@tickerbot/mcp-server 0.3.1 → 0.4.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 +32 -16
- package/dist/handler.d.ts +1 -3
- package/dist/handler.js +26 -17
- package/dist/hosted.d.ts +52 -0
- package/dist/hosted.js +158 -0
- package/dist/index.js +97 -62
- package/dist/tools.d.ts +2 -3
- package/dist/tools.js +411 -263
- package/package.json +3 -2
package/dist/tools.js
CHANGED
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
// GENERATED by scripts/regen-tools.mjs — do not edit by hand.
|
|
4
4
|
//
|
|
5
5
|
// The canonical tool list lives in main_service/mcp/tools.js on the
|
|
6
|
-
// server. At startup
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// freshness in cold-start scenarios.
|
|
6
|
+
// server. At startup this package connects to the hosted MCP server
|
|
7
|
+
// (`${baseUrl}/mcp`), serves its tools/list and forwards every call
|
|
8
|
+
// there — see src/index.ts (TB-740). This file is the snapshot it falls
|
|
9
|
+
// back to when that server cannot be reached, or no key is set.
|
|
11
10
|
//
|
|
12
11
|
// Staleness here is fine. Updating this file does NOT change behavior
|
|
13
12
|
// for online users — they always see whatever main_service is serving.
|
|
@@ -21,19 +20,19 @@ export const tools = [
|
|
|
21
20
|
"properties": {
|
|
22
21
|
"q": {
|
|
23
22
|
"type": "string",
|
|
24
|
-
"description": "SQL WHERE expression. Max 4000 chars; semicolons, comments and write keywords are rejected. Your custom signals are valid here
|
|
23
|
+
"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
24
|
},
|
|
26
25
|
"universe": {
|
|
27
26
|
"type": "string",
|
|
28
|
-
"description": "
|
|
27
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one answers 200 with no results and its id in `not_found`. Omitted, the screen runs across every ticker."
|
|
29
28
|
},
|
|
30
29
|
"asof": {
|
|
31
30
|
"type": "string",
|
|
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)
|
|
31
|
+
"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."
|
|
33
32
|
},
|
|
34
33
|
"grain": {
|
|
35
34
|
"type": "string",
|
|
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
|
|
35
|
+
"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). `1m` and `1h` need a timestamp `asof`; with a bare date they are a `400 interval_unavailable`.",
|
|
37
36
|
"enum": [
|
|
38
37
|
"1m",
|
|
39
38
|
"1h",
|
|
@@ -44,11 +43,11 @@ export const tools = [
|
|
|
44
43
|
},
|
|
45
44
|
"select": {
|
|
46
45
|
"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 `
|
|
46
|
+
"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 `results`. 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 …)`."
|
|
48
47
|
},
|
|
49
48
|
"group_by": {
|
|
50
49
|
"type": "string",
|
|
51
|
-
"description": "
|
|
50
|
+
"description": "Groups the scan: 1–6 group keys (signals, expressions or one of your custom signals as a boolean key). Results become rollups in `results`, 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. Default `select`: the keys + `COUNT(*) AS tickers`. Works with `asof`; does not paginate."
|
|
52
51
|
},
|
|
53
52
|
"having": {
|
|
54
53
|
"type": "string",
|
|
@@ -75,7 +74,7 @@ export const tools = [
|
|
|
75
74
|
},
|
|
76
75
|
"cursor": {
|
|
77
76
|
"type": "string",
|
|
78
|
-
"description": "
|
|
77
|
+
"description": "The previous response's `next_cursor`. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param. Row scans only."
|
|
79
78
|
}
|
|
80
79
|
},
|
|
81
80
|
"required": [
|
|
@@ -110,25 +109,25 @@ export const tools = [
|
|
|
110
109
|
},
|
|
111
110
|
{
|
|
112
111
|
"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.
|
|
112
|
+
"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. For one signal use tickerbot_subscribe_signal; a compound condition is a scan: `q: golden_cross AND rsi_14 > 70`.",
|
|
114
113
|
"inputSchema": {
|
|
115
114
|
"type": "object",
|
|
116
115
|
"properties": {
|
|
117
116
|
"q": {
|
|
118
117
|
"type": "string",
|
|
119
|
-
"description": "WHERE-clause expression using signal names
|
|
118
|
+
"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."
|
|
120
119
|
},
|
|
121
120
|
"universe": {
|
|
122
121
|
"type": "string",
|
|
123
|
-
"description": "
|
|
122
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one is a 400 `universe_not_found` naming it."
|
|
124
123
|
},
|
|
125
124
|
"select": {
|
|
126
125
|
"type": "string",
|
|
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."
|
|
126
|
+
"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. `*` and expressions are a 400: a delivery lists up to 100 matches, so name the signals."
|
|
128
127
|
},
|
|
129
128
|
"order": {
|
|
130
129
|
"type": "string",
|
|
131
|
-
"description": "Signal each delivery's match lists are sorted by before the 100-result cap applies, so a
|
|
130
|
+
"description": "Signal each delivery's match lists are sorted by before the 100-result cap applies, so a broad alert lists the same top 100 each time. Must be a real signal (validated at creation).",
|
|
132
131
|
"default": "market_cap"
|
|
133
132
|
},
|
|
134
133
|
"dir": {
|
|
@@ -142,7 +141,7 @@ export const tools = [
|
|
|
142
141
|
},
|
|
143
142
|
"channel": {
|
|
144
143
|
"type": "string",
|
|
145
|
-
"description": "Delivery channel
|
|
144
|
+
"description": "Delivery channel: `webhook` (POST to `target_url`), `discord` (an embed at `discord_url`), `in_app` (the dashboard only) or `mobile_push` (to `device_id`). Inferred when omitted: `discord` if `discord_url` is set, else `mobile_push` if `device_id` is set, else `webhook` if `target_url` is set, else `in_app`. See Delivery channels.",
|
|
146
145
|
"enum": [
|
|
147
146
|
"webhook",
|
|
148
147
|
"discord",
|
|
@@ -152,19 +151,19 @@ export const tools = [
|
|
|
152
151
|
},
|
|
153
152
|
"target_url": {
|
|
154
153
|
"type": "string",
|
|
155
|
-
"description": "Only with `channel=webhook`.
|
|
154
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
156
155
|
},
|
|
157
156
|
"discord_url": {
|
|
158
157
|
"type": "string",
|
|
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."
|
|
158
|
+
"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."
|
|
160
159
|
},
|
|
161
160
|
"device_id": {
|
|
162
161
|
"type": "string",
|
|
163
|
-
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`.
|
|
162
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. An unknown id is a 400 `device_not_found`."
|
|
164
163
|
},
|
|
165
164
|
"cadence": {
|
|
166
165
|
"type": "string",
|
|
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.",
|
|
166
|
+
"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.",
|
|
168
167
|
"enum": [
|
|
169
168
|
"realtime",
|
|
170
169
|
"hourly",
|
|
@@ -173,7 +172,7 @@ export const tools = [
|
|
|
173
172
|
},
|
|
174
173
|
"name": {
|
|
175
174
|
"type": "string",
|
|
176
|
-
"description": "
|
|
175
|
+
"description": "Display name, up to 80 characters. Defaults to `scan: ` plus the first 60 characters of `q`."
|
|
177
176
|
}
|
|
178
177
|
},
|
|
179
178
|
"required": [
|
|
@@ -209,72 +208,44 @@ export const tools = [
|
|
|
209
208
|
"inputSchema": {
|
|
210
209
|
"type": "object",
|
|
211
210
|
"properties": {
|
|
212
|
-
"
|
|
211
|
+
"search": {
|
|
213
212
|
"type": "string",
|
|
214
|
-
"description": "
|
|
215
|
-
"enum": [
|
|
216
|
-
"builtin",
|
|
217
|
-
"custom"
|
|
218
|
-
]
|
|
213
|
+
"description": "Case-insensitive text match on the name and description. Results are ranked: an exact name match first, then names that start with the term, then names that contain it, then descriptions that have it as a whole word, then descriptions that contain it; list order within each rank. Paging a search never repeats or skips."
|
|
219
214
|
},
|
|
220
|
-
"
|
|
215
|
+
"kind": {
|
|
221
216
|
"type": "string",
|
|
222
|
-
"description": "
|
|
217
|
+
"description": "Filter by kind (one or a comma list). Omit to return both. Values: builtin, custom.",
|
|
218
|
+
"pattern": "^(builtin|custom)(,(builtin|custom))*$"
|
|
223
219
|
},
|
|
224
220
|
"group": {
|
|
225
221
|
"type": "string",
|
|
226
|
-
"description": "One taxonomy group
|
|
222
|
+
"description": "One taxonomy group or a comma list (`technicals,fundamentals`). Each signal carries its `group`. Values: price, volume, price_action, technicals, fundamentals, events, profile, analyst, news.",
|
|
223
|
+
"pattern": "^(price|volume|price_action|technicals|fundamentals|events|profile|analyst|news)(,(price|volume|price_action|technicals|fundamentals|events|profile|analyst|news))*$"
|
|
227
224
|
},
|
|
228
225
|
"category": {
|
|
229
226
|
"type": "string",
|
|
230
|
-
"description": "One category
|
|
227
|
+
"description": "One category or a comma list (`oscillators,trend`). Each signal carries its `category`. Values: trades_quotes, bars, session_structure, highs_lows, support_resistance, volume_levels, volume_activity, performance, gaps, intraday_momentum, ranges, moving_averages, oscillators, trend, volatility_bands, income_statement, balance_sheet, cash_flow, margins_ratios, valuation, share_structure, short_interest, earnings, dividends, ipos, capital_changes, insider_activity, classification, identity, company, fund_facts, consensus_ratings, analyst_actions, price_targets, estimates, news.",
|
|
228
|
+
"pattern": "^(trades_quotes|bars|session_structure|highs_lows|support_resistance|volume_levels|volume_activity|performance|gaps|intraday_momentum|ranges|moving_averages|oscillators|trend|volatility_bands|income_statement|balance_sheet|cash_flow|margins_ratios|valuation|share_structure|short_interest|earnings|dividends|ipos|capital_changes|insider_activity|classification|identity|company|fund_facts|consensus_ratings|analyst_actions|price_targets|estimates|news)(,(trades_quotes|bars|session_structure|highs_lows|support_resistance|volume_levels|volume_activity|performance|gaps|intraday_momentum|ranges|moving_averages|oscillators|trend|volatility_bands|income_statement|balance_sheet|cash_flow|margins_ratios|valuation|share_structure|short_interest|earnings|dividends|ipos|capital_changes|insider_activity|classification|identity|company|fund_facts|consensus_ratings|analyst_actions|price_targets|estimates|news))*$"
|
|
231
229
|
},
|
|
232
230
|
"type": {
|
|
233
231
|
"type": "string",
|
|
234
|
-
"description": "One value type or a comma list. Custom signals are always `boolean`.",
|
|
235
|
-
"
|
|
236
|
-
"numeric",
|
|
237
|
-
"boolean",
|
|
238
|
-
"string",
|
|
239
|
-
"date",
|
|
240
|
-
"timestamp",
|
|
241
|
-
"jsonb",
|
|
242
|
-
"string[]"
|
|
243
|
-
]
|
|
232
|
+
"description": "One value type or a comma list. Custom signals are always `boolean`. Values: numeric, boolean, string, date, timestamp, object, string[].",
|
|
233
|
+
"pattern": "^(numeric|boolean|string|date|timestamp|object|string\\[\\])(,(numeric|boolean|string|date|timestamp|object|string\\[\\]))*$"
|
|
244
234
|
},
|
|
245
235
|
"asset_class": {
|
|
246
236
|
"type": "string",
|
|
247
|
-
"description": "Signals that apply to this asset class (one or a comma list), e.g. `crypto`."
|
|
237
|
+
"description": "Signals that apply to this asset class (one or a comma list), e.g. `crypto`. Values: stocks, rates, crypto, fx.",
|
|
238
|
+
"pattern": "^(stocks|rates|crypto|fx)(,(stocks|rates|crypto|fx))*$"
|
|
248
239
|
},
|
|
249
240
|
"refresh": {
|
|
250
241
|
"type": "string",
|
|
251
|
-
"description": "Signals that update on this schedule (one or a comma list).",
|
|
252
|
-
"
|
|
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
|
-
]
|
|
242
|
+
"description": "Signals that update on this schedule (one or a comma list). Values: 1m_4am_8pm_et, 1m_24_7, 5m, 10m, 15m, 30m, 1h, daily, daily_after_close, weekly, monthly, quarterly, on_event, static, custom.",
|
|
243
|
+
"pattern": "^(1m_4am_8pm_et|1m_24_7|5m|10m|15m|30m|1h|daily|daily_after_close|weekly|monthly|quarterly|on_event|static|custom)(,(1m_4am_8pm_et|1m_24_7|5m|10m|15m|30m|1h|daily|daily_after_close|weekly|monthly|quarterly|on_event|static|custom))*$"
|
|
269
244
|
},
|
|
270
245
|
"grain": {
|
|
271
246
|
"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
|
-
"
|
|
274
|
-
"1m",
|
|
275
|
-
"1h",
|
|
276
|
-
"1d"
|
|
277
|
-
]
|
|
247
|
+
"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. Values: 1m, 1h, 1d.",
|
|
248
|
+
"pattern": "^(1m|1h|1d)(,(1m|1h|1d))*$"
|
|
278
249
|
},
|
|
279
250
|
"select": {
|
|
280
251
|
"type": "string",
|
|
@@ -286,7 +257,7 @@ export const tools = [
|
|
|
286
257
|
},
|
|
287
258
|
"cursor": {
|
|
288
259
|
"type": "string",
|
|
289
|
-
"description": "
|
|
260
|
+
"description": "The previous response's `next_cursor`. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param."
|
|
290
261
|
}
|
|
291
262
|
}
|
|
292
263
|
},
|
|
@@ -294,8 +265,8 @@ export const tools = [
|
|
|
294
265
|
"method": "GET",
|
|
295
266
|
"path": "/v2/signals",
|
|
296
267
|
"paramLocation": {
|
|
297
|
-
"kind": "query",
|
|
298
268
|
"search": "query",
|
|
269
|
+
"kind": "query",
|
|
299
270
|
"group": "query",
|
|
300
271
|
"category": "query",
|
|
301
272
|
"type": "query",
|
|
@@ -310,17 +281,17 @@ export const tools = [
|
|
|
310
281
|
},
|
|
311
282
|
{
|
|
312
283
|
"name": "tickerbot_create_custom_signal",
|
|
313
|
-
"description": "Saves a named true/false SQL expression you can screen on
|
|
284
|
+
"description": "Saves a named true/false SQL expression you can screen on, select and subscribe to like a built-in boolean.",
|
|
314
285
|
"inputSchema": {
|
|
315
286
|
"type": "object",
|
|
316
287
|
"properties": {
|
|
317
288
|
"name": {
|
|
318
289
|
"type": "string",
|
|
319
|
-
"description": "Slug
|
|
290
|
+
"description": "Slug matching `^[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."
|
|
320
291
|
},
|
|
321
292
|
"expr": {
|
|
322
293
|
"type": "string",
|
|
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
|
|
294
|
+
"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`. 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`."
|
|
324
295
|
},
|
|
325
296
|
"description": {
|
|
326
297
|
"type": "string",
|
|
@@ -344,13 +315,13 @@ export const tools = [
|
|
|
344
315
|
},
|
|
345
316
|
{
|
|
346
317
|
"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
|
|
318
|
+
"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_query_events with kind=signal, signal=<name>, transition=enter.",
|
|
348
319
|
"inputSchema": {
|
|
349
320
|
"type": "object",
|
|
350
321
|
"properties": {
|
|
351
322
|
"signal": {
|
|
352
323
|
"type": "string",
|
|
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`."
|
|
324
|
+
"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`. An object or list signal (`leadership`, `etf_holders`) has no `condition` form: the read returns its catalog entry and a `note`; screen on it with `POST /v2/scan`."
|
|
354
325
|
},
|
|
355
326
|
"condition": {
|
|
356
327
|
"type": "string",
|
|
@@ -358,15 +329,15 @@ export const tools = [
|
|
|
358
329
|
},
|
|
359
330
|
"universe": {
|
|
360
331
|
"type": "string",
|
|
361
|
-
"description": "Scope to a
|
|
332
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one answers 200 with no results and its id in `not_found`."
|
|
362
333
|
},
|
|
363
334
|
"asof": {
|
|
364
335
|
"type": "string",
|
|
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)
|
|
336
|
+
"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."
|
|
366
337
|
},
|
|
367
338
|
"grain": {
|
|
368
339
|
"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).",
|
|
340
|
+
"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). `1m` and `1h` need a timestamp `asof`; with a bare date they are a `400 interval_unavailable`.",
|
|
370
341
|
"enum": [
|
|
371
342
|
"1m",
|
|
372
343
|
"1h",
|
|
@@ -377,7 +348,7 @@ export const tools = [
|
|
|
377
348
|
},
|
|
378
349
|
"select": {
|
|
379
350
|
"type": "string",
|
|
380
|
-
"description": "Signals each match carries beside `value`, e.g. `market_cap,sector`."
|
|
351
|
+
"description": "Signals each match carries beside `value`, e.g. `market_cap,sector`. `*` is every signal: the whole live row, or on an as-of read every signal the read's grain stores. An unknown signal is a 400, beside `*` too."
|
|
381
352
|
},
|
|
382
353
|
"order": {
|
|
383
354
|
"type": "string",
|
|
@@ -398,7 +369,7 @@ export const tools = [
|
|
|
398
369
|
},
|
|
399
370
|
"cursor": {
|
|
400
371
|
"type": "string",
|
|
401
|
-
"description": "
|
|
372
|
+
"description": "The previous response's `next_cursor`. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param."
|
|
402
373
|
}
|
|
403
374
|
},
|
|
404
375
|
"required": [
|
|
@@ -436,19 +407,19 @@ export const tools = [
|
|
|
436
407
|
"properties": {
|
|
437
408
|
"signal": {
|
|
438
409
|
"type": "string",
|
|
439
|
-
"description": "Custom signal slug (the signal name). A built-in name answers 404
|
|
410
|
+
"description": "Custom signal slug (the signal name). A built-in name answers 404: built-ins are read-only."
|
|
440
411
|
},
|
|
441
412
|
"new_name": {
|
|
442
413
|
"type": "string",
|
|
443
|
-
"description": "New slug
|
|
414
|
+
"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."
|
|
444
415
|
},
|
|
445
416
|
"expr": {
|
|
446
417
|
"type": "string",
|
|
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
|
|
418
|
+
"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 signal spelling is stored under its current name and reported in `_meta.deprecated_signals`)."
|
|
448
419
|
},
|
|
449
420
|
"description": {
|
|
450
421
|
"type": "string",
|
|
451
|
-
"description": "New description. Not derived from `expr
|
|
422
|
+
"description": "New description. Not derived from `expr`, so change both if the prose describes a threshold you are moving."
|
|
452
423
|
}
|
|
453
424
|
},
|
|
454
425
|
"required": [
|
|
@@ -477,7 +448,7 @@ export const tools = [
|
|
|
477
448
|
"properties": {
|
|
478
449
|
"signal": {
|
|
479
450
|
"type": "string",
|
|
480
|
-
"description": "Custom signal slug (the signal name). A built-in name answers 404
|
|
451
|
+
"description": "Custom signal slug (the signal name). A built-in name answers 404: built-ins are read-only."
|
|
481
452
|
},
|
|
482
453
|
"force": {
|
|
483
454
|
"type": "boolean",
|
|
@@ -514,15 +485,15 @@ export const tools = [
|
|
|
514
485
|
},
|
|
515
486
|
"universe": {
|
|
516
487
|
"type": "string",
|
|
517
|
-
"description": "
|
|
488
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one is a 400 `universe_not_found` naming it."
|
|
518
489
|
},
|
|
519
490
|
"select": {
|
|
520
491
|
"type": "string",
|
|
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."
|
|
492
|
+
"description": "What each delivered match carries. Omitted: the scan default row plus the signal. A list of signal names: exactly those, `ticker` always included. `*` and expressions are a 400: a delivery lists up to 100 matches, so name the signals."
|
|
522
493
|
},
|
|
523
494
|
"order": {
|
|
524
495
|
"type": "string",
|
|
525
|
-
"description": "Signal each delivery's match lists are sorted by before the 100-result cap applies, so a
|
|
496
|
+
"description": "Signal each delivery's match lists are sorted by before the 100-result cap applies, so a broad alert lists the same top 100 each time. Must be a real signal (validated at creation).",
|
|
526
497
|
"default": "market_cap"
|
|
527
498
|
},
|
|
528
499
|
"dir": {
|
|
@@ -536,7 +507,7 @@ export const tools = [
|
|
|
536
507
|
},
|
|
537
508
|
"channel": {
|
|
538
509
|
"type": "string",
|
|
539
|
-
"description": "Delivery channel
|
|
510
|
+
"description": "Delivery channel: `webhook` (POST to `target_url`), `discord` (an embed at `discord_url`), `in_app` (the dashboard only) or `mobile_push` (to `device_id`). Inferred when omitted: `discord` if `discord_url` is set, else `mobile_push` if `device_id` is set, else `webhook` if `target_url` is set, else `in_app`. See Delivery channels.",
|
|
540
511
|
"enum": [
|
|
541
512
|
"webhook",
|
|
542
513
|
"discord",
|
|
@@ -546,19 +517,19 @@ export const tools = [
|
|
|
546
517
|
},
|
|
547
518
|
"target_url": {
|
|
548
519
|
"type": "string",
|
|
549
|
-
"description": "Only with `channel=webhook`.
|
|
520
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
550
521
|
},
|
|
551
522
|
"discord_url": {
|
|
552
523
|
"type": "string",
|
|
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."
|
|
524
|
+
"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."
|
|
554
525
|
},
|
|
555
526
|
"device_id": {
|
|
556
527
|
"type": "string",
|
|
557
|
-
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`.
|
|
528
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. An unknown id is a 400 `device_not_found`."
|
|
558
529
|
},
|
|
559
530
|
"cadence": {
|
|
560
531
|
"type": "string",
|
|
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.",
|
|
532
|
+
"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.",
|
|
562
533
|
"enum": [
|
|
563
534
|
"realtime",
|
|
564
535
|
"hourly",
|
|
@@ -567,7 +538,7 @@ export const tools = [
|
|
|
567
538
|
},
|
|
568
539
|
"name": {
|
|
569
540
|
"type": "string",
|
|
570
|
-
"description": "
|
|
541
|
+
"description": "Display name, up to 80 characters. Defaults to the condition: `golden_cross`, or `rsi_14 < 30`."
|
|
571
542
|
}
|
|
572
543
|
},
|
|
573
544
|
"required": [
|
|
@@ -606,38 +577,24 @@ export const tools = [
|
|
|
606
577
|
"properties": {
|
|
607
578
|
"search": {
|
|
608
579
|
"type": "string",
|
|
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
|
|
580
|
+
"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 symbols that contain it, then names that have it as a whole word, then names that contain it; alphabetical within each rank. The cursor carries the rank, so paging a search never repeats or skips."
|
|
610
581
|
},
|
|
611
582
|
"ticker": {
|
|
612
583
|
"type": "string",
|
|
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
|
|
584
|
+
"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 absent from `results` and listed in `not_found`. For everything about each one, put the list in the path of Get a ticker."
|
|
614
585
|
},
|
|
615
586
|
"asset_class": {
|
|
616
587
|
"type": "string",
|
|
617
|
-
"description": "Filter by asset class
|
|
588
|
+
"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 outside these matches nothing). 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."
|
|
618
589
|
},
|
|
619
590
|
"asset_type": {
|
|
620
591
|
"type": "string",
|
|
621
|
-
"description": "Filter by instrument type
|
|
622
|
-
"
|
|
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
|
-
]
|
|
592
|
+
"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 a 400 (use `asset_class=crypto`). Values: CS, ETF, ADRC, PFD, FUND, UNIT, SP, ETS, WARRANT, RIGHT, ETN, ETV, equity.",
|
|
593
|
+
"pattern": "^(CS|ETF|ADRC|PFD|FUND|UNIT|SP|ETS|WARRANT|RIGHT|ETN|ETV|equity)(,(CS|ETF|ADRC|PFD|FUND|UNIT|SP|ETS|WARRANT|RIGHT|ETN|ETV|equity))*$"
|
|
637
594
|
},
|
|
638
595
|
"exchange": {
|
|
639
596
|
"type": "string",
|
|
640
|
-
"description": "Filter by exchange name (one or a comma list)
|
|
597
|
+
"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
598
|
},
|
|
642
599
|
"active": {
|
|
643
600
|
"type": "boolean",
|
|
@@ -650,7 +607,7 @@ export const tools = [
|
|
|
650
607
|
},
|
|
651
608
|
"cursor": {
|
|
652
609
|
"type": "string",
|
|
653
|
-
"description": "
|
|
610
|
+
"description": "The previous response's `next_cursor`. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param."
|
|
654
611
|
}
|
|
655
612
|
}
|
|
656
613
|
},
|
|
@@ -674,21 +631,21 @@ export const tools = [
|
|
|
674
631
|
},
|
|
675
632
|
{
|
|
676
633
|
"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`.
|
|
634
|
+
"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`. A comma list returns `data` keyed by symbol plus `not_found`. Crypto is the X-prefixed pair (X:BTCUSD); bare BTC/ETH are US-listed ETFs.",
|
|
678
635
|
"inputSchema": {
|
|
679
636
|
"type": "object",
|
|
680
637
|
"properties": {
|
|
681
638
|
"ticker": {
|
|
682
639
|
"type": "string",
|
|
683
|
-
"description": "One symbol, or a comma-separated list of up to 50 for a
|
|
640
|
+
"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."
|
|
684
641
|
},
|
|
685
642
|
"asof": {
|
|
686
643
|
"type": "string",
|
|
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)
|
|
644
|
+
"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."
|
|
688
645
|
},
|
|
689
646
|
"grain": {
|
|
690
647
|
"type": "string",
|
|
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.
|
|
648
|
+
"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. A signal in `select` that 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). Without `select`, the row carries the signals the pinned grain stores, and `_meta.signals_not_stored_at_grain` names the rest. A grain with no data for the ticker within its window (14 days for `1d`, 5 for `1h`/`1m`) is a `404 interval_unavailable`. `1m` and `1h` need a timestamp `asof`; with a bare date they are a `400 interval_unavailable`. A live read with `grain` is a 400.",
|
|
692
649
|
"enum": [
|
|
693
650
|
"1m",
|
|
694
651
|
"1h",
|
|
@@ -699,7 +656,7 @@ export const tools = [
|
|
|
699
656
|
},
|
|
700
657
|
"select": {
|
|
701
658
|
"type": "string",
|
|
702
|
-
"description": "Comma-separated signals to return: each row is `ticker` plus exactly these. Omit it for the full row
|
|
659
|
+
"description": "Comma-separated signals to return: each row is `ticker` plus exactly these. Omit it, or send `*`, for the full row: every signal the ticker carries, or on an as-of read every signal the read's grain stores. An unknown signal is a 400, beside `*` too."
|
|
703
660
|
}
|
|
704
661
|
},
|
|
705
662
|
"required": [
|
|
@@ -725,29 +682,29 @@ export const tools = [
|
|
|
725
682
|
},
|
|
726
683
|
{
|
|
727
684
|
"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`,
|
|
685
|
+
"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`, or `*` for every signal the grain stores, every ticker on one shared grid. `series` is keyed by symbol, one flat row per grain step. Paged backward: pass `next_cursor` back as `cursor` with the same params. For when a yes/no signal flipped, use tickerbot_query_events with kind=signal.",
|
|
729
686
|
"inputSchema": {
|
|
730
687
|
"type": "object",
|
|
731
688
|
"properties": {
|
|
732
689
|
"ticker": {
|
|
733
690
|
"type": "string",
|
|
734
|
-
"description": "
|
|
691
|
+
"description": "One symbol, or a comma-separated list of up to 50 for a response keyed by symbol, 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. 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."
|
|
735
692
|
},
|
|
736
693
|
"from": {
|
|
737
694
|
"type": "string",
|
|
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)
|
|
695
|
+
"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."
|
|
739
696
|
},
|
|
740
697
|
"to": {
|
|
741
698
|
"type": "string",
|
|
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,
|
|
699
|
+
"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 each ticker's market day: the ET calendar day for stocks and ETFs, the UTC day for crypto, FX and rates, ticker by ticker in a mixed list. See Time windows."
|
|
743
700
|
},
|
|
744
701
|
"asof": {
|
|
745
702
|
"type": "string",
|
|
746
|
-
"description": "Point-in-time read:
|
|
703
|
+
"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/{signal}`. Combined with `from`/`to` or `cursor` it is a 400 (a point and a window contradict), 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, FX and rates (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. 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. 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."
|
|
747
704
|
},
|
|
748
705
|
"grain": {
|
|
749
706
|
"type": "string",
|
|
750
|
-
"description": "Grid granularity. `1w` resamples the daily
|
|
707
|
+
"description": "Grid granularity. `1w` resamples the daily grain weekly (Monday-keyed); `1q` is the fiscal-quarter grid; `1y` is the fiscal-year grid of annual statements. This is the grid: 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`.",
|
|
751
708
|
"enum": [
|
|
752
709
|
"1m",
|
|
753
710
|
"1h",
|
|
@@ -760,16 +717,16 @@ export const tools = [
|
|
|
760
717
|
},
|
|
761
718
|
"select": {
|
|
762
719
|
"type": "string",
|
|
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)."
|
|
720
|
+
"description": "Up to 25 signals: built-in signals, your custom signals and OHLCV names, freely mixed. `*` is every signal the grain stores (at `1q` and `1y`, every quarterly or annual field), with no 25-signal cap; its page holds at most 1,000 points (tickers × `limit`), see `limit`. `*` returns the same rows as a named list of stored signals, and its `vwap` is the stored value (a named `vwap` is read from the bars). A name sent beside `*` adds nothing, and an unknown one is a 400. 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)."
|
|
764
721
|
},
|
|
765
722
|
"limit": {
|
|
766
723
|
"type": "integer",
|
|
767
|
-
"description": "Grid steps per page. Max 1000
|
|
724
|
+
"description": "Grid steps per page. Max 1000; an over-cap `limit` is clamped to 1000. 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). With `select=*` the page holds at most 1,000 points: over it, an explicit `limit` is a 400, and the default is lowered to fit (5 tickers get 200).",
|
|
768
725
|
"default": 252
|
|
769
726
|
},
|
|
770
727
|
"cursor": {
|
|
771
728
|
"type": "string",
|
|
772
|
-
"description": "Continue paging back: the previous response's `next_cursor`, unchanged
|
|
729
|
+
"description": "Continue paging back: the previous response's `next_cursor`, unchanged. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param. On `1m` to `1w` 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). On `1q`/`1y` it carries the shared fiscal label, so every ticker continues from the same period."
|
|
773
730
|
}
|
|
774
731
|
},
|
|
775
732
|
"required": [
|
|
@@ -790,14 +747,11 @@ export const tools = [
|
|
|
790
747
|
"cursor": "query"
|
|
791
748
|
},
|
|
792
749
|
"accepts": {
|
|
793
|
-
"columns": "query",
|
|
794
750
|
"fields": "query",
|
|
751
|
+
"columns": "query",
|
|
795
752
|
"interval": "query",
|
|
796
753
|
"as_of": "query",
|
|
797
754
|
"transitions_only": "query"
|
|
798
|
-
},
|
|
799
|
-
"fixedQuery": {
|
|
800
|
-
"api_version": "2027-01-12"
|
|
801
755
|
}
|
|
802
756
|
}
|
|
803
757
|
},
|
|
@@ -809,7 +763,7 @@ export const tools = [
|
|
|
809
763
|
"properties": {
|
|
810
764
|
"ticker": {
|
|
811
765
|
"type": "string",
|
|
812
|
-
"description": "Case-insensitive. Equities are bare symbols (`NVDA`); every other class carries a prefix
|
|
766
|
+
"description": "One ticker. For several, use Subscribe to a scan with `q=\"ticker IN ('NVDA','AAPL') AND (…)\"`. 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."
|
|
813
767
|
},
|
|
814
768
|
"q": {
|
|
815
769
|
"type": "string",
|
|
@@ -817,11 +771,11 @@ export const tools = [
|
|
|
817
771
|
},
|
|
818
772
|
"select": {
|
|
819
773
|
"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."
|
|
774
|
+
"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. `*` and expressions are a 400: a delivery lists up to 100 matches, so name the signals."
|
|
821
775
|
},
|
|
822
776
|
"channel": {
|
|
823
777
|
"type": "string",
|
|
824
|
-
"description": "Delivery channel
|
|
778
|
+
"description": "Delivery channel: `webhook` (POST to `target_url`), `discord` (an embed at `discord_url`), `in_app` (the dashboard only) or `mobile_push` (to `device_id`). Inferred when omitted: `discord` if `discord_url` is set, else `mobile_push` if `device_id` is set, else `webhook` if `target_url` is set, else `in_app`. See Delivery channels.",
|
|
825
779
|
"enum": [
|
|
826
780
|
"webhook",
|
|
827
781
|
"discord",
|
|
@@ -831,7 +785,7 @@ export const tools = [
|
|
|
831
785
|
},
|
|
832
786
|
"target_url": {
|
|
833
787
|
"type": "string",
|
|
834
|
-
"description": "Only with `channel=webhook`.
|
|
788
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
835
789
|
},
|
|
836
790
|
"discord_url": {
|
|
837
791
|
"type": "string",
|
|
@@ -839,11 +793,11 @@ export const tools = [
|
|
|
839
793
|
},
|
|
840
794
|
"device_id": {
|
|
841
795
|
"type": "string",
|
|
842
|
-
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`.
|
|
796
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. An unknown id is a 400 `device_not_found`."
|
|
843
797
|
},
|
|
844
798
|
"cadence": {
|
|
845
799
|
"type": "string",
|
|
846
|
-
"description": "How often to evaluate
|
|
800
|
+
"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
801
|
"enum": [
|
|
848
802
|
"realtime",
|
|
849
803
|
"hourly",
|
|
@@ -852,7 +806,7 @@ export const tools = [
|
|
|
852
806
|
},
|
|
853
807
|
"name": {
|
|
854
808
|
"type": "string",
|
|
855
|
-
"description": "
|
|
809
|
+
"description": "Display name, up to 80 characters. Defaults to `<TICKER>: ` plus the first 40 characters of `q`."
|
|
856
810
|
}
|
|
857
811
|
},
|
|
858
812
|
"required": [
|
|
@@ -891,11 +845,11 @@ export const tools = [
|
|
|
891
845
|
"properties": {
|
|
892
846
|
"ticker": {
|
|
893
847
|
"type": "string",
|
|
894
|
-
"description": "
|
|
848
|
+
"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."
|
|
895
849
|
},
|
|
896
850
|
"interval": {
|
|
897
851
|
"type": "string",
|
|
898
|
-
"description": "Bar interval. `2h`/`4h` roll up hourly bars; `1w`/`1mo` roll up daily bars into calendar weeks (Monday start) and months
|
|
852
|
+
"description": "Bar interval. `2h`/`4h` roll up hourly bars; `1w`/`1mo` roll up daily bars into calendar weeks (Monday start) and months; the bar's `t` is the bucket start (UTC), and with `asof` the last bucket is the week/month to date.",
|
|
899
853
|
"enum": [
|
|
900
854
|
"1s",
|
|
901
855
|
"1m",
|
|
@@ -912,23 +866,23 @@ export const tools = [
|
|
|
912
866
|
},
|
|
913
867
|
"from": {
|
|
914
868
|
"type": "string",
|
|
915
|
-
"description": "Window start: `YYYY-MM-DD`, ISO timestamp or epoch
|
|
869
|
+
"description": "Window start: `YYYY-MM-DD`, ISO timestamp or epoch milliseconds (11 to 13 digits). 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."
|
|
916
870
|
},
|
|
917
871
|
"to": {
|
|
918
872
|
"type": "string",
|
|
919
|
-
"description": "Window end: `YYYY-MM-DD`, ISO timestamp or epoch
|
|
873
|
+
"description": "Window end: `YYYY-MM-DD`, ISO timestamp or epoch milliseconds (11 to 13 digits). 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, FX and rates. Mutually exclusive with `asof` (400). See Time windows."
|
|
920
874
|
},
|
|
921
875
|
"asof": {
|
|
922
876
|
"type": "string",
|
|
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
|
|
877
|
+
"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, FX and rates. 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."
|
|
924
878
|
},
|
|
925
879
|
"adjusted": {
|
|
926
880
|
"type": "boolean",
|
|
927
|
-
"description": "Default `true`: prices are split-adjusted
|
|
881
|
+
"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."
|
|
928
882
|
},
|
|
929
883
|
"session": {
|
|
930
884
|
"type": "string",
|
|
931
|
-
"description": "Sub-hour intervals only. `all` (default) includes pre- and post-market bars. `regular` keeps bars whose start is in 09:30–16:00 ET (DST-aware). Why you might want it: the vendor buckets trades by SIP report time, and late-reported off-exchange (Form T) prints on thin names can land 20 min to hours late in a pre-market minute
|
|
885
|
+
"description": "Sub-hour intervals only. `all` (default) includes pre- and post-market bars. `regular` keeps bars whose start is in 09:30–16:00 ET (DST-aware). Why you might want it: the vendor buckets trades by SIP report time, and late-reported off-exchange (Form T) prints on thin names can land 20 min to hours late in a pre-market minute (a `$1.70` print at 08:13 ET on a `$3.85` stock). Daily high/low are untouched by those. `limit` counts after the filter; paging still works.",
|
|
932
886
|
"enum": [
|
|
933
887
|
"all",
|
|
934
888
|
"regular"
|
|
@@ -937,12 +891,12 @@ export const tools = [
|
|
|
937
891
|
},
|
|
938
892
|
"limit": {
|
|
939
893
|
"type": "integer",
|
|
940
|
-
"description": "Most-recent N bars. Max 1000
|
|
894
|
+
"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.",
|
|
941
895
|
"default": 100
|
|
942
896
|
},
|
|
943
897
|
"cursor": {
|
|
944
898
|
"type": "string",
|
|
945
|
-
"description": "Continue paging back: the previous response's `next_cursor`, unchanged, with the same
|
|
899
|
+
"description": "Continue paging back: the previous response's `next_cursor`, unchanged, with the same parameters. On a comma list, `next_cursor` is an object of each symbol's oldest-bar time; to page one symbol further, send its value as `cursor` with that symbol alone. From 2027-01-12 a comma list's `next_cursor` is one opaque string to pass back as `cursor` with the same symbols (Deprecations). A blank `cursor=` counts as absent."
|
|
946
900
|
}
|
|
947
901
|
},
|
|
948
902
|
"required": [
|
|
@@ -967,21 +921,18 @@ export const tools = [
|
|
|
967
921
|
"accepts": {
|
|
968
922
|
"as_of": "query",
|
|
969
923
|
"before": "query"
|
|
970
|
-
},
|
|
971
|
-
"fixedQuery": {
|
|
972
|
-
"api_version": "2027-01-12"
|
|
973
924
|
}
|
|
974
925
|
}
|
|
975
926
|
},
|
|
976
927
|
{
|
|
977
928
|
"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
|
|
929
|
+
"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
930
|
"inputSchema": {
|
|
980
931
|
"type": "object",
|
|
981
932
|
"properties": {
|
|
982
933
|
"ticker": {
|
|
983
934
|
"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
|
|
935
|
+
"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
936
|
}
|
|
986
937
|
},
|
|
987
938
|
"required": [
|
|
@@ -1004,13 +955,13 @@ export const tools = [
|
|
|
1004
955
|
},
|
|
1005
956
|
{
|
|
1006
957
|
"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)`.",
|
|
958
|
+
"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, `data.is_etf` is false and both are empty; `data.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
959
|
"inputSchema": {
|
|
1009
960
|
"type": "object",
|
|
1010
961
|
"properties": {
|
|
1011
962
|
"ticker": {
|
|
1012
963
|
"type": "string",
|
|
1013
|
-
"description": "ETF symbol, or a comma-separated list of up to 50 for a response keyed by symbol. Case-insensitive."
|
|
964
|
+
"description": "ETF 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."
|
|
1014
965
|
},
|
|
1015
966
|
"limit": {
|
|
1016
967
|
"type": "integer",
|
|
@@ -1019,7 +970,7 @@ export const tools = [
|
|
|
1019
970
|
},
|
|
1020
971
|
"cursor": {
|
|
1021
972
|
"type": "string",
|
|
1022
|
-
"description": "Continue paging: the previous response's `next_cursor`, unchanged
|
|
973
|
+
"description": "Continue paging: the previous response's `next_cursor`, unchanged. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param. 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
974
|
}
|
|
1024
975
|
},
|
|
1025
976
|
"required": [
|
|
@@ -1043,45 +994,170 @@ export const tools = [
|
|
|
1043
994
|
}
|
|
1044
995
|
},
|
|
1045
996
|
{
|
|
1046
|
-
"name": "
|
|
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)
|
|
997
|
+
"name": "tickerbot_query_events",
|
|
998
|
+
"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.",
|
|
1048
999
|
"inputSchema": {
|
|
1049
1000
|
"type": "object",
|
|
1050
1001
|
"properties": {
|
|
1051
1002
|
"kind": {
|
|
1052
1003
|
"type": "string",
|
|
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.",
|
|
1004
|
+
"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. Values: dividend, split, insider, analyst, earnings, filing, signal, news, estimate_revision.",
|
|
1005
|
+
"pattern": "^(dividend|split|insider|analyst|earnings|filing|signal|news|estimate_revision)(,(dividend|split|insider|analyst|earnings|filing|signal|news|estimate_revision))*$"
|
|
1006
|
+
},
|
|
1007
|
+
"ticker": {
|
|
1008
|
+
"type": "string",
|
|
1009
|
+
"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."
|
|
1010
|
+
},
|
|
1011
|
+
"universe": {
|
|
1012
|
+
"type": "string",
|
|
1013
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one answers 200 with no results and its id in `not_found`. Not combinable with `ticker`."
|
|
1014
|
+
},
|
|
1015
|
+
"from": {
|
|
1016
|
+
"type": "string",
|
|
1017
|
+
"description": "Events at or after this instant, in 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. For `signal`, the ticker's home-market day: ET for stocks and ETFs, UTC for crypto, FX and rates."
|
|
1018
|
+
},
|
|
1019
|
+
"to": {
|
|
1020
|
+
"type": "string",
|
|
1021
|
+
"description": "Window end, in the 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. For `signal`, the ticker's home-market day: ET for stocks and ETFs, UTC for crypto, FX and rates."
|
|
1022
|
+
},
|
|
1023
|
+
"signal": {
|
|
1024
|
+
"type": "string",
|
|
1025
|
+
"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`. An unknown name filters nothing in and is listed in `not_found` (every name unknown: no signal events). See Signal firings."
|
|
1026
|
+
},
|
|
1027
|
+
"transition": {
|
|
1028
|
+
"type": "string",
|
|
1029
|
+
"description": "Only with `kind=signal`. `enter` (false→true) or `exit` (true→false).",
|
|
1054
1030
|
"enum": [
|
|
1055
|
-
"
|
|
1056
|
-
"
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1031
|
+
"enter",
|
|
1032
|
+
"exit"
|
|
1033
|
+
]
|
|
1034
|
+
},
|
|
1035
|
+
"merge_gap_seconds": {
|
|
1036
|
+
"type": "integer",
|
|
1037
|
+
"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`."
|
|
1038
|
+
},
|
|
1039
|
+
"q": {
|
|
1040
|
+
"type": "string",
|
|
1041
|
+
"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."
|
|
1042
|
+
},
|
|
1043
|
+
"join": {
|
|
1044
|
+
"type": "string",
|
|
1045
|
+
"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'`. Needs `q`, `group_by` or a ticker signal in `select`.",
|
|
1046
|
+
"enum": [
|
|
1047
|
+
"state"
|
|
1064
1048
|
]
|
|
1065
1049
|
},
|
|
1050
|
+
"grain": {
|
|
1051
|
+
"type": "string",
|
|
1052
|
+
"description": "Only with `kind=signal` or `join=state`. With `kind=signal`, the grain the flips are read at: `1m`, `1h` or `1d`, or `auto` (the 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.",
|
|
1053
|
+
"enum": [
|
|
1054
|
+
"1m",
|
|
1055
|
+
"1h",
|
|
1056
|
+
"1d",
|
|
1057
|
+
"auto"
|
|
1058
|
+
],
|
|
1059
|
+
"default": "auto"
|
|
1060
|
+
},
|
|
1061
|
+
"select": {
|
|
1062
|
+
"type": "string",
|
|
1063
|
+
"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. `*` is every field: the whole `payload`, and with `join=state` every signal the read's grain stores. 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`."
|
|
1064
|
+
},
|
|
1065
|
+
"group_by": {
|
|
1066
|
+
"type": "string",
|
|
1067
|
+
"description": "Comma list of rollup keys; it 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`."
|
|
1068
|
+
},
|
|
1069
|
+
"having": {
|
|
1070
|
+
"type": "string",
|
|
1071
|
+
"description": "Only with `group_by`. Post-aggregation filter."
|
|
1072
|
+
},
|
|
1073
|
+
"order": {
|
|
1074
|
+
"type": "string",
|
|
1075
|
+
"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`, or with your own `select`, its last column's alias. A list is sorted by `ts`: `order=ts` is accepted there and changes nothing."
|
|
1076
|
+
},
|
|
1077
|
+
"dir": {
|
|
1078
|
+
"type": "string",
|
|
1079
|
+
"description": "A list: `desc` (default) is newest first, `asc` oldest first, paging forward. With `group_by`: the rollup's sort direction.",
|
|
1080
|
+
"enum": [
|
|
1081
|
+
"asc",
|
|
1082
|
+
"desc"
|
|
1083
|
+
],
|
|
1084
|
+
"default": "desc"
|
|
1085
|
+
},
|
|
1086
|
+
"limit": {
|
|
1087
|
+
"type": "integer",
|
|
1088
|
+
"description": "Page size for a list (default 50): up to 1000 until 2027-01-12, then 100, and the rest pages with `next_cursor`. A `group_by` rollup returns every group up to `limit` (default and max 1000) and sets `truncated: true` when there are more. A larger value is clamped to the max, not an error; see Deprecations.",
|
|
1089
|
+
"default": 50
|
|
1090
|
+
},
|
|
1091
|
+
"cursor": {
|
|
1092
|
+
"type": "string",
|
|
1093
|
+
"description": "Opaque cursor from the previous response. It carries the filters, `dir` and `select`, so pass it alone. A `q`, `ticker` list or `select` too long to ride in it is kept as a fingerprint instead: send that param again with `cursor`, the same as on the first page (`q_truncated` flags `q`). A missing or different value is a 400 naming the param. Not valid with `group_by`."
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
},
|
|
1097
|
+
"endpoint": {
|
|
1098
|
+
"method": "GET",
|
|
1099
|
+
"path": "/v2/events",
|
|
1100
|
+
"paramLocation": {
|
|
1101
|
+
"kind": "query",
|
|
1102
|
+
"ticker": "query",
|
|
1103
|
+
"universe": "query",
|
|
1104
|
+
"from": "query",
|
|
1105
|
+
"to": "query",
|
|
1106
|
+
"signal": "query",
|
|
1107
|
+
"transition": "query",
|
|
1108
|
+
"merge_gap_seconds": "query",
|
|
1109
|
+
"q": "query",
|
|
1110
|
+
"join": "query",
|
|
1111
|
+
"grain": "query",
|
|
1112
|
+
"select": "query",
|
|
1113
|
+
"group_by": "query",
|
|
1114
|
+
"having": "query",
|
|
1115
|
+
"order": "query",
|
|
1116
|
+
"dir": "query",
|
|
1117
|
+
"limit": "query",
|
|
1118
|
+
"cursor": "query"
|
|
1119
|
+
},
|
|
1120
|
+
"accepts": {
|
|
1121
|
+
"tickers": "query",
|
|
1122
|
+
"since": "query",
|
|
1123
|
+
"until": "query",
|
|
1124
|
+
"interval": "query",
|
|
1125
|
+
"firm": "query",
|
|
1126
|
+
"action": "query",
|
|
1127
|
+
"min_relevance": "query"
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
},
|
|
1131
|
+
{
|
|
1132
|
+
"name": "tickerbot_list_events",
|
|
1133
|
+
"description": "Deprecated: works until 2027-01-12. Same as tickerbot_query_events; call that instead.",
|
|
1134
|
+
"inputSchema": {
|
|
1135
|
+
"type": "object",
|
|
1136
|
+
"properties": {
|
|
1137
|
+
"kind": {
|
|
1138
|
+
"type": "string",
|
|
1139
|
+
"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. Values: dividend, split, insider, analyst, earnings, filing, signal, news, estimate_revision.",
|
|
1140
|
+
"pattern": "^(dividend|split|insider|analyst|earnings|filing|signal|news|estimate_revision)(,(dividend|split|insider|analyst|earnings|filing|signal|news|estimate_revision))*$"
|
|
1141
|
+
},
|
|
1066
1142
|
"ticker": {
|
|
1067
1143
|
"type": "string",
|
|
1068
1144
|
"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."
|
|
1069
1145
|
},
|
|
1070
1146
|
"universe": {
|
|
1071
1147
|
"type": "string",
|
|
1072
|
-
"description": "
|
|
1148
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one answers 200 with no results and its id in `not_found`. Not combinable with `ticker`."
|
|
1073
1149
|
},
|
|
1074
1150
|
"from": {
|
|
1075
1151
|
"type": "string",
|
|
1076
|
-
"description": "Events at
|
|
1152
|
+
"description": "Events at or after this instant, in 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. For `signal`, the ticker's home-market day: ET for stocks and ETFs, UTC for crypto, FX and rates."
|
|
1077
1153
|
},
|
|
1078
1154
|
"to": {
|
|
1079
1155
|
"type": "string",
|
|
1080
|
-
"description": "Window end
|
|
1156
|
+
"description": "Window end, in the 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. For `signal`, the ticker's home-market day: ET for stocks and ETFs, UTC for crypto, FX and rates."
|
|
1081
1157
|
},
|
|
1082
1158
|
"signal": {
|
|
1083
1159
|
"type": "string",
|
|
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."
|
|
1160
|
+
"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`. An unknown name filters nothing in and is listed in `not_found` (every name unknown: no signal events). See Signal firings."
|
|
1085
1161
|
},
|
|
1086
1162
|
"transition": {
|
|
1087
1163
|
"type": "string",
|
|
@@ -1101,14 +1177,14 @@ export const tools = [
|
|
|
1101
1177
|
},
|
|
1102
1178
|
"join": {
|
|
1103
1179
|
"type": "string",
|
|
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'`.",
|
|
1180
|
+
"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'`. Needs `q`, `group_by` or a ticker signal in `select`.",
|
|
1105
1181
|
"enum": [
|
|
1106
1182
|
"state"
|
|
1107
1183
|
]
|
|
1108
1184
|
},
|
|
1109
1185
|
"grain": {
|
|
1110
1186
|
"type": "string",
|
|
1111
|
-
"description": "With `kind=signal`, the grain the flips are read at: `1m`, `1h` or `1d` (default
|
|
1187
|
+
"description": "Only with `kind=signal` or `join=state`. With `kind=signal`, the grain the flips are read at: `1m`, `1h` or `1d`, or `auto` (the 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.",
|
|
1112
1188
|
"enum": [
|
|
1113
1189
|
"1m",
|
|
1114
1190
|
"1h",
|
|
@@ -1119,11 +1195,11 @@ export const tools = [
|
|
|
1119
1195
|
},
|
|
1120
1196
|
"select": {
|
|
1121
1197
|
"type": "string",
|
|
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`."
|
|
1198
|
+
"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. `*` is every field: the whole `payload`, and with `join=state` every signal the read's grain stores. 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`."
|
|
1123
1199
|
},
|
|
1124
1200
|
"group_by": {
|
|
1125
1201
|
"type": "string",
|
|
1126
|
-
"description": "Comma list of rollup keys
|
|
1202
|
+
"description": "Comma list of rollup keys; it 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`."
|
|
1127
1203
|
},
|
|
1128
1204
|
"having": {
|
|
1129
1205
|
"type": "string",
|
|
@@ -1131,7 +1207,7 @@ export const tools = [
|
|
|
1131
1207
|
},
|
|
1132
1208
|
"order": {
|
|
1133
1209
|
"type": "string",
|
|
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
|
|
1210
|
+
"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`, or with your own `select`, its last column's alias. A list is sorted by `ts`: `order=ts` is accepted there and changes nothing."
|
|
1135
1211
|
},
|
|
1136
1212
|
"dir": {
|
|
1137
1213
|
"type": "string",
|
|
@@ -1144,12 +1220,12 @@ export const tools = [
|
|
|
1144
1220
|
},
|
|
1145
1221
|
"limit": {
|
|
1146
1222
|
"type": "integer",
|
|
1147
|
-
"description": "Page size
|
|
1223
|
+
"description": "Page size for a list (default 50): up to 1000 until 2027-01-12, then 100, and the rest pages with `next_cursor`. A `group_by` rollup returns every group up to `limit` (default and max 1000) and sets `truncated: true` when there are more. A larger value is clamped to the max, not an error; see Deprecations.",
|
|
1148
1224
|
"default": 50
|
|
1149
1225
|
},
|
|
1150
1226
|
"cursor": {
|
|
1151
1227
|
"type": "string",
|
|
1152
|
-
"description": "Opaque cursor from the previous response. It carries the filters, `dir`, `select` (
|
|
1228
|
+
"description": "Opaque cursor from the previous response. It carries the filters, `dir` and `select`, so pass it alone. A `q`, `ticker` list or `select` too long to ride in it is kept as a fingerprint instead: send that param again with `cursor`, the same as on the first page (`q_truncated` flags `q`). A missing or different value is a 400 naming the param. Not valid with `group_by`."
|
|
1153
1229
|
}
|
|
1154
1230
|
}
|
|
1155
1231
|
},
|
|
@@ -1189,7 +1265,7 @@ export const tools = [
|
|
|
1189
1265
|
},
|
|
1190
1266
|
{
|
|
1191
1267
|
"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.
|
|
1268
|
+
"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.",
|
|
1193
1269
|
"inputSchema": {
|
|
1194
1270
|
"type": "object",
|
|
1195
1271
|
"properties": {}
|
|
@@ -1208,16 +1284,8 @@ export const tools = [
|
|
|
1208
1284
|
"properties": {
|
|
1209
1285
|
"kind": {
|
|
1210
1286
|
"type": "string",
|
|
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
|
|
1212
|
-
"
|
|
1213
|
-
"dividend",
|
|
1214
|
-
"split",
|
|
1215
|
-
"insider",
|
|
1216
|
-
"analyst",
|
|
1217
|
-
"earnings",
|
|
1218
|
-
"filing",
|
|
1219
|
-
"estimate_revision"
|
|
1220
|
-
]
|
|
1287
|
+
"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, one event per fiscal period and horizon that moved (about 1,000 a night across the market). Values: dividend, split, insider, analyst, earnings, filing, estimate_revision.",
|
|
1288
|
+
"pattern": "^(dividend|split|insider|analyst|earnings|filing|estimate_revision)(,(dividend|split|insider|analyst|earnings|filing|estimate_revision))*$"
|
|
1221
1289
|
},
|
|
1222
1290
|
"ticker": {
|
|
1223
1291
|
"type": "string",
|
|
@@ -1225,7 +1293,7 @@ export const tools = [
|
|
|
1225
1293
|
},
|
|
1226
1294
|
"universe": {
|
|
1227
1295
|
"type": "string",
|
|
1228
|
-
"description": "Scope to a universe
|
|
1296
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one is a 400 `universe_not_found` naming it."
|
|
1229
1297
|
},
|
|
1230
1298
|
"q": {
|
|
1231
1299
|
"type": "string",
|
|
@@ -1237,7 +1305,7 @@ export const tools = [
|
|
|
1237
1305
|
},
|
|
1238
1306
|
"channel": {
|
|
1239
1307
|
"type": "string",
|
|
1240
|
-
"description": "Delivery channel. Inferred when omitted: `
|
|
1308
|
+
"description": "Delivery channel: `webhook` (POST to `target_url`), `discord` (an embed at `discord_url`), `in_app` (the dashboard only) or `mobile_push` (to `device_id`). Inferred when omitted: `discord` if `discord_url` is set, else `mobile_push` if `device_id` is set, else `webhook` if `target_url` is set, else `in_app`. See Delivery channels.",
|
|
1241
1309
|
"enum": [
|
|
1242
1310
|
"webhook",
|
|
1243
1311
|
"discord",
|
|
@@ -1247,19 +1315,19 @@ export const tools = [
|
|
|
1247
1315
|
},
|
|
1248
1316
|
"target_url": {
|
|
1249
1317
|
"type": "string",
|
|
1250
|
-
"description": "Only with `channel=webhook`. HTTPS delivery
|
|
1318
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
1251
1319
|
},
|
|
1252
1320
|
"discord_url": {
|
|
1253
1321
|
"type": "string",
|
|
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."
|
|
1322
|
+
"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."
|
|
1255
1323
|
},
|
|
1256
1324
|
"device_id": {
|
|
1257
1325
|
"type": "string",
|
|
1258
|
-
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`.
|
|
1326
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. An unknown id is a 400 `device_not_found`."
|
|
1259
1327
|
},
|
|
1260
1328
|
"name": {
|
|
1261
1329
|
"type": "string",
|
|
1262
|
-
"description": "Display name. Defaults to `events: <kinds> · <scope>`."
|
|
1330
|
+
"description": "Display name, up to 80 characters. Defaults to `events: <kinds> · <scope>`."
|
|
1263
1331
|
}
|
|
1264
1332
|
},
|
|
1265
1333
|
"required": [
|
|
@@ -1290,14 +1358,14 @@ export const tools = [
|
|
|
1290
1358
|
}
|
|
1291
1359
|
},
|
|
1292
1360
|
{
|
|
1293
|
-
"name": "
|
|
1361
|
+
"name": "tickerbot_query_news",
|
|
1294
1362
|
"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.",
|
|
1295
1363
|
"inputSchema": {
|
|
1296
1364
|
"type": "object",
|
|
1297
1365
|
"properties": {
|
|
1298
1366
|
"search": {
|
|
1299
1367
|
"type": "string",
|
|
1300
|
-
"description": "Full-text search over `title` + `summary
|
|
1368
|
+
"description": "Full-text search over `title` + `summary`, in 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."
|
|
1301
1369
|
},
|
|
1302
1370
|
"ticker": {
|
|
1303
1371
|
"type": "string",
|
|
@@ -1305,15 +1373,15 @@ export const tools = [
|
|
|
1305
1373
|
},
|
|
1306
1374
|
"universe": {
|
|
1307
1375
|
"type": "string",
|
|
1308
|
-
"description": "
|
|
1376
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one answers 200 with no results and its id in `not_found`. Articles that mention any member. Not combinable with `ticker`."
|
|
1309
1377
|
},
|
|
1310
1378
|
"from": {
|
|
1311
1379
|
"type": "string",
|
|
1312
|
-
"description": "Earliest `time_published` (inclusive)
|
|
1380
|
+
"description": "Earliest `time_published` (inclusive), in strict ISO: `YYYY-MM-DD` or `YYYY-MM-DDTHH:MM[:SS]Z`. A bare date starts at 00:00 ET that day."
|
|
1313
1381
|
},
|
|
1314
1382
|
"to": {
|
|
1315
1383
|
"type": "string",
|
|
1316
|
-
"description": "Articles strictly before this instant
|
|
1384
|
+
"description": "Articles strictly before this instant, in the same strict ISO subset as `from` (as on `/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."
|
|
1317
1385
|
},
|
|
1318
1386
|
"min_relevance": {
|
|
1319
1387
|
"type": "number",
|
|
@@ -1321,15 +1389,15 @@ export const tools = [
|
|
|
1321
1389
|
},
|
|
1322
1390
|
"q": {
|
|
1323
1391
|
"type": "string",
|
|
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).
|
|
1392
|
+
"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)."
|
|
1325
1393
|
},
|
|
1326
1394
|
"select": {
|
|
1327
1395
|
"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."
|
|
1396
|
+
"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`). `*` returns every article field under Returns plus `mentions` (on a per-mention row, the mention's four fields too). `mentions` is selectable on its own."
|
|
1329
1397
|
},
|
|
1330
1398
|
"group_by": {
|
|
1331
1399
|
"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
|
|
1400
|
+
"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."
|
|
1333
1401
|
},
|
|
1334
1402
|
"having": {
|
|
1335
1403
|
"type": "string",
|
|
@@ -1337,7 +1405,7 @@ export const tools = [
|
|
|
1337
1405
|
},
|
|
1338
1406
|
"order": {
|
|
1339
1407
|
"type": "string",
|
|
1340
|
-
"description": "Sort
|
|
1408
|
+
"description": "Sort by 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)."
|
|
1341
1409
|
},
|
|
1342
1410
|
"dir": {
|
|
1343
1411
|
"type": "string",
|
|
@@ -1350,12 +1418,108 @@ export const tools = [
|
|
|
1350
1418
|
},
|
|
1351
1419
|
"limit": {
|
|
1352
1420
|
"type": "integer",
|
|
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
|
|
1421
|
+
"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 does not page: it returns up to `limit` groups, every group up to 1000 by default, and sets `truncated: true` when there are more. A larger value is clamped to the max, not an error; see Deprecations.",
|
|
1354
1422
|
"default": 50
|
|
1355
1423
|
},
|
|
1356
1424
|
"cursor": {
|
|
1357
1425
|
"type": "string",
|
|
1358
|
-
"description": "
|
|
1426
|
+
"description": "From a prior response's `next_cursor`. Send it with the same params as the first page (`limit` may change). It holds the position and pins the read: a page whose params differ from the first page's, or a cursor sent alone, is a 400 naming the param to send."
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
},
|
|
1430
|
+
"endpoint": {
|
|
1431
|
+
"method": "GET",
|
|
1432
|
+
"path": "/v2/news",
|
|
1433
|
+
"paramLocation": {
|
|
1434
|
+
"search": "query",
|
|
1435
|
+
"ticker": "query",
|
|
1436
|
+
"universe": "query",
|
|
1437
|
+
"from": "query",
|
|
1438
|
+
"to": "query",
|
|
1439
|
+
"min_relevance": "query",
|
|
1440
|
+
"q": "query",
|
|
1441
|
+
"select": "query",
|
|
1442
|
+
"group_by": "query",
|
|
1443
|
+
"having": "query",
|
|
1444
|
+
"order": "query",
|
|
1445
|
+
"dir": "query",
|
|
1446
|
+
"limit": "query",
|
|
1447
|
+
"cursor": "query"
|
|
1448
|
+
},
|
|
1449
|
+
"accepts": {
|
|
1450
|
+
"tickers": "query",
|
|
1451
|
+
"since": "query",
|
|
1452
|
+
"until": "query"
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
},
|
|
1456
|
+
{
|
|
1457
|
+
"name": "tickerbot_search_news",
|
|
1458
|
+
"description": "Deprecated: works until 2027-01-12. Same as tickerbot_query_news; call that instead.",
|
|
1459
|
+
"inputSchema": {
|
|
1460
|
+
"type": "object",
|
|
1461
|
+
"properties": {
|
|
1462
|
+
"search": {
|
|
1463
|
+
"type": "string",
|
|
1464
|
+
"description": "Full-text search over `title` + `summary`, in 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."
|
|
1465
|
+
},
|
|
1466
|
+
"ticker": {
|
|
1467
|
+
"type": "string",
|
|
1468
|
+
"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."
|
|
1469
|
+
},
|
|
1470
|
+
"universe": {
|
|
1471
|
+
"type": "string",
|
|
1472
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one answers 200 with no results and its id in `not_found`. Articles that mention any member. Not combinable with `ticker`."
|
|
1473
|
+
},
|
|
1474
|
+
"from": {
|
|
1475
|
+
"type": "string",
|
|
1476
|
+
"description": "Earliest `time_published` (inclusive), in strict ISO: `YYYY-MM-DD` or `YYYY-MM-DDTHH:MM[:SS]Z`. A bare date starts at 00:00 ET that day."
|
|
1477
|
+
},
|
|
1478
|
+
"to": {
|
|
1479
|
+
"type": "string",
|
|
1480
|
+
"description": "Articles strictly before this instant, in the same strict ISO subset as `from` (as on `/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."
|
|
1481
|
+
},
|
|
1482
|
+
"min_relevance": {
|
|
1483
|
+
"type": "number",
|
|
1484
|
+
"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`."
|
|
1485
|
+
},
|
|
1486
|
+
"q": {
|
|
1487
|
+
"type": "string",
|
|
1488
|
+
"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)."
|
|
1489
|
+
},
|
|
1490
|
+
"select": {
|
|
1491
|
+
"type": "string",
|
|
1492
|
+
"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`). `*` returns every article field under Returns plus `mentions` (on a per-mention row, the mention's four fields too). `mentions` is selectable on its own."
|
|
1493
|
+
},
|
|
1494
|
+
"group_by": {
|
|
1495
|
+
"type": "string",
|
|
1496
|
+
"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."
|
|
1497
|
+
},
|
|
1498
|
+
"having": {
|
|
1499
|
+
"type": "string",
|
|
1500
|
+
"description": "Only with `group_by`. HAVING clause on the rollup (max 1000 chars)."
|
|
1501
|
+
},
|
|
1502
|
+
"order": {
|
|
1503
|
+
"type": "string",
|
|
1504
|
+
"description": "Sort by 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)."
|
|
1505
|
+
},
|
|
1506
|
+
"dir": {
|
|
1507
|
+
"type": "string",
|
|
1508
|
+
"description": "Sort direction.",
|
|
1509
|
+
"enum": [
|
|
1510
|
+
"asc",
|
|
1511
|
+
"desc"
|
|
1512
|
+
],
|
|
1513
|
+
"default": "desc"
|
|
1514
|
+
},
|
|
1515
|
+
"limit": {
|
|
1516
|
+
"type": "integer",
|
|
1517
|
+
"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 does not page: it returns up to `limit` groups, every group up to 1000 by default, and sets `truncated: true` when there are more. A larger value is clamped to the max, not an error; see Deprecations.",
|
|
1518
|
+
"default": 50
|
|
1519
|
+
},
|
|
1520
|
+
"cursor": {
|
|
1521
|
+
"type": "string",
|
|
1522
|
+
"description": "From a prior response's `next_cursor`. Send it with the same params as the first page (`limit` may change). It holds the position and pins the read: a page whose params differ from the first page's, or a cursor sent alone, is a 400 naming the param to send."
|
|
1359
1523
|
}
|
|
1360
1524
|
}
|
|
1361
1525
|
},
|
|
@@ -1401,7 +1565,7 @@ export const tools = [
|
|
|
1401
1565
|
},
|
|
1402
1566
|
"universe": {
|
|
1403
1567
|
"type": "string",
|
|
1404
|
-
"description": "
|
|
1568
|
+
"description": "Scope to a built-in universe (`top_10`, `top_100`) or one of your own, by id. An unknown one is a 400 `universe_not_found` naming it. Articles that mention any member fire."
|
|
1405
1569
|
},
|
|
1406
1570
|
"min_relevance": {
|
|
1407
1571
|
"type": "number",
|
|
@@ -1417,7 +1581,7 @@ export const tools = [
|
|
|
1417
1581
|
},
|
|
1418
1582
|
"channel": {
|
|
1419
1583
|
"type": "string",
|
|
1420
|
-
"description": "Delivery channel. Inferred when omitted: `
|
|
1584
|
+
"description": "Delivery channel: `webhook` (POST to `target_url`), `discord` (an embed at `discord_url`), `in_app` (the dashboard only) or `mobile_push` (to `device_id`). Inferred when omitted: `discord` if `discord_url` is set, else `mobile_push` if `device_id` is set, else `webhook` if `target_url` is set, else `in_app`. See Delivery channels.",
|
|
1421
1585
|
"enum": [
|
|
1422
1586
|
"webhook",
|
|
1423
1587
|
"discord",
|
|
@@ -1427,19 +1591,19 @@ export const tools = [
|
|
|
1427
1591
|
},
|
|
1428
1592
|
"target_url": {
|
|
1429
1593
|
"type": "string",
|
|
1430
|
-
"description": "Only with `channel=webhook`. HTTPS delivery
|
|
1594
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
1431
1595
|
},
|
|
1432
1596
|
"discord_url": {
|
|
1433
1597
|
"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."
|
|
1598
|
+
"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."
|
|
1435
1599
|
},
|
|
1436
1600
|
"device_id": {
|
|
1437
1601
|
"type": "string",
|
|
1438
|
-
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`.
|
|
1602
|
+
"description": "Only with `channel=mobile_push`. Device to notify, from `POST /v2/devices/register`. An unknown id is a 400 `device_not_found`."
|
|
1439
1603
|
},
|
|
1440
1604
|
"name": {
|
|
1441
1605
|
"type": "string",
|
|
1442
|
-
"description": "Display name. Defaults to `news: <scope> · <search or q>`."
|
|
1606
|
+
"description": "Display name, up to 80 characters. Defaults to `news: <scope> · <search or q>`."
|
|
1443
1607
|
}
|
|
1444
1608
|
}
|
|
1445
1609
|
},
|
|
@@ -1467,21 +1631,18 @@ export const tools = [
|
|
|
1467
1631
|
},
|
|
1468
1632
|
{
|
|
1469
1633
|
"name": "tickerbot_list_universes",
|
|
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
|
|
1634
|
+
"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.",
|
|
1471
1635
|
"inputSchema": {
|
|
1472
1636
|
"type": "object",
|
|
1473
1637
|
"properties": {
|
|
1474
|
-
"
|
|
1638
|
+
"search": {
|
|
1475
1639
|
"type": "string",
|
|
1476
|
-
"description": "
|
|
1477
|
-
"enum": [
|
|
1478
|
-
"builtin",
|
|
1479
|
-
"custom"
|
|
1480
|
-
]
|
|
1640
|
+
"description": "Only universes whose id, name or description contains this text (case-insensitive). Results are ranked across built-in and your own universes: an exact id or name match first, then an id or name that starts with the term, then one that contains it, then descriptions that have it as a whole word, then descriptions that contain it; list order within each rank. Paging a search never repeats or skips."
|
|
1481
1641
|
},
|
|
1482
|
-
"
|
|
1642
|
+
"kind": {
|
|
1483
1643
|
"type": "string",
|
|
1484
|
-
"description": "
|
|
1644
|
+
"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. Values: builtin, custom.",
|
|
1645
|
+
"pattern": "^(builtin|custom)(,(builtin|custom))*$"
|
|
1485
1646
|
},
|
|
1486
1647
|
"limit": {
|
|
1487
1648
|
"type": "integer",
|
|
@@ -1490,7 +1651,7 @@ export const tools = [
|
|
|
1490
1651
|
},
|
|
1491
1652
|
"cursor": {
|
|
1492
1653
|
"type": "string",
|
|
1493
|
-
"description": "
|
|
1654
|
+
"description": "The previous response's `next_cursor`. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param."
|
|
1494
1655
|
}
|
|
1495
1656
|
}
|
|
1496
1657
|
},
|
|
@@ -1498,8 +1659,8 @@ export const tools = [
|
|
|
1498
1659
|
"method": "GET",
|
|
1499
1660
|
"path": "/v2/universes",
|
|
1500
1661
|
"paramLocation": {
|
|
1501
|
-
"kind": "query",
|
|
1502
1662
|
"search": "query",
|
|
1663
|
+
"kind": "query",
|
|
1503
1664
|
"limit": "query",
|
|
1504
1665
|
"cursor": "query"
|
|
1505
1666
|
},
|
|
@@ -1523,11 +1684,11 @@ export const tools = [
|
|
|
1523
1684
|
},
|
|
1524
1685
|
"name": {
|
|
1525
1686
|
"type": "string",
|
|
1526
|
-
"description": "
|
|
1687
|
+
"description": "Display name, up to 80 characters. Display only: the `id` is what references the universe."
|
|
1527
1688
|
},
|
|
1528
1689
|
"id": {
|
|
1529
1690
|
"type": "string",
|
|
1530
|
-
"description": "Optional slug
|
|
1691
|
+
"description": "Optional slug: the universe's permanent handle everywhere (`?universe=`, subscribe `universe`, CRUD path). Pattern `^[a-z][a-z0-9_]{0,62}$`: starts with a lowercase letter, then lowercase letters/digits/underscore, 63 chars max; the value is trimmed and lowercased before validation. `top_10` and `top_100` are reserved for built-in universes and rejected with 400. Must be unique within your account. Generated (`u_…`) if omitted."
|
|
1531
1692
|
},
|
|
1532
1693
|
"description": {
|
|
1533
1694
|
"type": "string",
|
|
@@ -1581,7 +1742,7 @@ export const tools = [
|
|
|
1581
1742
|
},
|
|
1582
1743
|
{
|
|
1583
1744
|
"name": "tickerbot_update_universe",
|
|
1584
|
-
"description": "Updates one of your universes: its name, description or members. `tickers` replaces the whole list; `add`/`remove` adjust it.
|
|
1745
|
+
"description": "Updates one of your universes: its name, description or members. `tickers` replaces the whole list; `add`/`remove` adjust it. Built-in universes cannot be edited.",
|
|
1585
1746
|
"inputSchema": {
|
|
1586
1747
|
"type": "object",
|
|
1587
1748
|
"properties": {
|
|
@@ -1644,7 +1805,7 @@ export const tools = [
|
|
|
1644
1805
|
},
|
|
1645
1806
|
{
|
|
1646
1807
|
"name": "tickerbot_delete_universe",
|
|
1647
|
-
"description": "Permanently deletes one of your universes.
|
|
1808
|
+
"description": "Permanently deletes one of your universes. A universe any of your webhooks still uses answers 409 universe_referenced; force=true deletes it, and those webhooks are disabled at their next evaluation.",
|
|
1648
1809
|
"inputSchema": {
|
|
1649
1810
|
"type": "object",
|
|
1650
1811
|
"properties": {
|
|
@@ -1654,7 +1815,7 @@ export const tools = [
|
|
|
1654
1815
|
},
|
|
1655
1816
|
"force": {
|
|
1656
1817
|
"type": "boolean",
|
|
1657
|
-
"description": "A universe
|
|
1818
|
+
"description": "A universe that any of your webhooks references (active or disabled) refuses to delete with `409 universe_referenced`, listing them in `referencing_webhooks`. Pass `force=true` to delete anyway; those webhooks are disabled at their next evaluation.",
|
|
1658
1819
|
"default": false
|
|
1659
1820
|
}
|
|
1660
1821
|
},
|
|
@@ -1685,11 +1846,8 @@ export const tools = [
|
|
|
1685
1846
|
"properties": {
|
|
1686
1847
|
"status": {
|
|
1687
1848
|
"type": "string",
|
|
1688
|
-
"description": "Filter by status: `active`, `disabled` or both as a comma list
|
|
1689
|
-
"
|
|
1690
|
-
"active",
|
|
1691
|
-
"disabled"
|
|
1692
|
-
]
|
|
1849
|
+
"description": "Filter by status: `active`, `disabled` or both as a comma list. A webhook is always one of the two (`disabled` covers a user pause, the automatic disable after deliveries have kept failing for 72 hours with none getting through, and the automatic disable of a trigger that cannot run; `disabled_reason` on each record says which: `user_disabled`, `delivery_failure`, `evaluation_failure`, `plan_downgrade` or `subscription_canceled`). Omit for all. Values: active, disabled.",
|
|
1850
|
+
"pattern": "^(active|disabled)(,(active|disabled))*$"
|
|
1693
1851
|
},
|
|
1694
1852
|
"limit": {
|
|
1695
1853
|
"type": "integer",
|
|
@@ -1698,7 +1856,7 @@ export const tools = [
|
|
|
1698
1856
|
},
|
|
1699
1857
|
"cursor": {
|
|
1700
1858
|
"type": "string",
|
|
1701
|
-
"description": "
|
|
1859
|
+
"description": "The previous response's `next_cursor`. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param."
|
|
1702
1860
|
}
|
|
1703
1861
|
}
|
|
1704
1862
|
},
|
|
@@ -1743,7 +1901,7 @@ export const tools = [
|
|
|
1743
1901
|
},
|
|
1744
1902
|
{
|
|
1745
1903
|
"name": "tickerbot_update_webhook",
|
|
1746
|
-
"description": "Edits a webhook in place; send only the fields you want to change.
|
|
1904
|
+
"description": "Edits a webhook in place; send only the fields you want to change. 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/order/dir; 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
1905
|
"inputSchema": {
|
|
1748
1906
|
"type": "object",
|
|
1749
1907
|
"properties": {
|
|
@@ -1751,23 +1909,15 @@ export const tools = [
|
|
|
1751
1909
|
"type": "string",
|
|
1752
1910
|
"description": "Webhook id."
|
|
1753
1911
|
},
|
|
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"
|
|
1765
|
-
]
|
|
1766
|
-
},
|
|
1767
1912
|
"search": {
|
|
1768
1913
|
"type": "string",
|
|
1769
1914
|
"description": "Only with news webhooks. The full-text search, as on Subscribe to news."
|
|
1770
1915
|
},
|
|
1916
|
+
"kind": {
|
|
1917
|
+
"type": "string",
|
|
1918
|
+
"description": "Only with event webhooks. The kinds to fire on, as on Subscribe to events. Values: dividend, split, insider, analyst, earnings, filing, estimate_revision.",
|
|
1919
|
+
"pattern": "^(dividend|split|insider|analyst|earnings|filing|estimate_revision)(,(dividend|split|insider|analyst|earnings|filing|estimate_revision))*$"
|
|
1920
|
+
},
|
|
1771
1921
|
"condition": {
|
|
1772
1922
|
"type": "string",
|
|
1773
1923
|
"description": "Only with signal webhooks. The bound, in Get a signal's grammar (`<30`)."
|
|
@@ -1786,7 +1936,7 @@ export const tools = [
|
|
|
1786
1936
|
},
|
|
1787
1937
|
"q": {
|
|
1788
1938
|
"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."
|
|
1939
|
+
"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. On a ticker webhook send the condition alone, or the `q` a read returns (`ticker = 'NVDA' AND (…)`): the webhook's own ticker scope is not added twice. 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
1940
|
},
|
|
1791
1941
|
"select": {
|
|
1792
1942
|
"type": "string",
|
|
@@ -1853,8 +2003,8 @@ export const tools = [
|
|
|
1853
2003
|
"path": "/v2/webhooks/{webhook}",
|
|
1854
2004
|
"paramLocation": {
|
|
1855
2005
|
"webhook": "path",
|
|
1856
|
-
"kind": "body",
|
|
1857
2006
|
"search": "body",
|
|
2007
|
+
"kind": "body",
|
|
1858
2008
|
"condition": "body",
|
|
1859
2009
|
"ticker": "body",
|
|
1860
2010
|
"universe": "body",
|
|
@@ -1875,6 +2025,8 @@ export const tools = [
|
|
|
1875
2025
|
"kinds": "body",
|
|
1876
2026
|
"tickers": "body",
|
|
1877
2027
|
"universe_id": "body",
|
|
2028
|
+
"columns": "body",
|
|
2029
|
+
"fields": "body",
|
|
1878
2030
|
"id": "path"
|
|
1879
2031
|
},
|
|
1880
2032
|
"pathAliases": {
|
|
@@ -1955,20 +2107,16 @@ export const tools = [
|
|
|
1955
2107
|
},
|
|
1956
2108
|
"status": {
|
|
1957
2109
|
"type": "string",
|
|
1958
|
-
"description": "Filter by delivery status (one or a comma list).",
|
|
1959
|
-
"
|
|
1960
|
-
"pending",
|
|
1961
|
-
"delivered",
|
|
1962
|
-
"permanent_failure"
|
|
1963
|
-
]
|
|
2110
|
+
"description": "Filter by delivery status (one or a comma list). Values: pending, delivered, permanent_failure.",
|
|
2111
|
+
"pattern": "^(pending|delivered|permanent_failure)(,(pending|delivered|permanent_failure))*$"
|
|
1964
2112
|
},
|
|
1965
2113
|
"from": {
|
|
1966
2114
|
"type": "string",
|
|
1967
|
-
"description": "Only deliveries created at
|
|
2115
|
+
"description": "Only deliveries created at or after this moment: `YYYY-MM-DD` or a UTC timestamp (`YYYY-MM-DDTHH:MM:SSZ`); 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."
|
|
1968
2116
|
},
|
|
1969
2117
|
"to": {
|
|
1970
2118
|
"type": "string",
|
|
1971
|
-
"description": "
|
|
2119
|
+
"description": "Window end (deliveries created up to 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."
|
|
1972
2120
|
},
|
|
1973
2121
|
"limit": {
|
|
1974
2122
|
"type": "integer",
|
|
@@ -1977,7 +2125,7 @@ export const tools = [
|
|
|
1977
2125
|
},
|
|
1978
2126
|
"cursor": {
|
|
1979
2127
|
"type": "string",
|
|
1980
|
-
"description": "
|
|
2128
|
+
"description": "The previous response's `next_cursor`. Send it with the same params as the first page (`limit` may change); a page whose params differ is a 400 naming the param."
|
|
1981
2129
|
}
|
|
1982
2130
|
},
|
|
1983
2131
|
"required": [
|
|
@@ -2007,7 +2155,7 @@ export const tools = [
|
|
|
2007
2155
|
},
|
|
2008
2156
|
{
|
|
2009
2157
|
"name": "tickerbot_redeliver_webhook_delivery",
|
|
2010
|
-
"description": "Resends a past delivery, with the exact body it carried, to the webhook's current target.
|
|
2158
|
+
"description": "Resends a past delivery, with the exact body it carried, 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.",
|
|
2011
2159
|
"inputSchema": {
|
|
2012
2160
|
"type": "object",
|
|
2013
2161
|
"properties": {
|
|
@@ -2044,7 +2192,7 @@ export const tools = [
|
|
|
2044
2192
|
},
|
|
2045
2193
|
{
|
|
2046
2194
|
"name": "tickerbot_test_webhook",
|
|
2047
|
-
"description": "Sends a
|
|
2195
|
+
"description": "Sends a sample delivery to your endpoint, instantly: the same shape, headers and signature as a real fire. One-shot: a failed test never retries and never auto-disables the webhook. 400 for an in-app webhook (nothing external to send to).",
|
|
2048
2196
|
"inputSchema": {
|
|
2049
2197
|
"type": "object",
|
|
2050
2198
|
"properties": {
|