Strata Data API

The company, industry, macro and market intelligence behind the Strata mobile app, over a simple REST API. One key works here and with the Strata MCP server.

Base URL
https://api.catalystfinance.ai/v1
Format
JSON over HTTPS

Quickstart

  1. Request access and create a key. Sign up at api.catalystfinance.ai and request API access. Once it is granted, create a key. The key is shown once, so store it somewhere safe.
  2. Make your first request.
Request
curl "https://api.catalystfinance.ai/v1/tickers/AAPL?include=description" \
  -H "Authorization: Bearer YOUR_API_KEY"

Every endpoint, parameter and response field is described in the interactive reference, where you can also try requests with your key.

Authentication

Send your key as a bearer token on every request:

Authorization: Bearer YOUR_API_KEY
  • Keys start with cat_. Each account has one active key, which you can replace or revoke from your account at any time.
  • Never put a key in a URL or query string, and never ship it inside a browser or mobile app.
  • The same key works with the MCP server, and both share one usage allowance.

Endpoints

All paths are relative to https://api.catalystfinance.ai/v1. Each endpoint shows its main parameters; the interactive reference lists every option. Only report generation and watchlist changes write anything.

Companies

GET/tickers

Find a ticker by company name or symbol.

ParameterInRequiredDescription
qqueryYesCompany name or the start of a symbol.
limitqueryNoHow many matches to return, from 1 to 100.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "q": "nvidia",    "limit": 5,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/tickers/{ticker}

Everything Strata holds on one company: digest, profile, fundamentals, valuation, projection, technicals, risk, analysts, earnings, insiders, ownership, congressional trades, company and industry state, and its insight feed.

ParameterInRequiredDescription
tickerpathYesMarket symbol, such as AAPL.
includequeryNoSections to return, separated by commas, such as digest, fundamentals or feed. Omit it, or pass all, for every section.
qqueryNoSearch the company's insight feed by meaning. Needs feed in include (all counts).
sourcesqueryNoComma-separated insight sources. Omit for all of them.
fromqueryNoEarliest insight time, as a date or timestamp.
toqueryNoLatest insight time, as a date or timestamp.
orderqueryNoasc or desc by publication time. Defaults to newest first. Not with q.
viewqueryNosource adds source_data, insights adds the insight card, both (the default) adds both.
limitqueryNoInsights on this page, from 1 to 100. Defaults to 50.
cursorqueryNofeed.page.next_cursor from the previous page. Keep the same filters. Not with q.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers/AAPL"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "include": "all",    "q": "iPhone demand",    "sources": "news,sec_filings",    "from": "2026-09-01",    "to": "2026-10-20",    "view": "both",    "limit": 20,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/tickers/{ticker}/articles

Full research articles for one company, newest first, or ranked by meaning when you pass q.

ParameterInRequiredDescription
tickerpathYesMarket symbol.
qqueryNoRank articles by meaning. Omit for newest first.
fromqueryNoEarliest publication time.
toqueryNoLatest publication time.
limitqueryNoArticles to return, from 1 to 100. Defaults to 10.
offsetqueryNoArticles to skip. Not with q.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers/NVDA/articles"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "q": "data center demand",    "from": "2026-01-01",    "to": "2026-10-20",    "limit": 5,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/tickers/{ticker}/financials

Historical figures as reported in SEC filings.

ParameterInRequiredDescription
tickerpathYesMarket symbol.
conceptqueryNoOne exact XBRL concept, such as us-gaap:GrossProfit. Omit to see every stored concept.
familyqueryNoOne stored family, such as revenue. Combined with concept.
fromqueryNoEarliest period end, YYYY-MM-DD.
toqueryNoLatest period end, YYYY-MM-DD.
limitqueryNoFacts on this page, up to 500. Defaults to 100.
offsetqueryNoFacts to skip. Keep the same filters.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers/AAPL/financials"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "concept": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax",    "family": "revenue",    "from": "2024-01-01",    "to": "2026-09-30",    "limit": 8,    "offset": 0,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/tickers/{ticker}/options

Settled options open interest and positioning.

ParameterInRequiredDescription
tickerpathYesMarket symbol.
expiryqueryNoOne expiry, YYYY-MM-DD. Omit for every stored expiry.
typequeryNocall or put. Omit for both.
limitqueryNoContracts on this page. Defaults to 50.
offsetqueryNoContracts to skip.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers/AAPL/options"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "expiry": "2026-12-18",    "type": "call",    "limit": 20,    "offset": 0,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/tickers/{ticker}/option-market

