Runs
Every capability call creates a run. The id shows the kind: exr_ extract, par_ parse, rdr_ redact, flr_ fill, sgr_ sign, plr_ pipeline. One set of routes works across all of them.
Track a run
GET /v1/runs/:id returns the same body the original call returns. It takes the same ?wait= (0–120 seconds), so long-poll instead of polling in a tight loop. ?include=evidence is accepted and does nothing. Citations are always included when the run was grounded.
A plr_ pipeline also carries steps[]. Each step has its own id, status, and output.
Agent runs (agr_…) are not on this surface. They have their own routes and statuses, no ttl, and they never appear in GET /v1/runs. Nothing on this page — TTL, keep, cancel, output/:name — applies to them.
List runs
GET /v1/runs returns your organization’s runs, newest first. It is the one call that shows work in flight when you have no run id.
List entries are handles, not results. They carry no output and no config. Fetch GET /v1/runs/:id for the data.
Paging is cursor-based. Pass the response’s cursor back as ?cursor= until has_more is false. Pages do not overlap. A cursor is opaque, so do not parse or construct one.
Filter by your own metadata
Every capability call takes a metadata object. It is the intended join key between your system and ours:
Tag every run at creation with the ids you already have: a job id, a customer id, an invoice number. Then you never need to store our run ids to find your work again.
GET /v1/runs is in the SDKs as of 0.3.0 — client.runs.listRuns({ object, status, limit, cursor }) in TypeScript, client.runs.list_runs(object=…, status=…, limit=…, cursor=…) in Python. The metadata.<key> filters are not typed parameters. Send those over HTTP as shown above.
The list is eventually consistent. A run created moments ago can be missing from GET /v1/runs, or show a status one step behind. GET /v1/runs/:id is always authoritative. Never decide “finished” or “failed” from the list. Never treat an absent run as a lost one.
Cancel and purge
Cancelling an already-terminal run is a no-op that returns the current body. DELETE is idempotent. Purging an already-purged run still returns 204.
Download a produced file
Runs that make a document — a redacted PDF, a filled form, a sealed contract — expose it two ways. The signed URL is inline on the run body at output.file.url. This route is the stable, guessable alias:
:name is the file name as reported in output.files[].name, or the file id. The response is a 302 to a signed, time-limited URL. Follow redirects.
A produced file is registered a moment after the run reports processed. In that window, output.file can arrive without its url, and this route can answer 404 not_found. Re-fetch GET /v1/runs/:id and the URL will be there.
Expiry and TTL
Runs clean themselves up. ttl on the create call (seconds, default 24 hours, max 7 days) sets when the run, its inline-created input files, and its outputs are purged. expiresAt on the run body gives the time.
After expiry, GET /v1/runs/:id answers 410 run_expired for a grace window, then 404 not_found. Persist what you need before then, or keep it.
Two exceptions:
- Files you registered with
POST /v1/filesare persistent. A run’s TTL never purges them. - Sign runs are TTL-exempt. An envelope must outlive the 7-day maximum. A
sgr_run — and a pipeline that contains asignstep — is not purged while the envelope is open.expiresAtis still present on the body. For a sign run it is not enforced.
Keep a run
keep is the bridge from the headless API into the CloudRaker product. It moves the run’s files and outputs into a real space and re-indexes them for search and the knowledge graph. It imports extraction results as records when the action was bound to a data object, and clears the run’s TTL.
Send either {"space": {"name": "…"}} to create a space or {"spaceId": "…"} to use an existing one. Sending both is a 400.
dashboardUrl opens the space in the app. Put this link in your own UI when a human must look at what the API produced. Afterwards GET /v1/runs/:id reports expiresAt: null. The run is no longer on a clock.
Keeping the same run into the same space again is a no-op. Keeping it into a different space returns 409 already_kept. Keeping a run that has not finished returns 409 pipeline_running. Wait for a terminal status first.
Everything a /v1 run touches is invisible in the app until you keep it. This makes ephemeral-by-default safe. Nothing accumulates in your organization’s spaces unless you ask for it.
Signature input
A sign run at needs_input is waiting for its signers. Signing links are signer-held secrets and never appear on the sender’s API.
The run body carries envelopeUrl. Track and manage the envelope with /v1/runs/:id/envelope, /void, /audit, and /signers/:id/resend.
On a pipeline, these sub-routes resolve to the sign step. They answer 404 when the pipeline has no such step.