@tickerbot/mcp-server 0.4.0 → 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 +15 -13
- package/dist/handler.js +20 -11
- package/dist/tools.d.ts +2 -3
- package/dist/tools.js +397 -248
- package/package.json +1 -1
package/dist/tools.js
CHANGED
|
@@ -20,19 +20,19 @@ export const tools = [
|
|
|
20
20
|
"properties": {
|
|
21
21
|
"q": {
|
|
22
22
|
"type": "string",
|
|
23
|
-
"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'`."
|
|
24
24
|
},
|
|
25
25
|
"universe": {
|
|
26
26
|
"type": "string",
|
|
27
|
-
"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."
|
|
28
28
|
},
|
|
29
29
|
"asof": {
|
|
30
30
|
"type": "string",
|
|
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)
|
|
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."
|
|
32
32
|
},
|
|
33
33
|
"grain": {
|
|
34
34
|
"type": "string",
|
|
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
|
|
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`.",
|
|
36
36
|
"enum": [
|
|
37
37
|
"1m",
|
|
38
38
|
"1h",
|
|
@@ -43,11 +43,11 @@ export const tools = [
|
|
|
43
43
|
},
|
|
44
44
|
"select": {
|
|
45
45
|
"type": "string",
|
|
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 `
|
|
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 …)`."
|
|
47
47
|
},
|
|
48
48
|
"group_by": {
|
|
49
49
|
"type": "string",
|
|
50
|
-
"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."
|
|
51
51
|
},
|
|
52
52
|
"having": {
|
|
53
53
|
"type": "string",
|
|
@@ -74,7 +74,7 @@ export const tools = [
|
|
|
74
74
|
},
|
|
75
75
|
"cursor": {
|
|
76
76
|
"type": "string",
|
|
77
|
-
"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."
|
|
78
78
|
}
|
|
79
79
|
},
|
|
80
80
|
"required": [
|
|
@@ -109,25 +109,25 @@ export const tools = [
|
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
"name": "tickerbot_subscribe_scan",
|
|
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.
|
|
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`.",
|
|
113
113
|
"inputSchema": {
|
|
114
114
|
"type": "object",
|
|
115
115
|
"properties": {
|
|
116
116
|
"q": {
|
|
117
117
|
"type": "string",
|
|
118
|
-
"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."
|
|
119
119
|
},
|
|
120
120
|
"universe": {
|
|
121
121
|
"type": "string",
|
|
122
|
-
"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."
|
|
123
123
|
},
|
|
124
124
|
"select": {
|
|
125
125
|
"type": "string",
|
|
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."
|
|
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."
|
|
127
127
|
},
|
|
128
128
|
"order": {
|
|
129
129
|
"type": "string",
|
|
130
|
-
"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).",
|
|
131
131
|
"default": "market_cap"
|
|
132
132
|
},
|
|
133
133
|
"dir": {
|
|
@@ -141,7 +141,7 @@ export const tools = [
|
|
|
141
141
|
},
|
|
142
142
|
"channel": {
|
|
143
143
|
"type": "string",
|
|
144
|
-
"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.",
|
|
145
145
|
"enum": [
|
|
146
146
|
"webhook",
|
|
147
147
|
"discord",
|
|
@@ -151,19 +151,19 @@ export const tools = [
|
|
|
151
151
|
},
|
|
152
152
|
"target_url": {
|
|
153
153
|
"type": "string",
|
|
154
|
-
"description": "Only with `channel=webhook`.
|
|
154
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
155
155
|
},
|
|
156
156
|
"discord_url": {
|
|
157
157
|
"type": "string",
|
|
158
|
-
"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."
|
|
159
159
|
},
|
|
160
160
|
"device_id": {
|
|
161
161
|
"type": "string",
|
|
162
|
-
"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`."
|
|
163
163
|
},
|
|
164
164
|
"cadence": {
|
|
165
165
|
"type": "string",
|
|
166
|
-
"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.",
|
|
167
167
|
"enum": [
|
|
168
168
|
"realtime",
|
|
169
169
|
"hourly",
|
|
@@ -172,7 +172,7 @@ export const tools = [
|
|
|
172
172
|
},
|
|
173
173
|
"name": {
|
|
174
174
|
"type": "string",
|
|
175
|
-
"description": "
|
|
175
|
+
"description": "Display name, up to 80 characters. Defaults to `scan: ` plus the first 60 characters of `q`."
|
|
176
176
|
}
|
|
177
177
|
},
|
|
178
178
|
"required": [
|
|
@@ -210,70 +210,42 @@ export const tools = [
|
|
|
210
210
|
"properties": {
|
|
211
211
|
"search": {
|
|
212
212
|
"type": "string",
|
|
213
|
-
"description": "Case-insensitive text match on the name and description."
|
|
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."
|
|
214
214
|
},
|
|
215
215
|
"kind": {
|
|
216
216
|
"type": "string",
|
|
217
|
-
"description": "Filter by kind (one or a comma list). Omit to return both.",
|
|
218
|
-
"
|
|
219
|
-
"builtin",
|
|
220
|
-
"custom"
|
|
221
|
-
]
|
|
217
|
+
"description": "Filter by kind (one or a comma list). Omit to return both. Values: builtin, custom.",
|
|
218
|
+
"pattern": "^(builtin|custom)(,(builtin|custom))*$"
|
|
222
219
|
},
|
|
223
220
|
"group": {
|
|
224
221
|
"type": "string",
|
|
225
|
-
"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))*$"
|
|
226
224
|
},
|
|
227
225
|
"category": {
|
|
228
226
|
"type": "string",
|
|
229
|
-
"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))*$"
|
|
230
229
|
},
|
|
231
230
|
"type": {
|
|
232
231
|
"type": "string",
|
|
233
|
-
"description": "One value type or a comma list. Custom signals are always `boolean`.",
|
|
234
|
-
"
|
|
235
|
-
"numeric",
|
|
236
|
-
"boolean",
|
|
237
|
-
"string",
|
|
238
|
-
"date",
|
|
239
|
-
"timestamp",
|
|
240
|
-
"jsonb",
|
|
241
|
-
"string[]"
|
|
242
|
-
]
|
|
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\\[\\]))*$"
|
|
243
234
|
},
|
|
244
235
|
"asset_class": {
|
|
245
236
|
"type": "string",
|
|
246
|
-
"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))*$"
|
|
247
239
|
},
|
|
248
240
|
"refresh": {
|
|
249
241
|
"type": "string",
|
|
250
|
-
"description": "Signals that update on this schedule (one or a comma list).",
|
|
251
|
-
"
|
|
252
|
-
"1m_4am_8pm_et",
|
|
253
|
-
"1m_24_7",
|
|
254
|
-
"5m",
|
|
255
|
-
"10m",
|
|
256
|
-
"15m",
|
|
257
|
-
"30m",
|
|
258
|
-
"1h",
|
|
259
|
-
"daily",
|
|
260
|
-
"daily_after_close",
|
|
261
|
-
"weekly",
|
|
262
|
-
"monthly",
|
|
263
|
-
"quarterly",
|
|
264
|
-
"on_event",
|
|
265
|
-
"static",
|
|
266
|
-
"custom"
|
|
267
|
-
]
|
|
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))*$"
|
|
268
244
|
},
|
|
269
245
|
"grain": {
|
|
270
246
|
"type": "string",
|
|
271
|
-
"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.",
|
|
272
|
-
"
|
|
273
|
-
"1m",
|
|
274
|
-
"1h",
|
|
275
|
-
"1d"
|
|
276
|
-
]
|
|
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))*$"
|
|
277
249
|
},
|
|
278
250
|
"select": {
|
|
279
251
|
"type": "string",
|
|
@@ -285,7 +257,7 @@ export const tools = [
|
|
|
285
257
|
},
|
|
286
258
|
"cursor": {
|
|
287
259
|
"type": "string",
|
|
288
|
-
"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."
|
|
289
261
|
}
|
|
290
262
|
}
|
|
291
263
|
},
|
|
@@ -309,17 +281,17 @@ export const tools = [
|
|
|
309
281
|
},
|
|
310
282
|
{
|
|
311
283
|
"name": "tickerbot_create_custom_signal",
|
|
312
|
-
"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.",
|
|
313
285
|
"inputSchema": {
|
|
314
286
|
"type": "object",
|
|
315
287
|
"properties": {
|
|
316
288
|
"name": {
|
|
317
289
|
"type": "string",
|
|
318
|
-
"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."
|
|
319
291
|
},
|
|
320
292
|
"expr": {
|
|
321
293
|
"type": "string",
|
|
322
|
-
"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`."
|
|
323
295
|
},
|
|
324
296
|
"description": {
|
|
325
297
|
"type": "string",
|
|
@@ -343,13 +315,13 @@ export const tools = [
|
|
|
343
315
|
},
|
|
344
316
|
{
|
|
345
317
|
"name": "tickerbot_get_signal",
|
|
346
|
-
"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.",
|
|
347
319
|
"inputSchema": {
|
|
348
320
|
"type": "object",
|
|
349
321
|
"properties": {
|
|
350
322
|
"signal": {
|
|
351
323
|
"type": "string",
|
|
352
|
-
"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`."
|
|
353
325
|
},
|
|
354
326
|
"condition": {
|
|
355
327
|
"type": "string",
|
|
@@ -357,15 +329,15 @@ export const tools = [
|
|
|
357
329
|
},
|
|
358
330
|
"universe": {
|
|
359
331
|
"type": "string",
|
|
360
|
-
"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`."
|
|
361
333
|
},
|
|
362
334
|
"asof": {
|
|
363
335
|
"type": "string",
|
|
364
|
-
"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."
|
|
365
337
|
},
|
|
366
338
|
"grain": {
|
|
367
339
|
"type": "string",
|
|
368
|
-
"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`.",
|
|
369
341
|
"enum": [
|
|
370
342
|
"1m",
|
|
371
343
|
"1h",
|
|
@@ -376,7 +348,7 @@ export const tools = [
|
|
|
376
348
|
},
|
|
377
349
|
"select": {
|
|
378
350
|
"type": "string",
|
|
379
|
-
"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."
|
|
380
352
|
},
|
|
381
353
|
"order": {
|
|
382
354
|
"type": "string",
|
|
@@ -397,7 +369,7 @@ export const tools = [
|
|
|
397
369
|
},
|
|
398
370
|
"cursor": {
|
|
399
371
|
"type": "string",
|
|
400
|
-
"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."
|
|
401
373
|
}
|
|
402
374
|
},
|
|
403
375
|
"required": [
|
|
@@ -435,19 +407,19 @@ export const tools = [
|
|
|
435
407
|
"properties": {
|
|
436
408
|
"signal": {
|
|
437
409
|
"type": "string",
|
|
438
|
-
"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."
|
|
439
411
|
},
|
|
440
412
|
"new_name": {
|
|
441
413
|
"type": "string",
|
|
442
|
-
"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."
|
|
443
415
|
},
|
|
444
416
|
"expr": {
|
|
445
417
|
"type": "string",
|
|
446
|
-
"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`)."
|
|
447
419
|
},
|
|
448
420
|
"description": {
|
|
449
421
|
"type": "string",
|
|
450
|
-
"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."
|
|
451
423
|
}
|
|
452
424
|
},
|
|
453
425
|
"required": [
|
|
@@ -476,7 +448,7 @@ export const tools = [
|
|
|
476
448
|
"properties": {
|
|
477
449
|
"signal": {
|
|
478
450
|
"type": "string",
|
|
479
|
-
"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."
|
|
480
452
|
},
|
|
481
453
|
"force": {
|
|
482
454
|
"type": "boolean",
|
|
@@ -513,15 +485,15 @@ export const tools = [
|
|
|
513
485
|
},
|
|
514
486
|
"universe": {
|
|
515
487
|
"type": "string",
|
|
516
|
-
"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."
|
|
517
489
|
},
|
|
518
490
|
"select": {
|
|
519
491
|
"type": "string",
|
|
520
|
-
"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."
|
|
521
493
|
},
|
|
522
494
|
"order": {
|
|
523
495
|
"type": "string",
|
|
524
|
-
"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).",
|
|
525
497
|
"default": "market_cap"
|
|
526
498
|
},
|
|
527
499
|
"dir": {
|
|
@@ -535,7 +507,7 @@ export const tools = [
|
|
|
535
507
|
},
|
|
536
508
|
"channel": {
|
|
537
509
|
"type": "string",
|
|
538
|
-
"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.",
|
|
539
511
|
"enum": [
|
|
540
512
|
"webhook",
|
|
541
513
|
"discord",
|
|
@@ -545,19 +517,19 @@ export const tools = [
|
|
|
545
517
|
},
|
|
546
518
|
"target_url": {
|
|
547
519
|
"type": "string",
|
|
548
|
-
"description": "Only with `channel=webhook`.
|
|
520
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
549
521
|
},
|
|
550
522
|
"discord_url": {
|
|
551
523
|
"type": "string",
|
|
552
|
-
"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."
|
|
553
525
|
},
|
|
554
526
|
"device_id": {
|
|
555
527
|
"type": "string",
|
|
556
|
-
"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`."
|
|
557
529
|
},
|
|
558
530
|
"cadence": {
|
|
559
531
|
"type": "string",
|
|
560
|
-
"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.",
|
|
561
533
|
"enum": [
|
|
562
534
|
"realtime",
|
|
563
535
|
"hourly",
|
|
@@ -566,7 +538,7 @@ export const tools = [
|
|
|
566
538
|
},
|
|
567
539
|
"name": {
|
|
568
540
|
"type": "string",
|
|
569
|
-
"description": "
|
|
541
|
+
"description": "Display name, up to 80 characters. Defaults to the condition: `golden_cross`, or `rsi_14 < 30`."
|
|
570
542
|
}
|
|
571
543
|
},
|
|
572
544
|
"required": [
|
|
@@ -605,38 +577,24 @@ export const tools = [
|
|
|
605
577
|
"properties": {
|
|
606
578
|
"search": {
|
|
607
579
|
"type": "string",
|
|
608
|
-
"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."
|
|
609
581
|
},
|
|
610
582
|
"ticker": {
|
|
611
583
|
"type": "string",
|
|
612
|
-
"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."
|
|
613
585
|
},
|
|
614
586
|
"asset_class": {
|
|
615
587
|
"type": "string",
|
|
616
|
-
"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."
|
|
617
589
|
},
|
|
618
590
|
"asset_type": {
|
|
619
591
|
"type": "string",
|
|
620
|
-
"description": "Filter by instrument type
|
|
621
|
-
"
|
|
622
|
-
"CS",
|
|
623
|
-
"ETF",
|
|
624
|
-
"ADRC",
|
|
625
|
-
"PFD",
|
|
626
|
-
"FUND",
|
|
627
|
-
"UNIT",
|
|
628
|
-
"SP",
|
|
629
|
-
"ETS",
|
|
630
|
-
"WARRANT",
|
|
631
|
-
"RIGHT",
|
|
632
|
-
"ETN",
|
|
633
|
-
"ETV",
|
|
634
|
-
"equity"
|
|
635
|
-
]
|
|
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))*$"
|
|
636
594
|
},
|
|
637
595
|
"exchange": {
|
|
638
596
|
"type": "string",
|
|
639
|
-
"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."
|
|
640
598
|
},
|
|
641
599
|
"active": {
|
|
642
600
|
"type": "boolean",
|
|
@@ -649,7 +607,7 @@ export const tools = [
|
|
|
649
607
|
},
|
|
650
608
|
"cursor": {
|
|
651
609
|
"type": "string",
|
|
652
|
-
"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."
|
|
653
611
|
}
|
|
654
612
|
}
|
|
655
613
|
},
|
|
@@ -673,21 +631,21 @@ export const tools = [
|
|
|
673
631
|
},
|
|
674
632
|
{
|
|
675
633
|
"name": "tickerbot_get_ticker",
|
|
676
|
-
"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.",
|
|
677
635
|
"inputSchema": {
|
|
678
636
|
"type": "object",
|
|
679
637
|
"properties": {
|
|
680
638
|
"ticker": {
|
|
681
639
|
"type": "string",
|
|
682
|
-
"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."
|
|
683
641
|
},
|
|
684
642
|
"asof": {
|
|
685
643
|
"type": "string",
|
|
686
|
-
"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."
|
|
687
645
|
},
|
|
688
646
|
"grain": {
|
|
689
647
|
"type": "string",
|
|
690
|
-
"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.",
|
|
691
649
|
"enum": [
|
|
692
650
|
"1m",
|
|
693
651
|
"1h",
|
|
@@ -698,7 +656,7 @@ export const tools = [
|
|
|
698
656
|
},
|
|
699
657
|
"select": {
|
|
700
658
|
"type": "string",
|
|
701
|
-
"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."
|
|
702
660
|
}
|
|
703
661
|
},
|
|
704
662
|
"required": [
|
|
@@ -724,29 +682,29 @@ export const tools = [
|
|
|
724
682
|
},
|
|
725
683
|
{
|
|
726
684
|
"name": "tickerbot_get_history",
|
|
727
|
-
"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.",
|
|
728
686
|
"inputSchema": {
|
|
729
687
|
"type": "object",
|
|
730
688
|
"properties": {
|
|
731
689
|
"ticker": {
|
|
732
690
|
"type": "string",
|
|
733
|
-
"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."
|
|
734
692
|
},
|
|
735
693
|
"from": {
|
|
736
694
|
"type": "string",
|
|
737
|
-
"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."
|
|
738
696
|
},
|
|
739
697
|
"to": {
|
|
740
698
|
"type": "string",
|
|
741
|
-
"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."
|
|
742
700
|
},
|
|
743
701
|
"asof": {
|
|
744
702
|
"type": "string",
|
|
745
|
-
"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."
|
|
746
704
|
},
|
|
747
705
|
"grain": {
|
|
748
706
|
"type": "string",
|
|
749
|
-
"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`.",
|
|
750
708
|
"enum": [
|
|
751
709
|
"1m",
|
|
752
710
|
"1h",
|
|
@@ -759,16 +717,16 @@ export const tools = [
|
|
|
759
717
|
},
|
|
760
718
|
"select": {
|
|
761
719
|
"type": "string",
|
|
762
|
-
"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)."
|
|
763
721
|
},
|
|
764
722
|
"limit": {
|
|
765
723
|
"type": "integer",
|
|
766
|
-
"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).",
|
|
767
725
|
"default": 252
|
|
768
726
|
},
|
|
769
727
|
"cursor": {
|
|
770
728
|
"type": "string",
|
|
771
|
-
"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."
|
|
772
730
|
}
|
|
773
731
|
},
|
|
774
732
|
"required": [
|
|
@@ -789,14 +747,11 @@ export const tools = [
|
|
|
789
747
|
"cursor": "query"
|
|
790
748
|
},
|
|
791
749
|
"accepts": {
|
|
792
|
-
"columns": "query",
|
|
793
750
|
"fields": "query",
|
|
751
|
+
"columns": "query",
|
|
794
752
|
"interval": "query",
|
|
795
753
|
"as_of": "query",
|
|
796
754
|
"transitions_only": "query"
|
|
797
|
-
},
|
|
798
|
-
"fixedQuery": {
|
|
799
|
-
"api_version": "2027-01-12"
|
|
800
755
|
}
|
|
801
756
|
}
|
|
802
757
|
},
|
|
@@ -808,7 +763,7 @@ export const tools = [
|
|
|
808
763
|
"properties": {
|
|
809
764
|
"ticker": {
|
|
810
765
|
"type": "string",
|
|
811
|
-
"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."
|
|
812
767
|
},
|
|
813
768
|
"q": {
|
|
814
769
|
"type": "string",
|
|
@@ -816,11 +771,11 @@ export const tools = [
|
|
|
816
771
|
},
|
|
817
772
|
"select": {
|
|
818
773
|
"type": "string",
|
|
819
|
-
"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."
|
|
820
775
|
},
|
|
821
776
|
"channel": {
|
|
822
777
|
"type": "string",
|
|
823
|
-
"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.",
|
|
824
779
|
"enum": [
|
|
825
780
|
"webhook",
|
|
826
781
|
"discord",
|
|
@@ -830,7 +785,7 @@ export const tools = [
|
|
|
830
785
|
},
|
|
831
786
|
"target_url": {
|
|
832
787
|
"type": "string",
|
|
833
|
-
"description": "Only with `channel=webhook`.
|
|
788
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
834
789
|
},
|
|
835
790
|
"discord_url": {
|
|
836
791
|
"type": "string",
|
|
@@ -838,11 +793,11 @@ export const tools = [
|
|
|
838
793
|
},
|
|
839
794
|
"device_id": {
|
|
840
795
|
"type": "string",
|
|
841
|
-
"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`."
|
|
842
797
|
},
|
|
843
798
|
"cadence": {
|
|
844
799
|
"type": "string",
|
|
845
|
-
"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.",
|
|
846
801
|
"enum": [
|
|
847
802
|
"realtime",
|
|
848
803
|
"hourly",
|
|
@@ -851,7 +806,7 @@ export const tools = [
|
|
|
851
806
|
},
|
|
852
807
|
"name": {
|
|
853
808
|
"type": "string",
|
|
854
|
-
"description": "
|
|
809
|
+
"description": "Display name, up to 80 characters. Defaults to `<TICKER>: ` plus the first 40 characters of `q`."
|
|
855
810
|
}
|
|
856
811
|
},
|
|
857
812
|
"required": [
|
|
@@ -890,11 +845,11 @@ export const tools = [
|
|
|
890
845
|
"properties": {
|
|
891
846
|
"ticker": {
|
|
892
847
|
"type": "string",
|
|
893
|
-
"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."
|
|
894
849
|
},
|
|
895
850
|
"interval": {
|
|
896
851
|
"type": "string",
|
|
897
|
-
"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.",
|
|
898
853
|
"enum": [
|
|
899
854
|
"1s",
|
|
900
855
|
"1m",
|
|
@@ -911,23 +866,23 @@ export const tools = [
|
|
|
911
866
|
},
|
|
912
867
|
"from": {
|
|
913
868
|
"type": "string",
|
|
914
|
-
"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."
|
|
915
870
|
},
|
|
916
871
|
"to": {
|
|
917
872
|
"type": "string",
|
|
918
|
-
"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."
|
|
919
874
|
},
|
|
920
875
|
"asof": {
|
|
921
876
|
"type": "string",
|
|
922
|
-
"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."
|
|
923
878
|
},
|
|
924
879
|
"adjusted": {
|
|
925
880
|
"type": "boolean",
|
|
926
|
-
"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."
|
|
927
882
|
},
|
|
928
883
|
"session": {
|
|
929
884
|
"type": "string",
|
|
930
|
-
"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.",
|
|
931
886
|
"enum": [
|
|
932
887
|
"all",
|
|
933
888
|
"regular"
|
|
@@ -936,12 +891,12 @@ export const tools = [
|
|
|
936
891
|
},
|
|
937
892
|
"limit": {
|
|
938
893
|
"type": "integer",
|
|
939
|
-
"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.",
|
|
940
895
|
"default": 100
|
|
941
896
|
},
|
|
942
897
|
"cursor": {
|
|
943
898
|
"type": "string",
|
|
944
|
-
"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."
|
|
945
900
|
}
|
|
946
901
|
},
|
|
947
902
|
"required": [
|
|
@@ -966,21 +921,18 @@ export const tools = [
|
|
|
966
921
|
"accepts": {
|
|
967
922
|
"as_of": "query",
|
|
968
923
|
"before": "query"
|
|
969
|
-
},
|
|
970
|
-
"fixedQuery": {
|
|
971
|
-
"api_version": "2027-01-12"
|
|
972
924
|
}
|
|
973
925
|
}
|
|
974
926
|
},
|
|
975
927
|
{
|
|
976
928
|
"name": "tickerbot_get_ticker_coverage",
|
|
977
|
-
"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.",
|
|
978
930
|
"inputSchema": {
|
|
979
931
|
"type": "object",
|
|
980
932
|
"properties": {
|
|
981
933
|
"ticker": {
|
|
982
934
|
"type": "string",
|
|
983
|
-
"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."
|
|
984
936
|
}
|
|
985
937
|
},
|
|
986
938
|
"required": [
|
|
@@ -1003,13 +955,13 @@ export const tools = [
|
|
|
1003
955
|
},
|
|
1004
956
|
{
|
|
1005
957
|
"name": "tickerbot_get_etf_holdings",
|
|
1006
|
-
"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)`.",
|
|
1007
959
|
"inputSchema": {
|
|
1008
960
|
"type": "object",
|
|
1009
961
|
"properties": {
|
|
1010
962
|
"ticker": {
|
|
1011
963
|
"type": "string",
|
|
1012
|
-
"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."
|
|
1013
965
|
},
|
|
1014
966
|
"limit": {
|
|
1015
967
|
"type": "integer",
|
|
@@ -1018,7 +970,7 @@ export const tools = [
|
|
|
1018
970
|
},
|
|
1019
971
|
"cursor": {
|
|
1020
972
|
"type": "string",
|
|
1021
|
-
"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`."
|
|
1022
974
|
}
|
|
1023
975
|
},
|
|
1024
976
|
"required": [
|
|
@@ -1042,45 +994,170 @@ export const tools = [
|
|
|
1042
994
|
}
|
|
1043
995
|
},
|
|
1044
996
|
{
|
|
1045
|
-
"name": "
|
|
1046
|
-
"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.",
|
|
1047
999
|
"inputSchema": {
|
|
1048
1000
|
"type": "object",
|
|
1049
1001
|
"properties": {
|
|
1050
1002
|
"kind": {
|
|
1051
1003
|
"type": "string",
|
|
1052
|
-
"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).",
|
|
1030
|
+
"enum": [
|
|
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`.",
|
|
1053
1046
|
"enum": [
|
|
1054
|
-
"
|
|
1055
|
-
"split",
|
|
1056
|
-
"insider",
|
|
1057
|
-
"analyst",
|
|
1058
|
-
"earnings",
|
|
1059
|
-
"filing",
|
|
1060
|
-
"signal",
|
|
1061
|
-
"news",
|
|
1062
|
-
"estimate_revision"
|
|
1047
|
+
"state"
|
|
1063
1048
|
]
|
|
1064
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
|
+
},
|
|
1065
1142
|
"ticker": {
|
|
1066
1143
|
"type": "string",
|
|
1067
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."
|
|
1068
1145
|
},
|
|
1069
1146
|
"universe": {
|
|
1070
1147
|
"type": "string",
|
|
1071
|
-
"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`."
|
|
1072
1149
|
},
|
|
1073
1150
|
"from": {
|
|
1074
1151
|
"type": "string",
|
|
1075
|
-
"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."
|
|
1076
1153
|
},
|
|
1077
1154
|
"to": {
|
|
1078
1155
|
"type": "string",
|
|
1079
|
-
"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."
|
|
1080
1157
|
},
|
|
1081
1158
|
"signal": {
|
|
1082
1159
|
"type": "string",
|
|
1083
|
-
"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."
|
|
1084
1161
|
},
|
|
1085
1162
|
"transition": {
|
|
1086
1163
|
"type": "string",
|
|
@@ -1100,14 +1177,14 @@ export const tools = [
|
|
|
1100
1177
|
},
|
|
1101
1178
|
"join": {
|
|
1102
1179
|
"type": "string",
|
|
1103
|
-
"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`.",
|
|
1104
1181
|
"enum": [
|
|
1105
1182
|
"state"
|
|
1106
1183
|
]
|
|
1107
1184
|
},
|
|
1108
1185
|
"grain": {
|
|
1109
1186
|
"type": "string",
|
|
1110
|
-
"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.",
|
|
1111
1188
|
"enum": [
|
|
1112
1189
|
"1m",
|
|
1113
1190
|
"1h",
|
|
@@ -1118,11 +1195,11 @@ export const tools = [
|
|
|
1118
1195
|
},
|
|
1119
1196
|
"select": {
|
|
1120
1197
|
"type": "string",
|
|
1121
|
-
"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`."
|
|
1122
1199
|
},
|
|
1123
1200
|
"group_by": {
|
|
1124
1201
|
"type": "string",
|
|
1125
|
-
"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`."
|
|
1126
1203
|
},
|
|
1127
1204
|
"having": {
|
|
1128
1205
|
"type": "string",
|
|
@@ -1130,7 +1207,7 @@ export const tools = [
|
|
|
1130
1207
|
},
|
|
1131
1208
|
"order": {
|
|
1132
1209
|
"type": "string",
|
|
1133
|
-
"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."
|
|
1134
1211
|
},
|
|
1135
1212
|
"dir": {
|
|
1136
1213
|
"type": "string",
|
|
@@ -1143,12 +1220,12 @@ export const tools = [
|
|
|
1143
1220
|
},
|
|
1144
1221
|
"limit": {
|
|
1145
1222
|
"type": "integer",
|
|
1146
|
-
"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.",
|
|
1147
1224
|
"default": 50
|
|
1148
1225
|
},
|
|
1149
1226
|
"cursor": {
|
|
1150
1227
|
"type": "string",
|
|
1151
|
-
"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`."
|
|
1152
1229
|
}
|
|
1153
1230
|
}
|
|
1154
1231
|
},
|
|
@@ -1188,7 +1265,7 @@ export const tools = [
|
|
|
1188
1265
|
},
|
|
1189
1266
|
{
|
|
1190
1267
|
"name": "tickerbot_list_event_kinds",
|
|
1191
|
-
"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.",
|
|
1192
1269
|
"inputSchema": {
|
|
1193
1270
|
"type": "object",
|
|
1194
1271
|
"properties": {}
|
|
@@ -1207,16 +1284,8 @@ export const tools = [
|
|
|
1207
1284
|
"properties": {
|
|
1208
1285
|
"kind": {
|
|
1209
1286
|
"type": "string",
|
|
1210
|
-
"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
|
|
1211
|
-
"
|
|
1212
|
-
"dividend",
|
|
1213
|
-
"split",
|
|
1214
|
-
"insider",
|
|
1215
|
-
"analyst",
|
|
1216
|
-
"earnings",
|
|
1217
|
-
"filing",
|
|
1218
|
-
"estimate_revision"
|
|
1219
|
-
]
|
|
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))*$"
|
|
1220
1289
|
},
|
|
1221
1290
|
"ticker": {
|
|
1222
1291
|
"type": "string",
|
|
@@ -1224,7 +1293,7 @@ export const tools = [
|
|
|
1224
1293
|
},
|
|
1225
1294
|
"universe": {
|
|
1226
1295
|
"type": "string",
|
|
1227
|
-
"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."
|
|
1228
1297
|
},
|
|
1229
1298
|
"q": {
|
|
1230
1299
|
"type": "string",
|
|
@@ -1236,7 +1305,7 @@ export const tools = [
|
|
|
1236
1305
|
},
|
|
1237
1306
|
"channel": {
|
|
1238
1307
|
"type": "string",
|
|
1239
|
-
"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.",
|
|
1240
1309
|
"enum": [
|
|
1241
1310
|
"webhook",
|
|
1242
1311
|
"discord",
|
|
@@ -1246,19 +1315,19 @@ export const tools = [
|
|
|
1246
1315
|
},
|
|
1247
1316
|
"target_url": {
|
|
1248
1317
|
"type": "string",
|
|
1249
|
-
"description": "Only with `channel=webhook`. HTTPS delivery
|
|
1318
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
1250
1319
|
},
|
|
1251
1320
|
"discord_url": {
|
|
1252
1321
|
"type": "string",
|
|
1253
|
-
"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."
|
|
1254
1323
|
},
|
|
1255
1324
|
"device_id": {
|
|
1256
1325
|
"type": "string",
|
|
1257
|
-
"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`."
|
|
1258
1327
|
},
|
|
1259
1328
|
"name": {
|
|
1260
1329
|
"type": "string",
|
|
1261
|
-
"description": "Display name. Defaults to `events: <kinds> · <scope>`."
|
|
1330
|
+
"description": "Display name, up to 80 characters. Defaults to `events: <kinds> · <scope>`."
|
|
1262
1331
|
}
|
|
1263
1332
|
},
|
|
1264
1333
|
"required": [
|
|
@@ -1289,14 +1358,14 @@ export const tools = [
|
|
|
1289
1358
|
}
|
|
1290
1359
|
},
|
|
1291
1360
|
{
|
|
1292
|
-
"name": "
|
|
1361
|
+
"name": "tickerbot_query_news",
|
|
1293
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.",
|
|
1294
1363
|
"inputSchema": {
|
|
1295
1364
|
"type": "object",
|
|
1296
1365
|
"properties": {
|
|
1297
1366
|
"search": {
|
|
1298
1367
|
"type": "string",
|
|
1299
|
-
"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."
|
|
1300
1369
|
},
|
|
1301
1370
|
"ticker": {
|
|
1302
1371
|
"type": "string",
|
|
@@ -1304,15 +1373,15 @@ export const tools = [
|
|
|
1304
1373
|
},
|
|
1305
1374
|
"universe": {
|
|
1306
1375
|
"type": "string",
|
|
1307
|
-
"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`."
|
|
1308
1377
|
},
|
|
1309
1378
|
"from": {
|
|
1310
1379
|
"type": "string",
|
|
1311
|
-
"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."
|
|
1312
1381
|
},
|
|
1313
1382
|
"to": {
|
|
1314
1383
|
"type": "string",
|
|
1315
|
-
"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."
|
|
1316
1385
|
},
|
|
1317
1386
|
"min_relevance": {
|
|
1318
1387
|
"type": "number",
|
|
@@ -1320,15 +1389,15 @@ export const tools = [
|
|
|
1320
1389
|
},
|
|
1321
1390
|
"q": {
|
|
1322
1391
|
"type": "string",
|
|
1323
|
-
"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)."
|
|
1324
1393
|
},
|
|
1325
1394
|
"select": {
|
|
1326
1395
|
"type": "string",
|
|
1327
|
-
"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."
|
|
1328
1397
|
},
|
|
1329
1398
|
"group_by": {
|
|
1330
1399
|
"type": "string",
|
|
1331
|
-
"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."
|
|
1332
1401
|
},
|
|
1333
1402
|
"having": {
|
|
1334
1403
|
"type": "string",
|
|
@@ -1336,7 +1405,7 @@ export const tools = [
|
|
|
1336
1405
|
},
|
|
1337
1406
|
"order": {
|
|
1338
1407
|
"type": "string",
|
|
1339
|
-
"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)."
|
|
1340
1409
|
},
|
|
1341
1410
|
"dir": {
|
|
1342
1411
|
"type": "string",
|
|
@@ -1349,12 +1418,108 @@ export const tools = [
|
|
|
1349
1418
|
},
|
|
1350
1419
|
"limit": {
|
|
1351
1420
|
"type": "integer",
|
|
1352
|
-
"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.",
|
|
1353
1422
|
"default": 50
|
|
1354
1423
|
},
|
|
1355
1424
|
"cursor": {
|
|
1356
1425
|
"type": "string",
|
|
1357
|
-
"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."
|
|
1358
1523
|
}
|
|
1359
1524
|
}
|
|
1360
1525
|
},
|
|
@@ -1400,7 +1565,7 @@ export const tools = [
|
|
|
1400
1565
|
},
|
|
1401
1566
|
"universe": {
|
|
1402
1567
|
"type": "string",
|
|
1403
|
-
"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."
|
|
1404
1569
|
},
|
|
1405
1570
|
"min_relevance": {
|
|
1406
1571
|
"type": "number",
|
|
@@ -1416,7 +1581,7 @@ export const tools = [
|
|
|
1416
1581
|
},
|
|
1417
1582
|
"channel": {
|
|
1418
1583
|
"type": "string",
|
|
1419
|
-
"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.",
|
|
1420
1585
|
"enum": [
|
|
1421
1586
|
"webhook",
|
|
1422
1587
|
"discord",
|
|
@@ -1426,19 +1591,19 @@ export const tools = [
|
|
|
1426
1591
|
},
|
|
1427
1592
|
"target_url": {
|
|
1428
1593
|
"type": "string",
|
|
1429
|
-
"description": "Only with `channel=webhook`. HTTPS delivery
|
|
1594
|
+
"description": "Only with `channel=webhook`. HTTPS URL each delivery is POSTed to."
|
|
1430
1595
|
},
|
|
1431
1596
|
"discord_url": {
|
|
1432
1597
|
"type": "string",
|
|
1433
|
-
"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."
|
|
1434
1599
|
},
|
|
1435
1600
|
"device_id": {
|
|
1436
1601
|
"type": "string",
|
|
1437
|
-
"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`."
|
|
1438
1603
|
},
|
|
1439
1604
|
"name": {
|
|
1440
1605
|
"type": "string",
|
|
1441
|
-
"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>`."
|
|
1442
1607
|
}
|
|
1443
1608
|
}
|
|
1444
1609
|
},
|
|
@@ -1466,21 +1631,18 @@ export const tools = [
|
|
|
1466
1631
|
},
|
|
1467
1632
|
{
|
|
1468
1633
|
"name": "tickerbot_list_universes",
|
|
1469
|
-
"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.",
|
|
1470
1635
|
"inputSchema": {
|
|
1471
1636
|
"type": "object",
|
|
1472
1637
|
"properties": {
|
|
1473
1638
|
"search": {
|
|
1474
1639
|
"type": "string",
|
|
1475
|
-
"description": "Only universes whose id, name or description contains this text (case-insensitive)."
|
|
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."
|
|
1476
1641
|
},
|
|
1477
1642
|
"kind": {
|
|
1478
1643
|
"type": "string",
|
|
1479
|
-
"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.",
|
|
1480
|
-
"
|
|
1481
|
-
"builtin",
|
|
1482
|
-
"custom"
|
|
1483
|
-
]
|
|
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))*$"
|
|
1484
1646
|
},
|
|
1485
1647
|
"limit": {
|
|
1486
1648
|
"type": "integer",
|
|
@@ -1489,7 +1651,7 @@ export const tools = [
|
|
|
1489
1651
|
},
|
|
1490
1652
|
"cursor": {
|
|
1491
1653
|
"type": "string",
|
|
1492
|
-
"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."
|
|
1493
1655
|
}
|
|
1494
1656
|
}
|
|
1495
1657
|
},
|
|
@@ -1522,11 +1684,11 @@ export const tools = [
|
|
|
1522
1684
|
},
|
|
1523
1685
|
"name": {
|
|
1524
1686
|
"type": "string",
|
|
1525
|
-
"description": "
|
|
1687
|
+
"description": "Display name, up to 80 characters. Display only: the `id` is what references the universe."
|
|
1526
1688
|
},
|
|
1527
1689
|
"id": {
|
|
1528
1690
|
"type": "string",
|
|
1529
|
-
"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."
|
|
1530
1692
|
},
|
|
1531
1693
|
"description": {
|
|
1532
1694
|
"type": "string",
|
|
@@ -1580,7 +1742,7 @@ export const tools = [
|
|
|
1580
1742
|
},
|
|
1581
1743
|
{
|
|
1582
1744
|
"name": "tickerbot_update_universe",
|
|
1583
|
-
"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.",
|
|
1584
1746
|
"inputSchema": {
|
|
1585
1747
|
"type": "object",
|
|
1586
1748
|
"properties": {
|
|
@@ -1643,7 +1805,7 @@ export const tools = [
|
|
|
1643
1805
|
},
|
|
1644
1806
|
{
|
|
1645
1807
|
"name": "tickerbot_delete_universe",
|
|
1646
|
-
"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.",
|
|
1647
1809
|
"inputSchema": {
|
|
1648
1810
|
"type": "object",
|
|
1649
1811
|
"properties": {
|
|
@@ -1653,7 +1815,7 @@ export const tools = [
|
|
|
1653
1815
|
},
|
|
1654
1816
|
"force": {
|
|
1655
1817
|
"type": "boolean",
|
|
1656
|
-
"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.",
|
|
1657
1819
|
"default": false
|
|
1658
1820
|
}
|
|
1659
1821
|
},
|
|
@@ -1684,11 +1846,8 @@ export const tools = [
|
|
|
1684
1846
|
"properties": {
|
|
1685
1847
|
"status": {
|
|
1686
1848
|
"type": "string",
|
|
1687
|
-
"description": "Filter by status: `active`, `disabled` or both as a comma list
|
|
1688
|
-
"
|
|
1689
|
-
"active",
|
|
1690
|
-
"disabled"
|
|
1691
|
-
]
|
|
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))*$"
|
|
1692
1851
|
},
|
|
1693
1852
|
"limit": {
|
|
1694
1853
|
"type": "integer",
|
|
@@ -1697,7 +1856,7 @@ export const tools = [
|
|
|
1697
1856
|
},
|
|
1698
1857
|
"cursor": {
|
|
1699
1858
|
"type": "string",
|
|
1700
|
-
"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."
|
|
1701
1860
|
}
|
|
1702
1861
|
}
|
|
1703
1862
|
},
|
|
@@ -1742,7 +1901,7 @@ export const tools = [
|
|
|
1742
1901
|
},
|
|
1743
1902
|
{
|
|
1744
1903
|
"name": "tickerbot_update_webhook",
|
|
1745
|
-
"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.",
|
|
1746
1905
|
"inputSchema": {
|
|
1747
1906
|
"type": "object",
|
|
1748
1907
|
"properties": {
|
|
@@ -1756,16 +1915,8 @@ export const tools = [
|
|
|
1756
1915
|
},
|
|
1757
1916
|
"kind": {
|
|
1758
1917
|
"type": "string",
|
|
1759
|
-
"description": "Only with event webhooks. The kinds to fire on, as on Subscribe to events.",
|
|
1760
|
-
"
|
|
1761
|
-
"dividend",
|
|
1762
|
-
"split",
|
|
1763
|
-
"insider",
|
|
1764
|
-
"analyst",
|
|
1765
|
-
"earnings",
|
|
1766
|
-
"filing",
|
|
1767
|
-
"estimate_revision"
|
|
1768
|
-
]
|
|
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))*$"
|
|
1769
1920
|
},
|
|
1770
1921
|
"condition": {
|
|
1771
1922
|
"type": "string",
|
|
@@ -1785,7 +1936,7 @@ export const tools = [
|
|
|
1785
1936
|
},
|
|
1786
1937
|
"q": {
|
|
1787
1938
|
"type": "string",
|
|
1788
|
-
"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."
|
|
1789
1940
|
},
|
|
1790
1941
|
"select": {
|
|
1791
1942
|
"type": "string",
|
|
@@ -1874,6 +2025,8 @@ export const tools = [
|
|
|
1874
2025
|
"kinds": "body",
|
|
1875
2026
|
"tickers": "body",
|
|
1876
2027
|
"universe_id": "body",
|
|
2028
|
+
"columns": "body",
|
|
2029
|
+
"fields": "body",
|
|
1877
2030
|
"id": "path"
|
|
1878
2031
|
},
|
|
1879
2032
|
"pathAliases": {
|
|
@@ -1954,20 +2107,16 @@ export const tools = [
|
|
|
1954
2107
|
},
|
|
1955
2108
|
"status": {
|
|
1956
2109
|
"type": "string",
|
|
1957
|
-
"description": "Filter by delivery status (one or a comma list).",
|
|
1958
|
-
"
|
|
1959
|
-
"pending",
|
|
1960
|
-
"delivered",
|
|
1961
|
-
"permanent_failure"
|
|
1962
|
-
]
|
|
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))*$"
|
|
1963
2112
|
},
|
|
1964
2113
|
"from": {
|
|
1965
2114
|
"type": "string",
|
|
1966
|
-
"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."
|
|
1967
2116
|
},
|
|
1968
2117
|
"to": {
|
|
1969
2118
|
"type": "string",
|
|
1970
|
-
"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."
|
|
1971
2120
|
},
|
|
1972
2121
|
"limit": {
|
|
1973
2122
|
"type": "integer",
|
|
@@ -1976,7 +2125,7 @@ export const tools = [
|
|
|
1976
2125
|
},
|
|
1977
2126
|
"cursor": {
|
|
1978
2127
|
"type": "string",
|
|
1979
|
-
"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."
|
|
1980
2129
|
}
|
|
1981
2130
|
},
|
|
1982
2131
|
"required": [
|
|
@@ -2006,7 +2155,7 @@ export const tools = [
|
|
|
2006
2155
|
},
|
|
2007
2156
|
{
|
|
2008
2157
|
"name": "tickerbot_redeliver_webhook_delivery",
|
|
2009
|
-
"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.",
|
|
2010
2159
|
"inputSchema": {
|
|
2011
2160
|
"type": "object",
|
|
2012
2161
|
"properties": {
|
|
@@ -2043,7 +2192,7 @@ export const tools = [
|
|
|
2043
2192
|
},
|
|
2044
2193
|
{
|
|
2045
2194
|
"name": "tickerbot_test_webhook",
|
|
2046
|
-
"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).",
|
|
2047
2196
|
"inputSchema": {
|
|
2048
2197
|
"type": "object",
|
|
2049
2198
|
"properties": {
|