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

# User data export and deletion

> Export Observe data for an external user ID, request deletion and track completion.

Use these operations from your backend when handling individual user-data requests, including your GDPR request workflow. They act on Observe data in the project selected by your API key.

The identifier is the **external user ID** your integration reports in [user references](/corbado-observe/tracking/user). Use that same value, including any pseudonymization your integration applies. It is distinct from an internal Observe user ID, an email address or a session ID unless your integration deliberately uses that value as its external ID.

<Steps>
  <Step title="Export the available user data">
    Call [Export user data](/api-reference/observe/export-user) with permission `observe:dataExports:read`.

    ```bash theme={null}
    curl 'https://api.cloud.corbado.io/v1/observe/dataExports/example-user-id' \
      --header "Authorization: Bearer $CORBADO_OBSERVE_API_KEY"
    ```

    URL-encode the external ID as a path segment. The response is a JSON object of named datasets, each containing rows. Datasets with no rows are omitted. The export contains the data available for that user at request time. A `404` response means Observe holds no data for that external ID.
  </Step>

  <Step title="Request deletion when needed">
    Call [Create user data deletion jobs](/api-reference/observe/delete-user-data) with permission `observe:dataDeletionJobs:write`.

    ```bash theme={null}
    curl --request POST 'https://api.cloud.corbado.io/v1/observe/dataDeletionJobs' \
      --header "Authorization: Bearer $CORBADO_OBSERVE_API_KEY" \
      --header 'Content-Type: application/json' \
      --data '{"externalIDs":["example-user-id"]}'
    ```

    A request accepts **1 to 1,000 external IDs** and returns one job per ID. Store each returned job's `id` and `externalID`. Creating a job queues deletion; it does not mean deletion has completed.
  </Step>

  <Step title="Check completion">
    Call [Get a deletion job](/api-reference/observe/deletion-status) with permission `observe:dataDeletionJobs:read`.

    ```bash theme={null}
    curl 'https://api.cloud.corbado.io/v1/observe/dataDeletionJobs/<dataDeletionJobID>' \
      --header "Authorization: Bearer $CORBADO_OBSERVE_API_KEY"
    ```

    The job progresses through `pending`, `processing` and `completed`. Check every returned job rather than treating a successful creation response as completion.
  </Step>
</Steps>

Coordinate deletion with copies already downloaded to your warehouse or other systems. This API does not delete those copies or delete the account in your identity provider. It also does not disable future event collection in your application.

For bulk analytics data, use [table and time-series exports](/corbado-observe/data-access/exports).
