Webhooks
Docpier POSTs to your HTTPS URL when async work finishes. You do not POST to Docpier for this. Return 2xx immediately, then process. Delivery is at-least-once — persist webhookId.
Route on product, then event. Per-item results are on GET, not in this envelope.
Envelope
Docpier sends JSON. Comments below are documentation only — they are not on the wire.
{
"product": "docmind", // "docmind" | "docbooks"
"event": "PROCESSING_FINALISED", // uppercase snake_case — see tables
"occurred": "2026-08-15T16:02:11.000Z", // ISO 8601
"webhookId": "01J7QK3N8X4M2P9C7R1T", // ULID per attempt — dedupe key
"retryCount": 0, // 0 on first try
"workspaceId": "01HWORKSPACE0000000001", // that product's workspace
"documentId": "01HDOCUMENT00000000001", // Docmind extract jobs
"extRef": "INV-1042", // your id, if you sent one
"filename": "invoice.pdf",
"status": "COMPLETED",
"message": null // optional human text on failure
}
Docbooks booking events use the same envelope with booking identifiers (bookingJobId, Docbooks workspaceId) instead of documentId. Extra field names follow the 0.2.0 domain contract.
Docmind events
| Event | Your next call |
|---|---|
PROCESSING_FINALISED | GET the document |
PROCESSING_FAILED | Domain failure — do not retry the extract blindly |
FEEDBACK_RECEIVED | Optional; HTTP 200 already had per-item status |
Split: webhook on the parent only.
Docbooks events
| Event | Your next call |
|---|---|
BOOKING_FINALISED | GET the booking job |
ONBOARDING_FINALISED | GET the onboarding job |
OFFBOARDING_FINALISED | GET the offboarding job |
Split booking: parent job only.
Delivery
10 attempts, exponential backoff, 24 hours. 10 s timeout. Production HTTPS (TLS 1.2+). Do not 4xx for application errors you cannot fix with a retry — acknowledge, then reconcile via GET.
Auth on your URL (configured by Docpier): none (dev), Basic, or Bearer. Email support@docpier.com with URL, scheme, and workspace or partner id.