Skip to main content
Every call to Parse, Extract, Split, Tables, Charts and Classify starts a job. A job’s id names its endpoint, such as parse-3f6c2a9e-… or extract-9b1d4e7a-…. Every job has three routes, and so do pipelines and batches:

Sync or async

By default, a POST waits for its job to end. It returns 200 with the job’s id when the job completes, or an error status when the job fails. Send "async": true to get 202 with the id at once. Pipelines and batches always run async. Use async for long documents, and wherever a client, proxy or load balancer might time out before the job ends. Either way, you read the result from the job’s /result route. This is an async parse, followed until it ends: Instead of polling, you can have a webhook tell your server when the job ends.

Statuses

This diagram shows how a job moves between statuses:

Wait for a job

This helper polls a job until it ends. Pass it the status call for the job’s endpoint, such as client.extract.get. client is the one from SDKs.
Status reads are free. The SDKs don’t retry for you, so retry a failed read in your own code, as shown in Errors and retries.

Read the result

GET /{endpoint}/{id}/result returns the result only for a completed job. For any other status, it returns: Anyone in your organization can read a job’s status and result.

Cancel a job

DELETE /{endpoint}/{id} cancels a job that’s queued or processing. It returns the job’s status, now canceled, and you aren’t billed for the job. A job that has already ended returns 409. Only the user who started a job or pipeline can cancel it. For anyone else, it isn’t found (404). Anyone in your organization can cancel a batch. DELETE never deletes a finished job’s result, and no route does. A result is deleted only when it expires, as described next.

Retention

By default, Pulse keeps every result and it has no expires_at. These cases make results expire: The clock starts when Pulse accepts the request, except for Extract, whose clock starts when the job ends. A batch’s jobs and a pipeline’s steps count from when the batch or pipeline ends. A completed job’s expires_at gives the exact time. An expiry of 1 hour or 24 hours replaces both 24-hour rules. No setting keeps a parse sent with save: false for more than 24 hours. Your organization’s retention is set by Pulse; to change it, contact support. A step sent an expired parse’s parse_id is refused.

Where results are deleted on first read

If your organization deletes each result the first time it’s read, the first GET …/result returns the result and deletes it. A second read returns 410. A step that reads the parse after that fails or is refused, even one you started earlier.
Start every step you need on a parse, and wait for each to end, before you read the parse’s own result. Or run the steps in a pipeline. Store each result you read, because you can’t read it again.
This is the safe order for a parse you also run Extract on: