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