---
title: "An export finished"
method: POST
path: "export.completed"
tags: ["webhooks"]
---

# An export finished

`POST export.completed` (webhook)

Once when an export reaches completed. download_url is null: fetch urls.self with your key for a fresh link.

## Payload

- WebhookEventExportSummary
  - `id` string, required: The event id, also sent as the webhook-id header; deduplicate on it
  - `type` string, required: The topic: quiz.started | quiz.finished | quiz.abandoned | identity.captured | quiz.published | experiment.started | experiment.ended | profile.created | profile.updated | export.completed | webhook.endpoint.disabled | ping
  - `created` string, date-time, required: When the event happened
  - `api_version` 'v1': The payload version
  - `data` WebhookDataExportSummary, required
    - `object` ExportSummary, required
      - `id` string, required: The export
      - `dataset` 'profiles' | 'responses' | 'quiz_analytics' | 'audit_events', required: What the file holds
      - `format` 'csv' | 'json', required: The file's format
      - `source` 'api' | 'dashboard', required: Where the export was requested
      - `status` 'pending' | 'running' | 'completed' | 'failed' | 'expired', required: pending | running | completed | failed | expired
      - `filters` ExportFilters, required
        - `quiz_id` string, nullable: Only this quiz (profiles and responses)
        - `from` string, date, nullable: First day, inclusive, UTC
        - `to` string, date, nullable: Last day, inclusive, UTC
        - `tz` string, nullable: quiz_analytics only: the timezone the days are counted in
        - `search` ProfileSearch: Who to find: the list filters of GET /v1/profiles except q, plus person facts and an answer filter, an OR of AND groups. Send the same body with every page: a cursor belongs to the search that answered it and is refused with any other body.
          - `quiz_id` string, nullable: Only people who took this quiz
          - `from` string, date, nullable: Last seen on or after this UTC day
          - `to` string, date, nullable: Last seen on or before this UTC day
          - `has_order` boolean, nullable: Placed an order we linked to a quiz session
          - `has_email` boolean, nullable: Has an email
          - `has_phone` boolean, nullable: Has a phone
          - `has_marketing_consent` boolean, nullable: Ticked the marketing-consent checkbox beside their newest email or phone answer
          - `is_returning` boolean, nullable: Took a quiz again after we first knew them, on any device
          - `match` 'any_session' | 'latest_completed_per_quiz': any_session: any time they took the quiz counts; latest_completed_per_quiz: only their latest completed take of each quiz
          - `groups` ProfileSearchGroup[], nullable: OR of AND groups: up to 4 groups of 8 terms
            - `all` union[], required: Every slot must hold: a term, or {any: [terms]}; at most 8 terms in the group, counting the terms inside any
              - …
      - `row_count` integer, nullable, required: Rows in the file; null until completed
      - `bytes` integer, nullable, required: The file's size in bytes; null until completed
      - `error` string, nullable, required: Why the build failed; null otherwise
      - `requested_at` string, date-time, required: When the export was requested
      - `started_at` string, date-time, nullable, required: When the build started; null before
      - `completed_at` string, date-time, nullable, required: When the file was ready; null before
      - `expires_at` string, date-time, required: When the export and its file are deleted
      - `download_url` string, nullable: Set on GET /v1/exports/{export_id} while completed; valid 15 minutes
      - `download_url_expires_at` string, date-time, nullable: When download_url stops working; null with it
      - `urls` object, required: self: this export on the API; fetch it for a fresh download link

## Acknowledgement `200`

Any 2xx within 10 seconds acknowledges the event

## Other responses

- `4XX`: 410 ends the delivery and disables the endpoint; any other 4xx but 408 and 429 ends it
- `5XX`: Retried, as are 408, 429, a timeout and a network error: seven retries over about 28 hours, then the delivery is dead

---

[API](https://skmtc.dev/octaneai/apis/octane-ai-merchant-api.md) - [All operations](https://skmtc.dev/octaneai/apis/octane-ai-merchant-api/llms.txt) - [OpenAPI document](https://skmtc.dev/octaneai/apis/octane-ai-merchant-api/revisions/dc2d1aa2b7c6?raw)
