> ## Documentation Index
> Fetch the complete documentation index at: https://docs.corbado.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Observe Data Model for the API and Exports

> How Observe structures authentication data into tables: journeys, events, environments, users and KPI series, with keys, time columns and schema changes.

The API and the exports use the same model as the management console. Events from your integration are classified into **flows**, and each flow contains the **subflows** a user went through. This page describes how that model appears as tables. For the events you send, see the [custom events reference](/corbado-observe/tracking/overview).

## 1. How the model fits together

| Entity              | Meaning                                                     | Example                                                 |
| ------------------- | ----------------------------------------------------------- | ------------------------------------------------------- |
| **Session**         | One tracked browser or app session                          | A visit to your login page                              |
| **Flow**            | One authentication journey with an outcome                  | A login that completed after a fallback                 |
| **Subflow**         | One attempt with one method inside a flow                   | A passkey login attempt that failed                     |
| **Decision**        | The options a user was offered and what they chose          | Passkey or password offered, passkey chosen             |
| **Event**           | A raw event your integration sent                           | A subflow step started or finished                      |
| **Low-level event** | An interaction signal captured by the Web SDK               | Focus, paste or autofill on the identifier field        |
| **Environment**     | Browser, operating system, device and WebAuthn capabilities | Chrome on macOS with a platform authenticator available |
| **User reference**  | The user identifier your integration sent                   | A pseudonymous user ID                                  |
| **Tag**             | A custom dimension you attach to flows                      | Product, market or experiment variant                   |

## 2. Exported tables

Table exports contain 40 tables. They fall into five groups:

| Group                           | Tables                                                                                                                                                                                                                                                                                                                       |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Journeys**                    | `ob_flow`, `ob_event_flow` (event to flow mapping), `ob_flow_applied_pattern`, `ob_flow_exposure` (experiment exposure)                                                                                                                                                                                                      |
| **Subflows**                    | One table per method or step, for example `ob_provide_identifier_sub_flow`, `ob_decision_sub_flow`, `ob_password_login_sub_flow`, `ob_passkey_login_sub_flow`, `ob_passkey_enrollment_sub_flow`, `ob_email_otp_sub_flow`, `ob_sms_otp_sub_flow`, `ob_email_link_sub_flow`, `ob_social_login_sub_flow` and `ob_totp_sub_flow` |
| **Events and sessions**         | `ob_tracking_session`, `ob_tracking_event`, `ob_tracking_event_batch`, `ob_tracking_event_low`, `ob_tracking_ui_pattern`, `ob_tracking_telemetry`                                                                                                                                                                            |
| **Environment and credentials** | `ob_tracking_device_info`, `ob_tracking_device_info_web_raw`, `ob_passkey`, `ob_trusted_device_binding`                                                                                                                                                                                                                      |
| **Users, tags and KPIs**        | `ob_tracking_user_reference`, `ob_tracking_transaction_id`, `ob_tag_flow`, `ob_tag_value`, `ob_tracking_tag`, `ob_tracking_tag_predefined`, `ob_time_series_data`, `ob_time_series_experiment_data`                                                                                                                          |

`ob_flow` already includes the client environment fields of each flow, so most journey analysis starts there and joins subflows by flow ID.

`ob_time_series_data` holds pre-calculated KPI data. Both this table and `ob_time_series_experiment_data` export a rolling calendar month ending at the export cutoff, so successive snapshots overlap. For reports that match the console, use [time-series exports](/corbado-observe/data-access/exports#2-time-series-exports) with the same interval, dimensions and filters. Recalculate from flows and subflows for questions the series do not cover.

## 3. Types, keys and identifiers

* **IDs:** unsigned 64-bit integers. Preserve the full unsigned range. If your platform only supports signed 64-bit integers, use a lossless decimal or string representation and apply it consistently to join keys.
* **Timestamps:** UTC with microsecond precision.
* **JSON columns:** exported as strings. Parse them in your platform where needed.
* **Nullable columns:** exported as nullable fields.
* **Joins:** flows reference their session, subflows reference their flow and events map to flows through `ob_event_flow`.
* **Row grain:** environment enrichment can produce multiple exported rows for the same flow. Count distinct flow IDs for journey totals and reduce environment rows to the required grain before joining subflows.
* **User identifiers:** stored as sent by your integration. See [pseudonymous identifiers](/corbado-observe/data-access/overview#3-security-and-privacy).

## 4. Time columns

Each table is exported by its own time column. Subflows use their start time, flows their creation time and events their event time. A journey that starts shortly before midnight can therefore have rows in two export dates. Join across the relevant export dates rather than assuming all related rows share one date. A one-day lookback can cover a midnight boundary, but is not a completeness guarantee for late events or reclassification. Tags and user references also have their own export time columns, which can use server ingestion time.

## 5. Re-classification and snapshots

Observe classifies a session a few minutes after its last event and classifies it again when later events arrive, for example when a user returns to the same session. An exported day is a snapshot of that day at export time. Classification changes after the export are not reflected in files that were already written. Agree the historical regeneration and reload process when your warehouse must reflect these corrections; downloading an unchanged snapshot again does not refresh its contents.

## 6. Schema changes

The export schema follows the data model and grows as Observe adds fields. Configure your loader to accept new columns rather than failing on them, and write transformations that select the columns they need instead of relying on column order.

<CardGroup cols={2}>
  <Card title="Exports" icon="file-export" href="/corbado-observe/data-access/exports">
    Schedules, formats and how to download exports.
  </Card>

  <Card title="Connect your data platform" icon="database" href="/corbado-observe/data-access/data-platforms">
    Loading pattern and platform notes.
  </Card>
</CardGroup>
