The Event Platform
#Capture and replay
A subscription can be suspended by the platform when your destination fails, or by you, for example during a maintenance of your system. While it is suspended, the Event Platform no longer delivers its events. Instead, it automatically captures them, with nothing to enable: every event the subscription would have received is kept for a limited time. Once the subscription is resumed, you can ask the platform to replay these missed events to your destination.
This page explains what is captured, how long it is kept, and how to replay it.
#What is captured
The platform captures an event when all these conditions are met:
- The subscription is
suspended, whether the platform suspended it (see the suspension policy) or you suspended it yourself. - The event is one of the event types the subscription tracks, and it matches the subscription filter, if any. You never get back an event you would not have received while active.
- The subscription was suspended less than 10 days ago.
The platform does not capture events for revoked or deleted subscriptions, nor events dropped after the retry policy.
#How long captured events are kept
Capture stops 10 days after the suspension started, and each captured event is kept 10 days. To get everything back, resume the subscription and start the replay within 10 days of the suspension.
#Supported subscription types
Replay is available for subscriptions with an HTTPS destination only.
#How to replay missed events
Replaying takes three steps: check what is waiting, resume the subscription, then request the replay and follow it.
All the calls below use the same headers as the rest of the Event Platform API, and the environment variables set in the getting started guide.
#1. Check what is waiting
The preview tells you how many events a replay would send, without sending anything. It works while the subscription is still suspended, so you can check before resuming it.
curl --request GET "https://event.prd.sdk.akeneo.cloud/api/v1/subscribers/$SUBSCRIBER_ID/subscriptions/$SUBSCRIPTION_ID/replays/dry-run" \
--header "X-PIM-URL: $TARGET_PIM_URL" \
--header "X-PIM-TOKEN: $PIM_API_TOKEN" \
--header "X-PIM-CLIENT-ID: $CLIENT_ID"
Response example:
{
"as_of": "2026-09-08T12:00:00Z",
"replayable_event_count": 42,
"oldest_available_at": "2026-08-29T12:00:00Z",
"newest_available_at": "2026-09-08T11:59:00Z",
"replay_available": false,
"blocking_reason": "subscription_suspended"
}
replayable_event_countis exact at theas_oftime. It can change right after: new events keep being captured and old ones expire.oldest_available_attells you how far back a replay can reach today.- When
replay_availableisfalse,blocking_reasonsays why:subscription_suspended: resume the subscription first.replay_in_progress: a replay of this subscription is already running.daily_quota_consumed: this subscription already had its replay today. Try again tomorrow (UTC).
#2. Resume the subscription
A replay can only start on an active subscription. Make sure your destination is able to receive events again, then resume the subscription.
New events are delivered as soon as the subscription is active again, while the replay sends the older ones in the background. Your destination receives both at the same time.
#3. Request the replay
curl --request POST "https://event.prd.sdk.akeneo.cloud/api/v1/subscribers/$SUBSCRIBER_ID/subscriptions/$SUBSCRIPTION_ID/replays" \
--header "X-PIM-URL: $TARGET_PIM_URL" \
--header "X-PIM-TOKEN: $PIM_API_TOKEN" \
--header "X-PIM-CLIENT-ID: $CLIENT_ID"
The platform records the replay and answers at once with 202 Accepted, whatever the number of events:
{
"replay_id": "01996f2a-7c3e-7d1a-9e4b-2f3c4d5e6f70",
"status": "pending",
"requested_at": "2026-09-22T12:00:00Z",
"selection_cutoff": "2026-09-22T12:00:00Z",
"status_path": "/api/v1/subscribers/01945f27-3412-76e9-8d46-820f769b2ba3/subscriptions/77777777-7777-7777-7777-777777777777/replays/01996f2a-7c3e-7d1a-9e4b-2f3c4d5e6f70"
}
The replay covers the events captured before selection_cutoff. If nothing is replayable, the platform answers 200 OK with "status": "empty", creates no replay and does not use your daily quota.
The request is refused with 409 Conflict when the subscription is still suspended, when a replay is already pending or running, or when the daily quota is used. The error message says which.
#4. Follow the replay
Use the status_path returned above:
curl --request GET "https://event.prd.sdk.akeneo.cloud/api/v1/subscribers/$SUBSCRIBER_ID/subscriptions/$SUBSCRIPTION_ID/replays/$REPLAY_ID" \
--header "X-PIM-URL: $TARGET_PIM_URL" \
--header "X-PIM-TOKEN: $PIM_API_TOKEN" \
--header "X-PIM-CLIENT-ID: $CLIENT_ID"
Response example:
{
"replay_id": "01996f2a-7c3e-7d1a-9e4b-2f3c4d5e6f70",
"status": "running",
"requested_at": "2026-09-22T12:00:00Z",
"selection_cutoff": "2026-09-22T12:00:00Z",
"last_progress_at": "2026-09-22T12:05:00Z",
"completed_at": null,
"claimed_count": 1200,
"delivered_count": 1150,
"retry_count": 20,
"expired_count": 0
}
| Field | Description |
|---|---|
claimed_count |
Events the replay has taken so far |
delivered_count |
Events delivered to your destination so far |
retry_count |
Delivery attempts that failed and were scheduled again. It only grows: a high value with a low delivered_count means your destination keeps rejecting the events |
expired_count |
Events that reached the end of their 10-day retention before being delivered. They will not be sent |
terminal_reason |
Why the replay did not complete. Only present once it is over |
Poll every few minutes at most: a replay runs at a bounded pace, so its counters do not move faster than that.
#Replay statuses
| Status | Description |
|---|---|
pending |
The replay is recorded and has not sent any event yet |
running |
Events are being sent |
completed |
Every event covered by the replay was delivered |
partial |
The replay ended, but some events expired or could not be delivered |
aborted |
The subscription was suspended while the replay ran |
failed |
The replay stopped because of a platform failure |
completed, partial, aborted and failed are final. Once the subscription is deleted or revoked, its replays can no longer be read: the status endpoint answers 404 Not Found.
After an aborted replay, the events not sent yet stay available until the end of their retention: resume the subscription and request a new replay.
#How events are replayed
- Oldest first, at a bounded pace. Replayed events are sent in the order they were captured, at a pace slower than live delivery. A large backlog can take several hours, or more than a day.
- Same events, flagged as replayed. A replayed event is the CloudEvent you would have received, with the same
idandtime. It carries two extra CloudEvent extension attributes, so you can tell it from a live event:replay: alwaystrue.replayedat: the time the event was replayed, in UTC (for example2026-09-22T12:05:00.123456789Z).
- At least once. As with live delivery, an event can reach you twice. Deduplicate on the CloudEvent
id, and do not rely on the order between replayed and live events. See At least once. - Retries until delivered or expired. If your destination fails or answers
429 Too Many Requests, the event is retried later, with a growing delay. Unlike live delivery, it is not dropped after three attempts: it is retried until it is delivered or reaches the end of its retention. - Suspension stops the replay. If your destination answers in a way that suspends the subscription (for example a
404 Not Found), the replay ends asaborted. Fix the destination, resume, and request a new replay.
#Quotas
- One pending or running replay per subscription at a time.
- One successfully completed replay per subscription per UTC day. A replay that ends
partial,abortedorfailedfrees the daily slot, so you can request another one the same day.