Replay a webhook delivery
curl --request POST \
--url https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_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.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_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 => [
"X-API-Key: <api-key>"
],
]);
$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.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"delivery": {
"id": 981,
"event_id": "evt_4471_booking.completed",
"event_type": "booking.completed",
"booking_ref": "JNK-8F3D21",
"status": "exhausted",
"attempt_count": 8,
"last_http_status": 503,
"last_error": "non-2xx response: 503",
"created_at": "2026-10-08T10:02:11Z",
"updated_at": "2026-10-08T11:20:40Z",
"delivered_at": null,
"exhausted_at": "2026-10-08T11:20:40Z",
"replay_count": 0,
"payload": {
"event": "booking.completed",
"event_id": "evt_4471_booking.completed",
"booking_ref": "JNK-8F3D21",
"status": "confirmed",
"occurred_at": "2026-10-08T10:02:11Z",
"livemode": true
}
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "Malformed JSON in request body.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/authentication/api-keys"
}
}{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "CONFLICT",
"message": "<string>",
"doc_url": "<string>"
},
"code": "delivery_in_progress"
}{
"error": {
"code": "GONE",
"message": "The resource no longer exists.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "A required field is missing or invalid.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "The request was declined for this offer. Try another offer.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The service is temporarily unavailable. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_TIMEOUT",
"message": "The request timed out before a result was available. Retry the request.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}Webhooks
webhooks replay
Replay a webhook delivery
POST
/
v1
/
webhooks
/
{id}
/
deliveries
/
{delivery_id}
/
replay
Replay a webhook delivery
curl --request POST \
--url https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_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.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_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 => [
"X-API-Key: <api-key>"
],
]);
$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.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gojinko.com/v1/webhooks/{id}/deliveries/{delivery_id}/replay")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"delivery": {
"id": 981,
"event_id": "evt_4471_booking.completed",
"event_type": "booking.completed",
"booking_ref": "JNK-8F3D21",
"status": "exhausted",
"attempt_count": 8,
"last_http_status": 503,
"last_error": "non-2xx response: 503",
"created_at": "2026-10-08T10:02:11Z",
"updated_at": "2026-10-08T11:20:40Z",
"delivered_at": null,
"exhausted_at": "2026-10-08T11:20:40Z",
"replay_count": 0,
"payload": {
"event": "booking.completed",
"event_id": "evt_4471_booking.completed",
"booking_ref": "JNK-8F3D21",
"status": "confirmed",
"occurred_at": "2026-10-08T10:02:11Z",
"livemode": true
}
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "Malformed JSON in request body.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/authentication/api-keys"
}
}{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "CONFLICT",
"message": "<string>",
"doc_url": "<string>"
},
"code": "delivery_in_progress"
}{
"error": {
"code": "GONE",
"message": "The resource no longer exists.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "A required field is missing or invalid.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "The request was declined for this offer. Try another offer.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The service is temporarily unavailable. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_TIMEOUT",
"message": "The request timed out before a result was available. Retry the request.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}Replays a delivered or exhausted event delivery for a subscription you own. Sets its status to pending, resets attempt_count to 0, increments replay_count, and enqueues a fresh delivery of the same payload with a new signature timestamp. The replay keeps the same event_id, so your idempotency key still applies. Pending or failed deliveries are still being delivered or retried and cannot be replayed. Payloads are purged 30 days after the delivery’s last attempt or replay; a delivery whose payload was purged can no longer be replayed.
Authorizations
ApiKeyAuthBearerAuth
Response
Webhook delivery replay enqueued
One event delivery to a webhook subscription, including its attempts and replay count. payload is the exact envelope sent, or null after it is purged 30 days after the delivery's last attempt or replay.
Show child attributes
Show child attributes
Example:
{ "id": 981, "event_id": "evt_4471_booking.completed", "event_type": "booking.completed", "booking_ref": "JNK-8F3D21", "status": "exhausted", "attempt_count": 8, "last_http_status": 503, "last_error": "non-2xx response: 503", "created_at": "2026-10-08T10:02:11Z", "updated_at": "2026-10-08T11:20:40Z", "delivered_at": null, "exhausted_at": "2026-10-08T11:20:40Z", "replay_count": 0, "payload": { "event": "booking.completed", "event_id": "evt_4471_booking.completed", "booking_ref": "JNK-8F3D21", "status": "confirmed", "occurred_at": "2026-10-08T10:02:11Z", "livemode": true } }
