Research a Concept
Some questions aren't about price at all. Does this company have anything to do with Greenland? Which stocks are exposed to GLP-1 drugs? Concept research answers them from what a company says in its SEC filings, what the news says about it and its company profile. Every "yes" comes with the passage it rests on and a link to the source.
There are two questions, and an endpoint for each:
A concept is free text: a theme, place, product, technology or event ("rare earths", "Strait of Hormuz", "GLP-1"). There is no list to pick from. Pass the phrase as a person would say it rather than expanding it into keywords. Generic market vocabulary ("valuation", "growth") is refused.
You'll need: a Power User or Business token. The examples use the made-up tickers XMPL and XMPM.
Rolling out
Concept research opens account by account. Until it's on for yours, both endpoints answer 404 and the MCP tool says it isn't available yet. Once it's on, a 503 with code: "not_available_yet" means the concept index itself hasn't opened.
Concept research or search?
GET /api/v2/stocks/search-securities?q=lithium&query_description=true finds companies whose description contains a keyword. It is fast and cheap, but it can't tell a lithium miner from a company that mentions lithium batteries once, and it never says why it matched.
Concept research judges the relation. A classifier reads the company's filings, news and profile and decides whether it relates to the concept, and a positive answer always carries the passage that convinced it. Use search to look a company up; use concept research when the question is "is X exposed to / connected to Y?".
1. Ask about one ticker
concept comes back as the label it resolved to, so "rare earth metals" and "REEs" both answer as Rare earths. resolvedBy says how: hot for a known concept or alias, warm for a close match to one, cold for a phrase nothing matched. A cold phrase is answered live and comes back with conceptStatus: "provisional".
2. Read the answer
There are three ways to answer, and only one of them is a yes:
coverage says where the answer came from:
meaning and provenance put the same thing in plain language, worded for an AI model to relay: pass them to your model verbatim, or build your own text from answer and coverage. Don't collapse unknown into not_related; they mean different things, and the distinction is the point.
probability is the classifier's probability that the ticker relates, and threshold is the bar it was compared against. probability is null when it fell below the storage floor (so not_related, exact value not kept) or the pair was never asked. relatedSince is when the cited evidence became public, which is when the relation starts.
3. Find the tickers that relate
Results are ranked by probability, highest first. limit is 1–25 (default 15).
Read coverage before you treat the list as complete:
index: the concept is fully indexed, so this is the whole market's answer. IflimitReachedistruethe list was cut atlimitand more tickers relate. An emptyindexlist really does mean no ticker relates.partial: the concept isn't fully indexed yet. The list is what the index holds plus one live pass overcandidatesAskedkeyword-matched candidates;live: truemarks a ticker that pass found. Other tickers may relate too.
An empty partial list means "none among the 200 candidates asked", not "no ticker relates":
When sweepRequested is true, the answer was thin and a sweep of the whole market was queued for the concept. Asking again later can return more.
Asking about the past
Both endpoints take as_of (YYYY-MM-DD) to answer as of an earlier date. A past date is answered from the index only and never classified live: a live pass would read today's filings into the past. So a past date can come back unknown (relate) or as an empty partial list (find) where today's answer would not:
askedAsOf is the date the question was answered for. relatedSince (relate) and each citation's publishedOn say when the evidence became public: a relation exists from that date on.
Follow the citations
Every related answer and every find result carries a citation:
Show the citation with the answer, and link url rather than paraphrasing it: the quote is the evidence, and a reader should be able to check it. The quote is stored with the answer, so it outlives the source (old news is pruned). A related answer without a citation is never returned; if the classifier ever said yes without evidence, the answer comes back unknown.
Refusals
A refusal is an answer, not a failure. It has the usual error body plus a stable code to branch on and retryable, whether the same request can succeed later:
Two 503s mean different things, so branch on code, not only on the status:
A 404 without a code means concept research isn't enabled for your account yet. The usual 400, 401, 403 (a Starter token) and 429 apply as on every endpoint.
Over MCP
The MCP server has the same research as one tool, concept_research: with ticker it answers one pair (relate), without it it finds the tickers that relate (find). It returns the same JSON as the endpoints, and a refusal comes back as a result with ok: false, its code, a message to relay and retryable, rather than as a tool error. It needs a Power User or Business token.
A prompt like this is enough:
A well-behaved assistant calls concept_research once per ticker with ticker set, because find returns only the top results and can be partial, while relate gives every watchlist name a definitive related, not_related or unknown. It then reports the yes answers with their links and keeps the unknowns separate from the noes.
Limits
Each request counts once against the endpoint's normal rate limits, whether it was answered from the index or classified live. A live answer is stored, so asking the same pair again is a fast read. Concept research spends no AI credits.


