Download the completed envelope
Once an envelope reaches completed, two PDFs are available: the signed
document and an audit certificate listing every signer action with
timestamps and IP addresses. Both are served directly by the API.
Signed document
curl https://api.permissio.us/v1/envelopes/env_abc123/documents/signed \
-H "Authorization: Bearer sk_live_your_key_here" \
--output signed.pdf
const res = await client.envelopes.getSignedDocument("env_abc123");
await fs.promises.writeFile("signed.pdf", Buffer.from(await res.arrayBuffer()));
Audit certificate
curl https://api.permissio.us/v1/envelopes/env_abc123/certificate \
-H "Authorization: Bearer sk_live_your_key_here" \
--output certificate.pdf
Both endpoints stream application/pdf. The signed document is integrity-checked
against its stored SHA-256 before it's served.
These artifacts exist only after the envelope reaches completed. Requesting
them for a draft or in-progress envelope returns HTTP 409 with a clear error
code — poll GET /v1/envelopes/{id} for status: "completed", or (better) wait
for the envelope.completed webhook before downloading.
Skip the extra call with webhooks
The envelope.completed webhook payload includes signed_document_url,
audit_certificate_url, and signed_document_sha256, so you can fetch (and
verify) the PDF as soon as the event arrives without polling. See
Webhooks → Event catalog.