API reference
Exports
Freeze a selection of the catalog into a file: a JSONL manifest of image items, or a ZIP rendered by the same pipeline as the dashboard's export, with your naming template.
The ExportJob object
Attributes
idstringCrockford-base32 ULID (26 chars).formatenummanifestzip
statusenumqueuedprocessingcompletedfailed
urlstring (URL), nullableSigned URL to the artifact oncecompleted(the JSONL manifest or the ZIP). Re-signed on every read; do not cache the URL, cache the file.nullagain once a ZIP is pastexpires_at.url_expires_attimestamp, nullableRFC 3339 / ISO 8601 timestamp.expires_attimestamp, nullableWhen the ZIP itself is deleted: 48 hours after it was produced. From then on the job stayscompletedandurlisnull; create a new export to get the files again.nullfor a manifest, and until a ZIP iscompleted.total_imagesintegerImages in the selection at creation time.errorobject, nullableShow child attributesHide child attributes
codestringmessagestringparamstring
created_attimestampRFC 3339 / ISO 8601 timestamp.started_attimestamp, nullableRFC 3339 / ISO 8601 timestamp.finished_attimestamp, nullableRFC 3339 / ISO 8601 timestamp.
The ExportJob object
{
"id": "01HX5K2MZ7A3Q4FBNDC0EVDXEX",
"format": "manifest",
"status": "queued",
"url": "https://example.com/…",
"url_expires_at": "2026-04-27T14:32:00Z",
"expires_at": "2026-04-27T14:32:00Z",
"total_images": 1,
"error": {
"code": "product_not_found",
"message": "Product 01HX...XY1 was not found.",
"param": "inputs.product_id"
},
"created_at": "2026-04-27T14:32:00Z",
"started_at": "2026-04-27T14:32:00Z",
"finished_at": "2026-04-27T14:32:00Z"
}Create an export job
POST/v1/exports
The same items GET /v1/images pages through, as a stable artifact: a JSONL manifest (one image per line, with its product_id, role, signed url and suggested_filename) or a ZIP of the image files rendered by the same export pipeline the dashboard uses, with your organization's naming template and per-workflow formats.
Select up to 500 products with product_ids, or omit it for the whole catalogue visible to the API (same cap). Narrow with role.
format: manifestis written immediately: the response is alreadycompletedwith a signedurl.format: zipis rendered asynchronously: pollGET /v1/exports/{id}(it carriesRetry-After) or subscribe toexport.completed/export.failed.
Image URLs inside a manifest are valid one hour after it was written; the image ids are permanent — re-fetch bytes with GET /v1/images/{id}. A ZIP is deleted 48 hours after it was produced (expires_at on the job); download it within that window, or create a new export. Send Idempotency-Key to make retries return the same job.
Parameters
formatenumoptionalmanifestzip
product_idsarray of stringsoptionalFreeze these products. Omit for the whole catalogue visible to the API (at most 500 products per job; page throughGET /v1/imagesfor more).rolearray of enumsoptionalOnly images of these roles.
Returns
Returns a ExportJob object with status 202.
Errors
400Invalid selection
404One or more product_ids not found
500Server error
502Export pipeline unavailable
POST/v1/exports
curl https://api.veeton.com/v1/exports \
-H "Authorization: Bearer $VEETON_KEY" \
-H "Content-Type: application/json" \
-d '{
"format": "manifest",
"product_ids": [
"01HX5K2MZ7A3Q4FBNDC0EVDXY1"
],
"role": [
"source"
]
}'Response · 202
{
"id": "01HX5K2MZ7A3Q4FBNDC0EVDXEX",
"format": "manifest",
"status": "queued",
"url": "https://example.com/…",
"url_expires_at": "2026-04-27T14:32:00Z",
"expires_at": "2026-04-27T14:32:00Z",
"total_images": 1,
"error": {
"code": "product_not_found",
"message": "Product 01HX...XY1 was not found.",
"param": "inputs.product_id"
},
"created_at": "2026-04-27T14:32:00Z",
"started_at": "2026-04-27T14:32:00Z",
"finished_at": "2026-04-27T14:32:00Z"
}List export jobs
GET/v1/exports
Your export jobs, newest first, with a freshly signed artifact URL on each completed one. Filter by status. To read the catalogue itself, page through GET /v1/images.
Parameters
limitinteger· queryoptionalcursorstring· queryoptionalstatusenum· queryoptionalqueuedprocessingcompletedfailed
Returns
Returns a ExportJobList object with status 200.
Errors
400Invalid cursor
500Server error
GET/v1/exports
curl https://api.veeton.com/v1/exports \
-H "Authorization: Bearer $VEETON_KEY"Response · 200
{
"data": [
{
"id": "01HX5K2MZ7A3Q4FBNDC0EVDXEX",
"format": "manifest",
"status": "queued",
"url": "https://example.com/…",
"url_expires_at": "2026-04-27T14:32:00Z",
"expires_at": "2026-04-27T14:32:00Z",
"total_images": 1,
"error": {
"code": "product_not_found",
"message": "Product 01HX...XY1 was not found.",
"param": "inputs.product_id"
},
"created_at": "2026-04-27T14:32:00Z",
"started_at": "2026-04-27T14:32:00Z",
"finished_at": "2026-04-27T14:32:00Z"
}
],
"next_cursor": "eyJpZCI6InByb2RfMDFIWCJ9",
"has_more": true
}Retrieve an export job
GET/v1/exports/{export_id}
Status and, once completed, a signed URL to the artifact (valid one hour, re-signed on every read). A ZIP is deleted 48 hours after it was produced: past expires_at the job stays completed with a null url. While queued or processing the response carries Retry-After.
Parameters
export_idstringrequiredCrockford-base32 ULID (26 chars).
Returns
Returns a ExportJob object with status 200.
Errors
404Not found
GET/v1/exports/{export_id}
curl https://api.veeton.com/v1/exports/01HX5K2MZ7A3Q4FBNDC0EVDXY1 \
-H "Authorization: Bearer $VEETON_KEY"Response · 200
{
"id": "01HX5K2MZ7A3Q4FBNDC0EVDXEX",
"format": "manifest",
"status": "queued",
"url": "https://example.com/…",
"url_expires_at": "2026-04-27T14:32:00Z",
"expires_at": "2026-04-27T14:32:00Z",
"total_images": 1,
"error": {
"code": "product_not_found",
"message": "Product 01HX...XY1 was not found.",
"param": "inputs.product_id"
},
"created_at": "2026-04-27T14:32:00Z",
"started_at": "2026-04-27T14:32:00Z",
"finished_at": "2026-04-27T14:32:00Z"
}