curl -X POST 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/deliveries/66666666-7777-8888-9999-000000000001/resend/' \
-H 'x-api-key: YOUR_API_KEY'import os
import requests
destination_uuid = '11111111-2222-3333-4444-555555555555'
delivery_uuid = '66666666-7777-8888-9999-000000000001'
resp = requests.post(
f'https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/',
headers={'x-api-key': os.environ['DIDIT_API_KEY']},
timeout=10,
)
resp.raise_for_status()
resent = resp.json()
if resent['response_status'] is None or resent['response_status'] >= 400:
print('Your endpoint still rejects it:', resent['response_status'])
else:
print('Delivered as', resent['uuid'])const destinationUuid = '11111111-2222-3333-4444-555555555555';
const deliveryUuid = '66666666-7777-8888-9999-000000000001';
const resp = await fetch(
`https://verification.didit.me/v3/webhook/destinations/${destinationUuid}/deliveries/${deliveryUuid}/resend/`,
{ method: 'POST', headers: { 'x-api-key': process.env.DIDIT_API_KEY } },
);
if (!resp.ok) throw new Error(await resp.text());
const resent = await resp.json();
console.log(resent.uuid, resent.response_status);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/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-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://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/"
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://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/")
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{
"uuid": "66666666-7777-8888-9999-000000000004",
"session_id": "22222222-3333-4444-5555-666666666666",
"request_url": "https://yourapp.com/webhooks/didit",
"response_status": 200,
"response_time_ms": 151,
"status": "In Progress",
"webhook_type": "status.updated",
"created_at": "2026-10-16T14:05:42.330981Z",
"request_header": "{\"Content-Type\": \"application/json\", \"X-Signature\": \"b8eb1e376517ee0cad8ba98ff7f8fd35fc72eca231000963a96a335f82328835\", \"X-Signature-V2\": \"9efd2ce9ed1303e1d05273ef9608a59363ed9789a05253db4748b3e8e50cb109\", \"X-Signature-Simple\": \"bf3a9dc04b2c20ab539203b0cd5cca2a10f630bf62d8feb6d68d82af80f64774\", \"X-Timestamp\": \"1792159542\", \"User-Agent\": \"DiditWebhook/2.0 +https://didit.me\"}",
"request_body": "{\"application_id\":\"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\"created_at\":1792056057,\"environment\":\"live\",\"event_id\":\"33333333-4444-5555-6666-777777777777\",\"sandbox_scenario\":null,\"session_id\":\"22222222-3333-4444-5555-666666666666\",\"status\":\"In Progress\",\"timestamp\":1792159542,\"vendor_data\":\"user-123\",\"webhook_type\":\"status.updated\",\"workflow_id\":\"44444444-5555-6666-7777-888888888888\",\"workflow_version\":3}"
}Resend Webhook Destination Delivery
Send a past webhook delivery to your endpoint again, freshly signed, and get the new attempt with the HTTP status your endpoint returned.
curl -X POST 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/deliveries/66666666-7777-8888-9999-000000000001/resend/' \
-H 'x-api-key: YOUR_API_KEY'import os
import requests
destination_uuid = '11111111-2222-3333-4444-555555555555'
delivery_uuid = '66666666-7777-8888-9999-000000000001'
resp = requests.post(
f'https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/',
headers={'x-api-key': os.environ['DIDIT_API_KEY']},
timeout=10,
)
resp.raise_for_status()
resent = resp.json()
if resent['response_status'] is None or resent['response_status'] >= 400:
print('Your endpoint still rejects it:', resent['response_status'])
else:
print('Delivered as', resent['uuid'])const destinationUuid = '11111111-2222-3333-4444-555555555555';
const deliveryUuid = '66666666-7777-8888-9999-000000000001';
const resp = await fetch(
`https://verification.didit.me/v3/webhook/destinations/${destinationUuid}/deliveries/${deliveryUuid}/resend/`,
{ method: 'POST', headers: { 'x-api-key': process.env.DIDIT_API_KEY } },
);
if (!resp.ok) throw new Error(await resp.text());
const resent = await resp.json();
console.log(resent.uuid, resent.response_status);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/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-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://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/"
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://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/")
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{
"uuid": "66666666-7777-8888-9999-000000000004",
"session_id": "22222222-3333-4444-5555-666666666666",
"request_url": "https://yourapp.com/webhooks/didit",
"response_status": 200,
"response_time_ms": 151,
"status": "In Progress",
"webhook_type": "status.updated",
"created_at": "2026-10-16T14:05:42.330981Z",
"request_header": "{\"Content-Type\": \"application/json\", \"X-Signature\": \"b8eb1e376517ee0cad8ba98ff7f8fd35fc72eca231000963a96a335f82328835\", \"X-Signature-V2\": \"9efd2ce9ed1303e1d05273ef9608a59363ed9789a05253db4748b3e8e50cb109\", \"X-Signature-Simple\": \"bf3a9dc04b2c20ab539203b0cd5cca2a10f630bf62d8feb6d68d82af80f64774\", \"X-Timestamp\": \"1792159542\", \"User-Agent\": \"DiditWebhook/2.0 +https://didit.me\"}",
"request_body": "{\"application_id\":\"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\"created_at\":1792056057,\"environment\":\"live\",\"event_id\":\"33333333-4444-5555-6666-777777777777\",\"sandbox_scenario\":null,\"session_id\":\"22222222-3333-4444-5555-666666666666\",\"status\":\"In Progress\",\"timestamp\":1792159542,\"vendor_data\":\"user-123\",\"webhook_type\":\"status.updated\",\"workflow_id\":\"44444444-5555-6666-7777-888888888888\",\"workflow_version\":3}"
}event_id before you resend in bulk, and resend only deliveries whose response_status is null, 400 or above.Authorizations
Your application's API key, from Developers -> API keys in the Business Console. The primary key has full access. A named key can be scoped: none, read or write per resource, limited to some workflows or to approved sessions, to a list of IP addresses, and to an expiry date. 401 means the key is missing, wrong, revoked or expired; 403 means the key has no access to this resource or action, or the request came from an address outside its IP list; 404 on a session route means the session is outside the key's workflows or statuses. A key without media access receives image, video and PDF URLs as null, and a key without sessions write receives session links and tokens as null. See https://docs.didit.me/console/api-keys.
Path Parameters
UUID of the destination the delivery was sent to.
UUID of the delivery to resend: the uuid of an entry returned by GET /v3/webhook/destinations/{destination_uuid}/deliveries/.
Response
The new delivery, already attempted. response_status is what your endpoint answered this time (504 timeout, 503 connection failure). The original delivery is unchanged.
One delivery attempt to a webhook destination, with the exact request headers and body Didit sent.
Delivery ID, for the detail and resend calls.
User verification session the event is about. null for business session, user, business, transaction, Travel Rule and workflow events.
URL the delivery was sent to: the destination's URL when the event was generated.
HTTP status your endpoint returned. null while the delivery is queued and not yet attempted. When no HTTP answer was received Didit records a status of its own: 504 when your endpoint did not answer within 5 seconds, 503 for a connection failure, 400 when the URL was refused as unsafe (for example a private or internal address), and 404 for any other request error. 400 or above counts as a failed delivery.
Time the attempt took, in milliseconds. null while the delivery is queued.
x >= 0Status the event reported when it was generated: the session status for session events (for example Approved or In Review), the person's or company's status for user and business events, and the transaction status for transaction events. null for events that carry no status.
Supported webhook event name. Use these exact strings in subscribed_events; unsupported values are rejected.
status.updated, data.updated, user.status.updated, user.data.updated, business.status.updated, business.data.updated, activity.created, transaction.created, transaction.status.updated, travel_rule.status.updated, workflow.compliance_changed, auth.signup, auth.login, auth.login_failed, auth.password_reset_requested, auth.password_reset_completed, auth.mfa_changed, auth.new_device, auth.account_locked, investigator.report.ready, investigator.decision.automated, investigator.decision.overridden, investigator.decision.contested, investigator.question.raised, investigator.automation.paused, investigator.rfi.answered, investigator.rfi.overdue, investigator.drift.detected, investigator.sla.breached, investigator.qa.failed, investigator.external.report.ready When the delivery was created.
JSON text (a string) of the request headers Didit sent: Content-Type, X-Signature, X-Signature-V2, X-Signature-Simple, X-Timestamp and User-Agent. Parse it with a JSON parser. It holds signatures, never the signing secret.
JSON text (a string) of the exact payload Didit sent, keys sorted, including event_id and timestamp. Parse it with a JSON parser; see Payload shape. For a scoped key without media: read, media URLs inside it are null; without sessions: write, session tokens and hosted verification links are null. A body changed that way no longer matches its signatures. Didit does not record the response body your endpoint returned.