Option quotes and greeks, open interest by expiry, and contract price bars.

ParameterInRequiredDescription
tickerpathYesMarket symbol.
expiryqueryNoOne expiry, YYYY-MM-DD.
typequeryNocall or put. Filters the quote list.
contractqueryNoOne OCC option symbol. Returns that quote and its bars.
barqueryNoBar size for that contract. Defaults to daily.
limitqueryNoQuotes, or bars when contract is set, up to 20. Defaults to 10.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers/AAPL/option-market"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "expiry": "2026-12-18",    "type": "call",    "contract": "AAPL261218C00230000",    "bar": "daily",    "limit": 10,}
response = requests.get(url, headers=headers, params=params)print(response.json())

POST/tickers/{ticker}/technical-analysis

Generate or reuse a full technical analysis report. Off by default; ask us to turn it on for your key.

ParameterInRequiredDescription
tickerpathYesMarket symbol, 1 to 5 letters.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers/AAPL/technical-analysis"headers = {"Authorization": "Bearer YOUR_API_KEY"}payload = {}
response = requests.post(url, headers=headers, json=payload)print(response.json())

GET/tickers/fundamentals

Compare financial ratios across up to 10 companies.

ParameterInRequiredDescription
tickersqueryYesOne to ten symbols, separated by commas.
metricsqueryNoComma-separated metric names, such as pe_ratio_ttm. Omit for all 15.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers/fundamentals"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "tickers": "AAPL,MSFT,NVDA",    "metrics": "pe_ratio_ttm,gross_margin_ttm_pct",}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/tickers/performance

Compare split-adjusted price returns across up to 10 companies.

ParameterInRequiredDescription
tickersqueryYesOne to ten symbols, separated by commas.
periodqueryNoytd, 1m, 3m, 6m or 1y. Defaults to ytd.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/tickers/performance"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "tickers": "AAPL,MSFT",    "period": "1y",}
response = requests.get(url, headers=headers, params=params)print(response.json())

Markets and the economy

GET/market/feed

Insights across the whole market, newest first, or searched by meaning.

ParameterInRequiredDescription
qqueryNoSearch by meaning. Omit for the newest insights.
tickersqueryNoUp to ten symbols. Only used together with q.
sourcesqueryNoComma-separated sources. Omit for all of them.
fromqueryNoEarliest insight time.
toqueryNoLatest insight time.
orderqueryNoasc or desc by publication time. Defaults to newest first. Not with q.
limitqueryNoInsights on this page, from 1 to 100. Defaults to 50.
cursorqueryNofeed.page.next_cursor from the previous page. Keep the same filters. Not with q.
viewqueryNosource, insights or both (the default), as on /tickers/{ticker}.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/feed"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "q": "semiconductor export rules",    "tickers": "NVDA",    "sources": "news,sec_filings",    "from": "2026-09-01",    "to": "2026-10-20",    "limit": 10,    "view": "both",}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/context

Country and commodity narratives, with market sentiment.

ParameterInRequiredDescription
idsqueryNoComma-separated slugs, such as united_states or gold.
categoryqueryNocountry or commodity. The other list comes back empty.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/context"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "ids": "united_states,japan",    "category": "country",}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/sentiment

The latest market sentiment score, or its daily history.

ParameterInRequiredDescription
fromqueryNoFirst day, YYYY-MM-DD. Sending a date returns history instead of the latest score.
toqueryNoLast day, YYYY-MM-DD.
orderqueryNoasc or desc. Defaults to asc in history mode.
limitqueryNoDays on this page. Defaults to 100.
offsetqueryNoDays to skip. Continue with page.next_offset.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/sentiment"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "from": "2026-09-01",    "to": "2026-10-20",    "order": "asc",    "limit": 100,    "offset": 0,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/calendar

Scheduled economic releases.

ParameterInRequiredDescription
fromqueryNoFirst day, YYYY-MM-DD. Defaults to today in UTC.
toqueryNoLast day, YYYY-MM-DD. Defaults to six days after from. The window can span at most 31 days.
countryqueryNoOne two-letter country or region code, such as US.
min_importancequeryNo1 low, 2 medium, 3 high.
limitqueryNoEvents on this page, up to 500.
offsetqueryNoEvents to skip.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/calendar"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "from": "2026-10-20",    "to": "2026-10-26",    "country": "US",    "min_importance": 2,    "limit": 50,    "offset": 0,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/performance

Sector or industry performance.

