View as markdown
Endpoints · Signals

Subscribe to a signal

POSThttps://api.tickerbot.io/v2/signals/{signal}/subscribe

For boolean signals (e.g. at_52w_high, golden_cross), the predicate is signal = true and condition is ignored. For numeric signals (e.g. rsi_14, change_1m), condition is required and takes the shape ">70", "<30", ">=100", "=50". Optionally restrict the scope to a single ticker or a universe. Response includes a test_url — subscribing does NOT auto-fire; hit it to send a real-shape webhook.fired and validate your receiver.

{signal} may be one of your custom signals, resolved as a boolean signal. The subscription freezes the signal SQL at creation — editing the signal later will not change it (re-subscribe to apply). See Create a custom signal.

Plan access

Paid plans (Hobby and above).

Cadence

Real-time on every paid plan — evaluated on every data refresh (~1×/min), so a match is delivered within seconds of it landing. Optionally throttle a webhook to hourly or at-market-open.

Capacity

Hobby 10 · Pro 100 · Scale & Enterprise unlimited.

stringrequired

Signal name from the schema (case-insensitive).

string

Required for numeric signals; ignored for boolean signals. Shape: `">70"`, `"<30"`, `">=100"`, `"=50"`.

string

Restrict to a single ticker. Default: any ticker.

string

Restrict to a system or user-owned universe (e.g. `top_100`).

string

https:// URL to POST when fired. Omit for in-app delivery.

string

Delivery channel. `webhook` (POST to `target_url`), `discord` (post an embed to `discord_url`), `in_app` (dashboard only), or `mobile_push` (notify a phone signed in to the Tickerbot mobile app; requires a `device_id` from `POST /v2/devices/register`). Inferred when omitted: `webhook` if `target_url` is set, `discord` if `discord_url` is set, else `in_app`. `slack` is reserved and returns `501`. See the Delivery channels guide.

string

Discord incoming-webhook URL (`https://discord.com/api/webhooks/…`). Required when `channel` is `discord`. Stored as a posting credential and stripped from list/get responses, which set `channel_config_present: true` instead.

string

`realtime` (the default) is evaluated on every data refresh (~1×/min); `hourly` and `nyse_open` throttle to a batch schedule. `1m` is a deprecated alias for `realtime`.

string

Human-readable label (up to 80 chars).

string

Comma-separated extra columns to include in each fired payload match row, beyond the standard set (`ticker`, `name`, `asset_type`, `price`, `day_change_pct`, `market_cap`). Each must be a real column; an unknown column is rejected at creation.

200
Webhook subscription created.
400
bad_request — invalid signal name, missing condition on a numeric signal, malformed condition, etc.
404
unknown_signal — signal does not exist.