> ## 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.

# Export Observe Data as Parquet and CSV

> Export Observe data in open formats: daily table exports as Parquet, time-series exports as CSV or Parquet and per-user exports and deletion.

Observe exports your data in open formats, so you can keep it in your own platform and combine it with your other sources. Table exports give you the complete data model day by day. Time-series exports give you the KPI series behind the console.

For enterprise delivery requirements, discuss [custom exports](/corbado-observe/data-access/data-platforms#3-custom-exports) with Corbado.

## 1. Table exports

Table exports write the [configured tables](/corbado-observe/data-access/data-model#2-exported-tables) as Apache Parquet files, compressed with Zstandard, once per day.

* **Schedule:** each export covers one day in the project's time zone and is written after 01:00 local time on the following day.
* **Completeness:** an export appears in the list only after all its files are written. Large tables are split into several files.
* **File metadata:** every file comes with its size, checksum and creation time. If an export is regenerated, file names stay the same and the creation time changes, so use the creation time to detect a reload.
* **Retention:** completed exports stay available for 365 days. One list request covers up to 92 days.
* **Activation:** table exports are enabled per project. [Contact us](mailto:support@corbado.com) to enable them.

### Existing export files

Older `ob_flow` and `ob_email_link_sub_flow` files can contain duplicate IDs from sessions with multiple device snapshots. Newly generated files select one snapshot per row. Existing files are not rewritten automatically: deduplicate by `id`, or ask Corbado to regenerate the affected table and dates. A regenerated file reflects the current classification state, so check its creation time before reloading it.

### List and download with the CLI

```sh theme={null}
corbado exports list --last-days 7
corbado exports list --table ob_flow --date 2026-06-10
corbado exports download <filename> --dir ./observe-exports
```

`--dir` keeps the `<table>/<file>.parquet` layout, which makes loading per table straightforward.

### List and download with the API

```sh theme={null}
curl "https://api.cloud.corbado.io/v1/observe/tableExports?lastDays=7" \
  -H "Authorization: Bearer <observe-api-key>"
```

The response lists exports by table and date, each with its files. Request a download link per file with `GET /observe/tableExports/{filename}/downloadLink`, URL-encoding the slashes in the file name. Links are short-lived, so request each link directly before downloading the file.

Both paths need a key with the table exports read permission.

## 2. Time-series exports

Time-series exports write the pre-calculated KPI series of the console as files. Start them in the console under [**Observe → Settings → Exports**](https://app.corbado.com/observe/settings/exports) or with `POST /observe/timeSeries/export`.

* **Formats:** CSV or Apache Parquet, one file per series, up to 20 series per request.
* **Dimensions:** exclude dimensions you do not need. Their values are summed, so totals stay correct.
* **Ranges:** hourly data for up to 92 days, daily data for up to 731 days and monthly data without a limit.
* **Processing:** the API generates files while streaming newline-delimited JSON progress over the open HTTP request. Keep the connection open until a `completed` or `failed` event arrives. Disconnecting can cancel generation. A project can run two exports at the same time.
* **Availability:** files can be downloaded for 7 days through short-lived links.

List exports with `GET /observe/timeSeries/exports` and check one with `GET /observe/timeSeries/exports/{exportID}`. After completion, request a link for each file with `GET /observe/timeSeries/exports/{exportID}/files/{fileName}/downloadLink`. After an interrupted request, check the export status before starting another export.

### Interpret the files

New exports include a `columnGuide` captured when the export is created, including the meanings of the series-specific dimensions and configured custom-tag names. The console’s export details show this guide; older exports may omit it.

Read columns by name rather than position. Time-series exports now include `customTag1` through `customTag20`; the `ob_time_series_data` table export includes the corresponding `custom_tag_1` through `custom_tag_20` and ID columns. Additional tag columns shift later column positions. Unconfigured slots are empty or null, and previously generated files keep their original schema.

Each row represents one bucket and retained dimension combination. Sum `value` for totals instead of counting rows. Zero-value rows are omitted; missing dimensions are empty in CSV and null in Parquet, which does not mean zero or non-engaged. `time` is the UTC bucket start; `timeLocal` has no offset and uses the export’s recorded timezone. Use `time` for joins and sorting because local times can repeat at the end of daylight saving time. API range boundaries use UTC with an exclusive end; the console converts selected local dates for you.

## 3. Per-user export and deletion

To answer a data subject request, export or delete the Observe data of individual users by the user ID your integration sends.

| Task | Endpoint | Notes |
| - | - | - |
| **Export one user** | `GET /observe/dataExports/{externalID}` | JSON grouped by table. The CLI equivalent is `corbado exports user <externalID>` |
| **Delete users** | `POST /observe/dataDeletionJobs` | Up to 50,000 external IDs per request; one background job per ID |
| **Check a deletion** | `GET /observe/dataDeletionJobs/{dataDeletionJobID}` | Status pending, processing or completed; completed jobs may include `result: success` or `noData` |

See [User data export and deletion](/api-reference/observe/user-data) for permissions, the external-ID mapping and the request-to-completion workflow.

`noData` means the job found no matching data at execution, including on a repeated deletion. Older completed jobs may omit the result.

Per-user exports include session password-manager detections with the manager name and earliest reported client time. Deletion removes those session detections and the user-to-client-environment mapping. Accumulated client-environment sightings remain as browser-level records after that user link is removed and are not included in the per-user export.

Deletion covers the user data stored by Observe. Copies you have already loaded into your own platform need their own deletion step.

Use the current stored form of the external user ID for per-user requests, including any policy-driven hashing. For joins with your own records, reproduce the same hashes or keep a mapping. Policy-driven deletion of account references is separate from a user-data deletion request: retained journeys can remain after their identifier or user ID lookup paths have been removed.

<CardGroup cols={2}>
  <Card title="Connect your data platform" icon="database" href="/corbado-observe/data-access/data-platforms">
    Load exports into your warehouse or lakehouse.
  </Card>

  <Card title="Data model" icon="sitemap" href="/corbado-observe/data-access/data-model">
    Tables, keys and time columns.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.