Ask for an invitation
Menu

Endpoint

Send a test event

POST/v1/webhook_endpoints/{id}/ping

Sends 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 /v1/webhook_endpoints/{id}/deliveries). 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

Parameters of Send a test event
ParameterType and placeMeaning
idrequiredstringpathThe id of the endpoint.
Orrerie-VersionstringheaderAPI version date. Default: the version the key was created with. Example 2026-10-11.
Idempotency-KeystringheaderMakes 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.