envelope.sent | It left draft and the invitations are going out. |
envelope.completed | Everybody who had to act has acted. ⚠️ THE EXECUTED DOCUMENT DOES NOT EXIST YET. Sealing is asynchronous and starts here — it takes about a minute — so a GET /api/v1/envelopes/{envelopeId}/documents on this event answers sealed: false, correctly. Use this to learn that signing finished; use envelope.sealed to fetch. |
envelope.declined | Somebody refused. Terminal; no further signing happens. |
envelope.voided | The sender withdrew it. Terminal. |
envelope.expired | Its deadline passed before everybody acted. Terminal, and the one outcome NOBODY acted to produce — which is why it is published: there is no invitation, no click and nobody to ask. |
envelope.sealed | ⚠️ THE ONE TO WAIT FOR BEFORE FETCHING. Every document this envelope holds has been sealed with its certificate of completion, and GET /api/v1/envelopes/{envelopeId}/documents now answers sealed: true. It fires about a minute after envelope.completed, in the transaction that records the last seal — or very much later than that for an envelope whose sealing failed and was requeued.
⚠️ SO IT CAN ARRIVE AFTER AN envelope.sealing_failed FOR THE SAME ENVELOPE, and when it does it is the later truth: the document exists now. Do not reject it as impossible, and do not close an envelope against ever receiving it — see envelope.sealing_failed below.
ONE PER ENVELOPE, NOT ONE PER DOCUMENT — a ten-document envelope emits this once, after the tenth. The body carries no document id and no url: fetch the documents endpoint on receipt, because the download credentials it mints are short-lived and one frozen into a webhook body would be expired before a redelivery reached you. |
envelope.sealing_failed | ⚠️ THE EXECUTED DOCUMENT DOES NOT EXIST AND NOTHING FURTHER WILL BE TRIED AUTOMATICALLY. Sealing gave up on one of this envelope’s documents, so nothing on our side is still working towards envelope.sealed and waiting for it without acting is waiting for ever. The envelope itself stays completed — the signatures are real and are kept — and the sender is emailed separately.
⚠️ IT IS NOT FINAL: A FAILED SEAL CAN BE REQUEUED BY OUR SUPPORT, AND ONE THAT THEN SUCCEEDS DELIVERS envelope.sealed FOR THIS SAME ENVELOPE. That is an ordinary route rather than a curiosity — it is how a cleared deployment fault is worked through — so treat this event as “stuck, tell us” and not as “gone”. Concretely: raise it with us, tell whoever is waiting that the executed copy is delayed rather than lost, keep your envelope.sealed handler able to accept one for this envelope, and if you refund, archive or close a case on this event make that step reversible.
ONLY ON THE PERMANENT GIVE-UP, never while a seal is still being retried. ONCE PER GIVE-UP — so once per document that failed, and again for a requeued job that fails again. Expect it to be rare; handle it anyway, because it is the only signal that distinguishes “not yet” from “not without us”. |
recipient.completed | One recipient finished their part — signed, or approved. ⚠️ ONE NAME FOR BOTH ACTS: what an integration does about it is identical, and two names would make every consumer write the same two-branch switch for ever. recipient_id says who. |