Endpoint
Send a test event
/v1/webhook_endpoints/{id}/pingSends one ping event to this endpoint now, in either mode, and returns the delivery attempt. It is not retried. The call waits up to 15 seconds for the try to end and answers 200 with it. When the try has not ended by then (the endpoint already has 4 tries in flight, its circuit lets one probe through at a time, or sending is paused for a moment during an Orrerie deploy), the ping stays queued and goes as soon as the endpoint is free: the call answers 202 with the attempt pending, under the whd_ id the try will carry; it then shows in the endpoint's delivery attempts (GET /). Only when Orrerie cannot say whether the ping was queued is the call answered 504 outcome_unknown with reason ping_unanswered; send it again with the same idempotency key.
- Scope a restricted key needs
webhooks:write- Publishable key
- Not allowed: secret or restricted key only
- Idempotency-Key
- Recommended. It makes a retry safe.
Parameters
| Parameter | Type and place | Meaning |
|---|---|---|
idrequired | stringpath | The id of the endpoint. |
Orrerie-Version | stringheader | API version date. Default: the version the key was created with. Example 2026-10-11. |
Idempotency-Key | stringheader | Makes a retry safe. Kept 24 hours. 1 to 255 characters. |
Request body
A JSON object. The body may be left out. A field the call does not list is refused with parameter_unknown.
Example request
curl
curl https://api.orrerie.com/v1/webhook_endpoints/we_tx7j2vmn3r2px2vpwbtz5h7b/ping \
-H "Authorization: Bearer $ORRERIE_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{}'JavaScript
const response = await fetch("https://api.orrerie.com/v1/webhook_endpoints/we_tx7j2vmn3r2px2vpwbtz5h7b/ping", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ORRERIE_SECRET_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({}),
});
const result = await response.json();
if (!response.ok) throw new Error(`${result.error.code}: ${result.error.message}`);
console.log(result);Python
import os
import requests
response = requests.post(
"https://api.orrerie.com/v1/webhook_endpoints/we_tx7j2vmn3r2px2vpwbtz5h7b/ping",
headers={"Authorization": f"Bearer {os.environ['ORRERIE_SECRET_KEY']}"},
json={},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(f"{result['error']['code']}: {result['error']['message']}")
print(result)PHP
<?php
$request = curl_init('https://api.orrerie.com/v1/webhook_endpoints/we_tx7j2vmn3r2px2vpwbtz5h7b/ping');
curl_setopt_array($request, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('ORRERIE_SECRET_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(new stdClass()),
]);
$body = curl_exec($request);
if ($body === false) {
throw new RuntimeException(curl_error($request));
}
$result = json_decode($body, true);
if (curl_getinfo($request, CURLINFO_HTTP_CODE) >= 400) {
throw new RuntimeException($result['error']['code'] . ': ' . $result['error']['message']);
}
print_r($result);Responses
200 OK
The answer is the webhook_delivery object. Headers: Orrerie-Request-Id.
Example response, 200
{
"id": "whd_dybzssesbh653tqfzcx0txw8",
"object": "webhook_delivery",
"livemode": true,
"created": "2026-10-11T14:09:55.990Z",
"event": "evt_srcv6en5gsj0b001t5650atx",
"endpoint": "we_tx7j2vmn3r2px2vpwbtz5h7b",
"attempt": 1,
"status": "succeeded",
"response_status": 200,
"duration_ms": 142,
"error": null,
"next_attempt_at": null,
"manual": true
}202 Accepted
The request was accepted and is waiting: for a person to approve it in the dashboard, or to be built in the background. Nothing has been signed or sent. The answer is the webhook_delivery object. Headers: Orrerie-Request-Id.
Example response, 202
{
"id": "whd_dybzssesbh653tqfzcx0txw8",
"object": "webhook_delivery",
"livemode": true,
"created": "2026-10-11T14:09:55.990Z",
"event": "evt_srcv6en5gsj0b001t5650atx",
"endpoint": "we_tx7j2vmn3r2px2vpwbtz5h7b",
"attempt": 1,
"status": "pending",
"response_status": null,
"duration_ms": null,
"error": null,
"next_attempt_at": "2026-10-11T14:09:55.990Z",
"manual": true
}Any other status: an error
A status of 400 or above answers with the error object. Branch on its code, never on its message.
Errors
This call has no error of its own. It answers with the errors every call can answer with: a bad key, a missing scope, an object that does not exist, the rate limit. Every error code has its own entry.