Re-enqueues one event from your feed to every active subscription that accepts its mode, with the STORED envelope verbatim — same id, so a receiver that dedupes on X-PS-Event-Id sees the same logical event again rather than a new one. This is the push half of the catch-up loop GET /v1/events is the pull half of: after an outage, read what you missed, then replay what your endpoint needs to process. Visibility follows the feed exactly — an event on the other side of your key's test/live line is a 404, and account-level events replay to both sides. enqueued: 0 is an honest answer meaning no active subscription accepts this event's mode; the fix is a webhook, not a retry.
- Credential
- An API key in
x-api-key - Scopes
webhooks:manage
Parameters
eventIdpath · stringrequiredThe event_id from GET /v1/events — the envelope's id, the X-PS-Event-Id value.
Idempotency-Keyheader · string (uuid)Unique key for idempotent requests. If you retry a request with the same key within 24 hours, you receive the original response. The key is bound to the request payload: reusing it for a different payload returns 422
idempotency_key_reuserather than the original response, so a changed request is never silently dropped. The binding is over the JSON's content, not its bytes — keys in another order or other whitespace are the same request. Generate a new key for each new request. On an operation that moves money (an order, a batch, an item, a shipping or address change, a cancellation's refund), a key that cannot be checked because the idempotency ledger is unreachable is answered 503idempotency_unavailablewithRetry-After, and nothing runs or is charged: retry with the same key.
Request
POST /api/v1/events/{eventId}/replay
curl -X POST "https://portal.printedsimply.com/api/v1/events/evt_F5S_u7olBRx4IBTVZNXoH-8d/replay" \
-H "x-api-key: ps_test_YOUR_KEY" \
-H "Idempotency-Key: replay-event-$(date +%s)"Response 200
Replay result: the event name, its event_id, and how many queue rows were enqueued.
data
replayedbooleaneventstringOne 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 | nullenqueuedintegerHow many subscriptions the replay was queued to. Zero is an honest answer: no active subscription accepts this event’s mode, and the fix is a webhook rather than a retry.
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": {
"replayed": true,
"event": "order.cancelled",
"event_id": "evt_F5S_u7olBRx4IBTVZNXoH-8d",
"enqueued": 1
},
"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.