View as markdown
Endpoints · Signals

Create a custom signal

POSThttps://api.tickerbot.io/v2/signals

Persists a named boolean (or numeric) expression in the existing predicate grammar. Once saved, the name is referenceable from any SQL context — `/v2/scan` `q`, `/v2/signals/{name}`, subscribe-path `condition`, the expression body of another custom signal — and the predicate compiler inlines its body before SQL emit. The expression is compiled at create time against the live signal column whitelist; references to other custom signals you own are inlined first (recursion is detected). Names are scoped per-user: `(user_id, name)` is the key. Names cannot collide with built-in column names — those return 409 `name_collision`. Write access requires Scale or above. Hobby/Pro can read `/v2/signals` catalog but writes return `403 custom_signals_tier_required`.

Plan access

Scale and above. Hobby/Pro can read the catalog but writes return 403 custom_signals_tier_required.

Rate limit

Hobby 600/min · Pro 2,000/min · Scale 10,000/min.

Capacity

Unlimited custom signals per account on Scale and Enterprise.

201
{ as_of, signal: { name, kind: "expression", description, expr, created_at, updated_at } }.
400
compile_failed (with errors array) when the expression doesn't parse / references unknown columns. bad_request for shape failures.
403
custom_signals_tier_required — Hobby/Pro can read but not write custom signals.
409
already_exists (slug taken on this account) or name_collision (slug matches a built-in column).