Resend a webhook delivery
curl --request POST \
--url https://api.example.com/merchants/{merchantId}/webhook-logs/{id}/resend \
--header 'x-digest-key: <api-key>' \
--header 'x-digest-signature: <x-digest-signature>' \
--header 'x-digest-timestamp: <x-digest-timestamp>'import requests
url = "https://api.example.com/merchants/{merchantId}/webhook-logs/{id}/resend"
headers = {
"x-digest-timestamp": "<x-digest-timestamp>",
"x-digest-key": "<api-key>",
"x-digest-signature": "<x-digest-signature>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-digest-timestamp': '<x-digest-timestamp>',
'x-digest-key': '<api-key>',
'x-digest-signature': '<x-digest-signature>'
}
};
fetch('https://api.example.com/merchants/{merchantId}/webhook-logs/{id}/resend', 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.example.com/merchants/{merchantId}/webhook-logs/{id}/resend",
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-digest-key: <api-key>",
"x-digest-signature: <x-digest-signature>",
"x-digest-timestamp: <x-digest-timestamp>"
],
]);
$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.example.com/merchants/{merchantId}/webhook-logs/{id}/resend"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-digest-timestamp", "<x-digest-timestamp>")
req.Header.Add("x-digest-key", "<api-key>")
req.Header.Add("x-digest-signature", "<x-digest-signature>")
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.example.com/merchants/{merchantId}/webhook-logs/{id}/resend")
.header("x-digest-timestamp", "<x-digest-timestamp>")
.header("x-digest-key", "<api-key>")
.header("x-digest-signature", "<x-digest-signature>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/merchants/{merchantId}/webhook-logs/{id}/resend")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-digest-timestamp"] = '<x-digest-timestamp>'
request["x-digest-key"] = '<api-key>'
request["x-digest-signature"] = '<x-digest-signature>'
response = http.request(request)
puts response.read_body{
"id": "4b6f2ad6-8e6f-4f5e-9d2a-0d6c1f0a9b1e",
"merchant_id": "e714ad11-4f8a-445d-979c-15b66639953b",
"checkout_id": "pt_8CZ3BFuIbw",
"event_type": "transaction_updated",
"url": "https://yourstore.com/webhook",
"status": "success",
"http_status": 200,
"error_message": null,
"attempt_count": 2,
"duration_ms": 184,
"last_attempt_at": "2026-06-10T15:30:00.000Z",
"created_at": "2026-06-10T14:02:10.000Z",
"updated_at": "2026-06-10T14:02:11.000Z",
"request_payload": "{\"data\":{\"id\":\"pt_8CZ3BFuIbw\",\"type\":\"transaction_updated\",\"status\":\"paid\"}}",
"response_body": "OK"
}{
"reason": "Signature verification failed",
"statusCode": 401
}{
"reason": "Not found",
"statusCode": 404
}{
"reason": "Too many resend requests, try again later",
"statusCode": 429
}Webhook Logs
Resend Webhook
Replays the stored payload of a previous delivery to your current webhook URL, re-signed with your current secret key. The payload is byte-identical to the original — deduplicate by event content, not by signature. Rate limited to 10 resends per minute.
POST
/
merchants
/
{merchantId}
/
webhook-logs
/
{id}
/
resend
Resend a webhook delivery
curl --request POST \
--url https://api.example.com/merchants/{merchantId}/webhook-logs/{id}/resend \
--header 'x-digest-key: <api-key>' \
--header 'x-digest-signature: <x-digest-signature>' \
--header 'x-digest-timestamp: <x-digest-timestamp>'import requests
url = "https://api.example.com/merchants/{merchantId}/webhook-logs/{id}/resend"
headers = {
"x-digest-timestamp": "<x-digest-timestamp>",
"x-digest-key": "<api-key>",
"x-digest-signature": "<x-digest-signature>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-digest-timestamp': '<x-digest-timestamp>',
'x-digest-key': '<api-key>',
'x-digest-signature': '<x-digest-signature>'
}
};
fetch('https://api.example.com/merchants/{merchantId}/webhook-logs/{id}/resend', 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.example.com/merchants/{merchantId}/webhook-logs/{id}/resend",
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-digest-key: <api-key>",
"x-digest-signature: <x-digest-signature>",
"x-digest-timestamp: <x-digest-timestamp>"
],
]);
$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.example.com/merchants/{merchantId}/webhook-logs/{id}/resend"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-digest-timestamp", "<x-digest-timestamp>")
req.Header.Add("x-digest-key", "<api-key>")
req.Header.Add("x-digest-signature", "<x-digest-signature>")
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.example.com/merchants/{merchantId}/webhook-logs/{id}/resend")
.header("x-digest-timestamp", "<x-digest-timestamp>")
.header("x-digest-key", "<api-key>")
.header("x-digest-signature", "<x-digest-signature>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/merchants/{merchantId}/webhook-logs/{id}/resend")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-digest-timestamp"] = '<x-digest-timestamp>'
request["x-digest-key"] = '<api-key>'
request["x-digest-signature"] = '<x-digest-signature>'
response = http.request(request)
puts response.read_body{
"id": "4b6f2ad6-8e6f-4f5e-9d2a-0d6c1f0a9b1e",
"merchant_id": "e714ad11-4f8a-445d-979c-15b66639953b",
"checkout_id": "pt_8CZ3BFuIbw",
"event_type": "transaction_updated",
"url": "https://yourstore.com/webhook",
"status": "success",
"http_status": 200,
"error_message": null,
"attempt_count": 2,
"duration_ms": 184,
"last_attempt_at": "2026-06-10T15:30:00.000Z",
"created_at": "2026-06-10T14:02:10.000Z",
"updated_at": "2026-06-10T14:02:11.000Z",
"request_payload": "{\"data\":{\"id\":\"pt_8CZ3BFuIbw\",\"type\":\"transaction_updated\",\"status\":\"paid\"}}",
"response_body": "OK"
}{
"reason": "Signature verification failed",
"statusCode": 401
}{
"reason": "Not found",
"statusCode": 404
}{
"reason": "Too many resend requests, try again later",
"statusCode": 429
}Authorizations
Your public API key
Headers
Current Unix timestamp
Your public api key
Digest Auth Signature
Path Parameters
Your merchant id.
Webhook delivery id.
Response
The delivery after the resend attempt.
Payment the event belongs to.
Example:
"transaction_updated"
Webhook URL the delivery was sent to.
Available options:
success, failed, skipped Example:
200
Example:
1
Example:
184
The exact JSON payload string that was sent (and signed).
Body returned by your endpoint (truncated).