curl --request POST \
--url https://api.zopay.cash/connect/v1/events/{event_id}/replay \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zopay.cash/connect/v1/events/{event_id}/replay"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.zopay.cash/connect/v1/events/{event_id}/replay', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zopay.cash/connect/v1/events/{event_id}/replay",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zopay.cash/connect/v1/events/{event_id}/replay"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.zopay.cash/connect/v1/events/{event_id}/replay")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zopay.cash/connect/v1/events/{event_id}/replay")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "<string>",
"event_id": "<string>",
"status": "<string>",
"attempt_count": 123
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}Replay a past event
POST /events//replay — encola una nueva entrega webhook para un evento existente.
curl --request POST \
--url https://api.zopay.cash/connect/v1/events/{event_id}/replay \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zopay.cash/connect/v1/events/{event_id}/replay"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.zopay.cash/connect/v1/events/{event_id}/replay', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zopay.cash/connect/v1/events/{event_id}/replay",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zopay.cash/connect/v1/events/{event_id}/replay"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.zopay.cash/connect/v1/events/{event_id}/replay")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zopay.cash/connect/v1/events/{event_id}/replay")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "<string>",
"event_id": "<string>",
"status": "<string>",
"attempt_count": 123
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "Missing or malformed Authorization header. Send: Authorization: Bearer sk_live_... or sk_test_...",
"doc_url": "https://docs.zopay.cash/errors/authentication_required",
"param": "currencies"
}
}X-ZoPay-Event-Id será el mismo evt_… que la entrega original — tu handler debe deduplicar por ese id.
- Idempotencia obligatoria. Misma
(org, Idempotency-Key, body)dentro de 24h devuelve la entrega original sin encolar otra. - Replayable siempre. Incluso eventos que ya entregaron 2xx pueden replicarse.
- Auditoría acumulativa. Cada replay crea una fila nueva en
webhook_deliveries— el historial crece, no muta.
| Trigger | HTTP | Code |
|---|---|---|
| Evento no existe (o cross-tenant) | 404 | event_not_found |
| Ningún webhook endpoint habilitado | 400 | webhook_endpoint_not_configured |
Mismo Idempotency-Key con otro body | 409 | idempotency_conflict |
Authorizations
Paste your Connect API key (sk_live_… for production, sk_test_… for sandbox) without the Bearer prefix. Mint and rotate keys from the admin panel.
Headers
Path Parameters
Event id to replay, beginning with evt_. Same 404-on-anything-that-doesn't-match semantics as the single-event GET endpoint.
Response
Successful Response
Body of POST /connect/v1/events/:id/replay.
Returns the newly-enqueued webhook_deliveries row's id and initial state. Partners poll their dashboard / GET /webhook-deliveries to watch the replay's lifecycle; the delivery's terminal state (delivered / failed / exhausted) is set asynchronously by the cron worker.
The new webhook_deliveries row id (UUID, rendered as string). Distinct from the original delivery's id if this event was delivered before; each replay produces a fresh row for audit clarity.
Always webhook_delivery. Stripe-style discriminator so polymorphic partner-side handlers can dispatch.
The connect_events id the delivery row points at. Identical to the path-param event_id -- echoed for convenience.
Always pending on the response. The worker claims the row on its next tick and transitions it through processing to a terminal state (delivered / failed / exhausted).
Always 0 on the response. The worker increments this on each attempt; a replay starts with a fresh budget.