Skip to main content
Exports are asynchronous: start a job, poll it, download the file. A synchronous endpoint would have to build and stream an arbitrarily large CSV inside a single request window; a job keeps working for as long as the export takes, and each poll is a light request against your rate limits. Both endpoints require a key with the lists scope — see Scopes.

Start the export

POST /business/lists/{listId}/export with an empty JSON body:
The API responds 202 with a job id:
A 202 means accepted, not finished — the file does not exist yet. Hold on to jobId; it is your only handle on the export. If the list does not exist, or belongs to a different workspace, you get 404 with the standard error envelope:

Poll the job

GET /business/exports/{jobId} returns the job’s current state:
status moves through a fixed lifecycle: completed and failed are terminal; once you see either, stop polling. Poll every few seconds with backoff — typical exports complete in seconds to a couple of minutes depending on list size. A compact loop:
Polling an unknown jobId — or one that has since expired — returns 404 EXPORT_NOT_FOUND. There is nothing to recover from that job; start a new export instead.

Download the file

downloadUrl is a presigned URL: fetch it directly, with no authentication header. It is valid for roughly 15 minutes — presigned URLs are short-lived on purpose, so a leaked link does not become a permanent public copy of your data. Every poll of a completed job returns a freshly signed URL, so if yours expires before you download, poll once more and use the new one. The file downloads named after the list. rowCount is the number of data rows — the header row is not counted. Each row carries the contact’s identity fields, emails and phones, company fields, and your custom columns. It also includes a Fuse Contact ID column: keep it intact if you plan to edit the file offline and bring it back, because a re-upload uses it to match rows to existing contacts instead of creating duplicates — see Upload your contacts.

When exports fail

A failed job sets error to a specific reason when there is one:
Failed jobs are terminal. Retrying means calling POST /business/lists/{listId}/export again for a fresh jobId — re-polling a failed job will only ever return failed.

Next steps

Upload your contacts

Round-trip an exported CSV back into Fuse, matched by Fuse Contact ID

API reference

Full request and response schemas for the export endpoints