Exports
An export turns a snapshot into a deliverable artefact — a PDF, CSV, slide deck, infographic, podcast, or video. Exports always run asynchronously: you queue a job, poll it, then download the result. One snapshot can feed any number of exports.
| Endpoint | Purpose |
|---|---|
POST /v1/exports | Queue a job |
GET /v1/exports | List your jobs, with filters |
GET /v1/exports/{id} | Poll one job |
GET /v1/exports/{id}/download | Stream the finished artefact |
DELETE /v1/exports/{id} | Delete a job and its artefact bytes |
The recipe:
GET /v1/meta/export-types— every export type, as a(provider, artifact_type)pair with a machine-readableoptions_schema. See Discovery.POST /v1/exportswithsnapshot_id, the pair, and anyoptions.- Poll
GET /v1/exports/{id}untilstatusiscompleted, then fetchdownload_url.
Create an export job
POST /v1/exports — bearer auth; rate-limited to 30 exports per hour per key; accepts Idempotency-Key.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
snapshot_id | string (uuid) | yes | A snapshot owned by you — from POST /v1/scans or GET /v1/snapshots. |
provider | string | yes | Provider key, e.g. internal-pdf, notebooklm. |
artifact_type | string | yes | Valid only paired with the matching provider — see the catalogue. Unknown pairs return 422. |
options | object | no | Per-type string fields, validated against the registry. Unknown option names and out-of-vocabulary values return 422 with did-you-mean hints and the valid list. |
curl https://api.regsn.app/v1/exports \
-H "Authorization: Bearer $REGSN_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"snapshot_id": "a1b2…",
"provider": "internal-pptx",
"artifact_type": "slide-deck",
"options": { "theme": "light" }
}'202:
{
"export_job_id": "c3d4…",
"status": "queued",
"status_url": "/v1/exports/c3d4…",
"download_url": null
}More examples:
curl https://api.regsn.app/v1/exports \
-H "Authorization: Bearer $REGSN_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"snapshot_id": "a1b2…",
"provider": "gemini-infographic",
"artifact_type": "infographic-custom",
"options": { "styleSlug": "riso-tritone-gem", "planModel": "opus" }
}'curl https://api.regsn.app/v1/exports \
-H "Authorization: Bearer $REGSN_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"snapshot_id": "a1b2…",
"provider": "notebooklm",
"artifact_type": "audio",
"options": {
"audio_format": "DEEP_DIVE",
"audio_length": "LONG",
"instructions": "Focus on enforcement-action implications."
}
}'Errors
Status · code | When |
|---|---|
404 not_found | snapshot_id does not exist or belongs to another account. |
409 idempotency_key_in_use / idempotency_in_progress | See Idempotency. |
422 validation_error | Missing field; unknown provider:artifact_type pair; invalid options — errors[] names each offending field (codes unknown_option, invalid_value, invalid_type, too_long) with the valid vocabulary. |
429 rate_limit_exceeded | The exports bucket is exhausted (30/hour). Honour Retry-After. |
503 transient_error | Service temporarily unavailable. Retry with the same Idempotency-Key. |
Export types and options
Sixteen (provider, artifact_type) pairs. All option values are strings. The authoritative, always-current schema is options_schema on GET /v1/meta/export-types; this table reflects it as of 20-07-2026.
provider | artifact_type | Options (defaults in bold) |
|---|---|---|
internal-pdf | pdf | — |
internal-csv | csv | — |
internal-tearsheet | tearsheet | targetLanguage; editorialModel (deprecated — accepted but ignored) |
internal-pptx | slide-deck | theme: light | dark; targetLanguage; editorialModel (deprecated — accepted but ignored) |
frontend-slides | slide-web | styleSlug: dark-editorial | light-consulting; targetLanguage |
gemini-infographic | tearsheet-detailed | styleSlug (12 styles, default bloomberg-editorial-gem); planModel: sonnet5 | sonnet | opus | opus48; targetLanguage |
gemini-infographic | infographic-custom | styleSlug (21 styles, default bloomberg-editorial-gem); planModel (default opus); targetLanguage |
openai-infographic | tearsheet-detailed | styleSlug (12 styles, default bloomberg-editorial-oai); targetLanguage |
openai-infographic | infographic-custom | styleSlug (21 styles, default bloomberg-editorial-oai); targetLanguage |
notebooklm | infographic | style (10 styles, default PROFESSIONAL — full list under Field notes); detail_level: CONCISE | STANDARD | DETAILED; orientation: LANDSCAPE | PORTRAIT | SQUARE; instructions; targetLanguage |
notebooklm | slide-detailed | slide_length: SHORT | DEFAULT; instructions; targetLanguage |
notebooklm | audio | audio_format: DEBATE | DEEP_DIVE | BRIEF | CRITIQUE; audio_length: SHORT | DEFAULT | LONG; instructions; targetLanguage |
notebooklm | video-explainer | instructions; targetLanguage |
notebooklm | video | video_format: CINEMATIC; instructions; targetLanguage |
elevenlabs-briefing | podcast-briefing | voiceId; modelId (alias model_id); targetLanguage |
elevenlabs-discussion | podcast-discussion | modelId (alias model_id); targetLanguage |
Field notes:
targetLanguage— a language code matching a translation present on the snapshot (e.g.fr,de; seetranslationLanguages). Omit for English. The podcast types fall back to English when the requested translation is missing — and thenotebooklmaudiotype’s defaultDEBATEformat is English-only regardless oftargetLanguage, as its product label says.style— thenotebooklminfographicvisual style:PROFESSIONAL(default),EDITORIAL,SCIENTIFIC,SKETCH_NOTE,BENTO_GRID,BRICKS,CLAY,INSTRUCTIONAL,KAWAIIorANIME.instructions— free text up to 2,000 characters steering the generator (NotebookLM types only).styleSlug— visual style anchor for the infographic types. The full per-type catalogue, with slugs, lives inoptions_schemaonGET /v1/meta/export-types— do not hardcode it.editorialModel— deprecated. Still accepted for backwards compatibility, but has no effect.notebooklmtypes require the NotebookLM integration to be configured on your account (requires_provider: "notebooklm"in the catalogue); theelevenlabs-*podcast types likewise (requires_provider: "elevenLabsPodcast").
Two account-level settings affect behaviour without appearing in the request. Free-text customisation — if it is disabled for your account, instructions values are replaced server-side with your account’s defaults rather than rejected. Expedite — whether AI-generated exports run in the real-time lane or the slower batch lane is a stored account preference, not a request option; it applies to bearer-key jobs exactly as it does in the dashboard.
List export jobs
GET /v1/exports
| Query parameter | Default | Notes |
|---|---|---|
snapshot_id | — | Only jobs for this snapshot. |
status | — | Comma-separated subset of queued, processing, completed, failed, cancelled. Unknown values return 422. |
limit | 50 | Max 100. Newest first. |
curl "https://api.regsn.app/v1/exports?status=queued,processing&limit=20" \
-H "Authorization: Bearer $REGSN_API_KEY"200 — { "data": [ …job objects… ] } in the shape below.
Poll an export job
GET /v1/exports/{id}
curl https://api.regsn.app/v1/exports/c3d4… \
-H "Authorization: Bearer $REGSN_API_KEY"200:
{
"id": "c3d4…",
"status": "completed",
"artifact_type": "slide-deck",
"provider": "internal-pptx",
"snapshot_id": "a1b2…",
"created_at": "2026-07-20T10:00:00.000Z",
"completed_at": "2026-07-20T10:03:41.000Z",
"cost_cents": 12,
"error": null,
"result_mime": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
"result_filename": "regulatory-snapshot.pptx",
"result_size_bytes": 482133,
"download_url": "/v1/exports/c3d4…/download"
}status is one of queued, processing, completed, failed, cancelled. download_url is populated only when completed; on failed, error carries the reason. 404 not_found for an id that does not exist or belongs to another account.
Download the artefact
GET /v1/exports/{id}/download — streams the raw bytes.
curl -OJ https://api.regsn.app/v1/exports/c3d4…/download \
-H "Authorization: Bearer $REGSN_API_KEY"Semantics:
Content-Typeis the job’sresult_mime;Content-Dispositionsuppliesresult_filename(-OJsaves under it).- Audio, video, PDF, and image types are served
inline(so players and viewers can point at the URL); everything else isattachment. - Audio and video support HTTP range requests —
Accept-Ranges: bytes, partial content as206. Other types ignoreRange.
Status · code | When |
|---|---|
404 not_found | The id does not exist or belongs to another account. |
409 not_ready | Job is not completed yet. |
410 gone | The job completed but the artefact bytes are no longer retained. Re-run the export. |
416 range_not_satisfiable | Range outside the resource (audio/video only). |
Delete an export job
DELETE /v1/exports/{id} — removes the job and its stored artefact bytes. Mutations bucket (30/min).
curl -X DELETE https://api.regsn.app/v1/exports/c3d4… \
-H "Authorization: Bearer $REGSN_API_KEY"204 on success; 404 not_found if the id does not exist or belongs to another account. Deleting a job does not affect the snapshot it was built from.
See also
- Discovery — the machine-readable export catalogue.
- Usage & budget — export costs deplete the same pool as scans.
- Studio, in the product — the dashboard surface over the same export engine.