Sign
Send a PDF out for e-signature, track the envelope, and get a sealed document with an audit trail.
POST /v1/sign creates a signature envelope for one PDF. Each signer verifies their email with a one-time code and signs by typing their name. When the last signer completes, the document gets a signature certificate and a tamper-evident cryptographic seal, and comes back as a new file.
How it works
- You send a file and one or more signers (
name+email). - CloudRaker creates the envelope and emails each signer their own signing link. The call returns
202withstatus: "needs_input"— signing is never synchronous. - The run stays at
needs_inputwhile signatures come in. PollGET /v1/runs/:id, watch the envelope, or subscribe a webhook. - Once everyone has signed, the document is sealed and the run reaches
processedwithoutput.fileandoutput.auditUrl.
Sign runs are exempt from the run TTL — an envelope must outlive the 7-day maximum, so it is never purged while it is open. The expiresAt field is still present on the run body; for a sign run it is not enforced. The envelope has its own expiry, visible on GET /v1/runs/:id/envelope.
Quickstart
The TypeScript and Python samples are plain HTTP so they run with nothing installed. This endpoint is also a top-level method on both SDKs as of 0.3.0 — client.sign(…); that page has a full worked example.
Example response
envelopeUrl is on every sign response — the 202 and each GET /v1/runs/:id — and points at the envelope, the sender’s view of who has signed. A sign run never carries a tasks[] array the way a fill review does: a signing link is a bearer capability belonging to one signer, so it is emailed to them and never returned to you.
Once every signer has completed, GET /v1/runs/:id reaches processed and output carries:
Configuration
Track the envelope
Four sub-routes hang off the run id.
GET /v1/runs/:id/envelope
The sender’s view: envelope status, the signer roster with per-signer state, and the event trail.
The envelope never contains signing links. A signing link is a bearer capability held only by its signer — to get a signer moving again, re-send their invitation.
POST /v1/runs/:id/signers/:signerId/resend
Emails a pending signer a new signing link; their previous link stops working immediately. 409 if that signer already signed or the envelope is no longer pending.
POST /v1/runs/:id/void
Cancels a pending envelope: every signing link dies at once and the run terminates as failed. Optional body { "reason": "…" }. 409 once the envelope is finalizing or completed.
GET /v1/runs/:id/audit
The audit trail as JSON — creation, invitations, email verifications, signatures, and the seal — available before the envelope completes. The sealed PDF carries the same document as an attachment.
Sync vs async
Always asynchronous — POST /v1/sign answers 202 whatever you pass for ?wait=, because a sign run cannot reach a terminal status inside the window. With the default wait it holds until the envelope exists and reports status: "needs_input"; with ?wait=0 it returns immediately with status: "queued". Poll GET /v1/runs/:id?wait=…, watch the envelope, or subscribe run.completed on a webhook endpoint.
Save as an action
Sign is the one capability with no action reference in its request body. POST /v1/sign and {"sign": …} pipeline steps always run the built-in signing action, and they take their whole configuration inline — send message and placement on every call.
POST /v1/actions does accept "capability": "sign", so a saved sign action can be created and listed, but today no /v1 request path consumes one. Passing a saved sign action as another verb’s action — or as a bare {"action": …} pipeline step — is rejected with 400 invalid_request, because only the sign path keeps the run exempt from the TTL purge.