Exports
Create and download sales, tax, customer, and affiliate payout reports.
Create a report without keeping your request open. Each export has its own UUID
and saved progress, so you can check it later. Exports cover several kinds of
store data and are available at /v2/exports independently of any one order.
Reports contain real store data. Keep downloaded files private. SellApp records who requested an export; the response does not expose that person's identifier.
Permissions by report type
Send X-STORE with your store slug. You need an API key with the listed ability
for an ordinary SDK/REST integration. Official CLI and MCP connections use the
admin grant; the table names their reviewed operation permissions, not scopes
to request during login. Your current store permissions remain required.
type | API-key ability | Reviewed create permission | Reviewed read permission | Store permissions |
|---|---|---|---|---|
sales, tax, customers | invoice | orders:write | orders:read | invoice |
affiliate_payouts | affiliate | payments:write | payments:read | Both affiliate and affiliate:payout |
The list returns only report types you may access, 50 reports per page.
Retrieving or downloading another store's export returns 404; lacking access
to its report category returns 403. Affiliate payout reports describe
commissions and merchant-recorded payments, not transfers made by SellApp.
Create, check, and download
Use csv or json for any supported type. Optional parameters.from and
parameters.to use YYYY-MM-DD. Both dates are inclusive. Omitted or null to
uses today; omitted or null from uses 365 days before to. The resulting
range may span at most 366 calendar days. Sales and tax use sale update dates;
customers and affiliate payouts use creation dates. Tax reports accept
parameters.report_type as summary or detailed.
Only one export per store and two per requesting account may be queued or
running, across credentials and stores. Capacity failures return 429 with
Retry-After: 60; wait and poll an existing export. Jobs may wait up to 15 minutes
to start and run for at most 300 seconds, including up to 240 seconds of report
generation.
Reports are limited to 100,000 source rows, 50 MiB of serialized source data, and
a 100 MiB output file. Tax summaries count the underlying sales rows. Exceeding
a limit fails the job without publishing a partial file. Request a smaller date
range after inspecting failure_message.
Set the environment variables from the quickstart.
These Bash commands require jq and create a real export. Save one
EXPORT_REQUEST_KEY for this request; reuse it only for an identical retry.
EXPORT_REQUEST_KEY="$(openssl rand -hex 16)"
EXPORT_RESPONSE="$(curl --fail-with-body --request POST \
--url "${SELLAPP_API_BASE_URL}/v2/exports" \
--header "Authorization: Bearer ${SELLAPP_API_KEY}" \
--header "X-STORE: ${SELLAPP_STORE_SLUG}" \
--header "Idempotency-Key: ${EXPORT_REQUEST_KEY}" \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"type":"sales","format":"csv","parameters":{"from":"2026-08-01","to":"2026-08-31"}}')"
EXPORT_ID="$(printf '%s' "$EXPORT_RESPONSE" | jq -er '.data.id')"The response includes meta.poll_after_seconds: 2. Wait at least that long,
then retrieve the returned ID. Repeat this read while status is pending or
running; do not create a new export on every poll.
EXPORT_RESPONSE="$(curl --fail-with-body \
--url "${SELLAPP_API_BASE_URL}/v2/exports/${EXPORT_ID}" \
--header "Authorization: Bearer ${SELLAPP_API_KEY}" \
--header "X-STORE: ${SELLAPP_STORE_SLUG}" \
--header 'Accept: application/json')"
printf '%s' "$EXPORT_RESPONSE" | jq '.data | {id, status, filename, size, expires_at}'The resource includes type, format, parameters, status, filename,
content_type, byte size, and failure_message. Timestamps describe creation,
updates, the start of generation, completion, failure, and expiration. Artifact
metadata and lifecycle timestamps can be null before the corresponding step.
When status is completed and expires_at is in the future, use the returned
download_url. It is a signed SellApp API URL valid for five minutes. Request it
with your credential and X-STORE; it redirects to a separate private storage
URL valid for five minutes. Send your API credential only to SellApp, not to the
storage URL. Do not log either signed URL. Retrieve the export again if the
SellApp download link expires while the artifact is still available.
Failures and expiration
A download attempted before completion returns 409. An expired artifact
returns 410, even if its last reported status still says completed.
Expired artifacts have no download_url. Expiration cleanup may finish later;
that does not extend download access.
Generation is attempted once. If status becomes failed, inspect the public
failure_message, then create a new export with a new request key when ready.
Retrying the original keyed create request retrieves the original result; it
does not restart failed generation. A missing artifact can return 404.
Provide your SellApp API key as a bearer token.
In: header
Header Parameters
Reuse this key only for an identical retry. A replay returns Idempotent-Replayed: true.
8 <= length <= 255Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://sell.app/api/v2/exports" \ -H "Idempotency-Key: project-library-2026-09-04" \ -H "X-STORE: launch-lab" \ -H "Content-Type: application/json" \ -d '{ "type": "sales", "format": "csv", "parameters": { "from": "2026-08-01", "to": "2026-08-31" } }'{
"data": {
"id": "01992a65-e064-71ba-b38f-902b7966a6be",
"type": "sales",
"format": "csv",
"status": "pending",
"parameters": {
"from": "2026-08-01",
"to": "2026-08-31"
},
"filename": null,
"content_type": null,
"size": null,
"failure_message": null,
"started_at": null,
"completed_at": null,
"failed_at": null,
"expires_at": null,
"created_at": "2026-09-04T09:12:00Z",
"updated_at": "2026-09-04T09:12:03Z"
},
"meta": {
"poll_after_seconds": 2
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Header Parameters
Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/exports" \ -H "X-STORE: launch-lab"{
"data": [
{
"id": "01992a65-e064-71ba-b38f-902b7966a6be",
"type": "sales",
"format": "csv",
"status": "completed",
"parameters": {
"from": "2026-08-01",
"to": "2026-08-31"
},
"download_url": "https://sell.app/api/v2/exports/01992a65-e064-71ba-b38f-902b7966a6be/download?expires=1788513423&signature=2c91df645a086ec399153a932b741f809d2b85c69740eaf3612384ebfb913a65",
"filename": "sales-2026-08-01-to-2026-08-31.csv",
"content_type": "text/csv",
"size": 18432,
"failure_message": null,
"started_at": "2026-09-04T09:12:01Z",
"completed_at": "2026-09-04T09:12:03Z",
"failed_at": null,
"expires_at": "2026-09-05T09:12:03Z",
"created_at": "2026-09-04T09:12:00Z",
"updated_at": "2026-09-04T09:12:03Z"
}
],
"links": {
"first": "https://sell.app/api/v2/exports?page=1",
"last": "https://sell.app/api/v2/exports?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://sell.app/api/v2/exports",
"per_page": 50,
"to": 1,
"total": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://sell.app/api/v2/exports?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
]
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The export identifier.
uuidHeader Parameters
Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/exports/01992a65-e064-71ba-b38f-902b7966a6be" \ -H "X-STORE: launch-lab"{
"data": {
"id": "01992a65-e064-71ba-b38f-902b7966a6be",
"type": "sales",
"format": "csv",
"status": "completed",
"parameters": {
"from": "2026-08-01",
"to": "2026-08-31"
},
"download_url": "https://sell.app/api/v2/exports/01992a65-e064-71ba-b38f-902b7966a6be/download?expires=1788513423&signature=2c91df645a086ec399153a932b741f809d2b85c69740eaf3612384ebfb913a65",
"filename": "sales-2026-08-01-to-2026-08-31.csv",
"content_type": "text/csv",
"size": 18432,
"failure_message": null,
"started_at": "2026-09-04T09:12:01Z",
"completed_at": "2026-09-04T09:12:03Z",
"failed_at": null,
"expires_at": "2026-09-05T09:12:03Z",
"created_at": "2026-09-04T09:12:00Z",
"updated_at": "2026-09-04T09:12:03Z"
}
}{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}Provide your SellApp API key as a bearer token.
In: header
Path Parameters
The export identifier.
uuidQuery Parameters
Expiry timestamp from the generated download URL.
Copy the signature from the response-supplied download_url. The example is illustrative and cannot authorize a download.
Header Parameters
Store slug. Required for OAuth access tokens. API keys may omit it to use their current store, or the first accessible store when no current store is selected.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://sell.app/api/v2/exports/01992a65-e064-71ba-b38f-902b7966a6be/download?expires=1788513423&signature=2c91df645a086ec399153a932b741f809d2b85c69740eaf3612384ebfb913a65" \ -H "X-STORE: launch-lab"No response body.
{
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request could not be understood.",
"status": 400,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#bad-request"
}{
"type": "authentication_error",
"code": "unauthenticated",
"message": "Unauthenticated.",
"status": 401,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#unauthenticated"
}{
"type": "authorization_error",
"code": "forbidden",
"message": "This action is unauthorized.",
"status": 403,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#forbidden"
}{
"type": "not_found_error",
"code": "resource_not_found",
"message": "Not Found.",
"status": 404,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#resource-not-found"
}{
"type": "conflict_error",
"code": "conflict",
"message": "The resource state changed before this request.",
"status": 409,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#conflict"
}{
"type": "invalid_request_error",
"code": "cursor_expired",
"message": "This cursor has expired. Start again without a cursor.",
"status": 410,
"param": "cursor",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#cursor-expired"
}{
"type": "validation_error",
"code": "validation_failed",
"message": "The selected product variant id is invalid.",
"status": 422,
"param": "product_variant_id",
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#validation-failed",
"errors": {
"product_variant_id": [
"The selected product variant id is invalid."
]
}
}{
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too Many Attempts.",
"status": 429,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#rate-limit-exceeded"
}{
"type": "api_error",
"code": "api_error",
"message": "Server Error",
"status": 500,
"param": null,
"request_id": "01992a65-e064-71ba-b38f-902b7966a6be",
"docs_url": "https://sell.app/docs/api/errors#api-error"
}