Pipelines
POST /v1/pipeline takes one file set and a list of steps. Every file is parsed once, then each step runs over the parsed set. It is the JSON, inline-config successor to the multipart /process API.
Steps run in parallel over the same files, not chained. A step never consumes another step’s output — “redact the form that fill produced” is not expressible today. Each step reads the original file set.
How it works
- You send files (URLs or file ids) and steps.
- Each step is one of
{"extract": {…}},{"redact": {…}},{"fill": {…}},{"sign": {…}}— the same inline config the matching verb takes — or{"action": "<id or slug>", "params": {…}}for a saved action. There is noparsestep: parsing is automatic. - The response is
202with the pipeline id (plr_…) and a typed id per step, in the order you sent them. GET /v1/runs/plr_…carriessteps[]— each with its ownid,capability,status, and result.
Quickstart
Example response
The create call returns the handle and the step ids:
Polling GET /v1/runs/plr_… returns the same step ids with results attached:
Key fields
Sub-routes that address a single step — /task, /envelope, /void, /audit, /signers/:id/resend — resolve against the run’s matching step: /task* goes to the fill step, the rest to the sign step. A pipeline without that step answers 404 not_found.
Configuration
Step configs are validated exactly like the standalone verbs: an extract step with neither schema nor action fails with 400 invalid_request, and a schema that breaks the schema dialect fails with 400 invalid_schema — same codes, same messages, as POST /v1/extract.
Sync vs async
Always asynchronous — POST /v1/pipeline returns 202 and takes no ?wait=. Poll GET /v1/runs/plr_…?wait=<seconds> (0–120) to long-poll for a terminal state, or subscribe a webhook and wait for processing.completed.
Sending an idempotency-key makes retries safe. A replay returns the original pipeline — its id, its current status, and its original step ids — with an idempotent-replay: true response header, not a second run.
Save as an action
Each step accepts a saved action instead of inline config, and the two can be combined — inline fields win:
{"extract": {"action": …}} keeps the step typed (its id is exr_…) and lets you override fields inline. A bare {"action": …} step runs the saved action as-is and its step id is null. See Saved actions.