@tickerbot/mcp-server 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -14
- package/dist/handler.js +18 -2
- package/dist/index.js +4 -2
- package/dist/tools.d.ts +12 -0
- package/dist/tools.js +1044 -816
- package/package.json +1 -1
package/dist/tools.js
CHANGED
|
@@ -14,139 +14,135 @@
|
|
|
14
14
|
// Refresh with: node scripts/regen-tools.mjs (or --live)
|
|
15
15
|
export const tools = [
|
|
16
16
|
{
|
|
17
|
-
"name": "
|
|
18
|
-
"description": "
|
|
17
|
+
"name": "tickerbot_scan",
|
|
18
|
+
"description": "Screens every ticker with a SQL `WHERE` clause and returns the matches. Run it now, or add `asof` to backtest it on any past date. The `q` grammar is a flat SQL WHERE over signal names: AND/OR/NOT, comparisons, numeric and string literals, custom signals by name. No JOIN or subqueries. With `group_by` the result is rollup rows, not tickers. Example: `gap_up AND market_cap < 2000000000 AND NOT earnings_this_week`.",
|
|
19
19
|
"inputSchema": {
|
|
20
20
|
"type": "object",
|
|
21
21
|
"properties": {
|
|
22
|
-
"
|
|
22
|
+
"q": {
|
|
23
23
|
"type": "string",
|
|
24
|
-
"description": "
|
|
24
|
+
"description": "SQL WHERE expression. Max 4000 chars; semicolons, comments and write keywords are rejected. Your custom signals are valid here — each expands to its SQL at run time. To scan named tickers: `ticker IN ('AAPL', 'MSFT')`; to scan one asset class: `asset_class = 'crypto'`."
|
|
25
25
|
},
|
|
26
|
-
"
|
|
26
|
+
"universe": {
|
|
27
27
|
"type": "string",
|
|
28
|
-
"description": "
|
|
28
|
+
"description": "Slug of a system universe (`top_10`, `top_100`) or one of your own. Omitted, the screen runs across every ticker."
|
|
29
29
|
},
|
|
30
|
-
"
|
|
30
|
+
"asof": {
|
|
31
31
|
"type": "string",
|
|
32
|
-
"description": "
|
|
33
|
-
"enum": [
|
|
34
|
-
"CS",
|
|
35
|
-
"ETF",
|
|
36
|
-
"ADRC",
|
|
37
|
-
"PFD",
|
|
38
|
-
"FUND",
|
|
39
|
-
"UNIT",
|
|
40
|
-
"SP",
|
|
41
|
-
"ETS",
|
|
42
|
-
"WARRANT",
|
|
43
|
-
"RIGHT",
|
|
44
|
-
"ETN",
|
|
45
|
-
"ETV",
|
|
46
|
-
"equity"
|
|
47
|
-
]
|
|
32
|
+
"description": "Target moment as `YYYY-MM-DD` (that day's close) or an ISO timestamp (that intraday moment; daily-only signals then carry the previous session's close, never that day's) — the same read as it stood then, unlimited depth. In `q`, `now()` and `current_date` mean that moment, so `last_earnings_date >= now() - interval '7 days'` backtests as written. Full contract under As of a past date."
|
|
48
33
|
},
|
|
49
|
-
"
|
|
34
|
+
"grain": {
|
|
50
35
|
"type": "string",
|
|
51
|
-
"description": "
|
|
36
|
+
"description": "Only with `asof`. Grain the past state is read at: `1m`, `1h`, `1d` or `auto` (default). `auto` blends: each signal comes from its freshest grain at or before the instant (minute, then hourly, then the last closed daily session), so nothing is refused for grain and no ticker is dropped; `_meta.blended` and `_meta.grains_present` say what contributed. Pin a grain for a faster read with every ticker on the same clock. A signal the pinned grain does not store is a `400 interval_unavailable` naming the grains that carry it (`rsi_14`, fundamentals and valuation ratios are `1d`-only).",
|
|
52
37
|
"enum": [
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
]
|
|
38
|
+
"1m",
|
|
39
|
+
"1h",
|
|
40
|
+
"1d",
|
|
41
|
+
"auto"
|
|
42
|
+
],
|
|
43
|
+
"default": "auto"
|
|
60
44
|
},
|
|
61
|
-
"
|
|
62
|
-
"type": "
|
|
63
|
-
"description": "
|
|
64
|
-
"default": 50
|
|
45
|
+
"select": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "What each result carries, as in SQL. Omitted: the default row (ticker, name, asset_class, asset_type, price, change_1d_pct, gap_pct, relative_volume, market_cap) plus every signal used in `q` and `order`; a custom signal appears as its own value, and a cross-ticker reference (`SPY.sma_50`) is not added. A list: exactly those items, `ticker` always included; expressions with `AS` work (`price / sma_50 AS dist`) and are validated like `q`. `*`: every signal in the catalog. All aggregates (`count(*), avg(rsi_14)`) without `group_by`: one summary row, in `groups`. With `group_by`, each item is an aggregate or a group key. Aggregates: count/avg/sum/min/max/stddev/string_agg/bool_and/bool_or, plus `FILTER (WHERE …)`."
|
|
65
48
|
},
|
|
66
|
-
"
|
|
49
|
+
"group_by": {
|
|
67
50
|
"type": "string",
|
|
68
|
-
"description": "
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
},
|
|
72
|
-
"endpoint": {
|
|
73
|
-
"method": "GET",
|
|
74
|
-
"path": "/v2/tickers",
|
|
75
|
-
"paramLocation": {
|
|
76
|
-
"search": "query",
|
|
77
|
-
"asset_class": "query",
|
|
78
|
-
"asset_type": "query",
|
|
79
|
-
"exchange": "query",
|
|
80
|
-
"limit": "query",
|
|
81
|
-
"cursor": "query"
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
"name": "tickerbot_get_ticker",
|
|
87
|
-
"description": "The full ticker row, every signal on the schema page, for one symbol or a comma list of up to 50. Right now, or with `asof`, as of any past date. Pass a comma list of up to 50 symbols for a batch (`data` keyed by symbol plus `not_found`). Crypto is the X-prefixed pair (X:BTCUSD) — bare BTC/ETH are US-listed ETFs.",
|
|
88
|
-
"inputSchema": {
|
|
89
|
-
"type": "object",
|
|
90
|
-
"properties": {
|
|
91
|
-
"ticker": {
|
|
51
|
+
"description": "GROUPED SCAN: 1–6 group keys (signals, expressions or one of your custom signals as a boolean key). Results become rollups in `groups`, each carrying its keys. Name a key with `AS` to choose its JSON key (`market_cap > 1e11 AS mega`); an un-named expression is named for you rather than returned as `?column?`. Default `select`: the keys + `COUNT(*) AS tickers`. Works with `asof`; does not paginate."
|
|
52
|
+
},
|
|
53
|
+
"having": {
|
|
92
54
|
"type": "string",
|
|
93
|
-
"description": "
|
|
55
|
+
"description": "Only with `group_by`. Filter the rollups. Custom signals are valid here too."
|
|
94
56
|
},
|
|
95
|
-
"
|
|
57
|
+
"order": {
|
|
96
58
|
"type": "string",
|
|
97
|
-
"description": "
|
|
59
|
+
"description": "Signal to sort by; it joins the default row. On a grouped scan the default is the count alias `tickers` (or, with a custom `select`, the last item's alias, so alias it with `AS`), sorted NULLS LAST with the group keys as tiebreak.",
|
|
60
|
+
"default": "change_1d_pct"
|
|
98
61
|
},
|
|
99
|
-
"
|
|
62
|
+
"dir": {
|
|
100
63
|
"type": "string",
|
|
101
|
-
"description": "
|
|
64
|
+
"description": "Sort direction.",
|
|
102
65
|
"enum": [
|
|
103
|
-
"
|
|
104
|
-
"
|
|
105
|
-
"1d",
|
|
106
|
-
"auto"
|
|
66
|
+
"asc",
|
|
67
|
+
"desc"
|
|
107
68
|
],
|
|
108
|
-
"default": "
|
|
69
|
+
"default": "desc"
|
|
70
|
+
},
|
|
71
|
+
"limit": {
|
|
72
|
+
"type": "integer",
|
|
73
|
+
"description": "Page size. Max 100. Grouped scans do not paginate: `truncated: true` when groups were cut, so sort with `order` to keep the ones you want.",
|
|
74
|
+
"default": 50
|
|
75
|
+
},
|
|
76
|
+
"cursor": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"description": "Opaque cursor from the previous response's `next_cursor`. Row scans only."
|
|
109
79
|
}
|
|
110
80
|
},
|
|
111
81
|
"required": [
|
|
112
|
-
"
|
|
82
|
+
"q"
|
|
113
83
|
]
|
|
114
84
|
},
|
|
115
85
|
"endpoint": {
|
|
116
|
-
"method": "
|
|
117
|
-
"path": "/v2/
|
|
86
|
+
"method": "POST",
|
|
87
|
+
"path": "/v2/scan",
|
|
118
88
|
"paramLocation": {
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
"
|
|
89
|
+
"q": "body",
|
|
90
|
+
"universe": "body",
|
|
91
|
+
"asof": "body",
|
|
92
|
+
"grain": "body",
|
|
93
|
+
"select": "body",
|
|
94
|
+
"group_by": "body",
|
|
95
|
+
"having": "body",
|
|
96
|
+
"order": "body",
|
|
97
|
+
"dir": "body",
|
|
98
|
+
"limit": "body",
|
|
99
|
+
"cursor": "body"
|
|
100
|
+
},
|
|
101
|
+
"accepts": {
|
|
102
|
+
"as_of": "body",
|
|
103
|
+
"interval": "body",
|
|
104
|
+
"columns": "body",
|
|
105
|
+
"fields": "body",
|
|
106
|
+
"full": "body",
|
|
107
|
+
"asset_class": "body"
|
|
122
108
|
}
|
|
123
109
|
}
|
|
124
110
|
},
|
|
125
111
|
{
|
|
126
|
-
"name": "
|
|
127
|
-
"description": "
|
|
112
|
+
"name": "tickerbot_subscribe_scan",
|
|
113
|
+
"description": "Gets you an alert by webhook each time a ticker starts matching a screen. Webhooks need a paid plan (Free has no webhook slots). Use for \"alert me when this happens\" requests. A signal alert is a scan on it: `q: golden_cross`, or `q: rsi_14 > 70` for a numeric one.",
|
|
128
114
|
"inputSchema": {
|
|
129
115
|
"type": "object",
|
|
130
116
|
"properties": {
|
|
131
|
-
"
|
|
117
|
+
"q": {
|
|
132
118
|
"type": "string",
|
|
133
|
-
"description": "
|
|
119
|
+
"description": "WHERE-clause expression using signal names — the same grammar and the same 4000-char cap as `POST /v2/scan`, so anything scannable is subscribable. Custom signals are expanded and frozen in at creation."
|
|
134
120
|
},
|
|
135
|
-
"
|
|
121
|
+
"universe": {
|
|
136
122
|
"type": "string",
|
|
137
|
-
"description": "
|
|
123
|
+
"description": "System or user-owned universe to scope the screen. Unknown universes are a 404 `universe_not_found`."
|
|
138
124
|
},
|
|
139
|
-
"
|
|
125
|
+
"select": {
|
|
140
126
|
"type": "string",
|
|
141
|
-
"description": "
|
|
127
|
+
"description": "What each delivered match carries. Omitted: the scan default row (ticker, name, asset_class, asset_type, price, change_1d_pct, gap_pct, relative_volume, market_cap) plus every signal used in `q` and `order`. A list of signal names: exactly those, `ticker` always included. Each must be a real signal; unknown ones are rejected at creation."
|
|
142
128
|
},
|
|
143
|
-
"
|
|
129
|
+
"order": {
|
|
130
|
+
"type": "string",
|
|
131
|
+
"description": "Signal each delivery's match lists are sorted by before the 100-result cap applies, so a truncated list is the deterministic top 100 rather than an arbitrary sample. Must be a real signal (validated at creation).",
|
|
132
|
+
"default": "market_cap"
|
|
133
|
+
},
|
|
134
|
+
"dir": {
|
|
144
135
|
"type": "string",
|
|
145
|
-
"description": "
|
|
136
|
+
"description": "Sort direction for `order`.",
|
|
137
|
+
"enum": [
|
|
138
|
+
"asc",
|
|
139
|
+
"desc"
|
|
140
|
+
],
|
|
141
|
+
"default": "desc"
|
|
146
142
|
},
|
|
147
143
|
"channel": {
|
|
148
144
|
"type": "string",
|
|
149
|
-
"description": "Delivery channel. `webhook` (POST to `target_url`), `discord` (
|
|
145
|
+
"description": "Delivery channel. `webhook` (POST to `target_url`), `discord` (embed to `discord_url`), `in_app` (dashboard only) or `mobile_push` (to `device_id`). Inferred when omitted: `webhook` if `target_url` is set, `discord` if `discord_url` is set, `mobile_push` if `device_id` is set, else `in_app`.",
|
|
150
146
|
"enum": [
|
|
151
147
|
"webhook",
|
|
152
148
|
"discord",
|
|
@@ -154,17 +150,21 @@ export const tools = [
|
|
|
154
150
|
"mobile_push"
|
|
155
151
|
]
|
|
156
152
|
},
|
|
153
|
+
"target_url": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": "Only with `channel=webhook`. https:// URL to POST when a ticker starts matching."
|
|
156
|
+
},
|
|
157
157
|
"discord_url": {
|
|
158
158
|
"type": "string",
|
|
159
|
-
"description": "Discord incoming-webhook URL
|
|
159
|
+
"description": "Only with `channel=discord`. Discord incoming-webhook URL. Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliveries) strips it and sets `channel_config_present: true` instead."
|
|
160
160
|
},
|
|
161
161
|
"device_id": {
|
|
162
162
|
"type": "string",
|
|
163
|
-
"description": "Device to notify, from `POST /v2/devices/register`.
|
|
163
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. Unknown ids are a 404 `device_not_found`."
|
|
164
164
|
},
|
|
165
165
|
"cadence": {
|
|
166
166
|
"type": "string",
|
|
167
|
-
"description": "
|
|
167
|
+
"description": "`realtime` (the default) is checked each time the data refreshes, about once a minute; `hourly` and `nyse_open` are checked on that schedule.",
|
|
168
168
|
"enum": [
|
|
169
169
|
"realtime",
|
|
170
170
|
"hourly",
|
|
@@ -173,92 +173,116 @@ export const tools = [
|
|
|
173
173
|
},
|
|
174
174
|
"name": {
|
|
175
175
|
"type": "string",
|
|
176
|
-
"description": "Human-readable label (up to 80 chars). Defaults to
|
|
177
|
-
},
|
|
178
|
-
"columns": {
|
|
179
|
-
"type": "string",
|
|
180
|
-
"description": "Comma-separated extra signals to include in each fired payload match row, beyond the standard set (`ticker`, `name`, `asset_type`, `price`, `change_1d_pct`, `market_cap`). Each must be a real signal; an unknown signal is rejected at creation. `fields` accepted as an alias — and note the RESPONSE reports them under `fields`, as an array."
|
|
181
|
-
},
|
|
182
|
-
"order": {
|
|
183
|
-
"type": "string",
|
|
184
|
-
"description": "Signal the fired payload's match lists are sorted by before the 100-row cap is applied, so a truncated list is the deterministic top 100 rather than an arbitrary sample. Must be a real signal (validated at creation).",
|
|
185
|
-
"default": "market_cap"
|
|
186
|
-
},
|
|
187
|
-
"dir": {
|
|
188
|
-
"type": "string",
|
|
189
|
-
"description": "Sort direction for `order`.",
|
|
190
|
-
"enum": [
|
|
191
|
-
"asc",
|
|
192
|
-
"desc"
|
|
193
|
-
],
|
|
194
|
-
"default": "desc"
|
|
176
|
+
"description": "Human-readable label (up to 80 chars). Defaults to `scan: <q>`."
|
|
195
177
|
}
|
|
196
178
|
},
|
|
197
179
|
"required": [
|
|
198
|
-
"ticker",
|
|
199
180
|
"q"
|
|
200
181
|
]
|
|
201
182
|
},
|
|
202
183
|
"endpoint": {
|
|
203
184
|
"method": "POST",
|
|
204
|
-
"path": "/v2/
|
|
185
|
+
"path": "/v2/scan/subscribe",
|
|
205
186
|
"paramLocation": {
|
|
206
|
-
"ticker": "path",
|
|
207
187
|
"q": "body",
|
|
208
|
-
"
|
|
209
|
-
"
|
|
188
|
+
"universe": "body",
|
|
189
|
+
"select": "body",
|
|
190
|
+
"order": "body",
|
|
191
|
+
"dir": "body",
|
|
210
192
|
"channel": "body",
|
|
193
|
+
"target_url": "body",
|
|
211
194
|
"discord_url": "body",
|
|
212
195
|
"device_id": "body",
|
|
213
196
|
"cadence": "body",
|
|
214
|
-
"name": "body"
|
|
215
|
-
"columns": "body",
|
|
216
|
-
"order": "body",
|
|
217
|
-
"dir": "body"
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
"name": "tickerbot_get_ticker_coverage",
|
|
223
|
-
"description": "For one ticker, what we hold and how far back — so an empty result is never ambiguous. Ask this before treating a gap in bars or series as an outage. `minute_tier.included: false` with `on_demand: true` is not a gap — sub-hour bars fetch from the provider on first request.",
|
|
224
|
-
"inputSchema": {
|
|
225
|
-
"type": "object",
|
|
226
|
-
"properties": {
|
|
227
|
-
"ticker": {
|
|
228
|
-
"type": "string",
|
|
229
|
-
"description": "Case-insensitive. Equities are bare symbols (`AAPL`); every other class carries a prefix — rates (`R:SOFR`), crypto (`X:BTCUSD`), fx (`X:EURUSD`). Bare `BTC`/`ETH` are US-listed ETFs, not spot crypto. See Tickers."
|
|
230
|
-
}
|
|
197
|
+
"name": "body"
|
|
231
198
|
},
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
"endpoint": {
|
|
237
|
-
"method": "GET",
|
|
238
|
-
"path": "/v2/tickers/{ticker}/coverage",
|
|
239
|
-
"paramLocation": {
|
|
240
|
-
"ticker": "path"
|
|
199
|
+
"accepts": {
|
|
200
|
+
"universe_id": "body",
|
|
201
|
+
"columns": "body",
|
|
202
|
+
"fields": "body"
|
|
241
203
|
}
|
|
242
204
|
}
|
|
243
205
|
},
|
|
244
206
|
{
|
|
245
207
|
"name": "tickerbot_list_signals",
|
|
246
|
-
"description": "
|
|
208
|
+
"description": "Lists every signal you can screen on: the built-ins and your custom signals, in one catalog you can filter, search and page. Use to discover the signal names and `q` vocabulary before composing a scan; custom signals appear with `kind: custom`. Narrow it with `category`, `group`, `type`, `search` and `select=type,description` rather than reading all ~460 rows.",
|
|
247
209
|
"inputSchema": {
|
|
248
210
|
"type": "object",
|
|
249
211
|
"properties": {
|
|
250
212
|
"kind": {
|
|
251
213
|
"type": "string",
|
|
252
|
-
"description": "Filter by kind (
|
|
214
|
+
"description": "Filter by kind (one or a comma list). Omit to return both.",
|
|
253
215
|
"enum": [
|
|
254
216
|
"builtin",
|
|
255
217
|
"custom"
|
|
256
218
|
]
|
|
257
219
|
},
|
|
220
|
+
"search": {
|
|
221
|
+
"type": "string",
|
|
222
|
+
"description": "Case-insensitive text match on the name and description."
|
|
223
|
+
},
|
|
224
|
+
"group": {
|
|
225
|
+
"type": "string",
|
|
226
|
+
"description": "One taxonomy group slug or a comma list (`technicals,fundamentals`). Groups and their categories are in `taxonomy`."
|
|
227
|
+
},
|
|
228
|
+
"category": {
|
|
229
|
+
"type": "string",
|
|
230
|
+
"description": "One category slug or a comma list (`oscillators,trend`)."
|
|
231
|
+
},
|
|
232
|
+
"type": {
|
|
233
|
+
"type": "string",
|
|
234
|
+
"description": "One value type or a comma list. Custom signals are always `boolean`.",
|
|
235
|
+
"enum": [
|
|
236
|
+
"numeric",
|
|
237
|
+
"boolean",
|
|
238
|
+
"string",
|
|
239
|
+
"date",
|
|
240
|
+
"timestamp",
|
|
241
|
+
"jsonb",
|
|
242
|
+
"string[]"
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
"asset_class": {
|
|
246
|
+
"type": "string",
|
|
247
|
+
"description": "Signals that apply to this asset class (one or a comma list), e.g. `crypto`."
|
|
248
|
+
},
|
|
249
|
+
"refresh": {
|
|
250
|
+
"type": "string",
|
|
251
|
+
"description": "Signals that update on this schedule (one or a comma list).",
|
|
252
|
+
"enum": [
|
|
253
|
+
"1m_4am_8pm_et",
|
|
254
|
+
"1m_24_7",
|
|
255
|
+
"5m",
|
|
256
|
+
"10m",
|
|
257
|
+
"15m",
|
|
258
|
+
"30m",
|
|
259
|
+
"1h",
|
|
260
|
+
"daily",
|
|
261
|
+
"daily_after_close",
|
|
262
|
+
"weekly",
|
|
263
|
+
"monthly",
|
|
264
|
+
"quarterly",
|
|
265
|
+
"on_event",
|
|
266
|
+
"static",
|
|
267
|
+
"custom"
|
|
268
|
+
]
|
|
269
|
+
},
|
|
270
|
+
"grain": {
|
|
271
|
+
"type": "string",
|
|
272
|
+
"description": "Signals with stored history at this grain (one or a comma list): what an as-of read or the history read can serve at it.",
|
|
273
|
+
"enum": [
|
|
274
|
+
"1m",
|
|
275
|
+
"1h",
|
|
276
|
+
"1d"
|
|
277
|
+
]
|
|
278
|
+
},
|
|
279
|
+
"select": {
|
|
280
|
+
"type": "string",
|
|
281
|
+
"description": "The fields each row carries (`name` is always included), e.g. `type,description`."
|
|
282
|
+
},
|
|
258
283
|
"limit": {
|
|
259
284
|
"type": "integer",
|
|
260
|
-
"description": "Page size
|
|
261
|
-
"default": 50
|
|
285
|
+
"description": "Page size over the whole list: your custom signals (newest first), then the built-ins A→Z. Max 500 until 2027-01-12, then 100 (a larger value is clamped to the max, not an error; `next_cursor` pages the rest; see Deprecations). Omitted, every matching signal comes back in one response until 2027-01-12; after that a call pages at a default limit."
|
|
262
286
|
},
|
|
263
287
|
"cursor": {
|
|
264
288
|
"type": "string",
|
|
@@ -271,6 +295,14 @@ export const tools = [
|
|
|
271
295
|
"path": "/v2/signals",
|
|
272
296
|
"paramLocation": {
|
|
273
297
|
"kind": "query",
|
|
298
|
+
"search": "query",
|
|
299
|
+
"group": "query",
|
|
300
|
+
"category": "query",
|
|
301
|
+
"type": "query",
|
|
302
|
+
"asset_class": "query",
|
|
303
|
+
"refresh": "query",
|
|
304
|
+
"grain": "query",
|
|
305
|
+
"select": "query",
|
|
274
306
|
"limit": "query",
|
|
275
307
|
"cursor": "query"
|
|
276
308
|
}
|
|
@@ -278,17 +310,17 @@ export const tools = [
|
|
|
278
310
|
},
|
|
279
311
|
{
|
|
280
312
|
"name": "tickerbot_create_custom_signal",
|
|
281
|
-
"description": "
|
|
313
|
+
"description": "Saves a named true/false SQL expression you can screen on anywhere a built-in signal works.",
|
|
282
314
|
"inputSchema": {
|
|
283
315
|
"type": "object",
|
|
284
316
|
"properties": {
|
|
285
317
|
"name": {
|
|
286
318
|
"type": "string",
|
|
287
|
-
"description": "Slug — `^[a-z][a-z0-9_]{0,63}$`. Must not collide with any built-in signal name, and 15 names are reserved outright: `columns`, plus the
|
|
319
|
+
"description": "Slug — `^[a-z][a-z0-9_]{0,63}$`. Must not collide with any built-in signal name, and 15 names are reserved outright: `columns`, plus the OHLCV aliases of the history read `open`/`high`/`low`/`close`/`volume`/`vwap`/`trades` and `o`/`h`/`l`/`c`/`v`/`vw`/`n` (those resolve to bars before custom lookup). This is the signal's API handle: it's what you reference in `q` and in the CRUD path."
|
|
288
320
|
},
|
|
289
321
|
"expr": {
|
|
290
322
|
"type": "string",
|
|
291
|
-
"description": "Boolean SQL predicate. May reference built-in signals and other custom signals you own. Must evaluate to true/false. Max 4000 chars. Stricter grammar than scan `q`: comparisons, `AND`/`OR`/`NOT`, `IN`, `BETWEEN`, `IS [NOT] NULL`, arithmetic
|
|
323
|
+
"description": "Boolean SQL predicate. May reference built-in signals and other custom signals you own. Must evaluate to true/false. Max 4000 chars. Stricter grammar than scan `q`: comparisons, `AND`/`OR`/`NOT`, `IN`, `BETWEEN`, `IS [NOT] NULL`, arithmetic and the functions `abs`/`coalesce`/`round`/`least`/`greatest` only — no `LIKE`/`ILIKE`, no `CASE`, no `::` casts, no other functions. An expression that scans fine can still be rejected here with `compile_failed`. What you send is what you read back: responses echo your expression as stored, not its expansion. A signal referencing another custom of yours returns the reference as you typed it — the inlined SQL exists only internally, and is what a subscribe endpoint freezes into a webhook. The one rewrite: a signal named under its pre-2026-09-07 spelling (`bollinger_pct_b`) is stored under its current name (`bollinger_b`) and reported in `_meta.deprecated_signals`."
|
|
292
324
|
},
|
|
293
325
|
"description": {
|
|
294
326
|
"type": "string",
|
|
@@ -311,126 +343,145 @@ export const tools = [
|
|
|
311
343
|
}
|
|
312
344
|
},
|
|
313
345
|
{
|
|
314
|
-
"name": "
|
|
315
|
-
"description": "
|
|
346
|
+
"name": "tickerbot_get_signal",
|
|
347
|
+
"description": "Returns what one signal is (its catalog entry, the same object List signals returns for it) and every ticker matching it, live or on any past date with `asof`: a screen on that one signal. Returns `catalog` (what the signal is) every time. Booleans list their matches with no `condition`; every other type lists them only with one, typed like the signal: \">70\" (numeric), \"<YYYY-MM-DDTHH:MM:SSZ\" (timestamp), \">=YYYY-MM-DD\" (date), \"=ETF\" (string); without it you get the catalog entry and a `note`. Without `order`, a non-boolean sorts by its value in the direction the condition implies (`<` ascending, `>` descending). To know when each ticker started matching, use tickerbot_list_events with kind=signal, signal=<name>, transition=enter.",
|
|
316
348
|
"inputSchema": {
|
|
317
349
|
"type": "object",
|
|
318
350
|
"properties": {
|
|
319
351
|
"signal": {
|
|
320
352
|
"type": "string",
|
|
321
|
-
"description": "
|
|
353
|
+
"description": "A signal name. Booleans (e.g. `golden_cross`, `above_sma_50`) are detected automatically; every other type (numeric `rsi_14`, timestamp `price_asof`, date `earnings_date`, string `asset_class`) requires a `condition`."
|
|
322
354
|
},
|
|
323
|
-
"
|
|
355
|
+
"condition": {
|
|
324
356
|
"type": "string",
|
|
325
|
-
"description": "
|
|
357
|
+
"description": "Lists the matches of a non-boolean signal; without it the response carries the catalog entry and a `note` instead of `results`. The shape follows the signal's `type` in the catalog. Single bound, `<op><value>`. numeric: `>70`, `<=200`, `!=0` (operators `>`, `>=`, `=`, `!=`, `<`, `<=`). timestamp: an ISO instant, `<YYYY-MM-DDTHH:MM:SSZ` or `>=YYYY-MM-DD` (a bare date is midnight UTC). date: `>=YYYY-MM-DD` or `=YYYY-MM-DD`. string: `=ETF` or `!=ETF` (`=` and `!=` only; quotes optional). A relative window (\"older than 15 minutes\") is a `/v2/scan` query: `price_asof < now() - interval '15 minutes'`. Sending a condition with a boolean or custom signal returns 400 (it does not apply)."
|
|
326
358
|
},
|
|
327
|
-
"
|
|
359
|
+
"universe": {
|
|
328
360
|
"type": "string",
|
|
329
|
-
"description": "
|
|
361
|
+
"description": "Scope to a system or caller-owned universe slug."
|
|
330
362
|
},
|
|
331
|
-
"
|
|
332
|
-
"type": "string",
|
|
333
|
-
"description": "New slug — renames the signal and changes its API handle everywhere (same validation as create). Refused while other custom signals reference the current name. `name` is accepted as an alias (new_name wins when both are sent), but new_name is the unambiguous spelling since the URL already carries the current name."
|
|
334
|
-
}
|
|
335
|
-
},
|
|
336
|
-
"required": [
|
|
337
|
-
"signal"
|
|
338
|
-
]
|
|
339
|
-
},
|
|
340
|
-
"endpoint": {
|
|
341
|
-
"method": "PATCH",
|
|
342
|
-
"path": "/v2/signals/{signal}",
|
|
343
|
-
"paramLocation": {
|
|
344
|
-
"signal": "path",
|
|
345
|
-
"expr": "body",
|
|
346
|
-
"description": "body",
|
|
347
|
-
"new_name": "body"
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
},
|
|
351
|
-
{
|
|
352
|
-
"name": "tickerbot_delete_custom_signal",
|
|
353
|
-
"description": "Delete one of your custom signals. Refused by default if another of your signals references it.",
|
|
354
|
-
"inputSchema": {
|
|
355
|
-
"type": "object",
|
|
356
|
-
"properties": {
|
|
357
|
-
"signal": {
|
|
363
|
+
"asof": {
|
|
358
364
|
"type": "string",
|
|
359
|
-
"description": "
|
|
365
|
+
"description": "Target moment as `YYYY-MM-DD` (that day's close) or an ISO timestamp (that intraday moment; daily-only signals then carry the previous session's close, never that day's) — the same read as it stood then, unlimited depth. Full contract under As of a past date."
|
|
360
366
|
},
|
|
361
|
-
"
|
|
362
|
-
"type": "
|
|
363
|
-
"description": "
|
|
364
|
-
"
|
|
365
|
-
|
|
367
|
+
"grain": {
|
|
368
|
+
"type": "string",
|
|
369
|
+
"description": "Only with `asof`. Grain the past state is read at: `1m`, `1h`, `1d` or `auto` (default). `auto` blends: each signal comes from its freshest grain at or before the instant (minute, then hourly, then the last closed daily session), so nothing is refused for grain and no ticker is dropped; `_meta.blended` and `_meta.grains_present` say what contributed. Pin a grain for the fastest response: one grain is read instead of three, and every ticker is captured on the same clock. A signal the pinned grain does not store is a `400 interval_unavailable` naming the grains that carry it (`rsi_14`, fundamentals and valuation ratios are `1d`-only).",
|
|
370
|
+
"enum": [
|
|
371
|
+
"1m",
|
|
372
|
+
"1h",
|
|
373
|
+
"1d",
|
|
374
|
+
"auto"
|
|
375
|
+
],
|
|
376
|
+
"default": "auto"
|
|
377
|
+
},
|
|
378
|
+
"select": {
|
|
379
|
+
"type": "string",
|
|
380
|
+
"description": "Signals each match carries beside `value`, e.g. `market_cap,sector`."
|
|
381
|
+
},
|
|
382
|
+
"order": {
|
|
383
|
+
"type": "string",
|
|
384
|
+
"description": "Signal to sort by (or `ticker`). Omitted: a yes/no signal lists tickers A→Z; any other signal sorts by its value in the direction the condition implies (`<`/`<=` ascending, `>`/`>=` descending)."
|
|
385
|
+
},
|
|
386
|
+
"dir": {
|
|
387
|
+
"type": "string",
|
|
388
|
+
"description": "Sort direction. Omitted: the direction the default order implies, else `desc`.",
|
|
389
|
+
"enum": [
|
|
390
|
+
"asc",
|
|
391
|
+
"desc"
|
|
392
|
+
]
|
|
393
|
+
},
|
|
394
|
+
"limit": {
|
|
395
|
+
"type": "integer",
|
|
396
|
+
"description": "Page size. Max 200 until 2027-01-12, then 100 (a larger value is clamped to the max, not an error; `next_cursor` pages the rest; see Deprecations).",
|
|
397
|
+
"default": 50
|
|
398
|
+
},
|
|
399
|
+
"cursor": {
|
|
400
|
+
"type": "string",
|
|
401
|
+
"description": "Opaque cursor from the previous response."
|
|
402
|
+
}
|
|
366
403
|
},
|
|
367
404
|
"required": [
|
|
368
405
|
"signal"
|
|
369
406
|
]
|
|
370
407
|
},
|
|
371
408
|
"endpoint": {
|
|
372
|
-
"method": "
|
|
409
|
+
"method": "GET",
|
|
373
410
|
"path": "/v2/signals/{signal}",
|
|
374
411
|
"paramLocation": {
|
|
375
412
|
"signal": "path",
|
|
376
|
-
"
|
|
413
|
+
"condition": "query",
|
|
414
|
+
"universe": "query",
|
|
415
|
+
"asof": "query",
|
|
416
|
+
"grain": "query",
|
|
417
|
+
"select": "query",
|
|
418
|
+
"order": "query",
|
|
419
|
+
"dir": "query",
|
|
420
|
+
"limit": "query",
|
|
421
|
+
"cursor": "query"
|
|
422
|
+
},
|
|
423
|
+
"accepts": {
|
|
424
|
+
"as_of": "query",
|
|
425
|
+
"interval": "query",
|
|
426
|
+
"sort_by": "query",
|
|
427
|
+
"include_active_since": "query"
|
|
377
428
|
}
|
|
378
429
|
}
|
|
379
430
|
},
|
|
380
431
|
{
|
|
381
|
-
"name": "
|
|
382
|
-
"description": "
|
|
432
|
+
"name": "tickerbot_update_custom_signal",
|
|
433
|
+
"description": "Updates a custom signal you own: its expression, description or name.",
|
|
383
434
|
"inputSchema": {
|
|
384
435
|
"type": "object",
|
|
385
436
|
"properties": {
|
|
386
437
|
"signal": {
|
|
387
438
|
"type": "string",
|
|
388
|
-
"description": "
|
|
389
|
-
},
|
|
390
|
-
"asof": {
|
|
391
|
-
"type": "string",
|
|
392
|
-
"description": "Optional. Target moment as `YYYY-MM-DD` (that day's close) or an ISO timestamp (that intraday moment) — the same read as it stood then, unlimited depth. Full contract under As of a past date."
|
|
393
|
-
},
|
|
394
|
-
"interval": {
|
|
395
|
-
"type": "string",
|
|
396
|
-
"description": "Grain the past state is reconstructed at: `1m`, `1h`, `1d`, or `auto` (default). Only valid alongside `asof` — a live read with `interval` is a 400. Details under As of a past date.",
|
|
397
|
-
"enum": [
|
|
398
|
-
"1m",
|
|
399
|
-
"1h",
|
|
400
|
-
"1d",
|
|
401
|
-
"auto"
|
|
402
|
-
],
|
|
403
|
-
"default": "auto"
|
|
439
|
+
"description": "Custom signal slug (the signal name). A built-in name answers 404 — built-ins are read-only."
|
|
404
440
|
},
|
|
405
|
-
"
|
|
441
|
+
"new_name": {
|
|
406
442
|
"type": "string",
|
|
407
|
-
"description": "
|
|
443
|
+
"description": "New slug — renames the signal and changes its API handle everywhere (same validation as create). Refused while other custom signals reference the current name."
|
|
408
444
|
},
|
|
409
|
-
"
|
|
445
|
+
"expr": {
|
|
410
446
|
"type": "string",
|
|
411
|
-
"description": "
|
|
412
|
-
},
|
|
413
|
-
"limit": {
|
|
414
|
-
"type": "integer",
|
|
415
|
-
"description": "Page size. Max 200.",
|
|
416
|
-
"default": 50
|
|
447
|
+
"description": "New SQL expression. Re-validated and re-inlined against your other custom signals. Same strict grammar as create: no `LIKE`/`ILIKE`, `CASE`, `::` casts or functions beyond `abs`/`coalesce`/`round`/`least`/`greatest`. The response echoes your expression as stored, not its expansion (a pre-2026-09-07 column spelling is stored under its current name and reported in `_meta.deprecated_signals`)."
|
|
417
448
|
},
|
|
418
|
-
"
|
|
449
|
+
"description": {
|
|
419
450
|
"type": "string",
|
|
420
|
-
"description": "
|
|
421
|
-
}
|
|
422
|
-
|
|
451
|
+
"description": "New description. Not derived from `expr` — change both if the prose describes a threshold you are moving."
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
"required": [
|
|
455
|
+
"signal"
|
|
456
|
+
]
|
|
457
|
+
},
|
|
458
|
+
"endpoint": {
|
|
459
|
+
"method": "PATCH",
|
|
460
|
+
"path": "/v2/signals/{signal}",
|
|
461
|
+
"paramLocation": {
|
|
462
|
+
"signal": "path",
|
|
463
|
+
"new_name": "body",
|
|
464
|
+
"expr": "body",
|
|
465
|
+
"description": "body"
|
|
466
|
+
},
|
|
467
|
+
"accepts": {
|
|
468
|
+
"name": "body"
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"name": "tickerbot_delete_custom_signal",
|
|
474
|
+
"description": "Deletes one of your custom signals. Refused by default if another of your signals references it.",
|
|
475
|
+
"inputSchema": {
|
|
476
|
+
"type": "object",
|
|
477
|
+
"properties": {
|
|
478
|
+
"signal": {
|
|
423
479
|
"type": "string",
|
|
424
|
-
"description": "
|
|
425
|
-
"enum": [
|
|
426
|
-
"default",
|
|
427
|
-
"market_cap"
|
|
428
|
-
],
|
|
429
|
-
"default": "default"
|
|
480
|
+
"description": "Custom signal slug (the signal name). A built-in name answers 404 — built-ins are read-only."
|
|
430
481
|
},
|
|
431
|
-
"
|
|
482
|
+
"force": {
|
|
432
483
|
"type": "boolean",
|
|
433
|
-
"description": "
|
|
484
|
+
"description": "When `true`, skip the reference check and delete; referencing signals fail with `unknown_column` the next time they compile.",
|
|
434
485
|
"default": false
|
|
435
486
|
}
|
|
436
487
|
},
|
|
@@ -439,50 +490,53 @@ export const tools = [
|
|
|
439
490
|
]
|
|
440
491
|
},
|
|
441
492
|
"endpoint": {
|
|
442
|
-
"method": "
|
|
493
|
+
"method": "DELETE",
|
|
443
494
|
"path": "/v2/signals/{signal}",
|
|
444
495
|
"paramLocation": {
|
|
445
496
|
"signal": "path",
|
|
446
|
-
"
|
|
447
|
-
"interval": "query",
|
|
448
|
-
"condition": "query",
|
|
449
|
-
"universe": "query",
|
|
450
|
-
"limit": "query",
|
|
451
|
-
"cursor": "query",
|
|
452
|
-
"sort_by": "query",
|
|
453
|
-
"include_active_since": "query"
|
|
497
|
+
"force": "query"
|
|
454
498
|
}
|
|
455
499
|
}
|
|
456
500
|
},
|
|
457
501
|
{
|
|
458
502
|
"name": "tickerbot_subscribe_signal",
|
|
459
|
-
"description": "
|
|
503
|
+
"description": "Gets you an alert by webhook each time a ticker starts matching one signal, bounded by a condition the way Get a signal is. Webhooks need a paid plan (Free has no webhook slots). A yes/no or custom signal takes no `condition`; any other signal needs one (`<30`). For a compound condition use tickerbot_subscribe_scan.",
|
|
460
504
|
"inputSchema": {
|
|
461
505
|
"type": "object",
|
|
462
506
|
"properties": {
|
|
463
507
|
"signal": {
|
|
464
508
|
"type": "string",
|
|
465
|
-
"description": "
|
|
509
|
+
"description": "A signal name: a built-in signal or one of your custom signals. An unknown name is a 404."
|
|
466
510
|
},
|
|
467
511
|
"condition": {
|
|
468
512
|
"type": "string",
|
|
469
|
-
"description": "
|
|
513
|
+
"description": "The bound, in Get a signal's grammar: required for every signal that is not yes/no, shaped by its `type`. numeric: `>70`, `<30`, `!=0`. timestamp: `<YYYY-MM-DDTHH:MM:SSZ` or `>=YYYY-MM-DD`. date: `>=YYYY-MM-DD`. string: `=ETF` or `!=ETF`. A yes/no or custom signal takes none; sending one is a 400."
|
|
470
514
|
},
|
|
471
|
-
"
|
|
515
|
+
"universe": {
|
|
472
516
|
"type": "string",
|
|
473
|
-
"description": "Restrict to a
|
|
517
|
+
"description": "Restrict to a system or user-owned universe. Unknown universes are a 404 `universe_not_found`."
|
|
474
518
|
},
|
|
475
|
-
"
|
|
519
|
+
"select": {
|
|
476
520
|
"type": "string",
|
|
477
|
-
"description": "
|
|
521
|
+
"description": "What each delivered match carries. Omitted: the scan default row plus the signal. A list of signal names: exactly those, `ticker` always included."
|
|
478
522
|
},
|
|
479
|
-
"
|
|
523
|
+
"order": {
|
|
480
524
|
"type": "string",
|
|
481
|
-
"description": "
|
|
525
|
+
"description": "Signal each delivery's match lists are sorted by before the 100-result cap applies, so a truncated list is the deterministic top 100 rather than an arbitrary sample. Must be a real signal (validated at creation).",
|
|
526
|
+
"default": "market_cap"
|
|
527
|
+
},
|
|
528
|
+
"dir": {
|
|
529
|
+
"type": "string",
|
|
530
|
+
"description": "Sort direction for `order`.",
|
|
531
|
+
"enum": [
|
|
532
|
+
"asc",
|
|
533
|
+
"desc"
|
|
534
|
+
],
|
|
535
|
+
"default": "desc"
|
|
482
536
|
},
|
|
483
537
|
"channel": {
|
|
484
538
|
"type": "string",
|
|
485
|
-
"description": "Delivery channel. `webhook` (POST to `target_url`), `discord` (
|
|
539
|
+
"description": "Delivery channel. `webhook` (POST to `target_url`), `discord` (embed to `discord_url`), `in_app` (dashboard only) or `mobile_push` (to `device_id`). Inferred when omitted: `webhook` if `target_url` is set, `discord` if `discord_url` is set, `mobile_push` if `device_id` is set, else `in_app`.",
|
|
486
540
|
"enum": [
|
|
487
541
|
"webhook",
|
|
488
542
|
"discord",
|
|
@@ -490,17 +544,21 @@ export const tools = [
|
|
|
490
544
|
"mobile_push"
|
|
491
545
|
]
|
|
492
546
|
},
|
|
547
|
+
"target_url": {
|
|
548
|
+
"type": "string",
|
|
549
|
+
"description": "Only with `channel=webhook`. https:// URL to POST when a ticker starts matching."
|
|
550
|
+
},
|
|
493
551
|
"discord_url": {
|
|
494
552
|
"type": "string",
|
|
495
|
-
"description": "Discord incoming-webhook URL
|
|
553
|
+
"description": "Only with `channel=discord`. Discord incoming-webhook URL. Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliveries) strips it and sets `channel_config_present: true` instead."
|
|
496
554
|
},
|
|
497
555
|
"device_id": {
|
|
498
556
|
"type": "string",
|
|
499
|
-
"description": "Device to notify, from `POST /v2/devices/register`.
|
|
557
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. Unknown ids are a 404 `device_not_found`."
|
|
500
558
|
},
|
|
501
559
|
"cadence": {
|
|
502
560
|
"type": "string",
|
|
503
|
-
"description": "`realtime` (the default) is
|
|
561
|
+
"description": "`realtime` (the default) is checked each time the data refreshes, about once a minute; `hourly` and `nyse_open` are checked on that schedule.",
|
|
504
562
|
"enum": [
|
|
505
563
|
"realtime",
|
|
506
564
|
"hourly",
|
|
@@ -509,25 +567,7 @@ export const tools = [
|
|
|
509
567
|
},
|
|
510
568
|
"name": {
|
|
511
569
|
"type": "string",
|
|
512
|
-
"description": "Human-readable label (up to 80 chars). Defaults to the predicate
|
|
513
|
-
},
|
|
514
|
-
"columns": {
|
|
515
|
-
"type": "string",
|
|
516
|
-
"description": "Comma-separated extra signals to include in each fired payload match row, beyond the standard set (`ticker`, `name`, `asset_type`, `price`, `change_1d_pct`, `market_cap`). Each must be a real signal; an unknown signal is rejected at creation. `fields` accepted as an alias — and note the RESPONSE reports them under `fields`, as an array."
|
|
517
|
-
},
|
|
518
|
-
"order": {
|
|
519
|
-
"type": "string",
|
|
520
|
-
"description": "Signal the fired payload's match lists are sorted by before the 100-row cap is applied, so a truncated list is the deterministic top 100 rather than an arbitrary sample. Must be a real signal (validated at creation).",
|
|
521
|
-
"default": "market_cap"
|
|
522
|
-
},
|
|
523
|
-
"dir": {
|
|
524
|
-
"type": "string",
|
|
525
|
-
"description": "Sort direction for `order`.",
|
|
526
|
-
"enum": [
|
|
527
|
-
"asc",
|
|
528
|
-
"desc"
|
|
529
|
-
],
|
|
530
|
-
"default": "desc"
|
|
570
|
+
"description": "Human-readable label (up to 80 chars). Defaults to the predicate: `golden_cross`, or `rsi_14 < 30`."
|
|
531
571
|
}
|
|
532
572
|
},
|
|
533
573
|
"required": [
|
|
@@ -540,290 +580,312 @@ export const tools = [
|
|
|
540
580
|
"paramLocation": {
|
|
541
581
|
"signal": "path",
|
|
542
582
|
"condition": "body",
|
|
543
|
-
"ticker": "body",
|
|
544
583
|
"universe": "body",
|
|
545
|
-
"
|
|
584
|
+
"select": "body",
|
|
585
|
+
"order": "body",
|
|
586
|
+
"dir": "body",
|
|
546
587
|
"channel": "body",
|
|
588
|
+
"target_url": "body",
|
|
547
589
|
"discord_url": "body",
|
|
548
590
|
"device_id": "body",
|
|
549
591
|
"cadence": "body",
|
|
550
|
-
"name": "body"
|
|
592
|
+
"name": "body"
|
|
593
|
+
},
|
|
594
|
+
"accepts": {
|
|
595
|
+
"universe_id": "body",
|
|
551
596
|
"columns": "body",
|
|
552
|
-
"
|
|
553
|
-
"dir": "body"
|
|
597
|
+
"fields": "body"
|
|
554
598
|
}
|
|
555
599
|
}
|
|
556
600
|
},
|
|
557
601
|
{
|
|
558
|
-
"name": "
|
|
559
|
-
"description": "
|
|
602
|
+
"name": "tickerbot_list_tickers",
|
|
603
|
+
"description": "Lists every ticker we track, active or delisted, with its identity. For everything about one, use Get a ticker.",
|
|
560
604
|
"inputSchema": {
|
|
561
605
|
"type": "object",
|
|
562
606
|
"properties": {
|
|
563
|
-
"
|
|
607
|
+
"search": {
|
|
564
608
|
"type": "string",
|
|
565
|
-
"description": "
|
|
609
|
+
"description": "Case-insensitive match on `ticker` or `name`, max 64 characters (longer is a 400). Results are ranked: an exact ticker match first, then symbols that start with the term, then name matches — alphabetical within each rank. The cursor carries the rank, so paging a search never repeats or skips."
|
|
566
610
|
},
|
|
567
|
-
"
|
|
611
|
+
"ticker": {
|
|
568
612
|
"type": "string",
|
|
569
|
-
"description": "
|
|
613
|
+
"description": "One symbol or a comma-separated list (up to 50; more is a 400): just those tickers' identity records, in the usual order. A symbol we don't track is simply absent. For everything about each one, put the list in the path of Get a ticker."
|
|
570
614
|
},
|
|
571
|
-
"
|
|
615
|
+
"asset_class": {
|
|
572
616
|
"type": "string",
|
|
573
|
-
"description": "
|
|
574
|
-
"enum": [
|
|
575
|
-
"1m",
|
|
576
|
-
"1h",
|
|
577
|
-
"1d",
|
|
578
|
-
"auto"
|
|
579
|
-
],
|
|
580
|
-
"default": "auto"
|
|
617
|
+
"description": "Filter by asset class — `stocks`, `rates`, `crypto`, `fx` or a comma-separated list (the live classes today; validated for shape, not against a fixed list, so a well-formed class we don't track simply matches nothing — same contract as scan). Omit for every class. This is the class of INSTRUMENT, distinct from `asset_type` below (the instrument type within equities). Every result carries its `asset_class`, so a non-equity result identifies itself."
|
|
581
618
|
},
|
|
582
|
-
"
|
|
619
|
+
"asset_type": {
|
|
583
620
|
"type": "string",
|
|
584
|
-
"description": "
|
|
585
|
-
"
|
|
621
|
+
"description": "Filter by instrument type WITHIN equities (one or a comma list) — the stored `asset_type` value (`CS`, `ETF`, `ADRC`, `PFD`, `FUND`, `UNIT`, `SP`, `ETS`, `WARRANT`, `RIGHT`, `ETN`, `ETV`), matched case-insensitively. `equity` is a convenience value expanding to the equity-like set. This is NOT an asset class: `asset_type=crypto` is rejected — use `asset_class=crypto`.",
|
|
622
|
+
"enum": [
|
|
623
|
+
"CS",
|
|
624
|
+
"ETF",
|
|
625
|
+
"ADRC",
|
|
626
|
+
"PFD",
|
|
627
|
+
"FUND",
|
|
628
|
+
"UNIT",
|
|
629
|
+
"SP",
|
|
630
|
+
"ETS",
|
|
631
|
+
"WARRANT",
|
|
632
|
+
"RIGHT",
|
|
633
|
+
"ETN",
|
|
634
|
+
"ETV",
|
|
635
|
+
"equity"
|
|
636
|
+
]
|
|
586
637
|
},
|
|
587
|
-
"
|
|
638
|
+
"exchange": {
|
|
588
639
|
"type": "string",
|
|
589
|
-
"description": "
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
"default": "desc"
|
|
640
|
+
"description": "Filter by exchange name (one or a comma list) — the value results carry in their `exchange` field. MIC codes (`XNAS`, `XNYS`, `BATS`) are also accepted and match `exchange_mic`. A malformed value (non-letters, over 16 chars) is a 400."
|
|
641
|
+
},
|
|
642
|
+
"active": {
|
|
643
|
+
"type": "boolean",
|
|
644
|
+
"description": "`true` for tickers that trade today, `false` for delisted ones. Omit it for both."
|
|
595
645
|
},
|
|
596
646
|
"limit": {
|
|
597
647
|
"type": "integer",
|
|
598
|
-
"description": "Page size. Max
|
|
648
|
+
"description": "Page size. Max 1000 until 2027-01-12, then 100 (a larger value is clamped to the max, not an error; see Deprecations).",
|
|
599
649
|
"default": 50
|
|
600
650
|
},
|
|
601
651
|
"cursor": {
|
|
602
652
|
"type": "string",
|
|
603
|
-
"description": "Opaque cursor from the previous response's `next_cursor
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
"
|
|
653
|
+
"description": "Opaque cursor from the previous response's `next_cursor` field. Continues the walk from after that page. A cursor minted under `search` only resumes the same search."
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
},
|
|
657
|
+
"endpoint": {
|
|
658
|
+
"method": "GET",
|
|
659
|
+
"path": "/v2/tickers",
|
|
660
|
+
"paramLocation": {
|
|
661
|
+
"search": "query",
|
|
662
|
+
"ticker": "query",
|
|
663
|
+
"asset_class": "query",
|
|
664
|
+
"asset_type": "query",
|
|
665
|
+
"exchange": "query",
|
|
666
|
+
"active": "query",
|
|
667
|
+
"limit": "query",
|
|
668
|
+
"cursor": "query"
|
|
669
|
+
},
|
|
670
|
+
"accepts": {
|
|
671
|
+
"tickers": "query"
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
"name": "tickerbot_get_ticker",
|
|
677
|
+
"description": "Returns everything about one ticker or a comma list of up to 50 in the path (a screen's matches, say): every signal each one carries, live or on any past date with `asof`. Pass a comma list of up to 50 symbols for a batch (`data` keyed by symbol plus `not_found`). Crypto is the X-prefixed pair (X:BTCUSD) — bare BTC/ETH are US-listed ETFs.",
|
|
678
|
+
"inputSchema": {
|
|
679
|
+
"type": "object",
|
|
680
|
+
"properties": {
|
|
681
|
+
"ticker": {
|
|
615
682
|
"type": "string",
|
|
616
|
-
"description": "
|
|
683
|
+
"description": "One symbol, or a comma-separated list of up to 50 for a batch response keyed by symbol. Case-insensitive. Equities are bare symbols (`NVDA`); every other class carries a prefix — rates (`R:SOFR`), crypto (`X:BTCUSD`), fx (`X:EURUSD`). Bare `BTC`/`ETH` are US-listed ETFs, not spot crypto. See Tickers."
|
|
617
684
|
},
|
|
618
|
-
"
|
|
685
|
+
"asof": {
|
|
619
686
|
"type": "string",
|
|
620
|
-
"description": "
|
|
687
|
+
"description": "Target moment as `YYYY-MM-DD` (that day's close) or an ISO timestamp (that intraday moment; daily-only signals then carry the previous session's close, never that day's) — the same read as it stood then, unlimited depth. Full contract under As of a past date."
|
|
621
688
|
},
|
|
622
|
-
"
|
|
689
|
+
"grain": {
|
|
623
690
|
"type": "string",
|
|
624
|
-
"description": "
|
|
691
|
+
"description": "Only with `asof`. Grain the past state is read at: `1m`, `1h`, `1d` or `auto` (default). `auto` blends: each signal comes from its freshest grain at or before the instant (minute, then hourly, then the last closed daily session), so nothing is refused for grain and no ticker is dropped; `_meta.blended` and `_meta.grains_present` say what contributed. Pin a grain for the fastest response: one grain is read instead of three. On this single-ticker read a pinned grain returns the signals that grain stores (`rsi_14`, fundamentals and valuation ratios are `1d`-only, so they are absent under `1h`/`1m` rather than refused), and a grain with no data for the ticker within its window (14 days for `1d`, 5 for `1h`/`1m`) is a `404 interval_unavailable`. A live read with `grain` is a 400.",
|
|
692
|
+
"enum": [
|
|
693
|
+
"1m",
|
|
694
|
+
"1h",
|
|
695
|
+
"1d",
|
|
696
|
+
"auto"
|
|
697
|
+
],
|
|
698
|
+
"default": "auto"
|
|
625
699
|
},
|
|
626
700
|
"select": {
|
|
627
701
|
"type": "string",
|
|
628
|
-
"description": "
|
|
629
|
-
},
|
|
630
|
-
"having": {
|
|
631
|
-
"type": "string",
|
|
632
|
-
"description": "Filter the aggregate rows (requires `group_by`). Custom signals are valid here too."
|
|
702
|
+
"description": "Comma-separated signals to return: each row is `ticker` plus exactly these. Omit it for the full row (every signal the ticker carries). An unknown signal is a 400."
|
|
633
703
|
}
|
|
634
704
|
},
|
|
635
705
|
"required": [
|
|
636
|
-
"
|
|
706
|
+
"ticker"
|
|
637
707
|
]
|
|
638
708
|
},
|
|
639
709
|
"endpoint": {
|
|
640
|
-
"method": "
|
|
641
|
-
"path": "/v2/
|
|
710
|
+
"method": "GET",
|
|
711
|
+
"path": "/v2/tickers/{ticker}",
|
|
642
712
|
"paramLocation": {
|
|
643
|
-
"
|
|
644
|
-
"asof": "
|
|
645
|
-
"
|
|
646
|
-
"
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
"
|
|
650
|
-
"
|
|
651
|
-
"
|
|
652
|
-
"
|
|
653
|
-
"asset_class": "body",
|
|
654
|
-
"group_by": "body",
|
|
655
|
-
"select": "body",
|
|
656
|
-
"having": "body"
|
|
713
|
+
"ticker": "path",
|
|
714
|
+
"asof": "query",
|
|
715
|
+
"grain": "query",
|
|
716
|
+
"select": "query"
|
|
717
|
+
},
|
|
718
|
+
"accepts": {
|
|
719
|
+
"as_of": "query",
|
|
720
|
+
"interval": "query",
|
|
721
|
+
"fields": "query",
|
|
722
|
+
"columns": "query"
|
|
657
723
|
}
|
|
658
724
|
}
|
|
659
725
|
},
|
|
660
726
|
{
|
|
661
|
-
"name": "
|
|
662
|
-
"description": "
|
|
727
|
+
"name": "tickerbot_get_history",
|
|
728
|
+
"description": "Returns the signals of one ticker or a comma list of up to 50 in the path (a screen's matches, say) over time, all-time: up to 25 signals in `select`, every ticker on one shared grid. `ticker` takes one symbol or a comma list of up to 50 (a scan's matches) on one aligned grid. `data` is one flat row per grain step: the rows themselves for one symbol, keyed by symbol for a list. Paged backward: pass `next_cursor` back as `cursor`. For when a yes/no signal flipped, use tickerbot_list_events with kind=signal.",
|
|
663
729
|
"inputSchema": {
|
|
664
730
|
"type": "object",
|
|
665
731
|
"properties": {
|
|
666
|
-
"
|
|
667
|
-
"type": "string",
|
|
668
|
-
"description": "WHERE-clause expression using signal names — the same grammar and the same 4000-char cap as `POST /v2/scan`, so anything scannable is subscribable. Custom signals are expanded and frozen in at creation."
|
|
669
|
-
},
|
|
670
|
-
"universe": {
|
|
732
|
+
"ticker": {
|
|
671
733
|
"type": "string",
|
|
672
|
-
"description": "
|
|
734
|
+
"description": "Ticker symbol, or a comma-separated list (up to 50) on one aligned grid. A page holds at most 25,000 points in all (tickers × `limit`), so 50 tickers page at up to 500 points each."
|
|
673
735
|
},
|
|
674
|
-
"
|
|
736
|
+
"from": {
|
|
675
737
|
"type": "string",
|
|
676
|
-
"description": "
|
|
738
|
+
"description": "Window start, `YYYY-MM-DD` or ISO: a bare date starts at the beginning of that day, a timestamp is included. At `1q` and `1y` it bounds the fiscal period end. Intraday requests default to a recent window (`1m`: 7 days, `1h`: 60 days) — the cursor keeps walking further back window-by-window, or pass `from` to widen it up front."
|
|
677
739
|
},
|
|
678
|
-
"
|
|
679
|
-
"type": "string",
|
|
680
|
-
"description": "Delivery channel. `webhook` (POST to `target_url`), `discord` (embed to `discord_url`), `in_app` (dashboard only), or `mobile_push` (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`.",
|
|
681
|
-
"enum": [
|
|
682
|
-
"webhook",
|
|
683
|
-
"discord",
|
|
684
|
-
"in_app",
|
|
685
|
-
"mobile_push"
|
|
686
|
-
]
|
|
687
|
-
},
|
|
688
|
-
"discord_url": {
|
|
740
|
+
"to": {
|
|
689
741
|
"type": "string",
|
|
690
|
-
"description": "
|
|
742
|
+
"description": "Window end, `YYYY-MM-DD` or ISO. A bare date covers that whole day. A timestamp is included until 2027-01-12 and exclusive from then, as everywhere else (Deprecations). At `1m`/`1h` a bare date on `from` or `to` is the ET calendar day for stocks and ETFs, and the UTC day when the request includes crypto or FX. See Time windows."
|
|
691
743
|
},
|
|
692
|
-
"
|
|
744
|
+
"asof": {
|
|
693
745
|
"type": "string",
|
|
694
|
-
"description": "
|
|
746
|
+
"description": "Point-in-time read: ONE result per ticker (the state at that instant) rather than a range. `YYYY-MM-DD` or a full ISO timestamp, the same meaning `asof` carries on `/v2/tickers/{ticker}`, `/v2/scan` and `/v2/signals`. Cannot be combined with `from`/`to` or `cursor` (400) — a point and a window are contradictory, and `limit` has no meaning under it. It also resolves WHICH COMPANY held the symbol at that instant: a ticker that changed hands returns the state of whoever traded it then, so `/v2/tickers/SHLD/history?asof=2010-06-30` returns Sears Holdings' price and `asof=2026-01-01` returns the Global X defense ETF. Returns the most recent result at or before the instant, so a date inside a trading gap gives the last result before it; on the `1d` and `1w` grids a timestamp returns the previous session's result, never that day's close. Also: `next_cursor` is always `null` (every requested ticker is on the one page). A ticker with no data on the grid at or before the instant (outside the minute tier, say) comes back as an empty array with `_meta.coverage[ticker].rows: 0`; a 404 means only that we do not track the symbol. A bare date on the `1m`/`1h` grid is accepted and means the last result of that day: the ET calendar day for stocks and ETFs, the UTC day for crypto and FX (the state reads 400 that combination; this grid read does not). The look-back is the grid's window: `1d` walks back without limit, `1h` 60 days and `1m` 7 days before the instant. At `grain=1q` a quarter is visible from its `available_at` — when the market could first trade on it: 9:30 AM ET on the report date for a pre-market earnings release, else 9:30 AM ET of the next session; statements the session after filing — and a bare date means that day's 4 PM ET close, so you get the latest quarter that was public knowledge at the instant, with restatements after it excluded: `/v2/tickers/AAPL/history?grain=1q&asof=2026-07-30` returns 2026-Q1, `asof=2026-07-31T13:30:00Z` 2026-Q2 (the June quarter was reported after the close on 2026-07-30). See availability. At `grain=1y` a fiscal year is visible from its `available_at` — 9:30 AM ET of the first session after the ORIGINAL annual report was filed — and a bare date means that day's 4 PM ET close: `/v2/tickers/AAPL/history?grain=1y&asof=2025-10-31` returns fiscal 2024, `asof=2025-11-03` fiscal 2025 (the 10-K was filed after the close on Friday 2025-10-31). Response time: under 1.5 s cold, under 0.6 s warm."
|
|
695
747
|
},
|
|
696
|
-
"
|
|
748
|
+
"grain": {
|
|
697
749
|
"type": "string",
|
|
698
|
-
"description": "`
|
|
750
|
+
"description": "Grid granularity. `1w` resamples the daily tier weekly (Monday-keyed); `1q` is the fiscal-quarter grid; `1y` is the fiscal-year grid of annual statements. This is the grid, not a state tier: there is no `auto` here and nothing blends — under `asof` you get the last result on this grid, and a signal the grid does not carry is a `400`.",
|
|
699
751
|
"enum": [
|
|
700
|
-
"
|
|
701
|
-
"
|
|
702
|
-
"
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
"
|
|
752
|
+
"1m",
|
|
753
|
+
"1h",
|
|
754
|
+
"1d",
|
|
755
|
+
"1w",
|
|
756
|
+
"1q",
|
|
757
|
+
"1y"
|
|
758
|
+
],
|
|
759
|
+
"default": "1d"
|
|
708
760
|
},
|
|
709
|
-
"
|
|
761
|
+
"select": {
|
|
710
762
|
"type": "string",
|
|
711
|
-
"description": "
|
|
763
|
+
"description": "Up to 25 signals: built-in signals, your custom signals and OHLCV names, freely mixed. Omitted → the ticker-history default set (price, change_1d_pct, relative_volume, market_cap), intersected with what the grain carries. At `1q`, `select` is required and quarterly-only; at `1y`, required and annual-only (the list is under Notes)."
|
|
712
764
|
},
|
|
713
|
-
"
|
|
714
|
-
"type": "
|
|
715
|
-
"description": "
|
|
716
|
-
"default":
|
|
765
|
+
"limit": {
|
|
766
|
+
"type": "integer",
|
|
767
|
+
"description": "Grid steps per page. Max 1000 — an over-cap `limit` is clamped to 1000 (house convention, `limit=10000` means \"max\"). Separately, a page holds at most 25,000 points in all: tickers × `limit` over 25,000 is a 400 (50 tickers take `limit` up to 500; 25 take the full 1,000).",
|
|
768
|
+
"default": 252
|
|
717
769
|
},
|
|
718
|
-
"
|
|
770
|
+
"cursor": {
|
|
719
771
|
"type": "string",
|
|
720
|
-
"description": "
|
|
721
|
-
"enum": [
|
|
722
|
-
"asc",
|
|
723
|
-
"desc"
|
|
724
|
-
],
|
|
725
|
-
"default": "desc"
|
|
772
|
+
"description": "Continue paging back: the previous response's `next_cursor`, unchanged, with the same tickers and parameters. It carries each ticker's own position, so every ticker continues from its own oldest row: nothing is skipped or repeated, even when the tickers trade on different calendars (a stock and a crypto pair)."
|
|
726
773
|
}
|
|
727
774
|
},
|
|
728
775
|
"required": [
|
|
729
|
-
"
|
|
776
|
+
"ticker"
|
|
730
777
|
]
|
|
731
778
|
},
|
|
732
779
|
"endpoint": {
|
|
733
|
-
"method": "
|
|
734
|
-
"path": "/v2/
|
|
780
|
+
"method": "GET",
|
|
781
|
+
"path": "/v2/tickers/{ticker}/history",
|
|
735
782
|
"paramLocation": {
|
|
736
|
-
"
|
|
737
|
-
"
|
|
738
|
-
"
|
|
739
|
-
"
|
|
740
|
-
"
|
|
741
|
-
"
|
|
742
|
-
"
|
|
743
|
-
"
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
"
|
|
783
|
+
"ticker": "path",
|
|
784
|
+
"from": "query",
|
|
785
|
+
"to": "query",
|
|
786
|
+
"asof": "query",
|
|
787
|
+
"grain": "query",
|
|
788
|
+
"select": "query",
|
|
789
|
+
"limit": "query",
|
|
790
|
+
"cursor": "query"
|
|
791
|
+
},
|
|
792
|
+
"accepts": {
|
|
793
|
+
"columns": "query",
|
|
794
|
+
"fields": "query",
|
|
795
|
+
"interval": "query",
|
|
796
|
+
"as_of": "query",
|
|
797
|
+
"transitions_only": "query"
|
|
798
|
+
},
|
|
799
|
+
"fixedQuery": {
|
|
800
|
+
"api_version": "2027-01-12"
|
|
747
801
|
}
|
|
748
802
|
}
|
|
749
803
|
},
|
|
750
804
|
{
|
|
751
|
-
"name": "
|
|
752
|
-
"description": "
|
|
805
|
+
"name": "tickerbot_subscribe_ticker",
|
|
806
|
+
"description": "Gets you an alert by webhook each time one ticker starts matching a condition. Webhooks need a paid plan (Free has no webhook slots). Omit `target_url` for in-app delivery.",
|
|
753
807
|
"inputSchema": {
|
|
754
808
|
"type": "object",
|
|
755
809
|
"properties": {
|
|
756
|
-
"tickers": {
|
|
757
|
-
"type": "string",
|
|
758
|
-
"description": "Comma-separated symbols, up to 50 (POST accepts a JSON array). Exactly one of `tickers` or `ticker` is required; when both are passed, `ticker` wins — so sending both silently narrows the request to one symbol."
|
|
759
|
-
},
|
|
760
810
|
"ticker": {
|
|
761
811
|
"type": "string",
|
|
762
|
-
"description": "
|
|
812
|
+
"description": "Case-insensitive. Equities are bare symbols (`NVDA`); every other class carries a prefix — rates (`R:SOFR`), crypto (`X:BTCUSD`), fx (`X:EURUSD`). Bare `BTC`/`ETH` are US-listed ETFs, not spot crypto. See Tickers."
|
|
763
813
|
},
|
|
764
|
-
"
|
|
814
|
+
"q": {
|
|
765
815
|
"type": "string",
|
|
766
|
-
"description": "
|
|
816
|
+
"description": "WHERE-clause fragment using signal names from the catalog, the same grammar as `/v2/scan`. Custom signals are expanded and frozen in at creation."
|
|
767
817
|
},
|
|
768
|
-
"
|
|
769
|
-
"type": "string",
|
|
770
|
-
"description": "
|
|
771
|
-
"enum": [
|
|
772
|
-
"1m",
|
|
773
|
-
"1h",
|
|
774
|
-
"1d",
|
|
775
|
-
"1w",
|
|
776
|
-
"1q"
|
|
777
|
-
],
|
|
778
|
-
"default": "1d"
|
|
818
|
+
"select": {
|
|
819
|
+
"type": "string",
|
|
820
|
+
"description": "What each delivery carries. Omitted: the scan default row (ticker, name, asset_class, asset_type, price, change_1d_pct, gap_pct, relative_volume, market_cap) plus every signal used in `q`. A list of signal names: exactly those, `ticker` always included. Each must be a real signal; unknown ones are rejected at creation."
|
|
779
821
|
},
|
|
780
|
-
"
|
|
822
|
+
"channel": {
|
|
781
823
|
"type": "string",
|
|
782
|
-
"description": "
|
|
824
|
+
"description": "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 at `device_id`). Inferred when omitted: `webhook` if `target_url` is set, `discord` if `discord_url` is set, `mobile_push` if `device_id` is set, else `in_app`. See Delivery channels.",
|
|
825
|
+
"enum": [
|
|
826
|
+
"webhook",
|
|
827
|
+
"discord",
|
|
828
|
+
"in_app",
|
|
829
|
+
"mobile_push"
|
|
830
|
+
]
|
|
783
831
|
},
|
|
784
|
-
"
|
|
832
|
+
"target_url": {
|
|
785
833
|
"type": "string",
|
|
786
|
-
"description": "
|
|
834
|
+
"description": "Only with `channel=webhook`. https:// URL to POST when the condition fires."
|
|
787
835
|
},
|
|
788
|
-
"
|
|
836
|
+
"discord_url": {
|
|
789
837
|
"type": "string",
|
|
790
|
-
"description": "
|
|
838
|
+
"description": "Only with `channel=discord`. Discord incoming-webhook URL (`https://discord.com/api/webhooks/…`). Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliveries) strips it and sets `channel_config_present: true` instead."
|
|
791
839
|
},
|
|
792
|
-
"
|
|
793
|
-
"type": "
|
|
794
|
-
"description": "
|
|
795
|
-
"default": 252
|
|
840
|
+
"device_id": {
|
|
841
|
+
"type": "string",
|
|
842
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. Unknown ids are a 404 `device_not_found`."
|
|
796
843
|
},
|
|
797
|
-
"
|
|
844
|
+
"cadence": {
|
|
798
845
|
"type": "string",
|
|
799
|
-
"description": "
|
|
846
|
+
"description": "How often to evaluate. `realtime` (the default) is checked each time the data refreshes, about once a minute; `hourly` and `nyse_open` are checked on that schedule.",
|
|
847
|
+
"enum": [
|
|
848
|
+
"realtime",
|
|
849
|
+
"hourly",
|
|
850
|
+
"nyse_open"
|
|
851
|
+
]
|
|
800
852
|
},
|
|
801
|
-
"
|
|
802
|
-
"type": "
|
|
803
|
-
"description": "
|
|
853
|
+
"name": {
|
|
854
|
+
"type": "string",
|
|
855
|
+
"description": "Human-readable label (up to 80 chars). Defaults to `<TICKER>: <query>`."
|
|
804
856
|
}
|
|
805
|
-
}
|
|
857
|
+
},
|
|
858
|
+
"required": [
|
|
859
|
+
"ticker",
|
|
860
|
+
"q"
|
|
861
|
+
]
|
|
806
862
|
},
|
|
807
863
|
"endpoint": {
|
|
808
|
-
"method": "
|
|
809
|
-
"path": "/v2/
|
|
864
|
+
"method": "POST",
|
|
865
|
+
"path": "/v2/tickers/{ticker}/subscribe",
|
|
810
866
|
"paramLocation": {
|
|
811
|
-
"
|
|
812
|
-
"
|
|
813
|
-
"
|
|
814
|
-
"
|
|
815
|
-
"
|
|
816
|
-
"
|
|
817
|
-
"
|
|
818
|
-
"
|
|
819
|
-
"
|
|
820
|
-
|
|
867
|
+
"ticker": "path",
|
|
868
|
+
"q": "body",
|
|
869
|
+
"select": "body",
|
|
870
|
+
"channel": "body",
|
|
871
|
+
"target_url": "body",
|
|
872
|
+
"discord_url": "body",
|
|
873
|
+
"device_id": "body",
|
|
874
|
+
"cadence": "body",
|
|
875
|
+
"name": "body"
|
|
876
|
+
},
|
|
877
|
+
"accepts": {
|
|
878
|
+
"condition": "body",
|
|
879
|
+
"columns": "body",
|
|
880
|
+
"fields": "body",
|
|
881
|
+
"order": "body",
|
|
882
|
+
"dir": "body"
|
|
821
883
|
}
|
|
822
884
|
}
|
|
823
885
|
},
|
|
824
886
|
{
|
|
825
887
|
"name": "tickerbot_get_bars",
|
|
826
|
-
"description": "OHLCV bars from
|
|
888
|
+
"description": "Returns OHLCV bars from `1s` to monthly for one ticker or a comma list of up to 50 in the path, such as a screen's matches.",
|
|
827
889
|
"inputSchema": {
|
|
828
890
|
"type": "object",
|
|
829
891
|
"properties": {
|
|
@@ -850,19 +912,19 @@ export const tools = [
|
|
|
850
912
|
},
|
|
851
913
|
"from": {
|
|
852
914
|
"type": "string",
|
|
853
|
-
"description": "Window start
|
|
915
|
+
"description": "Window start: `YYYY-MM-DD`, ISO timestamp or epoch-ms. A bare date starts at the beginning of that day; a timestamp is included. Combines with `to` for an explicit window; page within it using `cursor`. Mutually exclusive with `asof` (400). See Time windows."
|
|
854
916
|
},
|
|
855
917
|
"to": {
|
|
856
918
|
"type": "string",
|
|
857
|
-
"description": "Window end (
|
|
919
|
+
"description": "Window end: `YYYY-MM-DD`, ISO timestamp or epoch-ms. A bare date covers that whole day. A timestamp is included until 2027-01-12 (the newest bar returned is at or before it) and exclusive from then, as everywhere else (Deprecations). On sub-daily intervals a bare date on `from` or `to` is the ET calendar day for stocks and ETFs (the whole 04:00-20:00 ET session) and the UTC day for crypto and FX. Mutually exclusive with `asof` (400). See Time windows."
|
|
858
920
|
},
|
|
859
921
|
"asof": {
|
|
860
922
|
"type": "string",
|
|
861
|
-
"description": "Point-in-time: the most recent bar whose period had closed at or before that moment. A bare `YYYY-MM-DD` means that day's close. A full timestamp means the last FINISHED bar — at 10:00 ET on a Wednesday the day's close has not happened, so `1d` returns Tuesday's bar. Returns one bar unless you also pass `limit`, which gives the last `limit` closed bars
|
|
923
|
+
"description": "Point-in-time: the most recent bar whose period had closed at or before that moment. A bare `YYYY-MM-DD` means that day's close. A full timestamp means the last FINISHED bar — at 10:00 ET on a Wednesday the day's close has not happened, so `1d` returns Tuesday's bar. A bare date on an intraday grid (`1m`, `1h`, …) is accepted and means the last bar of that day: the ET calendar day for stocks and ETFs (through the 19:59 ET bar), the UTC day for crypto and FX. Returns one bar unless you also pass `limit`, which gives the last `limit` closed bars; follow `next_cursor` with the same parameters to keep paging back: the cursor and `asof` both bound the page, so no bar after the instant is ever served and every page stays on the company that held the symbol at the instant. Unlimited depth. Response time: under 1.5 s cold, under 0.6 s warm."
|
|
862
924
|
},
|
|
863
925
|
"adjusted": {
|
|
864
926
|
"type": "boolean",
|
|
865
|
-
"description": "Default `true`: prices are split-adjusted — restated after each later split, as the tape is, so a series is continuous across a split. `false` returns the price as it printed that day (a name that later did a 1:10 reverse split reads `21.4` adjusted and `2.14` on the tape), which is what a broker fill or a chart from that time shows. Volume scales the other way.
|
|
927
|
+
"description": "Default `true`: prices are split-adjusted — restated after each later split, as the tape is, so a series is continuous across a split. `false` returns the price as it printed that day (a name that later did a 1:10 reverse split reads `21.4` adjusted and `2.14` on the tape), which is what a broker fill or a chart from that time shows. Volume scales the other way."
|
|
866
928
|
},
|
|
867
929
|
"session": {
|
|
868
930
|
"type": "string",
|
|
@@ -875,16 +937,12 @@ export const tools = [
|
|
|
875
937
|
},
|
|
876
938
|
"limit": {
|
|
877
939
|
"type": "integer",
|
|
878
|
-
"description": "Most-recent N bars. Max 1000 — an over-cap value is clamped, not an error.",
|
|
940
|
+
"description": "Most-recent N bars. Max 1000 — an over-cap value is clamped, not an error. On a comma list the cap is per symbol: each symbol returns its newest `limit` bars in the window.",
|
|
879
941
|
"default": 100
|
|
880
942
|
},
|
|
881
|
-
"before": {
|
|
882
|
-
"type": "string",
|
|
883
|
-
"description": "Return the N bars ending strictly before this date/timestamp — back-paging. Mutually exclusive with `cursor` (they are the same control — a 400 when both are sent)."
|
|
884
|
-
},
|
|
885
943
|
"cursor": {
|
|
886
944
|
"type": "string",
|
|
887
|
-
"description": "
|
|
945
|
+
"description": "Continue paging back: the previous response's `next_cursor`, unchanged, with the same symbols and parameters. On a comma list it carries each symbol's own position, so every symbol continues from its own oldest bar. A blank `cursor=` counts as absent."
|
|
888
946
|
}
|
|
889
947
|
},
|
|
890
948
|
"required": [
|
|
@@ -894,7 +952,7 @@ export const tools = [
|
|
|
894
952
|
},
|
|
895
953
|
"endpoint": {
|
|
896
954
|
"method": "GET",
|
|
897
|
-
"path": "/v2/
|
|
955
|
+
"path": "/v2/tickers/{ticker}/bars/{interval}",
|
|
898
956
|
"paramLocation": {
|
|
899
957
|
"ticker": "path",
|
|
900
958
|
"interval": "path",
|
|
@@ -904,95 +962,153 @@ export const tools = [
|
|
|
904
962
|
"adjusted": "query",
|
|
905
963
|
"session": "query",
|
|
906
964
|
"limit": "query",
|
|
907
|
-
"before": "query",
|
|
908
965
|
"cursor": "query"
|
|
966
|
+
},
|
|
967
|
+
"accepts": {
|
|
968
|
+
"as_of": "query",
|
|
969
|
+
"before": "query"
|
|
970
|
+
},
|
|
971
|
+
"fixedQuery": {
|
|
972
|
+
"api_version": "2027-01-12"
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
},
|
|
976
|
+
{
|
|
977
|
+
"name": "tickerbot_get_ticker_coverage",
|
|
978
|
+
"description": "Reports what we hold for one ticker or a comma list of up to 50, and how far back, so an empty result is never ambiguous. Ask this before treating a gap in bars or history as an outage. An absent `1m` span is not a gap — sub-hour bars load on the first request for a symbol.",
|
|
979
|
+
"inputSchema": {
|
|
980
|
+
"type": "object",
|
|
981
|
+
"properties": {
|
|
982
|
+
"ticker": {
|
|
983
|
+
"type": "string",
|
|
984
|
+
"description": "One symbol, or a comma-separated list of up to 50 for a response keyed by symbol. Case-insensitive. Equities are bare symbols (`NVDA`); every other class carries a prefix — rates (`R:SOFR`), crypto (`X:BTCUSD`), fx (`X:EURUSD`). Bare `BTC`/`ETH` are US-listed ETFs, not spot crypto. See Tickers."
|
|
985
|
+
}
|
|
986
|
+
},
|
|
987
|
+
"required": [
|
|
988
|
+
"ticker"
|
|
989
|
+
]
|
|
990
|
+
},
|
|
991
|
+
"endpoint": {
|
|
992
|
+
"method": "GET",
|
|
993
|
+
"path": "/v2/tickers/{ticker}/coverage",
|
|
994
|
+
"paramLocation": {
|
|
995
|
+
"ticker": "path"
|
|
996
|
+
},
|
|
997
|
+
"accepts": {
|
|
998
|
+
"symbol": "path"
|
|
999
|
+
},
|
|
1000
|
+
"pathAliases": {
|
|
1001
|
+
"symbol": "ticker"
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
},
|
|
1005
|
+
{
|
|
1006
|
+
"name": "tickerbot_get_etf_holdings",
|
|
1007
|
+
"description": "Returns an ETF's constituents and their weights, heaviest first, and its sector weights, for one ETF or a comma list of up to 50. Returns `data.holdings` and the sector mix `data.sectors`. When the ticker is not an ETF, `is_etf` is false and both are empty; `is_etf: true` with zero holdings means a real ETF whose holdings are not ingested yet. The reverse lookup (\"which ETFs hold NVDA\") is the `etf_holders` signal on tickerbot_get_ticker, or a scan: `'SMH' = ANY(etf_holders)`.",
|
|
1008
|
+
"inputSchema": {
|
|
1009
|
+
"type": "object",
|
|
1010
|
+
"properties": {
|
|
1011
|
+
"ticker": {
|
|
1012
|
+
"type": "string",
|
|
1013
|
+
"description": "ETF symbol, or a comma-separated list of up to 50 for a response keyed by symbol. Case-insensitive."
|
|
1014
|
+
},
|
|
1015
|
+
"limit": {
|
|
1016
|
+
"type": "integer",
|
|
1017
|
+
"description": "Holdings per page, per ETF. Max 5000 until 2027-01-12, then 1000 (an over-cap `limit` is clamped to the max, not an error; see Deprecations). When more holdings follow the page, the ETF's object carries `truncated: true` and `total` (its full holding count), and `next_cursor` pages the rest.",
|
|
1018
|
+
"default": 500
|
|
1019
|
+
},
|
|
1020
|
+
"cursor": {
|
|
1021
|
+
"type": "string",
|
|
1022
|
+
"description": "Continue paging: the previous response's `next_cursor`, unchanged, with the same symbols and `limit`. On a comma list it carries each ETF's own position, so every ETF continues from its own last holding; a finished one returns an empty `holdings`."
|
|
1023
|
+
}
|
|
1024
|
+
},
|
|
1025
|
+
"required": [
|
|
1026
|
+
"ticker"
|
|
1027
|
+
]
|
|
1028
|
+
},
|
|
1029
|
+
"endpoint": {
|
|
1030
|
+
"method": "GET",
|
|
1031
|
+
"path": "/v2/tickers/{ticker}/holdings",
|
|
1032
|
+
"paramLocation": {
|
|
1033
|
+
"ticker": "path",
|
|
1034
|
+
"limit": "query",
|
|
1035
|
+
"cursor": "query"
|
|
1036
|
+
},
|
|
1037
|
+
"accepts": {
|
|
1038
|
+
"symbol": "path"
|
|
1039
|
+
},
|
|
1040
|
+
"pathAliases": {
|
|
1041
|
+
"symbol": "ticker"
|
|
909
1042
|
}
|
|
910
1043
|
}
|
|
911
1044
|
},
|
|
912
1045
|
{
|
|
913
1046
|
"name": "tickerbot_list_events",
|
|
914
|
-
"description": "
|
|
1047
|
+
"description": "Queries events with SQL across every ticker or a screen's matches: earnings, dividends, splits, filings, insider trades and analyst actions, plus opt-in estimate revisions, news and signal firings. Requires at least one bound: a ticker scope (ticker/universe) or a time window (from/to) — `q` alone is not a bound. With one `kind`, its payload fields are bare names in `q`/`select`/`group_by` (`q: firm ILIKE 'Morgan Stanley'`, `q: relevance >= 0.8` on news); tickerbot_list_event_kinds lists them. `join: state` adds the ticker's signals as of each event. Every result has a stable `id`: use it to drop duplicates. `kind: signal` takes custom signals too.",
|
|
915
1048
|
"inputSchema": {
|
|
916
1049
|
"type": "object",
|
|
917
1050
|
"properties": {
|
|
918
1051
|
"kind": {
|
|
919
1052
|
"type": "string",
|
|
920
|
-
"description": "Comma list of kinds.
|
|
1053
|
+
"description": "Comma list of kinds. Leave it out for earnings, dividend, split, filing, insider and analyst. News, signal and estimate_revision come back only when named. List event kinds lists each kind, its fields and its filters.",
|
|
921
1054
|
"enum": [
|
|
922
|
-
"earnings",
|
|
923
1055
|
"dividend",
|
|
924
1056
|
"split",
|
|
925
1057
|
"insider",
|
|
926
1058
|
"analyst",
|
|
1059
|
+
"earnings",
|
|
1060
|
+
"filing",
|
|
1061
|
+
"signal",
|
|
927
1062
|
"news",
|
|
928
|
-
"
|
|
1063
|
+
"estimate_revision"
|
|
929
1064
|
]
|
|
930
1065
|
},
|
|
931
1066
|
"ticker": {
|
|
932
1067
|
"type": "string",
|
|
933
|
-
"description": "
|
|
934
|
-
},
|
|
935
|
-
"tickers": {
|
|
936
|
-
"type": "string",
|
|
937
|
-
"description": "Comma list of tickers (max 50). Mutually exclusive with `universe`."
|
|
1068
|
+
"description": "One ticker or a comma list (up to 50). Not combinable with `universe`. A crypto, FX or rate symbol (`X:BTCUSD`) takes `kind=signal`; every other kind is equities-only and returns `400` naming the symbol's asset class."
|
|
938
1069
|
},
|
|
939
1070
|
"universe": {
|
|
940
1071
|
"type": "string",
|
|
941
|
-
"description": "Universe slug (`top_10`, `top_100
|
|
1072
|
+
"description": "Universe slug (`top_10`, `top_100` or one of yours) to scope the stream. Not combinable with `ticker`."
|
|
942
1073
|
},
|
|
943
|
-
"
|
|
1074
|
+
"from": {
|
|
944
1075
|
"type": "string",
|
|
945
|
-
"description": "
|
|
1076
|
+
"description": "Events at/after this instant — strict ISO: `YYYY-MM-DD` or `YYYY-MM-DDTHH:MM[:SS]Z`. A bare `YYYY-MM-DD` means from the start of that day. For news, analyst ratings and estimate revisions the day is the ET calendar day (a story at 21:00 ET on Nov 2 is Nov 2); dated kinds use their own dates."
|
|
946
1077
|
},
|
|
947
|
-
"
|
|
1078
|
+
"to": {
|
|
948
1079
|
"type": "string",
|
|
949
|
-
"description": "
|
|
950
|
-
"enum": [
|
|
951
|
-
"upgrades",
|
|
952
|
-
"downgrades",
|
|
953
|
-
"initiates_coverage_on",
|
|
954
|
-
"maintains",
|
|
955
|
-
"reiterates",
|
|
956
|
-
"assumes",
|
|
957
|
-
"reinstates",
|
|
958
|
-
"suspends",
|
|
959
|
-
"terminates_coverage_on"
|
|
960
|
-
]
|
|
1080
|
+
"description": "Window end — same strict ISO subset. A bare `YYYY-MM-DD` means through the end of that day; a timestamp is exclusive (events strictly before it). For news, analyst ratings and estimate revisions the day is the ET calendar day; dated kinds use their own dates."
|
|
961
1081
|
},
|
|
962
1082
|
"signal": {
|
|
963
1083
|
"type": "string",
|
|
964
|
-
"description": "
|
|
1084
|
+
"description": "Only with `kind=signal`. One signal or a comma list of up to 5: built-in yes/no signals or your custom signals. Required with `q` or `join=state`. See Signal firings."
|
|
965
1085
|
},
|
|
966
1086
|
"transition": {
|
|
967
1087
|
"type": "string",
|
|
968
|
-
"description": "
|
|
1088
|
+
"description": "Only with `kind=signal`. `enter` (false→true) or `exit` (true→false).",
|
|
969
1089
|
"enum": [
|
|
970
1090
|
"enter",
|
|
971
1091
|
"exit"
|
|
972
1092
|
]
|
|
973
1093
|
},
|
|
974
|
-
"
|
|
975
|
-
"type": "
|
|
976
|
-
"description": "
|
|
977
|
-
},
|
|
978
|
-
"to": {
|
|
979
|
-
"type": "string",
|
|
980
|
-
"description": "Window end — same strict ISO subset. A bare `YYYY-MM-DD` means through the end of that day, matching bars/series/spans; a timestamp is exclusive (events strictly before it). (`until` accepted as an alias.)"
|
|
1094
|
+
"merge_gap_seconds": {
|
|
1095
|
+
"type": "integer",
|
|
1096
|
+
"description": "Only with `kind=signal`. Merges an exit and re-entry closer than N seconds into one span. Needs one `signal` and a `ticker` list, and does not combine with `q`, `group_by` or `join=state`."
|
|
981
1097
|
},
|
|
982
1098
|
"q": {
|
|
983
1099
|
"type": "string",
|
|
984
|
-
"description": "SQL WHERE over
|
|
1100
|
+
"description": "SQL WHERE over `id`, `ticker`, `ts`, `kind` and `payload` (plus the ticker's signals with `join=state`). With one `kind`, its payload fields are typed columns by bare name: `amount > 1`, `firm ILIKE 'Morgan Stanley'`, `relevance >= 0.8` on news (List event kinds lists them); with several kinds, use `payload->>'…'`. Max 4000 chars. ANDs with the other filters."
|
|
985
1101
|
},
|
|
986
1102
|
"join": {
|
|
987
1103
|
"type": "string",
|
|
988
|
-
"description": "Set to `state` to
|
|
1104
|
+
"description": "Set to `state` to use the ticker's signals in `q`, `select`, `group_by` and `having`, read as of each event's timestamp at the grain `grain` picks. On the daily grain an event on day D reads D-1's row, never D's close. A signal and a payload field with the same name (`price` on insider and signal events, `cik` on filing) resolve to the signal; spell the field `payload->>'price'`.",
|
|
989
1105
|
"enum": [
|
|
990
1106
|
"state"
|
|
991
1107
|
]
|
|
992
1108
|
},
|
|
993
|
-
"
|
|
1109
|
+
"grain": {
|
|
994
1110
|
"type": "string",
|
|
995
|
-
"description": "
|
|
1111
|
+
"description": "With `kind=signal`, the grain the flips are read at: `1m`, `1h` or `1d` (default: the coarsest grain the signal is stored at). With `join=state`, the grain the ticker's signals are read at: `auto` (default) blends hourly and the last closed daily session per event; see as of a past date.",
|
|
996
1112
|
"enum": [
|
|
997
1113
|
"1m",
|
|
998
1114
|
"1h",
|
|
@@ -1003,23 +1119,23 @@ export const tools = [
|
|
|
1003
1119
|
},
|
|
1004
1120
|
"select": {
|
|
1005
1121
|
"type": "string",
|
|
1006
|
-
"description": "
|
|
1122
|
+
"description": "Without `group_by`: what each result carries. `id`, `ticker`, `ts` and `kind` always, then the names you list, each at the top level of the result: `payload`, a payload field of the one kind named (`firm`, or `payload->>'firm'`) and with `join=state` a ticker signal. With `group_by`: the rollup's output columns (default: the group keys + `COUNT(*) AS events`), named with `AS` or for you as on `group_by`."
|
|
1007
1123
|
},
|
|
1008
1124
|
"group_by": {
|
|
1009
1125
|
"type": "string",
|
|
1010
|
-
"description": "Comma list of rollup keys — switches the response to
|
|
1126
|
+
"description": "Comma list of rollup keys — switches the response to rollups. Columns (`kind`, `ticker`), payload fields (`firm`, or the explicit `payload->>'firm'`) and expressions over them all roll up. Name a key with `AS` to choose its JSON key: `payload->>'firm' AS firm`. Un-named keys are named for you — a payload read takes its key (`payload->>'firm'` → `firm`), a function keeps the function's name (`lower(ticker)` → `lower`), and anything else falls back to `group_1`, `group_2`."
|
|
1011
1127
|
},
|
|
1012
1128
|
"having": {
|
|
1013
1129
|
"type": "string",
|
|
1014
|
-
"description": "Post-aggregation filter.
|
|
1130
|
+
"description": "Only with `group_by`. Post-aggregation filter."
|
|
1015
1131
|
},
|
|
1016
1132
|
"order": {
|
|
1017
1133
|
"type": "string",
|
|
1018
|
-
"description": "
|
|
1134
|
+
"description": "With `group_by`: the rollup sort, a bare column or output name (put expressions in `select` and sort by their alias); a group key's name works too: `group_by=payload->>'firm' AS firm&order=firm`. Default: `events`. A list is sorted by `ts`: `order=ts` is accepted there and changes nothing."
|
|
1019
1135
|
},
|
|
1020
1136
|
"dir": {
|
|
1021
1137
|
"type": "string",
|
|
1022
|
-
"description": "
|
|
1138
|
+
"description": "A list: `desc` (default) is newest first, `asc` oldest first, paging forward. With `group_by`: the rollup's sort direction.",
|
|
1023
1139
|
"enum": [
|
|
1024
1140
|
"asc",
|
|
1025
1141
|
"desc"
|
|
@@ -1028,12 +1144,12 @@ export const tools = [
|
|
|
1028
1144
|
},
|
|
1029
1145
|
"limit": {
|
|
1030
1146
|
"type": "integer",
|
|
1031
|
-
"description": "Page size (
|
|
1147
|
+
"description": "Page size (lists) / max groups (aggregate mode). A list takes up to 1000 until 2027-01-12, then 100, and pages the rest with `next_cursor`; a `group_by` rollup keeps up to 1000 groups and sets `truncated: true` past that. A larger value is clamped to the max, not an error; see Deprecations.",
|
|
1032
1148
|
"default": 50
|
|
1033
1149
|
},
|
|
1034
1150
|
"cursor": {
|
|
1035
1151
|
"type": "string",
|
|
1036
|
-
"description": "Opaque cursor from the previous response
|
|
1152
|
+
"description": "Opaque cursor from the previous response. It carries the filters, `dir`, `select` (and `q` when short), so pass it alone. Not valid with `group_by`."
|
|
1037
1153
|
}
|
|
1038
1154
|
}
|
|
1039
1155
|
},
|
|
@@ -1043,17 +1159,15 @@ export const tools = [
|
|
|
1043
1159
|
"paramLocation": {
|
|
1044
1160
|
"kind": "query",
|
|
1045
1161
|
"ticker": "query",
|
|
1046
|
-
"tickers": "query",
|
|
1047
1162
|
"universe": "query",
|
|
1048
|
-
"firm": "query",
|
|
1049
|
-
"action": "query",
|
|
1050
|
-
"signal": "query",
|
|
1051
|
-
"transition": "query",
|
|
1052
1163
|
"from": "query",
|
|
1053
1164
|
"to": "query",
|
|
1165
|
+
"signal": "query",
|
|
1166
|
+
"transition": "query",
|
|
1167
|
+
"merge_gap_seconds": "query",
|
|
1054
1168
|
"q": "query",
|
|
1055
1169
|
"join": "query",
|
|
1056
|
-
"
|
|
1170
|
+
"grain": "query",
|
|
1057
1171
|
"select": "query",
|
|
1058
1172
|
"group_by": "query",
|
|
1059
1173
|
"having": "query",
|
|
@@ -1061,53 +1175,69 @@ export const tools = [
|
|
|
1061
1175
|
"dir": "query",
|
|
1062
1176
|
"limit": "query",
|
|
1063
1177
|
"cursor": "query"
|
|
1178
|
+
},
|
|
1179
|
+
"accepts": {
|
|
1180
|
+
"tickers": "query",
|
|
1181
|
+
"since": "query",
|
|
1182
|
+
"until": "query",
|
|
1183
|
+
"interval": "query",
|
|
1184
|
+
"firm": "query",
|
|
1185
|
+
"action": "query",
|
|
1186
|
+
"min_relevance": "query"
|
|
1064
1187
|
}
|
|
1065
1188
|
}
|
|
1066
1189
|
},
|
|
1190
|
+
{
|
|
1191
|
+
"name": "tickerbot_list_event_kinds",
|
|
1192
|
+
"description": "Returns every event kind: what it is, whether it is in the default stream and can be subscribed to, what its `ts` means, and the fields you can name in `q`, `select` and `group_by` when you ask for that kind alone. Call once to learn the kinds, which are in the default stream, which can be subscribed to, and the field names each accepts in `q`, `select` and `group_by`.",
|
|
1193
|
+
"inputSchema": {
|
|
1194
|
+
"type": "object",
|
|
1195
|
+
"properties": {}
|
|
1196
|
+
},
|
|
1197
|
+
"endpoint": {
|
|
1198
|
+
"method": "GET",
|
|
1199
|
+
"path": "/v2/events/kinds",
|
|
1200
|
+
"paramLocation": {}
|
|
1201
|
+
}
|
|
1202
|
+
},
|
|
1067
1203
|
{
|
|
1068
1204
|
"name": "tickerbot_subscribe_events",
|
|
1069
|
-
"description": "
|
|
1205
|
+
"description": "Gets you an alert by webhook when new events of the kinds you choose land, filtered on the event and on the ticker's signals. Webhooks need a paid plan (Free has no webhook slots). One `q` covers the event's fields (with one kind, bare: `firm = 'Goldman Sachs'`) and the ticker's signals at fire time (`market_cap > 1e10`); on a name clash (`price`, `cik`) the ticker signal wins; the event's own value is `payload->>'price'`. Latency is the ingest cadence (analyst ≤1h, corporate kinds daily), not sub-minute.",
|
|
1070
1206
|
"inputSchema": {
|
|
1071
1207
|
"type": "object",
|
|
1072
1208
|
"properties": {
|
|
1073
|
-
"
|
|
1209
|
+
"kind": {
|
|
1074
1210
|
"type": "string",
|
|
1075
|
-
"description": "Event kinds to fire on
|
|
1211
|
+
"description": "Event kinds to fire on, an array or a comma list. `filing` fires when a 10-K, 20-F, 40-F or 10-Q lands (the next morning's EDGAR index read); `estimate_revision` when the nightly consensus refresh moves an EPS estimate (about 1,000 a night across the market, at most about one a day per ticker).",
|
|
1076
1212
|
"enum": [
|
|
1077
|
-
"earnings",
|
|
1078
1213
|
"dividend",
|
|
1079
1214
|
"split",
|
|
1080
1215
|
"insider",
|
|
1081
|
-
"analyst"
|
|
1216
|
+
"analyst",
|
|
1217
|
+
"earnings",
|
|
1218
|
+
"filing",
|
|
1219
|
+
"estimate_revision"
|
|
1082
1220
|
]
|
|
1083
1221
|
},
|
|
1084
|
-
"tickers": {
|
|
1085
|
-
"type": "string",
|
|
1086
|
-
"description": "Scope to specific tickers (max 50). Mutually exclusive with `universe` — and with the singular alias `ticker` (sending both is a 400). Omit both for all tickers."
|
|
1087
|
-
},
|
|
1088
1222
|
"ticker": {
|
|
1089
1223
|
"type": "string",
|
|
1090
|
-
"description": "
|
|
1224
|
+
"description": "One ticker or a comma list (up to 50). Not combinable with `universe`. Omit both for every ticker."
|
|
1091
1225
|
},
|
|
1092
1226
|
"universe": {
|
|
1093
1227
|
"type": "string",
|
|
1094
|
-
"description": "Scope to a universe slug (`top_10`, `top_100
|
|
1228
|
+
"description": "Scope to a universe slug (`top_10`, `top_100` or one of yours)."
|
|
1095
1229
|
},
|
|
1096
1230
|
"q": {
|
|
1097
1231
|
"type": "string",
|
|
1098
|
-
"description": "
|
|
1099
|
-
},
|
|
1100
|
-
"event_q": {
|
|
1101
|
-
"type": "string",
|
|
1102
|
-
"description": "Optional event-CONTENT filter in the `/v2/events` grammar — only `ticker`, `ts`, `kind`, `payload` may appear. Composes with `q`."
|
|
1232
|
+
"description": "The filter, as on Query events with `join=state`: the event's own fields (`id`, `ticker`, `ts`, `kind`, `payload`, and with one kind its payload fields by bare name) and the ticker's signals at fire time, in one WHERE clause. A payload field and a signal with the same name resolve to the signal, as on Query events: `price` on insider, `cik` on filing. Spell the event's own value `payload->>'price'`. Custom signals are expanded and frozen at creation."
|
|
1103
1233
|
},
|
|
1104
|
-
"
|
|
1234
|
+
"select": {
|
|
1105
1235
|
"type": "string",
|
|
1106
|
-
"description": "
|
|
1236
|
+
"description": "What each delivered event carries: `id`, `ticker`, `ts` and `kind` always, then the names you list, at the top level: `payload`, the payload fields of the one kind named, and ticker signals at fire time. Omitted: each event as on Query events (`payload` whole)."
|
|
1107
1237
|
},
|
|
1108
1238
|
"channel": {
|
|
1109
1239
|
"type": "string",
|
|
1110
|
-
"description": "Delivery channel. `
|
|
1240
|
+
"description": "Delivery channel. Inferred when omitted: `webhook` if `target_url` is set, `discord` if `discord_url` is set, `mobile_push` if `device_id` is set, else `in_app`.",
|
|
1111
1241
|
"enum": [
|
|
1112
1242
|
"webhook",
|
|
1113
1243
|
"discord",
|
|
@@ -1115,13 +1245,17 @@ export const tools = [
|
|
|
1115
1245
|
"mobile_push"
|
|
1116
1246
|
]
|
|
1117
1247
|
},
|
|
1248
|
+
"target_url": {
|
|
1249
|
+
"type": "string",
|
|
1250
|
+
"description": "Only with `channel=webhook`. HTTPS delivery URL."
|
|
1251
|
+
},
|
|
1118
1252
|
"discord_url": {
|
|
1119
1253
|
"type": "string",
|
|
1120
|
-
"description": "Discord incoming-webhook URL.
|
|
1254
|
+
"description": "Only with `channel=discord`. Discord incoming-webhook URL. Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliveries) strips it and sets `channel_config_present: true` instead."
|
|
1121
1255
|
},
|
|
1122
1256
|
"device_id": {
|
|
1123
1257
|
"type": "string",
|
|
1124
|
-
"description": "Device to notify, from `POST /v2/devices/register`.
|
|
1258
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. Unknown ids are a 404 `device_not_found`."
|
|
1125
1259
|
},
|
|
1126
1260
|
"name": {
|
|
1127
1261
|
"type": "string",
|
|
@@ -1129,64 +1263,81 @@ export const tools = [
|
|
|
1129
1263
|
}
|
|
1130
1264
|
},
|
|
1131
1265
|
"required": [
|
|
1132
|
-
"
|
|
1266
|
+
"kind"
|
|
1133
1267
|
]
|
|
1134
1268
|
},
|
|
1135
1269
|
"endpoint": {
|
|
1136
1270
|
"method": "POST",
|
|
1137
1271
|
"path": "/v2/events/subscribe",
|
|
1138
1272
|
"paramLocation": {
|
|
1139
|
-
"
|
|
1140
|
-
"tickers": "body",
|
|
1273
|
+
"kind": "body",
|
|
1141
1274
|
"ticker": "body",
|
|
1142
1275
|
"universe": "body",
|
|
1143
1276
|
"q": "body",
|
|
1144
|
-
"
|
|
1145
|
-
"target_url": "body",
|
|
1277
|
+
"select": "body",
|
|
1146
1278
|
"channel": "body",
|
|
1279
|
+
"target_url": "body",
|
|
1147
1280
|
"discord_url": "body",
|
|
1148
1281
|
"device_id": "body",
|
|
1149
1282
|
"name": "body"
|
|
1283
|
+
},
|
|
1284
|
+
"accepts": {
|
|
1285
|
+
"kinds": "body",
|
|
1286
|
+
"tickers": "body",
|
|
1287
|
+
"universe_id": "body",
|
|
1288
|
+
"event_q": "body"
|
|
1150
1289
|
}
|
|
1151
1290
|
}
|
|
1152
1291
|
},
|
|
1153
1292
|
{
|
|
1154
1293
|
"name": "tickerbot_search_news",
|
|
1155
|
-
"description": "SQL
|
|
1294
|
+
"description": "Queries news with SQL for any ticker or a screen's matches: articles with how each one treats every ticker it mentions, or rollups when you group them. `ticker` (one or a comma list) keeps articles that mention it; add `min_relevance: 0.8` to keep only articles about it. Each article carries `mentions`: per ticker, `relevance` and `sentiment_score`/`sentiment`. Naming `ticker`, `relevance`, `sentiment_score` or `sentiment` in `q`/`select`/`group_by` gives one row per article per mention: `q: ticker = 'NVDA' AND sentiment_score < -0.3` is articles negative about NVDA. `search` is full-text over title and summary. Rollups with group_by/having return `truncated: true` instead of paging.",
|
|
1156
1295
|
"inputSchema": {
|
|
1157
1296
|
"type": "object",
|
|
1158
1297
|
"properties": {
|
|
1159
|
-
"
|
|
1298
|
+
"search": {
|
|
1160
1299
|
"type": "string",
|
|
1161
|
-
"description": "
|
|
1300
|
+
"description": "Full-text search over `title` + `summary` — websearch grammar: `nvidia earnings` (all words), `\"price target\"` (phrase), `chips OR semiconductors`, `-crypto` (negation). Max 200 chars. ANDs with `q` and the other filters. Language-stemmed English."
|
|
1162
1301
|
},
|
|
1163
|
-
"
|
|
1302
|
+
"ticker": {
|
|
1164
1303
|
"type": "string",
|
|
1165
|
-
"description": "
|
|
1304
|
+
"description": "One ticker or a comma list (up to 50): articles that mention any of them. Not combinable with `universe`. Per-mention rows still list every ticker an article mentions; put `ticker = 'NVDA'` in `q` for one ticker's rows."
|
|
1166
1305
|
},
|
|
1167
1306
|
"universe": {
|
|
1168
1307
|
"type": "string",
|
|
1169
|
-
"description": "Universe slug
|
|
1308
|
+
"description": "Universe slug: articles that mention any member. Not combinable with `ticker`."
|
|
1170
1309
|
},
|
|
1171
1310
|
"from": {
|
|
1172
1311
|
"type": "string",
|
|
1173
|
-
"description": "Earliest `time_published` (inclusive) — strict ISO: `YYYY-MM-DD` or `YYYY-MM-DDTHH:MM[:SS]Z`.
|
|
1312
|
+
"description": "Earliest `time_published` (inclusive) — strict ISO: `YYYY-MM-DD` or `YYYY-MM-DDTHH:MM[:SS]Z`. A bare date starts at 00:00 ET that day."
|
|
1174
1313
|
},
|
|
1175
1314
|
"to": {
|
|
1176
1315
|
"type": "string",
|
|
1177
|
-
"description": "Articles strictly before this instant — same strict ISO subset, matching `/v2/events`. (`
|
|
1316
|
+
"description": "Articles strictly before this instant — same strict ISO subset, matching `/v2/events`. A bare `YYYY-MM-DD` means through the end of that day (the ET calendar day), so `from` and `to` on the same date return that day."
|
|
1178
1317
|
},
|
|
1179
|
-
"
|
|
1180
|
-
"type": "
|
|
1181
|
-
"description": "
|
|
1318
|
+
"min_relevance": {
|
|
1319
|
+
"type": "number",
|
|
1320
|
+
"description": "Only with `ticker` or `universe`. Keeps an article only when it is about one of the tickers, meaning that ticker's `relevance` (0 to 1) is at least this value. `0.8` drops passing mentions. Omitted: every article that mentions them. `400` without a ticker scope; in `q`, filter the mention itself: `ticker = 'NVDA' AND relevance >= 0.8`."
|
|
1182
1321
|
},
|
|
1183
1322
|
"q": {
|
|
1184
1323
|
"type": "string",
|
|
1185
|
-
"description": "WHERE clause over
|
|
1324
|
+
"description": "WHERE clause over news articles. Max 4000 chars. Required unless `search`, `ticker`, `universe`, `from` or `to` is present. Takes every article field under Returns except `mentions`, plus the per-mention fields `ticker`, `relevance`, `sentiment_score` and `sentiment` (one article per mention). Signals are not joinable here."
|
|
1325
|
+
},
|
|
1326
|
+
"select": {
|
|
1327
|
+
"type": "string",
|
|
1328
|
+
"description": "Fields or expressions to return (max 2000 chars). Defaults to the article row (no `group_by`) or `<group_by keys>, COUNT(*) AS volume` (with `group_by`). `mentions` is selectable on its own."
|
|
1329
|
+
},
|
|
1330
|
+
"group_by": {
|
|
1331
|
+
"type": "string",
|
|
1332
|
+
"description": "Comma-separated group keys, 1-6 (max 1000 chars); the response becomes rollups. `ticker` rolls up per ticker mentioned. Name a key with `AS` to choose its JSON key; an un-named expression is named for you rather than returned as `?column?`."
|
|
1333
|
+
},
|
|
1334
|
+
"having": {
|
|
1335
|
+
"type": "string",
|
|
1336
|
+
"description": "Only with `group_by`. HAVING clause on the rollup (max 1000 chars)."
|
|
1186
1337
|
},
|
|
1187
1338
|
"order": {
|
|
1188
1339
|
"type": "string",
|
|
1189
|
-
"description": "Sort — a bare
|
|
1340
|
+
"description": "Sort — a bare field name or SELECT alias only (put expressions in `select` and order by their alias). Defaults to `time_published` (articles) or `volume` (rollups; with your own `select` that has no `volume` column, its last column's alias)."
|
|
1190
1341
|
},
|
|
1191
1342
|
"dir": {
|
|
1192
1343
|
"type": "string",
|
|
@@ -1199,24 +1350,12 @@ export const tools = [
|
|
|
1199
1350
|
},
|
|
1200
1351
|
"limit": {
|
|
1201
1352
|
"type": "integer",
|
|
1202
|
-
"description": "Page size.
|
|
1353
|
+
"description": "Page size (articles) / max groups (a `group_by` rollup). Articles take up to 1000 until 2027-01-12, then 100, and page the rest with `next_cursor`; a rollup keeps up to 1000 groups and sets `truncated: true` past that. A larger value is clamped to the max, not an error; see Deprecations.",
|
|
1203
1354
|
"default": 50
|
|
1204
1355
|
},
|
|
1205
1356
|
"cursor": {
|
|
1206
1357
|
"type": "string",
|
|
1207
1358
|
"description": "Opaque pagination cursor from a prior response's `next_cursor`."
|
|
1208
|
-
},
|
|
1209
|
-
"group_by": {
|
|
1210
|
-
"type": "string",
|
|
1211
|
-
"description": "AGGREGATE MODE: comma-separated group keys, 1-6 (max 1000 chars). Switches the response to rollup rows. Use `tk` to roll up per ticker without writing the UNNEST. Name a key with `AS` to choose its JSON key; an un-named expression is named for you rather than returned as `?column?`."
|
|
1212
|
-
},
|
|
1213
|
-
"select": {
|
|
1214
|
-
"type": "string",
|
|
1215
|
-
"description": "Columns/expressions to return (max 2000 chars). Defaults to article columns (no `group_by`) or `<group_by cols>, COUNT(*) AS volume` (with `group_by`)."
|
|
1216
|
-
},
|
|
1217
|
-
"having": {
|
|
1218
|
-
"type": "string",
|
|
1219
|
-
"description": "HAVING clause on the aggregate (max 1000 chars). Requires `group_by`."
|
|
1220
1359
|
}
|
|
1221
1360
|
}
|
|
1222
1361
|
},
|
|
@@ -1224,94 +1363,129 @@ export const tools = [
|
|
|
1224
1363
|
"method": "GET",
|
|
1225
1364
|
"path": "/v2/news",
|
|
1226
1365
|
"paramLocation": {
|
|
1366
|
+
"search": "query",
|
|
1227
1367
|
"ticker": "query",
|
|
1228
|
-
"tickers": "query",
|
|
1229
1368
|
"universe": "query",
|
|
1230
1369
|
"from": "query",
|
|
1231
1370
|
"to": "query",
|
|
1232
|
-
"
|
|
1371
|
+
"min_relevance": "query",
|
|
1233
1372
|
"q": "query",
|
|
1373
|
+
"select": "query",
|
|
1374
|
+
"group_by": "query",
|
|
1375
|
+
"having": "query",
|
|
1234
1376
|
"order": "query",
|
|
1235
1377
|
"dir": "query",
|
|
1236
1378
|
"limit": "query",
|
|
1237
|
-
"cursor": "query"
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
"
|
|
1379
|
+
"cursor": "query"
|
|
1380
|
+
},
|
|
1381
|
+
"accepts": {
|
|
1382
|
+
"tickers": "query",
|
|
1383
|
+
"since": "query",
|
|
1384
|
+
"until": "query"
|
|
1241
1385
|
}
|
|
1242
1386
|
}
|
|
1243
1387
|
},
|
|
1244
1388
|
{
|
|
1245
|
-
"name": "
|
|
1246
|
-
"description": "
|
|
1389
|
+
"name": "tickerbot_subscribe_news",
|
|
1390
|
+
"description": "Gets you an alert by webhook when a new article matches your search, tickers or SQL filter, with how it treats each ticker it mentions. Webhooks need a paid plan (Free has no webhook slots). Takes Query news's filters (search, ticker, universe, min_relevance, q); one of search/ticker/universe/q is required, since the whole market is about 6,000 articles a weekday. Fires as new matching articles land; each article fires once. Each delivery is `event: \"news.fired\"` with `articles`, each the Query news row (or `select`) plus `mentions`.",
|
|
1247
1391
|
"inputSchema": {
|
|
1248
1392
|
"type": "object",
|
|
1249
1393
|
"properties": {
|
|
1250
|
-
"
|
|
1394
|
+
"search": {
|
|
1251
1395
|
"type": "string",
|
|
1252
|
-
"description": "
|
|
1396
|
+
"description": "Full-text search over `title` + `summary`, as on Query news."
|
|
1253
1397
|
},
|
|
1254
|
-
"limit": {
|
|
1255
|
-
"type": "integer",
|
|
1256
|
-
"description": "Max holdings returned. Max 5000. When the cap cuts the list, the response sets `truncated: true` and `total` (the ETF's full holding count) — raise `limit` to at least `total` to get the full set, possible whenever `total` is within the 5000 cap (an over-cap `limit` is clamped to 5000, not an error). No `truncated` in the response means the list is complete.",
|
|
1257
|
-
"default": 500
|
|
1258
|
-
}
|
|
1259
|
-
},
|
|
1260
|
-
"required": [
|
|
1261
|
-
"ticker"
|
|
1262
|
-
]
|
|
1263
|
-
},
|
|
1264
|
-
"endpoint": {
|
|
1265
|
-
"method": "GET",
|
|
1266
|
-
"path": "/v2/etf/{ticker}/holdings",
|
|
1267
|
-
"paramLocation": {
|
|
1268
|
-
"ticker": "path",
|
|
1269
|
-
"limit": "query"
|
|
1270
|
-
}
|
|
1271
|
-
}
|
|
1272
|
-
},
|
|
1273
|
-
{
|
|
1274
|
-
"name": "tickerbot_get_etf_sectors",
|
|
1275
|
-
"description": "Returns an ETF's sector weights, heaviest first. Always complete, since sector breakdowns are small. When the ticker is not an ETF, `is_etf` is false and `sectors` is empty.",
|
|
1276
|
-
"inputSchema": {
|
|
1277
|
-
"type": "object",
|
|
1278
|
-
"properties": {
|
|
1279
1398
|
"ticker": {
|
|
1280
1399
|
"type": "string",
|
|
1281
|
-
"description": "
|
|
1400
|
+
"description": "One ticker or a comma list (up to 50): articles that mention any of them. Not combinable with `universe`."
|
|
1401
|
+
},
|
|
1402
|
+
"universe": {
|
|
1403
|
+
"type": "string",
|
|
1404
|
+
"description": "Universe slug (`top_10`, `top_100` or one of yours): articles that mention any member."
|
|
1405
|
+
},
|
|
1406
|
+
"min_relevance": {
|
|
1407
|
+
"type": "number",
|
|
1408
|
+
"description": "Only with `ticker` or `universe`. Only articles about one of the tickers (its `relevance` at least this value, 0 to 1)."
|
|
1409
|
+
},
|
|
1410
|
+
"q": {
|
|
1411
|
+
"type": "string",
|
|
1412
|
+
"description": "The filter, as on Query news: article fields and the per-mention fields `ticker`, `relevance`, `sentiment_score` and `sentiment`. An article fires once when any of its mentions matches."
|
|
1413
|
+
},
|
|
1414
|
+
"select": {
|
|
1415
|
+
"type": "string",
|
|
1416
|
+
"description": "The article fields each delivered article carries, besides `id` and `mentions` (always sent). Names only. Omitted: the Query news default row."
|
|
1417
|
+
},
|
|
1418
|
+
"channel": {
|
|
1419
|
+
"type": "string",
|
|
1420
|
+
"description": "Delivery channel. Inferred when omitted: `webhook` if `target_url` is set, `discord` if `discord_url` is set, `mobile_push` if `device_id` is set, else `in_app`.",
|
|
1421
|
+
"enum": [
|
|
1422
|
+
"webhook",
|
|
1423
|
+
"discord",
|
|
1424
|
+
"in_app",
|
|
1425
|
+
"mobile_push"
|
|
1426
|
+
]
|
|
1427
|
+
},
|
|
1428
|
+
"target_url": {
|
|
1429
|
+
"type": "string",
|
|
1430
|
+
"description": "Only with `channel=webhook`. HTTPS delivery URL."
|
|
1431
|
+
},
|
|
1432
|
+
"discord_url": {
|
|
1433
|
+
"type": "string",
|
|
1434
|
+
"description": "Only with `channel=discord`. Discord incoming-webhook URL. Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliveries) strips it and sets `channel_config_present: true` instead."
|
|
1435
|
+
},
|
|
1436
|
+
"device_id": {
|
|
1437
|
+
"type": "string",
|
|
1438
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. Unknown ids are a 404 `device_not_found`."
|
|
1439
|
+
},
|
|
1440
|
+
"name": {
|
|
1441
|
+
"type": "string",
|
|
1442
|
+
"description": "Display name. Defaults to `news: <scope> · <search or q>`."
|
|
1282
1443
|
}
|
|
1283
|
-
}
|
|
1284
|
-
"required": [
|
|
1285
|
-
"ticker"
|
|
1286
|
-
]
|
|
1444
|
+
}
|
|
1287
1445
|
},
|
|
1288
1446
|
"endpoint": {
|
|
1289
|
-
"method": "
|
|
1290
|
-
"path": "/v2/
|
|
1447
|
+
"method": "POST",
|
|
1448
|
+
"path": "/v2/news/subscribe",
|
|
1291
1449
|
"paramLocation": {
|
|
1292
|
-
"
|
|
1450
|
+
"search": "body",
|
|
1451
|
+
"ticker": "body",
|
|
1452
|
+
"universe": "body",
|
|
1453
|
+
"min_relevance": "body",
|
|
1454
|
+
"q": "body",
|
|
1455
|
+
"select": "body",
|
|
1456
|
+
"channel": "body",
|
|
1457
|
+
"target_url": "body",
|
|
1458
|
+
"discord_url": "body",
|
|
1459
|
+
"device_id": "body",
|
|
1460
|
+
"name": "body"
|
|
1461
|
+
},
|
|
1462
|
+
"accepts": {
|
|
1463
|
+
"tickers": "body",
|
|
1464
|
+
"universe_id": "body"
|
|
1293
1465
|
}
|
|
1294
1466
|
}
|
|
1295
1467
|
},
|
|
1296
1468
|
{
|
|
1297
1469
|
"name": "tickerbot_list_universes",
|
|
1298
|
-
"description": "
|
|
1470
|
+
"description": "Lists every universe you can use: your own ticker lists and the built-in ones. `kind: builtin` lists the built-in universes (top_10, top_100); omit it for yours; `builtin,custom` lists both. Use a slug as `universe` on scan, signal, and subscribe tools.",
|
|
1299
1471
|
"inputSchema": {
|
|
1300
1472
|
"type": "object",
|
|
1301
1473
|
"properties": {
|
|
1302
|
-
"
|
|
1474
|
+
"kind": {
|
|
1303
1475
|
"type": "string",
|
|
1304
|
-
"description": "Which universes to list: `
|
|
1476
|
+
"description": "Which universes to list: `builtin` (`top_10`, `top_100`), `custom` (your own) or both as a comma list. Leave it out for your own; from the cut-off on Deprecations it lists both.",
|
|
1305
1477
|
"enum": [
|
|
1306
|
-
"
|
|
1307
|
-
"
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1478
|
+
"builtin",
|
|
1479
|
+
"custom"
|
|
1480
|
+
]
|
|
1481
|
+
},
|
|
1482
|
+
"search": {
|
|
1483
|
+
"type": "string",
|
|
1484
|
+
"description": "Only universes whose id, name or description contains this text (case-insensitive)."
|
|
1311
1485
|
},
|
|
1312
1486
|
"limit": {
|
|
1313
1487
|
"type": "integer",
|
|
1314
|
-
"description": "Page size
|
|
1488
|
+
"description": "Page size. Max 100.",
|
|
1315
1489
|
"default": 50
|
|
1316
1490
|
},
|
|
1317
1491
|
"cursor": {
|
|
@@ -1324,28 +1498,32 @@ export const tools = [
|
|
|
1324
1498
|
"method": "GET",
|
|
1325
1499
|
"path": "/v2/universes",
|
|
1326
1500
|
"paramLocation": {
|
|
1327
|
-
"
|
|
1501
|
+
"kind": "query",
|
|
1502
|
+
"search": "query",
|
|
1328
1503
|
"limit": "query",
|
|
1329
1504
|
"cursor": "query"
|
|
1505
|
+
},
|
|
1506
|
+
"accepts": {
|
|
1507
|
+
"owner": "query"
|
|
1330
1508
|
}
|
|
1331
1509
|
}
|
|
1332
1510
|
},
|
|
1333
1511
|
{
|
|
1334
1512
|
"name": "tickerbot_create_universe",
|
|
1335
|
-
"description": "
|
|
1513
|
+
"description": "Saves a named list of tickers to scope screens and subscriptions.",
|
|
1336
1514
|
"inputSchema": {
|
|
1337
1515
|
"type": "object",
|
|
1338
1516
|
"properties": {
|
|
1339
|
-
"name": {
|
|
1340
|
-
"type": "string",
|
|
1341
|
-
"description": "Human-readable label, up to 80 characters. Display-only — never used to reference the universe."
|
|
1342
|
-
},
|
|
1343
1517
|
"tickers": {
|
|
1344
1518
|
"type": "array",
|
|
1345
1519
|
"items": {
|
|
1346
1520
|
"type": "string"
|
|
1347
1521
|
},
|
|
1348
|
-
"description": "Ticker symbols, up to 10,000. Validated against the
|
|
1522
|
+
"description": "Ticker symbols, up to 10,000. Validated against the tickers we track. `[]` is accepted: an empty universe you can fill later via PATCH."
|
|
1523
|
+
},
|
|
1524
|
+
"name": {
|
|
1525
|
+
"type": "string",
|
|
1526
|
+
"description": "Human-readable label, up to 80 characters. Display-only — never used to reference the universe."
|
|
1349
1527
|
},
|
|
1350
1528
|
"id": {
|
|
1351
1529
|
"type": "string",
|
|
@@ -1357,16 +1535,16 @@ export const tools = [
|
|
|
1357
1535
|
}
|
|
1358
1536
|
},
|
|
1359
1537
|
"required": [
|
|
1360
|
-
"
|
|
1361
|
-
"
|
|
1538
|
+
"tickers",
|
|
1539
|
+
"name"
|
|
1362
1540
|
]
|
|
1363
1541
|
},
|
|
1364
1542
|
"endpoint": {
|
|
1365
1543
|
"method": "POST",
|
|
1366
1544
|
"path": "/v2/universes",
|
|
1367
1545
|
"paramLocation": {
|
|
1368
|
-
"name": "body",
|
|
1369
1546
|
"tickers": "body",
|
|
1547
|
+
"name": "body",
|
|
1370
1548
|
"id": "body",
|
|
1371
1549
|
"description": "body"
|
|
1372
1550
|
}
|
|
@@ -1374,51 +1552,49 @@ export const tools = [
|
|
|
1374
1552
|
},
|
|
1375
1553
|
{
|
|
1376
1554
|
"name": "tickerbot_get_universe",
|
|
1377
|
-
"description": "Returns
|
|
1555
|
+
"description": "Returns one universe: a built-in (`top_10`, `top_100`) or one you own.",
|
|
1378
1556
|
"inputSchema": {
|
|
1379
1557
|
"type": "object",
|
|
1380
1558
|
"properties": {
|
|
1381
|
-
"
|
|
1559
|
+
"universe": {
|
|
1382
1560
|
"type": "string",
|
|
1383
|
-
"description": "Universe slug."
|
|
1561
|
+
"description": "Universe slug: a built-in (`top_10`, `top_100`) or one of yours."
|
|
1384
1562
|
}
|
|
1385
1563
|
},
|
|
1386
1564
|
"required": [
|
|
1387
|
-
"
|
|
1565
|
+
"universe"
|
|
1388
1566
|
]
|
|
1389
1567
|
},
|
|
1390
1568
|
"endpoint": {
|
|
1391
1569
|
"method": "GET",
|
|
1392
|
-
"path": "/v2/universes/{
|
|
1570
|
+
"path": "/v2/universes/{universe}",
|
|
1393
1571
|
"paramLocation": {
|
|
1572
|
+
"universe": "path"
|
|
1573
|
+
},
|
|
1574
|
+
"accepts": {
|
|
1394
1575
|
"id": "path"
|
|
1576
|
+
},
|
|
1577
|
+
"pathAliases": {
|
|
1578
|
+
"id": "universe"
|
|
1395
1579
|
}
|
|
1396
1580
|
}
|
|
1397
1581
|
},
|
|
1398
1582
|
{
|
|
1399
1583
|
"name": "tickerbot_update_universe",
|
|
1400
|
-
"description": "
|
|
1584
|
+
"description": "Updates one of your universes: its name, description or members. `tickers` replaces the whole list; `add`/`remove` adjust it. System universes cannot be edited.",
|
|
1401
1585
|
"inputSchema": {
|
|
1402
1586
|
"type": "object",
|
|
1403
1587
|
"properties": {
|
|
1404
|
-
"
|
|
1588
|
+
"universe": {
|
|
1405
1589
|
"type": "string",
|
|
1406
1590
|
"description": "Universe slug."
|
|
1407
1591
|
},
|
|
1408
|
-
"name": {
|
|
1409
|
-
"type": "string",
|
|
1410
|
-
"description": "New label. Non-empty, max 80 characters."
|
|
1411
|
-
},
|
|
1412
|
-
"description": {
|
|
1413
|
-
"type": "string",
|
|
1414
|
-
"description": "New notes. Max 500 characters."
|
|
1415
|
-
},
|
|
1416
1592
|
"tickers": {
|
|
1417
1593
|
"type": "array",
|
|
1418
1594
|
"items": {
|
|
1419
1595
|
"type": "string"
|
|
1420
1596
|
},
|
|
1421
|
-
"description": "Replace the full ticker list (up to 10,000; validated against the
|
|
1597
|
+
"description": "Replace the full ticker list (up to 10,000; validated against the tickers we track). Does not combine with `add`/`remove` (400)."
|
|
1422
1598
|
},
|
|
1423
1599
|
"add": {
|
|
1424
1600
|
"type": "array",
|
|
@@ -1433,63 +1609,83 @@ export const tools = [
|
|
|
1433
1609
|
"type": "string"
|
|
1434
1610
|
},
|
|
1435
1611
|
"description": "Remove these tickers."
|
|
1612
|
+
},
|
|
1613
|
+
"name": {
|
|
1614
|
+
"type": "string",
|
|
1615
|
+
"description": "New label. Non-empty, max 80 characters."
|
|
1616
|
+
},
|
|
1617
|
+
"description": {
|
|
1618
|
+
"type": "string",
|
|
1619
|
+
"description": "New notes. Max 500 characters."
|
|
1436
1620
|
}
|
|
1437
1621
|
},
|
|
1438
1622
|
"required": [
|
|
1439
|
-
"
|
|
1623
|
+
"universe"
|
|
1440
1624
|
]
|
|
1441
1625
|
},
|
|
1442
1626
|
"endpoint": {
|
|
1443
1627
|
"method": "PATCH",
|
|
1444
|
-
"path": "/v2/universes/{
|
|
1628
|
+
"path": "/v2/universes/{universe}",
|
|
1445
1629
|
"paramLocation": {
|
|
1446
|
-
"
|
|
1447
|
-
"name": "body",
|
|
1448
|
-
"description": "body",
|
|
1630
|
+
"universe": "path",
|
|
1449
1631
|
"tickers": "body",
|
|
1450
1632
|
"add": "body",
|
|
1451
|
-
"remove": "body"
|
|
1633
|
+
"remove": "body",
|
|
1634
|
+
"name": "body",
|
|
1635
|
+
"description": "body"
|
|
1636
|
+
},
|
|
1637
|
+
"accepts": {
|
|
1638
|
+
"id": "path"
|
|
1639
|
+
},
|
|
1640
|
+
"pathAliases": {
|
|
1641
|
+
"id": "universe"
|
|
1452
1642
|
}
|
|
1453
1643
|
}
|
|
1454
1644
|
},
|
|
1455
1645
|
{
|
|
1456
1646
|
"name": "tickerbot_delete_universe",
|
|
1457
|
-
"description": "Permanently
|
|
1647
|
+
"description": "Permanently deletes one of your universes. Webhooks that reference the deleted universe fail on their next eval — clean those up first.",
|
|
1458
1648
|
"inputSchema": {
|
|
1459
1649
|
"type": "object",
|
|
1460
1650
|
"properties": {
|
|
1461
|
-
"
|
|
1651
|
+
"universe": {
|
|
1462
1652
|
"type": "string",
|
|
1463
1653
|
"description": "Universe slug."
|
|
1464
1654
|
},
|
|
1465
1655
|
"force": {
|
|
1466
1656
|
"type": "boolean",
|
|
1467
|
-
"description": "A universe still referenced by live webhooks refuses to delete with `409 universe_referenced`. Pass `force=true` to delete anyway
|
|
1657
|
+
"description": "A universe still referenced by live webhooks refuses to delete with `409 universe_referenced`. Pass `force=true` to delete anyway; those webhooks are disabled at their next evaluation.",
|
|
1468
1658
|
"default": false
|
|
1469
1659
|
}
|
|
1470
1660
|
},
|
|
1471
1661
|
"required": [
|
|
1472
|
-
"
|
|
1662
|
+
"universe"
|
|
1473
1663
|
]
|
|
1474
1664
|
},
|
|
1475
1665
|
"endpoint": {
|
|
1476
1666
|
"method": "DELETE",
|
|
1477
|
-
"path": "/v2/universes/{
|
|
1667
|
+
"path": "/v2/universes/{universe}",
|
|
1478
1668
|
"paramLocation": {
|
|
1479
|
-
"
|
|
1669
|
+
"universe": "path",
|
|
1480
1670
|
"force": "query"
|
|
1671
|
+
},
|
|
1672
|
+
"accepts": {
|
|
1673
|
+
"id": "path"
|
|
1674
|
+
},
|
|
1675
|
+
"pathAliases": {
|
|
1676
|
+
"id": "universe"
|
|
1481
1677
|
}
|
|
1482
1678
|
}
|
|
1483
1679
|
},
|
|
1484
1680
|
{
|
|
1485
1681
|
"name": "tickerbot_list_webhooks",
|
|
1486
|
-
"description": "
|
|
1682
|
+
"description": "Lists every webhook on your account, newest first.",
|
|
1487
1683
|
"inputSchema": {
|
|
1488
1684
|
"type": "object",
|
|
1489
1685
|
"properties": {
|
|
1490
1686
|
"status": {
|
|
1491
1687
|
"type": "string",
|
|
1492
|
-
"description": "Filter by status: `active
|
|
1688
|
+
"description": "Filter by status: `active`, `disabled` or both as a comma list — the only two states a webhook has (`disabled` covers a user pause, the automatic disable after 72 hours with no successful delivery and the automatic disable of a trigger that can no longer run; `disabled_reason` on each record says which: `user_disabled`, `delivery_failure`, `evaluation_failure`, `plan_downgrade` or `subscription_canceled`). Omit for all.",
|
|
1493
1689
|
"enum": [
|
|
1494
1690
|
"active",
|
|
1495
1691
|
"disabled"
|
|
@@ -1517,69 +1713,100 @@ export const tools = [
|
|
|
1517
1713
|
}
|
|
1518
1714
|
},
|
|
1519
1715
|
{
|
|
1520
|
-
"name": "
|
|
1521
|
-
"description": "
|
|
1716
|
+
"name": "tickerbot_get_webhook",
|
|
1717
|
+
"description": "Returns one webhook's current state.",
|
|
1522
1718
|
"inputSchema": {
|
|
1523
1719
|
"type": "object",
|
|
1524
1720
|
"properties": {
|
|
1525
|
-
"
|
|
1526
|
-
"type": "
|
|
1527
|
-
"description": "
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
"
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
"
|
|
1568
|
-
|
|
1569
|
-
"description": "scan / signal / event: optional universe slug (`top_10`, `top_100`, or one of yours) scoping which tickers can fire. Mutually exclusive with `trigger.tickers` on event."
|
|
1570
|
-
}
|
|
1571
|
-
},
|
|
1572
|
-
"required": [
|
|
1573
|
-
"type"
|
|
1721
|
+
"webhook": {
|
|
1722
|
+
"type": "string",
|
|
1723
|
+
"description": "Webhook id, from a subscribe or from List webhooks."
|
|
1724
|
+
}
|
|
1725
|
+
},
|
|
1726
|
+
"required": [
|
|
1727
|
+
"webhook"
|
|
1728
|
+
]
|
|
1729
|
+
},
|
|
1730
|
+
"endpoint": {
|
|
1731
|
+
"method": "GET",
|
|
1732
|
+
"path": "/v2/webhooks/{webhook}",
|
|
1733
|
+
"paramLocation": {
|
|
1734
|
+
"webhook": "path"
|
|
1735
|
+
},
|
|
1736
|
+
"accepts": {
|
|
1737
|
+
"id": "path"
|
|
1738
|
+
},
|
|
1739
|
+
"pathAliases": {
|
|
1740
|
+
"id": "webhook"
|
|
1741
|
+
}
|
|
1742
|
+
}
|
|
1743
|
+
},
|
|
1744
|
+
{
|
|
1745
|
+
"name": "tickerbot_update_webhook",
|
|
1746
|
+
"description": "Edits a webhook in place; send only the fields you want to change. Send only what changes. The trigger takes the filters of the subscribe that made the webhook (subscription_origin.type: scan q/universe/select/order/dir; ticker q/select; signal condition/universe/select; event kind/ticker/universe/q/select; news search/ticker/universe/min_relevance/q/select), validated like a new subscribe; a change to the filters fires only on new matches (what already matches or already happened does not fire), while an edit of select/order/dir keeps what already matched. enabled=true turns a disabled webhook back on. Unknown fields are a 400.",
|
|
1747
|
+
"inputSchema": {
|
|
1748
|
+
"type": "object",
|
|
1749
|
+
"properties": {
|
|
1750
|
+
"webhook": {
|
|
1751
|
+
"type": "string",
|
|
1752
|
+
"description": "Webhook id."
|
|
1753
|
+
},
|
|
1754
|
+
"kind": {
|
|
1755
|
+
"type": "string",
|
|
1756
|
+
"description": "Only with event webhooks. The kinds to fire on, as on Subscribe to events.",
|
|
1757
|
+
"enum": [
|
|
1758
|
+
"dividend",
|
|
1759
|
+
"split",
|
|
1760
|
+
"insider",
|
|
1761
|
+
"analyst",
|
|
1762
|
+
"earnings",
|
|
1763
|
+
"filing",
|
|
1764
|
+
"estimate_revision"
|
|
1574
1765
|
]
|
|
1575
1766
|
},
|
|
1576
|
-
"
|
|
1767
|
+
"search": {
|
|
1768
|
+
"type": "string",
|
|
1769
|
+
"description": "Only with news webhooks. The full-text search, as on Subscribe to news."
|
|
1770
|
+
},
|
|
1771
|
+
"condition": {
|
|
1772
|
+
"type": "string",
|
|
1773
|
+
"description": "Only with signal webhooks. The bound, in Get a signal's grammar (`<30`)."
|
|
1774
|
+
},
|
|
1775
|
+
"ticker": {
|
|
1776
|
+
"type": "string",
|
|
1777
|
+
"description": "Only with event or news webhooks. The symbols, one or a comma list. Replaces a `universe` scope."
|
|
1778
|
+
},
|
|
1779
|
+
"universe": {
|
|
1780
|
+
"type": "string",
|
|
1781
|
+
"description": "Only with scan, signal, event or news webhooks. The universe to scope to; `null` for the whole market. On event and news webhooks it replaces a `ticker` scope."
|
|
1782
|
+
},
|
|
1783
|
+
"min_relevance": {
|
|
1784
|
+
"type": "number",
|
|
1785
|
+
"description": "Only with news webhooks. The least relevance (0–1) a scoped ticker needs; the webhook needs a `ticker` or `universe` scope."
|
|
1786
|
+
},
|
|
1787
|
+
"q": {
|
|
1788
|
+
"type": "string",
|
|
1789
|
+
"description": "Only with scan, ticker, event or news webhooks. The filter, in the grammar of the subscribe that made the webhook. On an event webhook it replaces the whole filter. A change to the filters (`q`, `condition`, `universe`, `kind`, `ticker`, `search`, `min_relevance`) fires only on new matches; an edit of `select`, `order` or `dir` keeps what already matched."
|
|
1790
|
+
},
|
|
1791
|
+
"select": {
|
|
1792
|
+
"type": "string",
|
|
1793
|
+
"description": "What each delivery carries, as on the subscribe that made the webhook; `null` for the default."
|
|
1794
|
+
},
|
|
1795
|
+
"order": {
|
|
1796
|
+
"type": "string",
|
|
1797
|
+
"description": "Only with scan or signal webhooks. The signal each delivery's match lists are sorted by."
|
|
1798
|
+
},
|
|
1799
|
+
"dir": {
|
|
1577
1800
|
"type": "string",
|
|
1578
|
-
"description": "
|
|
1801
|
+
"description": "Only with scan or signal webhooks. The sort direction for `order`.",
|
|
1802
|
+
"enum": [
|
|
1803
|
+
"asc",
|
|
1804
|
+
"desc"
|
|
1805
|
+
]
|
|
1579
1806
|
},
|
|
1580
1807
|
"channel": {
|
|
1581
1808
|
"type": "string",
|
|
1582
|
-
"description": "
|
|
1809
|
+
"description": "Moves the webhook to another channel: `webhook` (with `target_url`), `discord` (with `discord_url`), `in_app` or `mobile_push` (with `device_id`). Inferred from `discord_url` or `device_id` when you send one of those alone.",
|
|
1583
1810
|
"enum": [
|
|
1584
1811
|
"webhook",
|
|
1585
1812
|
"discord",
|
|
@@ -1587,175 +1814,148 @@ export const tools = [
|
|
|
1587
1814
|
"mobile_push"
|
|
1588
1815
|
]
|
|
1589
1816
|
},
|
|
1817
|
+
"target_url": {
|
|
1818
|
+
"type": "string",
|
|
1819
|
+
"description": "New https:// delivery URL. Alone, it moves a webhook between HTTPS (`target_url`) and in-app delivery (`null` or empty); a Discord or mobile-push webhook sends `channel: \"webhook\"` with it."
|
|
1820
|
+
},
|
|
1590
1821
|
"discord_url": {
|
|
1591
1822
|
"type": "string",
|
|
1592
|
-
"description": "Discord webhook URL
|
|
1823
|
+
"description": "Only with `channel=discord`. Discord incoming-webhook URL. Never returned after this call: reads show `channel_config_present: true`."
|
|
1593
1824
|
},
|
|
1594
1825
|
"device_id": {
|
|
1595
1826
|
"type": "string",
|
|
1596
|
-
"description": "
|
|
1827
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`."
|
|
1597
1828
|
},
|
|
1598
1829
|
"cadence": {
|
|
1599
1830
|
"type": "string",
|
|
1600
|
-
"description": "Evaluation cadence
|
|
1831
|
+
"description": "Evaluation cadence. Event and news webhooks deliver as they land, so only `realtime` is accepted on them.",
|
|
1601
1832
|
"enum": [
|
|
1602
1833
|
"realtime",
|
|
1603
1834
|
"hourly",
|
|
1604
1835
|
"nyse_open"
|
|
1605
|
-
]
|
|
1606
|
-
"default": "realtime"
|
|
1836
|
+
]
|
|
1607
1837
|
},
|
|
1608
1838
|
"name": {
|
|
1609
1839
|
"type": "string",
|
|
1610
|
-
"description": "
|
|
1611
|
-
},
|
|
1612
|
-
"columns": {
|
|
1613
|
-
"type": "string",
|
|
1614
|
-
"description": "Extra columns echoed in fired payloads' match rows (`fields` accepted as an alias). Not accepted on `event` triggers (400) — event deliveries carry the event payload, not state rows."
|
|
1615
|
-
},
|
|
1616
|
-
"order": {
|
|
1617
|
-
"type": "string",
|
|
1618
|
-
"description": "Signal the fired payload's match lists are sorted by before the 100-row cap is applied — so a truncated list is the deterministic top 100, not an arbitrary sample. Same contract as `POST /v2/scan`. Not accepted on `event` triggers (they deliver one event at a time).",
|
|
1619
|
-
"default": "market_cap"
|
|
1840
|
+
"description": "New display name. Non-empty, max 80 characters."
|
|
1620
1841
|
},
|
|
1621
|
-
"
|
|
1622
|
-
"type": "
|
|
1623
|
-
"description": "
|
|
1624
|
-
"enum": [
|
|
1625
|
-
"asc",
|
|
1626
|
-
"desc"
|
|
1627
|
-
],
|
|
1628
|
-
"default": "desc"
|
|
1842
|
+
"enabled": {
|
|
1843
|
+
"type": "boolean",
|
|
1844
|
+
"description": "`false` turns the webhook off. `true` turns a disabled webhook back on: your webhook limit is checked and the trigger is checked again. A plain re-enable starts clean and fires once for every current match; after a change to the trigger's filters (in this call or while it was off) it fires only on new matches."
|
|
1629
1845
|
}
|
|
1630
1846
|
},
|
|
1631
1847
|
"required": [
|
|
1632
|
-
"
|
|
1848
|
+
"webhook"
|
|
1633
1849
|
]
|
|
1634
1850
|
},
|
|
1635
1851
|
"endpoint": {
|
|
1636
|
-
"method": "
|
|
1637
|
-
"path": "/v2/webhooks",
|
|
1852
|
+
"method": "PATCH",
|
|
1853
|
+
"path": "/v2/webhooks/{webhook}",
|
|
1638
1854
|
"paramLocation": {
|
|
1639
|
-
"
|
|
1640
|
-
"
|
|
1855
|
+
"webhook": "path",
|
|
1856
|
+
"kind": "body",
|
|
1857
|
+
"search": "body",
|
|
1858
|
+
"condition": "body",
|
|
1859
|
+
"ticker": "body",
|
|
1860
|
+
"universe": "body",
|
|
1861
|
+
"min_relevance": "body",
|
|
1862
|
+
"q": "body",
|
|
1863
|
+
"select": "body",
|
|
1864
|
+
"order": "body",
|
|
1865
|
+
"dir": "body",
|
|
1641
1866
|
"channel": "body",
|
|
1867
|
+
"target_url": "body",
|
|
1642
1868
|
"discord_url": "body",
|
|
1643
1869
|
"device_id": "body",
|
|
1644
1870
|
"cadence": "body",
|
|
1645
1871
|
"name": "body",
|
|
1646
|
-
"
|
|
1647
|
-
"order": "body",
|
|
1648
|
-
"dir": "body"
|
|
1649
|
-
}
|
|
1650
|
-
}
|
|
1651
|
-
},
|
|
1652
|
-
{
|
|
1653
|
-
"name": "tickerbot_get_webhook",
|
|
1654
|
-
"description": "The current state of one webhook subscription.",
|
|
1655
|
-
"inputSchema": {
|
|
1656
|
-
"type": "object",
|
|
1657
|
-
"properties": {
|
|
1658
|
-
"id": {
|
|
1659
|
-
"type": "string",
|
|
1660
|
-
"description": "Webhook id returned by a subscribe endpoint (`POST /v2/tickers/{T}/subscribe`, etc.)."
|
|
1661
|
-
}
|
|
1872
|
+
"enabled": "body"
|
|
1662
1873
|
},
|
|
1663
|
-
"
|
|
1664
|
-
"
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
"endpoint": {
|
|
1668
|
-
"method": "GET",
|
|
1669
|
-
"path": "/v2/webhooks/{id}",
|
|
1670
|
-
"paramLocation": {
|
|
1874
|
+
"accepts": {
|
|
1875
|
+
"kinds": "body",
|
|
1876
|
+
"tickers": "body",
|
|
1877
|
+
"universe_id": "body",
|
|
1671
1878
|
"id": "path"
|
|
1879
|
+
},
|
|
1880
|
+
"pathAliases": {
|
|
1881
|
+
"id": "webhook"
|
|
1672
1882
|
}
|
|
1673
1883
|
}
|
|
1674
1884
|
},
|
|
1675
1885
|
{
|
|
1676
|
-
"name": "
|
|
1677
|
-
"description": "
|
|
1886
|
+
"name": "tickerbot_enable_webhook",
|
|
1887
|
+
"description": "Deprecated: works until 2027-01-12, then is removed. Turns a disabled webhook back on (a webhook disabled after repeated delivery failures, or one you turned off). It is tickerbot_update_webhook with enabled=true: call that instead.",
|
|
1678
1888
|
"inputSchema": {
|
|
1679
1889
|
"type": "object",
|
|
1680
1890
|
"properties": {
|
|
1681
|
-
"
|
|
1891
|
+
"webhook": {
|
|
1682
1892
|
"type": "string",
|
|
1683
1893
|
"description": "Webhook id."
|
|
1684
|
-
},
|
|
1685
|
-
"name": {
|
|
1686
|
-
"type": "string",
|
|
1687
|
-
"description": "New display name. Non-empty, max 80 characters."
|
|
1688
|
-
},
|
|
1689
|
-
"cadence": {
|
|
1690
|
-
"type": "string",
|
|
1691
|
-
"description": "Evaluation cadence. A user preference — never gated. Event triggers deliver on ingest — only `realtime` is accepted on them (400 otherwise).",
|
|
1692
|
-
"enum": [
|
|
1693
|
-
"realtime",
|
|
1694
|
-
"hourly",
|
|
1695
|
-
"nyse_open"
|
|
1696
|
-
]
|
|
1697
|
-
},
|
|
1698
|
-
"target_url": {
|
|
1699
|
-
"type": "string",
|
|
1700
|
-
"description": "New 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)."
|
|
1701
|
-
},
|
|
1702
|
-
"enabled": {
|
|
1703
|
-
"type": "boolean",
|
|
1704
|
-
"description": "`false` disables the webhook (status → `disabled`). `true` is a no-op unless disabled, in which case use `POST /v2/webhooks/{id}/enable` instead."
|
|
1705
1894
|
}
|
|
1706
1895
|
},
|
|
1707
1896
|
"required": [
|
|
1708
|
-
"
|
|
1897
|
+
"webhook"
|
|
1709
1898
|
]
|
|
1710
1899
|
},
|
|
1711
1900
|
"endpoint": {
|
|
1712
1901
|
"method": "PATCH",
|
|
1713
|
-
"path": "/v2/webhooks/{
|
|
1902
|
+
"path": "/v2/webhooks/{webhook}",
|
|
1714
1903
|
"paramLocation": {
|
|
1715
|
-
"
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
"
|
|
1719
|
-
|
|
1904
|
+
"webhook": "path"
|
|
1905
|
+
},
|
|
1906
|
+
"accepts": {
|
|
1907
|
+
"id": "path"
|
|
1908
|
+
},
|
|
1909
|
+
"pathAliases": {
|
|
1910
|
+
"id": "webhook"
|
|
1911
|
+
},
|
|
1912
|
+
"fixedBody": {
|
|
1913
|
+
"enabled": true
|
|
1720
1914
|
}
|
|
1721
1915
|
}
|
|
1722
1916
|
},
|
|
1723
1917
|
{
|
|
1724
1918
|
"name": "tickerbot_delete_webhook",
|
|
1725
|
-
"description": "
|
|
1919
|
+
"description": "Deletes a webhook and its delivery history.",
|
|
1726
1920
|
"inputSchema": {
|
|
1727
1921
|
"type": "object",
|
|
1728
1922
|
"properties": {
|
|
1729
|
-
"
|
|
1923
|
+
"webhook": {
|
|
1730
1924
|
"type": "string",
|
|
1731
1925
|
"description": "Webhook id."
|
|
1732
1926
|
}
|
|
1733
1927
|
},
|
|
1734
1928
|
"required": [
|
|
1735
|
-
"
|
|
1929
|
+
"webhook"
|
|
1736
1930
|
]
|
|
1737
1931
|
},
|
|
1738
1932
|
"endpoint": {
|
|
1739
1933
|
"method": "DELETE",
|
|
1740
|
-
"path": "/v2/webhooks/{
|
|
1934
|
+
"path": "/v2/webhooks/{webhook}",
|
|
1741
1935
|
"paramLocation": {
|
|
1936
|
+
"webhook": "path"
|
|
1937
|
+
},
|
|
1938
|
+
"accepts": {
|
|
1742
1939
|
"id": "path"
|
|
1940
|
+
},
|
|
1941
|
+
"pathAliases": {
|
|
1942
|
+
"id": "webhook"
|
|
1743
1943
|
}
|
|
1744
1944
|
}
|
|
1745
1945
|
},
|
|
1746
1946
|
{
|
|
1747
1947
|
"name": "tickerbot_list_webhook_deliveries",
|
|
1748
|
-
"description": "
|
|
1948
|
+
"description": "Lists a webhook's recent deliveries: what was sent and what came back.",
|
|
1749
1949
|
"inputSchema": {
|
|
1750
1950
|
"type": "object",
|
|
1751
1951
|
"properties": {
|
|
1752
|
-
"
|
|
1952
|
+
"webhook": {
|
|
1753
1953
|
"type": "string",
|
|
1754
1954
|
"description": "Webhook id."
|
|
1755
1955
|
},
|
|
1756
1956
|
"status": {
|
|
1757
1957
|
"type": "string",
|
|
1758
|
-
"description": "Filter by delivery status.",
|
|
1958
|
+
"description": "Filter by delivery status (one or a comma list).",
|
|
1759
1959
|
"enum": [
|
|
1760
1960
|
"pending",
|
|
1761
1961
|
"delivered",
|
|
@@ -1764,11 +1964,11 @@ export const tools = [
|
|
|
1764
1964
|
},
|
|
1765
1965
|
"from": {
|
|
1766
1966
|
"type": "string",
|
|
1767
|
-
"description": "Only deliveries created at/after this moment — epoch seconds, epoch milliseconds (13+ digits)
|
|
1967
|
+
"description": "Only deliveries created at/after this moment — epoch seconds, epoch milliseconds (13+ digits) or an ISO datetime; a date-only value starts at the beginning of that UTC day. Delivery history is retained for 90 days; deleting a webhook deletes its delivery history with it."
|
|
1768
1968
|
},
|
|
1769
1969
|
"to": {
|
|
1770
1970
|
"type": "string",
|
|
1771
|
-
"description": "Only deliveries created
|
|
1971
|
+
"description": "Only deliveries created before this moment — same value grammar as `from`. A date-only value covers that whole UTC day. A timestamp is included until 2027-01-12 and exclusive from then, as everywhere else (Deprecations). `from` after `to` is a 400. See Time windows."
|
|
1772
1972
|
},
|
|
1773
1973
|
"limit": {
|
|
1774
1974
|
"type": "integer",
|
|
@@ -1781,65 +1981,93 @@ export const tools = [
|
|
|
1781
1981
|
}
|
|
1782
1982
|
},
|
|
1783
1983
|
"required": [
|
|
1784
|
-
"
|
|
1984
|
+
"webhook"
|
|
1785
1985
|
]
|
|
1786
1986
|
},
|
|
1787
1987
|
"endpoint": {
|
|
1788
1988
|
"method": "GET",
|
|
1789
|
-
"path": "/v2/webhooks/{
|
|
1989
|
+
"path": "/v2/webhooks/{webhook}/deliveries",
|
|
1790
1990
|
"paramLocation": {
|
|
1791
|
-
"
|
|
1991
|
+
"webhook": "path",
|
|
1792
1992
|
"status": "query",
|
|
1793
1993
|
"from": "query",
|
|
1794
1994
|
"to": "query",
|
|
1795
1995
|
"limit": "query",
|
|
1796
1996
|
"cursor": "query"
|
|
1997
|
+
},
|
|
1998
|
+
"accepts": {
|
|
1999
|
+
"since": "query",
|
|
2000
|
+
"until": "query",
|
|
2001
|
+
"id": "path"
|
|
2002
|
+
},
|
|
2003
|
+
"pathAliases": {
|
|
2004
|
+
"id": "webhook"
|
|
1797
2005
|
}
|
|
1798
2006
|
}
|
|
1799
2007
|
},
|
|
1800
2008
|
{
|
|
1801
|
-
"name": "
|
|
1802
|
-
"description": "
|
|
2009
|
+
"name": "tickerbot_redeliver_webhook_delivery",
|
|
2010
|
+
"description": "Resends a past delivery, with the exact body it carried, to the webhook's current target. Resends the exact original body to the webhook's current target. The webhook must be active (409 otherwise); take delivery ids from tickerbot_list_webhook_deliveries. Test fires cannot be resent.",
|
|
1803
2011
|
"inputSchema": {
|
|
1804
2012
|
"type": "object",
|
|
1805
2013
|
"properties": {
|
|
1806
|
-
"
|
|
2014
|
+
"webhook": {
|
|
1807
2015
|
"type": "string",
|
|
1808
2016
|
"description": "Webhook id."
|
|
2017
|
+
},
|
|
2018
|
+
"delivery": {
|
|
2019
|
+
"type": "string",
|
|
2020
|
+
"description": "The delivery to resend, from `GET /v2/webhooks/{webhook}/deliveries`."
|
|
1809
2021
|
}
|
|
1810
2022
|
},
|
|
1811
2023
|
"required": [
|
|
1812
|
-
"
|
|
2024
|
+
"webhook",
|
|
2025
|
+
"delivery"
|
|
1813
2026
|
]
|
|
1814
2027
|
},
|
|
1815
2028
|
"endpoint": {
|
|
1816
2029
|
"method": "POST",
|
|
1817
|
-
"path": "/v2/webhooks/{
|
|
2030
|
+
"path": "/v2/webhooks/{webhook}/deliveries/{delivery}/redeliver",
|
|
1818
2031
|
"paramLocation": {
|
|
1819
|
-
"
|
|
2032
|
+
"webhook": "path",
|
|
2033
|
+
"delivery": "path"
|
|
2034
|
+
},
|
|
2035
|
+
"accepts": {
|
|
2036
|
+
"id": "path",
|
|
2037
|
+
"delivery_id": "path"
|
|
2038
|
+
},
|
|
2039
|
+
"pathAliases": {
|
|
2040
|
+
"id": "webhook",
|
|
2041
|
+
"delivery_id": "delivery"
|
|
1820
2042
|
}
|
|
1821
2043
|
}
|
|
1822
2044
|
},
|
|
1823
2045
|
{
|
|
1824
2046
|
"name": "tickerbot_test_webhook",
|
|
1825
|
-
"description": "
|
|
2047
|
+
"description": "Sends a real-shape test delivery to your endpoint, instantly. One-shot: a failed test never retries and never auto-disables the webhook. 400 when the webhook has no target_url.",
|
|
1826
2048
|
"inputSchema": {
|
|
1827
2049
|
"type": "object",
|
|
1828
2050
|
"properties": {
|
|
1829
|
-
"
|
|
2051
|
+
"webhook": {
|
|
1830
2052
|
"type": "string",
|
|
1831
2053
|
"description": "Webhook id."
|
|
1832
2054
|
}
|
|
1833
2055
|
},
|
|
1834
2056
|
"required": [
|
|
1835
|
-
"
|
|
2057
|
+
"webhook"
|
|
1836
2058
|
]
|
|
1837
2059
|
},
|
|
1838
2060
|
"endpoint": {
|
|
1839
2061
|
"method": "POST",
|
|
1840
|
-
"path": "/v2/webhooks/{
|
|
2062
|
+
"path": "/v2/webhooks/{webhook}/test",
|
|
1841
2063
|
"paramLocation": {
|
|
2064
|
+
"webhook": "path"
|
|
2065
|
+
},
|
|
2066
|
+
"accepts": {
|
|
1842
2067
|
"id": "path"
|
|
2068
|
+
},
|
|
2069
|
+
"pathAliases": {
|
|
2070
|
+
"id": "webhook"
|
|
1843
2071
|
}
|
|
1844
2072
|
}
|
|
1845
2073
|
}
|