Update a webhook
https://api.tickerbot.io/ v2/ webhooks/ {id}Edit a webhook in place — send only the fields you want to change.
Body parameters
stringrequiredWebhook id.
stringNew display name. Non-empty, max 80 characters.
enumEvaluation cadence. A user preference — never gated. Event triggers deliver on ingest — only realtime is accepted on them (400 otherwise).
realtime | Evaluate on every refresh — the canonical value. (1m is a deprecated alias that collapses to this.) |
hourly | Batch schedule: evaluate once an hour. |
nyse_open | Batch schedule: evaluate once per session, at the NYSE open. |
stringNew https:// delivery URL (webhook channel only — a Discord/mobile subscription 400s here). null or empty switches to in-app delivery; status is untouched — a disabled webhook stays disabled until POST /v2/webhooks/{id}/enable (the only path that re-checks your account's webhook cap).
booleanfalse disables the webhook (status → disabled). true is a no-op unless disabled, in which case use POST /v2/webhooks/{id}/enable instead.
Returns
as_ofstringServer time this response was assembled (ISO 8601).
idstringThe webhook id — `wh_…`, the handle for every other call on this record.
namestringYour label for the subscription.
qstringThe stored predicate. Custom signals appear expanded: the SQL is frozen at creation.
rule_idstringLegacy link to a v1 alert rule; `null` on everything created through v2.
fieldsstringExtra signals carried on each fired match row; `null` means the standard set.
orderstringSort signal for the payload row list; `null` means the evaluator default (`market_cap`).
dirstringSort direction for that list; `null` means the default (`desc`).
universe_idstringUniverse the trigger is scoped to, or `null` for the whole market.
cadencestringHow often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.
channelstringWhere deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.
target_urlstringYour HTTPS endpoint; `null` on every channel except `webhook`.
deliverystringLegacy alias of `channel`, kept aligned for older readers.
statusstring`active` or `disabled`. Auto-disable follows repeated delivery failure.
sourcestringWhich API version created the record; `v2` for anything you create today.
subscription_originobjectWhich door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.
last_predicate_valuestringThe trigger's value at the last evaluation; `null` until it has run.
created_atnumberCreation timestamp.
updated_atnumberLast modification timestamp.
last_firednumberWhen a delivery last went out; `null` if it never has.
last_match_setarrayTickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.
last_eval_error_atnumberWhen the last evaluation error happened; `null` on a healthy hook.
last_errorstringThe last evaluation error; `null` on a healthy hook. The answer to "why is my webhook not firing?".
next_eval_atnumberWhen the evaluator will next consider this subscription.
last_evaluated_atnumberWhen it was last evaluated; `null` until the first run.
event_kindsarrayEvent-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).
event_qstringEvent-trigger webhooks only: the payload filter, or `null`.
event_tickersarrayEvent-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.
trigger_kindstringEvent-trigger webhooks only: `event`.
Status codes
200signing_secret stripped). An empty patch body returns the current record unchanged.400target_url on a non-webhook channel, or enabled: true on a disabled webhook.404Notes
- Editable:
name,cadence,target_url,enabled. The trigger itself (q/ticker/signal/universe scope) and thechannelare immutable after creation — to change what fires, or where a Discord/mobile subscription delivers, delete and re-subscribe. - Changing
target_urldoes NOT re-validate the endpoint; there is no handshake, so confirm delivery withPOST /v2/webhooks/{id}/test. Setting it tonullor""switches delivery to in-app and leavesstatusuntouched, so a disabled webhook stays disabled. enabled: falsedisables the webhook. Re-enabling routes throughPOST /v2/webhooks/{id}/enable, which re-checks your account's webhook cap — soenabled: trueon a disabled webhook is a 400 pointing there.- After changing
target_url, firePOST /v2/webhooks/{id}/testto verify the new endpoint receives and verifies a signed delivery.