---
title: "Start an export of the project's data to object storage (owner/admin)"
method: POST
path: "/v1/projects/{project_id}/exports"
tags: ["exports"]
---

# Start an export of the project's data to object storage (owner/admin)

`POST /v1/projects/{project_id}/exports`

## Request

- Base URL: `https://api.wavehouse.cloud`
- URL: `https://api.wavehouse.cloud/v1/projects/{project_id}/exports`
- Auth: one of:
  - API key in cookie `whc_session`
  - HTTP bearer
  - API key in header `X-API-Key`

Queues an asynchronous export. ClickHouse writes the data DIRECTLY to object storage — no bytes pass through this API — so the response is a job you poll, not a file. Each table produces a data object plus a `<table>.schema.sql` sidecar holding its CREATE TABLE (the only thing that carries ENGINE, ORDER BY, PARTITION BY, TTL and codecs; no data format does). Format `native` (default) is lossless. Format `parquet` is for interop and is lossy at two edges: Enum8/Enum16 keep their LABELS but not their ordinals (round-tripping into a differently-ordered Enum rewrites the data), and LowCardinality(T) returns as plain T. A table holding a type Parquet cannot represent (e.g. AggregateFunction) fails the job with an error naming the column. A ReplacingMergeTree is exported UN-MERGED — the faithful dump of what is stored. The produced objects are transfer scratch: they are deleted after 7 days, and each download link is signed for 15 minutes.

## Path parameters

- `project_id` string, required

## Headers

- `Idempotency-Key` string: A unique value you choose per logical request (a random UUID). A retry with the same key and the same request within 24 hours returns the first response, marked Idempotency-Replayed: true, instead of acting twice. The same key with a different request is refused with 422; one sent while the first is still running gets 409.

## Request body

- CreateProjectExportInput
  - `format` string: native (default, lossless) or parquet (interop; Enum ordinals and LowCardinality encoding are NOT preserved)
  - `tables` string[]: tables to export; omit or leave empty to export every table in the project

## Response `202`

Accepted

- ExportView
  - `attempt` integer, required
  - `bytes_done` integer, required
  - `cancel_requested` boolean
  - `created_at` string, date-time, required
  - `finished_at` string, date-time
  - `format` string, required: native | parquet
  - `job_id` string, required
  - `last_error` string
  - `query_id` string: the engine query_id of the statement most recently issued for this job
  - `rows_done` integer, required
  - `started_at` string, date-time
  - `status` string, required: queued | running | succeeded | failed | dead | cancelled
  - `steps` ExportStepView[], required
    - `detail` string
    - `done_at` string, date-time: absent while pending
    - `name` string, required: plan | credential | schema:<table> | data:<table> | cancelled
    - `status` string, required: pending | done | failed
  - `tables` string[]: the requested tables; empty means the whole project database

## Other responses

- `429`: Rate limited, per client IP, API key or org; a client IP is also refused on every route for a while after repeated authentication failures. A limited operation carries RateLimit-Policy and RateLimit on every response; wait Retry-After seconds before retrying.
- `default`: Error

---

[API](https://skmtc.dev/wavehouse/apis/wavehouse-cloud-api.md) · [All operations](https://skmtc.dev/wavehouse/apis/wavehouse-cloud-api/llms.txt) · [OpenAPI document](https://skmtc.dev/wavehouse/apis/wavehouse-cloud-api/revisions/adea029bf505?raw)
