One delivery attempt including the payload that was sent — the list endpoint omits payloads. Use this to inspect the exact body your endpoint received, or to forward it somewhere else (this is how printedsimply listen replays events to localhost). event_id is the logical event this attempt belongs to, and equals payload.id.
- Credential
- An API key in
x-api-key - Scopes
webhooks:manage
Parameters
idpath · stringrequired
Request
GET /api/v1/webhooks/deliveries/{id}
curl "https://portal.printedsimply.com/api/v1/webhooks/deliveries/ccbkfrz5r3gcby08k4iqiuxwb" \
-H "x-api-key: ps_test_YOUR_KEY"Response 200
The attempt, with the exact body that was POSTed so a receiver that lost one can replay it against its own handler.
data
idstringrequiredwebhook_idstringrequiredeventstringrequiredOne of
order.createdorder.paidorder.in_productionorder.shippedorder.deliveredorder.cancelledorder.failedorder.updatedorder.reroutedorder.quality_checkorder.issueorder.approval_requestedorder.approval_approvedorder.approval_declinedorder.approval_expiredcampaign.openedcampaign.order_addedcampaign.closedcampaign.batch_in_productioncampaign.completeddesign.proof_sentdesign.changes_requesteddesign.approvedreturn.requestedreturn.approvedreturn.remake_createdreturn.resolvedreturn.rejecteddrop.openeddrop.saledrop.closeddrop.sold_outcheckout_link.salegift.claimedgift.expiredproduct.updatedcatalog.syncedwebhook.disabledautopilot.run.createdautopilot.run.awaiting_approvalautopilot.run.completedautopilot.run.failedautopilot.run.cancelleddesign_run.item_readydesign_run.completedguarantee.issuedguarantee.honoredguarantee.breachedguarantee.remediedtest.pingevent_idstring | nullNull only for attempts recorded before the log carried the id.
status_codeinteger | nullsuccessbooleanrequiredfailure_causestring | nullWhy a failed attempt failed, and so what to fix:
dns,refused,timeout,tls,reset,redirect,unauthorizedand the other endpoint-side causes are your URL's;egress,signingandinternalare ours, and the attempt is retried on schedule. Null when delivered, and on a failure logged with neither a cause nor a status.One of
dnsunsafe_urlrefusedtimeouttlsresetnetworkredirectunauthorizedhttp_4xxhttp_5xxinbox_refusedegresssigninginternalcreated_atstring (date-time)requiredpayloadobjectrequiredThe exact body that was POSTed, so a receiver that lost one can replay it against its own handler. Its
idis the same value asevent_idbeside it — surfaced as its own key so reading the log does not mean reaching into an opaque body for the dedupe key.
meta
pageintegertotalintegerlimitintegerThe page size actually applied, which is not necessarily the one asked for — the operation's own ceiling wins.
pagesintegertotaloverlimit, rounded up.next_cursorstring | nullOn a cursor-paged operation: send this back as
cursorfor the next page. Null on the last page. Absent on operations that do not page by cursor.has_morebooleanOn a list operation whose
metaisListMeta: whether another page follows this one.
{
"status": "success",
"data": {
"id": "ccbkfrz5r3gcby08k4iqiuxwb",
"webhook_id": "whk_hCyrY24j_gUrQWxJ7ji6s9st",
"event": "order.shipped",
"event_id": "evt_ey8SQMTGI1sCP-c0JpwB3AyX",
"payload": {
"id": "evt_ey8SQMTGI1sCP-c0JpwB3AyX",
"data": {
"status": "shipped",
"event_id": "evt_o0ONdH8-7LUjFVrEVoIyufJ0",
"order_id": "test_ord_wVK9ZiG-VYiPrlSeBUBmrUVk",
"provider": "printedsimply",
"tracking": {
"url": "https://portal.printedsimply.com/track/eyJ2IjoxLCJ0IjoidHJhY2tpbmciLCJ0b2siOiJ0cmtfQXF1SkZxRExEa2lzSzZKaC1IQUJIejlMIiwiZXhwIjoiMjAyNy0wMS0xM1QxNTowMDozMi4wMDBaIn0.50de0b297f5ed5a39f7b618a2e6f8138f8d50b31a2daabe2709af8f2d7265b25",
"number": "TRK-TEST-JCWX8ET5IGBT",
"carrier": "UPS"
},
"test_mode": true,
"tracking_url": "https://portal.printedsimply.com/track/eyJ2IjoxLCJ0IjoidHJhY2tpbmciLCJ0b2siOiJ0cmtfQXF1SkZxRExEa2lzSzZKaC1IQUJIejlMIiwiZXhwIjoiMjAyNy0wMS0xM1QxNTowMDozMi4wMDBaIn0.50de0b297f5ed5a39f7b618a2e6f8138f8d50b31a2daabe2709af8f2d7265b25",
"portal_order_id": "ord_wVK9ZiG-VYiPrlSeBUBmrUVk",
"tracking_number": "TRK-TEST-JCWX8ET5IGBT",
"tracking_carrier": "UPS",
"estimated_delivery": {
"latest": "2026-10-29",
"earliest": "2026-10-23",
"ships_by": "2026-10-19",
"is_estimate": true
}
},
"event": "order.shipped",
"timestamp": "2026-10-15T15:00:32.000Z"
},
"status_code": 200,
"success": true,
"failure_cause": null,
"created_at": "2026-10-15T15:00:32.000Z"
},
"request_id": "4e3753e1-48dd-4313-bfd8-48e4af4e116a"
}Errors
Missing, invalid or expired API key:
missing_api_key(none sent),invalid_api_key(unknown or revoked),key_expired(past the expiry set when it was created; create a new key).404Resource not found
Rate limit exceeded. Two windows can produce this status and
error.codesays which:rate_limit_exceededfor the per-minute sliding window,daily_quota_exceededfor the plan's daily quota. Both carryRetry-After; the daily one also carriesX-Daily-LimitandX-Daily-Remaining. The per-minute limits are plan-based — see Rate Limits above, or call GET /v1/me for this credential's own figures.