ParameterInRequiredDescription
levelqueryNosector or industry. Defaults to sector.
namequeryNoOne exact group name. Omit it to list every group and its name.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/performance"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "level": "sector",    "name": "Information Technology",}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/movers

Top gainers and losers for the market, a sector, or an industry.

ParameterInRequiredDescription
scopequeryNomarket, sector or industry. Defaults to market.
namequeryNoRequired for a sector or industry. Use a name from /market/performance.
directionqueryNogainers, losers, or both. Defaults to both.
limitqueryNoHow many names in each direction, up to 10.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/movers"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "scope": "sector",    "name": "Information Technology",    "direction": "gainers",    "limit": 10,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/price-targets

Screen analyst price-target consensus by upside, sector, size and coverage.

ParameterInRequiredDescription
tickersqueryNoUp to ten symbols. Omit to screen the market.
min_upside_pctqueryNoSmallest upside, as a signed percent.
max_upside_pctqueryNoLargest upside. Must be at least the minimum.
sectorqueryNoOne exact sector name.
min_market_capqueryNoSmallest stored market cap.
min_analystsqueryNoFewest analysts covering the name.
limitqueryNoRows on this page. Defaults to 25.
offsetqueryNoRows to skip.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/price-targets"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "tickers": "AAPL,MSFT,NVDA",    "min_upside_pct": 15,    "max_upside_pct": 100,    "sector": "Information Technology",    "min_market_cap": 10000000000,    "min_analysts": 5,    "limit": 25,    "offset": 0,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/insiders

Companies ranked by insider open-market buying or selling, with the prior year's pace and the other side of the same window. A company whose insiders went the other way on balance ranks after every company that did not.

ParameterInRequiredDescription
directionqueryNobuying or selling. Defaults to buying.
daysqueryNoWindow ending today, from 1 to 365. Defaults to 30.
min_insidersqueryNoFewest distinct insiders, from 1 to 50. Use 3 for cluster buying.
sortqueryNovalue, insiders or trades. Defaults to value.
limitqueryNoCompanies to return, from 1 to 25. Defaults to 10.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/insiders"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "direction": "buying",    "days": 30,    "limit": 10,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/guidance

Guidance raises or cuts in company releases, sized by how far the guided midpoint moved against the range it replaced.

ParameterInRequiredDescription
directionqueryNoraised or lowered. Defaults to raised.
daysqueryNoReleases in the last 1 to 365 days. Defaults to 30.
kindsqueryNoComma-separated: revenue, eps, ebitda, net_income, capex, other. Defaults to the first four.
limitqueryNoCompanies to return, from 1 to 25. Defaults to 10.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/guidance"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "direction": "raised",    "days": 30,    "kinds": "revenue,eps",    "limit": 10,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/new-highs

Stocks that closed at or near a 52-week high on heavy volume in the last few sessions. Covers the S&P 500.

ParameterInRequiredDescription
sessionsqueryNoTrading sessions to look back, from 1 to 20. Defaults to 5.
within_pct_of_highqueryNoFurthest below the 52-week high, in percent. Defaults to 1.
min_relative_volumequeryNoSmallest session volume as a multiple of the 20-day average. Defaults to 1.5.
limitqueryNoStocks to return, from 1 to 30. Defaults to 15.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/new-highs"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "sessions": 5,    "within_pct_of_high": 1,    "min_relative_volume": 1.5,    "limit": 15,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/market/events

Companies with a kind of event: recent ones, such as contract wins or spin-offs, or dated milestones ahead, such as FDA decisions. Found by meaning from q, then kept by Strata's event labels.

ParameterInRequiredDescription
qqueryYesThe kind of event in plain words.
whenqueryNorecent or upcoming. Defaults to recent.
event_typesqueryNoComma-separated event labels, such as government_contract or spin_off.
calendar_typesqueryNoWith upcoming only. Comma-separated milestone kinds, such as regulatory_decision or data_readout.
daysqueryNoWindow length. Defaults to 30 for recent and 90 for upcoming.
min_market_capqueryNoSmallest stored market cap.
max_market_capqueryNoLargest stored market cap.
sectorqueryNoOne exact sector name.
limitqueryNoCompanies to return, from 1 to 30. Defaults to 15.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/market/events"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "q": "FDA decision date for a drug approval",    "when": "upcoming",    "calendar_types": "regulatory_decision",    "sector": "Health Care",    "limit": 15,}
response = requests.get(url, headers=headers, params=params)print(response.json())

Industries, funds and signals

GET/industries

