Skip to main content
POST
Search financial documents
Search answers a question about a public company from what the company has reported, and shows where the answer came from: how it pays its directors, what its clawback policy says, what it announced in its latest results release, who replaced its chief financial officer. You send a precise query and the companies you mean. You get back the parts of the record that answer it, word for word, each with a link that opens the source at that place.
Alpha. Access is by invitation; callers without access receive a 404. The request and response shapes may change during the alpha. Contact us to request access.

Make your first request

Search uses the same API key as every other endpoint.
Each result is one document. Each excerpt is a passage from that document, reproduced verbatim, with a link that opens the document at the passage.

Write the query

query is the only required field, at most 300 characters. The more precise the query, the better the answer. Five rules cover most requests. A year in the query text widens the search to every year on record. To search one year, send filters.date instead.

Name the companies

filters.identifiers lists the companies to search, by ticker or cik. A CIK may be sent without leading zeros. A list runs the same query over each company in it. An identifier that matches no listed company is a 400 that names it. Send it whenever you know the company. Without it, Search reads the newest document of every company. A query that names a company Search cannot identify is a 422 with the fix in the body, never an answer drawn from other companies’ documents.

Pick the kind of document

Search reads two kinds of document today. A proxy statement (DEF 14A) says how a company is governed and how it pays its directors and executives. A current report (8-K) says what a company announced: its results, a new officer, a departure, an agreement. A current report often carries the announcement itself as an exhibit, such as the results press release. filters.document_type names the kinds to read, as a result’s attributes.document_type names them: ["DEF 14A"], ["8-K"], or both. Send it when a passage from the other kind would be wrong. Without it, Search reads the kinds the question names, and every kind when the question names none: clawback policy reads the proxy statements; press release on quarterly results reads the current reports.
The result is the press release, an exhibit of the current report. Its title names the exhibit, and its attributes carry the exhibit and the items the report covers. The excerpt is shortened.

Set the window

filters.date bounds the day a document became public: after, before, or both, as ISO days. Both bounds are inclusive. When you send no window and the query names no year, only the newest proxy statement of each company is searched; a company files one a year. Current reports are many a year, so every one of them stays in scope: send filters.date around the event you mean. A window keeps every document inside it in scope. “Every document since 2024” is {"after": "2024-01-01"}; one year is both bounds.

Read the response

One result per document, best first. Ten documents come back unless limit says otherwise; the most you can ask for is 100. A key that does not apply to a result is absent, never null. Example response for clawback policy for incentive compensation with filters.identifiers.ticker of ["AAPL"]. The excerpts are shortened.

Errors

Next steps

Best Practices

Write precise queries, improve one change at a time, and use the request shape for each kind of task.

Authorizations

X-API-KEY
string
header
required

API key for authentication.

Body

application/json
query
string
required

One question in plain English, 1 to 300 characters.

Required string length: 1 - 300
filters
object

Constraints on which documents are searched. Nothing outside a filter is returned.

limit
integer
default:10

How many results to return. A result is one document.

Required range: 1 <= x <= 100

Response

The passages that answer, one result per document

search_id
string<uuid>
required

The id of this search. Keep it when you report a result.

results
object[]
required

One result per document, best first. At most limit.

warnings
object[]

What a partial answer is missing. Absent when nothing is.