Export Product List
GET/api/v2/products/list/export
Export products as XLSX or CSV.
products:readGrant 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 viaGET /api/v2/products/list/export/download?file=<filename>(the job'sresults.filevalue).
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
- 200
- 401
- 403
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.