The industry catalog, with the IDs used below.

No parameters.

Sample code
import requests
url = "https://api.catalystfinance.ai/v1/industries"headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers)print(response.json())

GET/industries/{industry_id}

The current narrative for one industry.

ParameterInRequiredDescription
industry_idpathYesAn id from GET /industries. Keep its case and characters.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/industries/semiconductors_and_semiconductor_equipment"headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers)print(response.json())

GET/funds/{ticker}

A fund's holdings.

ParameterInRequiredDescription
tickerpathYesFund ticker, such as VOO.
limitqueryNoHoldings on this page, up to 100. Defaults to 50.
offsetqueryNoHoldings to skip.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/funds/VOO"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "limit": 25,    "offset": 0,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/signals/board

The live signals leaderboard, with themes and per-ticker risk.

ParameterInRequiredDescription
directionqueryNolong, short, or both. Defaults to both.
symbolqueryNoOne exact ticker. Omit for the whole board.
themequeryNoOne theme slug, including its subthemes.
limitqueryNoLive candidates to return, up to 25. Defaults to 15.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/signals/board"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "direction": "long",    "symbol": "NVDA",    "theme": "gpu-accelerated-compute-systems",    "limit": 15,}
response = requests.get(url, headers=headers, params=params)print(response.json())

One record

GET/insights/{id}

One story, with its source text.

ParameterInRequiredDescription
idpathYesStory id, 24 hexadecimal characters.
text_offsetqueryNoWhere to start in the stored source text. Defaults to 0.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/insights/6ad7714fa5b8e2ef5b9c1908"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "text_offset": 0,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/articles/{id}

One deep-dive article.

ParameterInRequiredDescription
idpathYesArticle id, 24 hexadecimal characters.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/articles/ARTICLE_ID"headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers)print(response.json())

GET/research-handoff

One call for the current research on a signal, company, fund, story or article. Send exactly one id.

ParameterInRequiredDescription
tickerqueryNoA company or fund symbol.
signal_idqueryNoA Strata signal id.
insight_idqueryNoA story id, the same form as /insights/{id}.
article_idqueryNoA deep-dive id, the same form as /articles/{id}.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/research-handoff"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "ticker": "NVDA",}
response = requests.get(url, headers=headers, params=params)print(response.json())

Your portfolio

Reads need your own API key with Allow this key to read my holdings and watchlists turned on in your portal. Watchlist changes are not yet open to API keys: today only an assistant you approve for Edit your watchlists can make them, and a key gets 403 watchlist_scope_required.

GET/me/portfolio

Your linked portfolio and accounts, with update times.

No parameters.

Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/portfolio"headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers)print(response.json())

GET/me/holdings

Your holdings, a page at a time.

ParameterInRequiredDescription
tickerqueryNoOne exact stored symbol, such as AAPL.
limitqueryNoHoldings on this page, up to 100.
cursorqueryNoThe next_cursor from the previous page. Keep the same ticker and limit.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/holdings"headers = {"Authorization": "Bearer YOUR_API_KEY"}params = {    "ticker": "AAPL",    "limit": 50,}
response = requests.get(url, headers=headers, params=params)print(response.json())

GET/me/watchlists

Your watchlists, in order, each with its stocks.

No parameters.

Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/watchlists"headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers)print(response.json())

POST/me/watchlists

Create a watchlist, optionally with a starting list of stocks.

ParameterInRequiredDescription
namebodyYesThe list name, up to 100 characters.
tickersbodyNoOptional starting symbols, up to 50.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/watchlists"headers = {"Authorization": "Bearer YOUR_API_KEY"}payload = {    "name": "Semis",    "tickers": [        "NVDA",        "AVGO"    ]}
response = requests.post(url, headers=headers, json=payload)print(response.json())

PATCH/me/watchlists/{id}

Rename a watchlist.

ParameterInRequiredDescription
idpathYesA watchlist id, or default for your main list.
namebodyYesThe new name.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/watchlists/default"headers = {"Authorization": "Bearer YOUR_API_KEY"}payload = {    "name": "Core holdings"}
response = requests.patch(url, headers=headers, json=payload)print(response.json())

PUT/me/watchlists/order

Set the order of every watchlist. Include each id once.

ParameterInRequiredDescription
watchlist_idsbodyYesEvery watchlist id, in the new order, up to 20.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/watchlists/order"headers = {"Authorization": "Bearer YOUR_API_KEY"}payload = {    "watchlist_ids": [        "LIST_ID_1",        "LIST_ID_2"    ]}
response = requests.put(url, headers=headers, json=payload)print(response.json())

