FurniOpsDocs
API referenceExports

Start an export

Queues an export in the caller's mode, written as gzip JSON Lines. products: the catalogue the caller can see, one product per line as GET /v1/products returns it; needs products:read beside exports:write and the plan's bulk exports (403 feature_unavailable), and exported products count against the export_rows quota (429 quota_exceeded). organisation: everything the organisation holds, one file per dataset, each line as its API read returns it, closed by a manifest; needs every dataset's read permission (403 insufficient_scope), takes no filters (422), and is neither plan-gated nor metered. Follow it with GET /v1/exports/{id} or the export.completed event. An organisation may have at most 3 open (pending or running) exports per mode, test and live counted apart; one more answers 409 conflict.

POST/v1/exports

Queues an export in the caller's mode, written as gzip JSON Lines. products: the catalogue the caller can see, one product per line as GET /v1/products returns it; needs products:read beside exports:write and the plan's bulk exports (403 feature_unavailable), and exported products count against the export_rows quota (429 quota_exceeded). organisation: everything the organisation holds, one file per dataset, each line as its API read returns it, closed by a manifest; needs every dataset's read permission (403 insufficient_scope), takes no filters (422), and is neither plan-gated nor metered. Follow it with GET /v1/exports/{id} or the export.completed event. An organisation may have at most 3 open (pending or running) exports per mode, test and live counted apart; one more answers 409 conflict.

Authorization

apiKey
AuthorizationBearer <token>

An API key (fo_live_… / fo_test_…) as a bearer token

In: header

Header Parameters

FurniOps-Version?string

Dated API version; pinned per organisation on first use and overridable per request

Value in

  • "2026-10-01"
  • "2026-10-04"
FurniOps-Mode?string

The data the request acts on: test is the organisation's sandbox. An OAuth token picks it (live by default); an API key's mode is fixed, and naming the other one is refused

Value in

  • "live"
  • "test"
Idempotency-Key*string

Unique key for this operation, reused on retries (24 h)

Length1 <= length <= 257
FurniOps-Dry-Run?string

Preview the write and change nothing: true answers the would-be response, explain a Preview (application/vnd.furniops.preview+json)

Value in

  • "true"
  • "explain"

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

The export to make

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X POST "https://example.com/v1/exports" \  -H "Idempotency-Key: string" \  -H "Content-Type: application/json" \  -d '{    "kind": "products"  }'
{  "id": "string",  "object": "export",  "kind": "products",  "status": "pending",  "livemode": true,  "filters": {    "updated_since": "2019-08-24T14:15:22Z"  },  "rows": 0,  "files": [    {      "url": "http://example.com",      "dataset": "string",      "rows": 0,      "bytes": 0    }  ],  "error": "string",  "created_at": "2019-08-24T14:15:22Z",  "completed_at": "2019-08-24T14:15:22Z",  "expires_at": "2019-08-24T14:15:22Z"}