Endpoints
Auth is the same as the batch endpoints:
Authorization: Bearer {YOUR_API_KEY} or the apiKey header.
Sync vs. Async export:
Quick Start
CallPOST /exports with the batch_ids you want combined into one CSV; delivery mode is decided for you by size.
Prefer clicking through instead? See Using the Dashboard for the same flow with checkboxes and an Export N Batches button.
Sync Exports
Small exports skip the export job entirely. A single batch (max 50,000 places) always qualifies; so does any combination of batches that stays roughly under 50,000 rows and 120 MB. You get200 back with the CSV already in the body:
Async Exports
Larger selections return202 immediately: status: queued, a status_url to poll, and download_url: null until the job finishes.
There is no set limit to number of batches or total jobs to export, async export comfortably handles exports >1M jobs across many batches.
Idempotency-Key
Sending anIdempotency-Key is optional, not required. Its only job is to make retries safe:
- With a key: retry the same request (same key, same
batch_ids) as many times as you want, like after a timeout, and you’ll get back the original export job instead of a new one. Reuse the key with a differentbatch_idsset and you’ll get409, since that’s not a retry. - Without a key: every request creates a new export job, including retries. Fine for one-off calls; risky if your client retries automatically.
Export Lifecycle
- Queued: Export Job accepted; waiting for a worker to pick it up.
- Running: A worker is generating the CSV.
- Completed:
download_urlis set. Download it before the retention window closes. - Failed: Something went wrong — check
error. Worker dispatch failures return502on create and mark the export jobfailedimmediately; it’s safe to retry. - Expired: The artifact aged past its 7-day retention window.
download_urlisnullandexpiredistrue.
What's populated at each status
What's populated at each status
Polling & Downloading
1
Poll for status
Call
GET /exports/{export_id} (or follow status_url from the create response) every few seconds. Don’t poll faster than that.2
Stop when terminal
Stop once
status is completed, failed, or expired.3
Download
Call
GET /exports/{export_id}/download. It returns 307 with a Location pointing at a short-lived signed S3 URL. Most HTTP clients (curl, requests, fetch) follow the redirect automatically, and the body that arrives is text/csv.The signed URL from
/download is valid for 1 hour. The underlying artifact is retained for 7 days; call /download again to get a fresh URL as long as the export hasn’t expired.Status Response Fields
This is the shape returned by the
202 on create, by Get export status, and by each element of List exports.
Listing Exports
GET /exports?status=&cursor=&limit= returns { exports: [...], next_cursor }, newest first.
CSV Columns
Every export has the same shape:batch_id, batch_name, place_id, status, then per-attribute columns — {field}_original (your inputs), {field}_enriched (the enriched value), {field}_status, plus confidence and reasoning columns. Columns that are blank across every row are dropped.
For what each attribute returns, see Place Job Results.
Errors
Using the Dashboard
Exports work the same way without writing any code. On Place Enrichment → Run Batches, check one or more batches and click Export N Batches. A confirm dialog — “Export N batches (~X jobs) as a single CSV. Large selections generate in the background…” — kicks off the samePOST /exports under the hood.
- Small exports download instantly in the browser.
- Large exports show a “queued” toast with a View link to the Exports screen (sidebar → Exports,
/place-enrichment/exports). - The Exports screen lists background exports with status pills — Queued / Generating / Ready / Failed / Expired — and auto-polls until each one finishes. Ready rows get a Download button (a plain link that follows the
307to S3); failed rows get Retry. - Its subtitle states the rule plainly: “Background CSV exports, kept 7 days. Small exports download instantly and aren’t listed here.”
Best Practices
- Send an Idempotency-Key for anything you might retry — a UUID v4 per export attempt, reused across that attempt’s retries, not generated per HTTP call.
- Poll politely — every few seconds is enough; the export runs as a background export job either way.
- Download promptly — the signed URL expires in 1 hour. Call
/downloadagain for a fresh one if you miss the window. - Check
metadata.rows_exported— confirms the export covered the rows you expected before you rely on the file.
Next Steps
- Batch Processing - create the batches you’re exporting
- Place Job Results - full schema of the enriched attributes behind each CSV column