POST/me/watchlists/{id}/tickers

Add stocks to a watchlist. Symbols already on it are reported, not duplicated.

ParameterInRequiredDescription
idpathYesA watchlist id, or default.
tickersbodyYesSymbols to add, up to 50.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/watchlists/default/tickers"headers = {"Authorization": "Bearer YOUR_API_KEY"}payload = {    "tickers": [        "AAPL",        "MSFT"    ]}
response = requests.post(url, headers=headers, json=payload)print(response.json())

POST/me/watchlists/{id}/tickers/remove

Remove stocks from a watchlist.

ParameterInRequiredDescription
idpathYesA watchlist id, or default.
tickersbodyYesSymbols to remove, up to 50.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/watchlists/default/tickers/remove"headers = {"Authorization": "Bearer YOUR_API_KEY"}payload = {    "tickers": [        "MSFT"    ]}
response = requests.post(url, headers=headers, json=payload)print(response.json())

PUT/me/watchlists/{id}/tickers

Set the order of the stocks in a watchlist.

ParameterInRequiredDescription
idpathYesA watchlist id, or default.
tickersbodyYesExactly the stocks already on the list, in the new order, up to 200.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/watchlists/default/tickers"headers = {"Authorization": "Bearer YOUR_API_KEY"}payload = {    "tickers": [        "NVDA",        "AAPL",        "MSFT"    ]}
response = requests.put(url, headers=headers, json=payload)print(response.json())

DELETE/me/watchlists/{id}

Delete a watchlist. Your main list cannot be deleted.

ParameterInRequiredDescription
idpathYesA watchlist id.
Sample code
import requests
url = "https://api.catalystfinance.ai/v1/me/watchlists/LIST_ID"headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.delete(url, headers=headers)print(response.json())

Responses

  • Research responses carry a meta object and an X-Request-Id header (the /me/ endpoints do not send one yet). Quote the request ID when you contact us about a call.
  • Data is Strata's stored research, each item with its own timestamp. Missing coverage is returned as null or an empty list, never invented.
  • On /tickers/{ticker}, meta.coverage marks each section covered, covered_empty (on record, nothing for this section) or not_covered, and meta.coverage_summary.researched says whether Strata actively researches the company. Check them before reading an empty section as “nothing to report”.
  • Unknown or repeated query parameters are rejected rather than silently ignored.

Errors

Errors share one shape. The /me/ endpoints leave out request_id.

{
  "error": { "code": "invalid_api_token", "message": "..." },
  "request_id": "..."
}
StatusCodesMeaning
400invalid_*, unknown_query_parameterA parameter is missing, malformed or not recognised.
401missing_api_token, invalid_api_tokenNo key was sent, or the key is not valid.
403generation_not_allowed, portfolio_scope_required, watchlist_scope_requiredThe key lacks the permission this call needs: report generation, holdings access or watchlist editing.
404not_found, industry_not_found, fund_not_found, watchlist_not_foundNo such story, article, industry, fund, watchlist or route. An unknown ticker is not a 404; its sections come back empty.
409ambiguous_fund, watchlist_name_taken, watchlist_order_mismatchThe fund ticker matches several funds, or a watchlist change conflicts with what is stored.
429rate_limitedOver your allowance. Wait for the Retry-After seconds, then try again.
500internal_errorSomething went wrong on our side.
503api_busy, api_unavailable, temporarily_unavailableTemporarily unavailable. Retry after a short wait.

The full list of codes is in the interactive reference.

Limits

  • The default allowance is 60 requests a minute and 10,000 a day (UTC), shared between the API and MCP. Need more? Talk to us.
  • Report generation is off by default. Once turned on, it has its own limit of 5 a minute.
  • Watchlist changes are limited to 60 an hour per account.
  • Over the limit you get 429 rate_limited with a Retry-After header. Wait that many seconds before retrying.
  • 503 api_busy also sends Retry-After. Back off and retry.

Pagination

  • Insight feeds use cursors: pass feed.page.next_cursor as cursor while feed.page.has_more is true. A cursor belongs to its filters, so changing a filter means starting again. A search with q returns one ranked page and cannot be continued.
  • /me/holdings works the same way with pagination.next_cursor.
  • Lists that take offset return page.has_more and page.next_offset (under history on /market/sentiment and holdings on /funds/{ticker}).
  • New response fields can appear at any time, so ignore fields you do not recognise.

The same research inside an assistant. MCP server