Test fire a webhook
POST
https://api.tickerbot.io/ v2/ webhooks/ {id}/ testSend a real-shape test POST to your endpoint, instantly.
Body parameters
stringrequiredWebhook id.
Returns
as_ofstringServer time this response was assembled (ISO 8601).
idstringDelivery id of the test — dl_…, the same shape as a real delivery on the deliveries route.
webhook_idstringThe webhook that was tested.
testbooleantrue — this delivery was a synthetic ping, not a trigger firing.
deliveredbooleanWhether your endpoint accepted the ping (2xx within the timeout).
http_statusnumberThe status your endpoint returned; null when it could not be reached.
elapsed_msnumberRound-trip time of the ping.
errorstringWhy delivery failed, in words; null on success.
statusstringThe delivery record's status: delivered or permanent_failure (a test is never retried).
created_atstringWhen the ping was sent (ISO 8601).
Status codes
| Code | Meaning |
|---|---|
202 | The inline delivery outcome — delivered true/false, http_status from your endpoint, elapsed_ms for the round trip, and error (if any). One-shot: a failed test fire is recorded as permanent_failure and is NOT retried (test fires never enter the standard retry ladder, and never trigger auto-disable on the parent webhook). Call /test again to re-test after fixing your receiver. |
400 | The webhook has nothing to fire over the wire — no target_url (in-app deliveries), a Discord webhook with no URL configured, or a mobile-push webhook with no device registered. |
404 | Webhook not found. |
Notes
- Fires synchronously with the payload the webhook will actually receive:
webhook.firedfor condition triggers,events.firedwith aneventsarray for event triggers. For URL targets the body has the same field set and the sameX-Tickerbot-SignatureHMAC as a real fire, so tools that introspect payload shape (n8n, Zapier, custom field mappers) lock the right schema the first time. - Discord and mobile-push targets are testable too but are never HMAC-signed — for those channels the URL or device token is itself the credential, and Discord receives its own embed format rather than the raw JSON.
- The test marker rides in an
X-Tickerbot-Test: trueHTTP header, not the body, so receivers that do not care get a payload indistinguishable from production and those that do can filter on the header. - Condition-trigger webhooks get the canonical
webhook.firedshape (event,webhook_id,name,q,as_of,matches,current_matches,matched_count,current_match_count) with one synthetic match (TBOT) populated for every signal the rule references. Event-trigger webhooks get theevents.firedshape instead —eventsarray with one synthetic event,event_count,kinds— mirroring their real deliveries; receivers handling both types should branch on theeventfield. Notestfield on the body — the marker is in theX-Tickerbot-Test: trueheader. - Test fires are ONE-SHOT: failed deliveries are recorded as
permanent_failureand never retried. They also never trigger auto-disable on the parent webhook (only real-firepermanent_failuredoes that). - Test deliveries are persisted with
test: trueon the delivery row and appear in /v2/webhooks/{id}/deliveries alongside real ones.