Appearance
Events
JustDocs sends 10 events. Each endpoint chooses the ones it receives. Events carry identifiers and statuses, never document content or anyone's answers: fetch the record through the API when you need more.
| Event | When |
|---|---|
request.sent | A signing request was sent: invitations to the first recipients (or all of them, with parallel routing) are on their way, and may arrive just after this event. With an approval, this is when an owner or admin approved it. |
request.viewed | A recipient opened their signing link for the first time. |
request.signed | A recipient finished signing. The request completes separately, once everyone has signed and the completed copy is sealed. |
request.completed | Everyone signed and the completed copy is ready. Fetch the request for its documents. |
request.declined | A recipient declined to sign, or reported the request as unwanted. The request stops. |
request.voided | The request was voided in the app or through a key before it completed. Voiding never waits for approval. |
request.expired | The request passed its expiry date before everyone signed. |
intake.submitted | The respondent submitted an intake link's form, and their answers filled the documents. |
approval.requested | A key asked to send something that waits for a person: a signing request, or an intake link. |
approval.decided | An approval was decided: approved, declined, expired (after 7 days, or because the request was sent in the app instead), or failed (approved, but the send itself didn't go through). A 7-day expiry is noticed within ten minutes. |
The envelope
Every delivery is a POST with a JSON body in the same envelope:
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The event's id, evt_…. The same on every endpoint and every retry, so you can drop duplicates. |
type | string | Yes | The event, such as request.completed. |
created_at | string (date-time) | Yes | When it happened. |
workspace_id | string (uuid) | Yes | The team workspace. |
data | object | Yes | What happened, below. |
With these headers:
| Header | Value |
|---|---|
JustDocs-Signature | t=<unix seconds>,v1=<hex HMAC-SHA256>. See Verify signatures. |
JustDocs-Event-Id | The envelope's id. |
Content-Type | application/json |
User-Agent | JustDocs-Webhooks/1 |
Signing requests
data carries:
| Field | Type | Required | Description |
|---|---|---|---|
signing_request_id | string (uuid) | Yes | The signing request. |
status | string | Yes | The request's status just after the event: sent, completed, declined, voided or expired. |
recipient.id | string (uuid) | No | The recipient it was about, on request.viewed, request.signed and request.declined. |
recipient.role | string | No | Their role key. |
request.sent
A signing request was sent: invitations to the first recipients (or all of them, with parallel routing) are on their way, and may arrive just after this event. With an approval, this is when an owner or admin approved it.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "request.sent",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"status": "sent"
}
}request.viewed
A recipient opened their signing link for the first time.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "request.viewed",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"status": "sent",
"recipient": {
"id": "b6d8f1a3-5c7e-4d9b-a2f4-6c8e1b3d5f7a",
"role": "client"
}
}
}request.signed
A recipient finished signing. The request completes separately, once everyone has signed and the completed copy is sealed.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "request.signed",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"status": "sent",
"recipient": {
"id": "b6d8f1a3-5c7e-4d9b-a2f4-6c8e1b3d5f7a",
"role": "client"
}
}
}request.completed
Everyone signed and the completed copy is ready. Fetch the request for its documents.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "request.completed",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"status": "completed"
}
}request.declined
A recipient declined to sign, or reported the request as unwanted. The request stops.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "request.declined",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"status": "declined",
"recipient": {
"id": "b6d8f1a3-5c7e-4d9b-a2f4-6c8e1b3d5f7a",
"role": "client"
}
}
}request.voided
The request was voided in the app or through a key before it completed. Voiding never waits for approval.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "request.voided",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"status": "voided"
}
}request.expired
The request passed its expiry date before everyone signed.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "request.expired",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"status": "expired"
}
}Intake links
data carries:
| Field | Type | Required | Description |
|---|---|---|---|
intake_request_id | string (uuid) | Yes | The intake link. |
status | string | Yes | submitted. |
intake.submitted
The respondent submitted an intake link's form, and their answers filled the documents.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "intake.submitted",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"intake_request_id": "e7b2d4f6-8a1c-4e3b-9d5f-7a2c4e6b8d1f",
"status": "submitted"
}
}Approvals
data carries:
| Field | Type | Required | Description |
|---|---|---|---|
approval_id | string (uuid) | Yes | The approval. |
kind | string | Yes | signing.send or intake.create. |
status | string | Yes | pending on approval.requested; then approved, declined, expired or failed. |
signing_request_id | string (uuid) or null | Yes | The signing request, for signing.send. |
intake_request_id | string (uuid) or null | Yes | The intake link, for intake.create once it exists. |
credential_id | string (uuid) | Yes | The key that asked. |
reason | string | No | Why it failed, or why it expired when the request was sent another way. |
approval.requested
A key asked to send something that waits for a person: a signing request, or an intake link.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "approval.requested",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"approval_id": "a4c6e8b2-1d3f-4b5a-8c7e-9f1b3d5a7c2e",
"kind": "signing.send",
"status": "pending",
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"intake_request_id": null,
"credential_id": "d2f4b6a8-3c5e-4f7a-b9d1-2e4c6a8b1d3f"
}
}approval.decided
An approval was decided: approved, declined, expired (after 7 days, or because the request was sent in the app instead), or failed (approved, but the send itself didn't go through). A 7-day expiry is noticed within ten minutes.
json
{
"id": "evt_3b8e1f7c-2a4d-4c6e-9f1b-5d7a9c2e4b6f",
"type": "approval.decided",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"approval_id": "a4c6e8b2-1d3f-4b5a-8c7e-9f1b3d5a7c2e",
"kind": "signing.send",
"status": "approved",
"signing_request_id": "c3e9a7b1-2d4f-4a6c-8e1b-5f7d9a2c4e6b",
"intake_request_id": null,
"credential_id": "d2f4b6a8-3c5e-4f7a-b9d1-2e4c6a8b1d3f"
}
}Test events
Send a test on an endpoint, on the team's Webhooks page, delivers a ping to that endpoint alone, signed like any other event:
json
{
"id": "evt_7d9f2b4a-6c8e-4a1d-b3f5-7e9a2c4d6f8b",
"type": "ping",
"created_at": "2026-11-03T16:20:00.000Z",
"workspace_id": "f1a3c5e7-9b2d-4c4f-a6e8-1b3d5f7a9c2e",
"data": {
"message": "A test event from JustDocs"
}
}