---
title: "Read export progress and its verified 24-hour download capability"
method: GET
path: "/v1/projects/{project_id}/exports/{export_id}"
---

# Read export progress and its verified 24-hour download capability

`GET /v1/projects/{project_id}/exports/{export_id}`

## Request

- Base URL: `https://app.ohmyho.st`
- URL: `https://app.ohmyho.st/v1/projects/{project_id}/exports/{export_id}`
- Auth: HTTP bearer

Owner-only, including at zero credits. Poll queued/running jobs after next_poll_after_seconds. A verified SQL ZIP is retained seven days. Its signed download URL is valid 24 hours and is issued only with at least 24 hours of retention left; otherwise download fields are null. Treat the URL as a secret bearer capability. Neither the password nor any permanent storage credential can be retrieved. Generic operation reads never contain this capability.

## Path parameters

- `project_id` string, required
- `export_id` string, required

## Headers

- `X-Request-Id` string

## Response `200`

Current export state and optional verified SQL ZIP download.

- ProjectExport
  - `id` string, required
  - `project_id` string, required
  - `state` 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled', required
  - `requested_at` string, date-time, required
  - `next_request_at` string, date-time, required
  - `next_poll_after_seconds` 5 | null, nullable, required
  - `error` OperationFailure, required
    - `code` 'operation_failed' | 'operation_abandoned' | 'authorization_changed' | 'source_commit_conflict' | 'source_snapshot_invalid' | 'source_upload_expired' | 'recovery_dispatch_failed' | 'recovery_job_failed' | 'recovery_input_expired' | 'recovery_database_unavailable' | 'recovery_checksum_mismatch' | 'recovery_scope_unavailable' | 'recovery_archive_too_large' | 'build_not_started' | 'build_failed' | 'database_write_rejected' | 'database_write_unavailable' | 'database_write_outcome_unknown' | 'database_compute_failed' | 'database_compute_plan_changed' | 'database_compute_rejected' | 'database_migration_failed' | 'insufficient_organization_credits' | 'paid_plan_required' | 'runtime_candidate_failed' | 'runtime_candidate_rejected' | 'storage_jurisdiction_conflict' | 'provider_state_absent' | 'auto_deploy_plan_rejected' | 'promotion_source_stale' | 'promotion_target_stale', required
    - `message` string, required
    - `retryable` false, required: A terminal operation cannot be retried in place; follow suggested_action.
    - `suggested_action` string, required
    - `detail` string: Present only on auto_deploy_plan_rejected when planning the pushed commit returned a typed refusal. It is the same fixed catalog sentence that the planning 409 problem returns as detail, naming the file, the rule and the required change.
  - `archive` ProjectExportArchive, required
    - `bytes` integer, required
    - `sha256` string, required
    - `sql_files` string[], required: dev.sql and/or prod.sql for isolated data, or shared.sql alone.
    - `captured_at` string, date-time, required
    - `expires_at` string, date-time, required
    - `download_url` string, uri, nullable, required
    - `download_expires_at` string, date-time, nullable, required

## Other responses

- `400`: The request failed.
- `401`: The request failed.
- `404`: The resource does not exist or is not visible to the authenticated principal.
- `429`: The request failed.
- `503`: The request failed.

---

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