Skip to main content

Export Product List

GET 

/api/v2/products/list/export

Export products as XLSX or CSV.

Required scope: products:read

Grant this scope to your token under Settings → Developer → Personal Access Tokens.

Authentication: Requires Bearer token.

Scope options:

  • filtered: Uses current filter parameters (same as the products list)
  • all: All products (ignores filters)
  • current_page: First page of current filter results
  • selected: Specific product IDs (requires ids param)

Content modes:

  • summary: One row per product (includes the product-level Default Supplier columns when requested)
  • suppliers: One row per product-supplier link. Emits the per-link supplier columns (Supplier Name, Supplier SKU, MOQ, Leadtime, Target Stock Days, Is Default, pricing tiers) and omits the duplicate product-level Default Supplier columns, so the file round-trips 1:1 with the supplier-links import template.

Response (dual mode):

  • Small exports (≤ 1000 records, or scope=current_page): Returns the file directly as a binary download (XLSX or CSV).
  • Large exports (> 1000 records): Returns 200 application/json with { data: { tracked_job_log_id, queued: true }, message }. The export is dispatched as a background job; track it via the tracked job log endpoints. Once complete, download via GET /api/v2/products/list/export/download?file=<filename> (the job's results.file value).

Requires permission: products.export

Response shape - delivery. By default an export of up to 1,000 rows is returned directly in this response, and a larger one runs in the background and returns {"tracked_job_log_id": ..., "queued": true}. Pass delivery=job to get the job response every time: a small export still runs immediately (it is never queued) and comes back already finished - {"tracked_job_log_id": ..., "queued": false, "status": "completed", "results": {"download_url": ..., "record_count": ...}} - while a large one is queued exactly as before. scope=current_page always returns the page directly, whatever delivery says. Use it when your client expects one flow for every export (start, then check GET /api/tracked-job-logs/{trackedJobLog}, then download), such as an ETL connector. Subscribe to the export.completed webhook to be told when a queued export is ready instead of polling.

Request​

Responses​

OK

Response Headers
    Content-Type