Search financial documents
curl --request POST \
--url https://api.financialdatasets.ai/search \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"query": "clawback policy for incentive compensation",
"filters": {
"identifiers": {
"ticker": [
"AAPL"
]
}
},
"limit": 1
}
'import requests
url = "https://api.financialdatasets.ai/search"
payload = {
"query": "clawback policy for incentive compensation",
"filters": { "identifiers": { "ticker": ["AAPL"] } },
"limit": 1
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'clawback policy for incentive compensation',
filters: {identifiers: {ticker: ['AAPL']}},
limit: 1
})
};
fetch('https://api.financialdatasets.ai/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.financialdatasets.ai/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'clawback policy for incentive compensation',
'filters' => [
'identifiers' => [
'ticker' => [
'AAPL'
]
]
],
'limit' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/search"
payload := strings.NewReader("{\n \"query\": \"clawback policy for incentive compensation\",\n \"filters\": {\n \"identifiers\": {\n \"ticker\": [\n \"AAPL\"\n ]\n }\n },\n \"limit\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.financialdatasets.ai/search")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"clawback policy for incentive compensation\",\n \"filters\": {\n \"identifiers\": {\n \"ticker\": [\n \"AAPL\"\n ]\n }\n },\n \"limit\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"clawback policy for incentive compensation\",\n \"filters\": {\n \"identifiers\": {\n \"ticker\": [\n \"AAPL\"\n ]\n }\n },\n \"limit\": 1\n}"
response = http.request(request)
puts response.read_body{
"search_id": "48805604-29b5-431f-ae85-7a405d576984",
"results": [
{
"title": "Apple Inc · DEF 14A 2026",
"url": "https://www.sec.gov/Archives/edgar/data/320193/000130817926000008/aapl014016-def14a.htm",
"date": "2026-01-08",
"source": "sec.gov",
"excerpts": [
{
"text": "Governance and Other Considerations\nRecoupment of Compensation\nThe terms of all outstanding time-based and performance-based RSU awards held by our named executive officers in 2025 allow us to recoup any shares or other ...",
"citation": {
"document": "0001308179-26-000008",
"date": "2026-01-08",
"section": "Compensation > Compensation Discussion and Analysis > Governance and Other Considerations > Recoupment of Compensation",
"link": "https://www.sec.gov/Archives/edgar/data/320193/000130817926000008/aapl014016-def14a.htm#:~:text=Governance%20and%20Other,to%20limited%20exceptions."
},
"attributes": {
"kind": "text"
}
}
],
"entities": [
{
"name": "Apple Inc",
"identifiers": {
"cik": "0000320193",
"ticker": "AAPL"
}
}
],
"attributes": {
"document_type": "DEF 14A"
}
}
]
}{
"error": {
"message": "limit: Input should be less than or equal to 100"
}
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "The endpoint /search does not exist."
}{
"search_id": "e38104d5-6bd7-4d82-bc4e-0a21179d1f77",
"error": {
"reason": "unresolved_company",
"message": "A company named in the query matched no listing, or several.",
"fix": "Send filters.identifiers."
}
}{
"search_id": "e38104d5-6bd7-4d82-bc4e-0a21179d1f77",
"error": {
"message": "Search is temporarily unavailable. Try again shortly."
}
}Search
Search
Ask a question about a public company in plain English and get the answer from what it reported, with a citation.
POST
/
search
Search financial documents
curl --request POST \
--url https://api.financialdatasets.ai/search \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"query": "clawback policy for incentive compensation",
"filters": {
"identifiers": {
"ticker": [
"AAPL"
]
}
},
"limit": 1
}
'import requests
url = "https://api.financialdatasets.ai/search"
payload = {
"query": "clawback policy for incentive compensation",
"filters": { "identifiers": { "ticker": ["AAPL"] } },
"limit": 1
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'clawback policy for incentive compensation',
filters: {identifiers: {ticker: ['AAPL']}},
limit: 1
})
};
fetch('https://api.financialdatasets.ai/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.financialdatasets.ai/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'clawback policy for incentive compensation',
'filters' => [
'identifiers' => [
'ticker' => [
'AAPL'
]
]
],
'limit' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/search"
payload := strings.NewReader("{\n \"query\": \"clawback policy for incentive compensation\",\n \"filters\": {\n \"identifiers\": {\n \"ticker\": [\n \"AAPL\"\n ]\n }\n },\n \"limit\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.financialdatasets.ai/search")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"clawback policy for incentive compensation\",\n \"filters\": {\n \"identifiers\": {\n \"ticker\": [\n \"AAPL\"\n ]\n }\n },\n \"limit\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"clawback policy for incentive compensation\",\n \"filters\": {\n \"identifiers\": {\n \"ticker\": [\n \"AAPL\"\n ]\n }\n },\n \"limit\": 1\n}"
response = http.request(request)
puts response.read_body{
"search_id": "48805604-29b5-431f-ae85-7a405d576984",
"results": [
{
"title": "Apple Inc · DEF 14A 2026",
"url": "https://www.sec.gov/Archives/edgar/data/320193/000130817926000008/aapl014016-def14a.htm",
"date": "2026-01-08",
"source": "sec.gov",
"excerpts": [
{
"text": "Governance and Other Considerations\nRecoupment of Compensation\nThe terms of all outstanding time-based and performance-based RSU awards held by our named executive officers in 2025 allow us to recoup any shares or other ...",
"citation": {
"document": "0001308179-26-000008",
"date": "2026-01-08",
"section": "Compensation > Compensation Discussion and Analysis > Governance and Other Considerations > Recoupment of Compensation",
"link": "https://www.sec.gov/Archives/edgar/data/320193/000130817926000008/aapl014016-def14a.htm#:~:text=Governance%20and%20Other,to%20limited%20exceptions."
},
"attributes": {
"kind": "text"
}
}
],
"entities": [
{
"name": "Apple Inc",
"identifiers": {
"cik": "0000320193",
"ticker": "AAPL"
}
}
],
"attributes": {
"document_type": "DEF 14A"
}
}
]
}{
"error": {
"message": "limit: Input should be less than or equal to 100"
}
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "The endpoint /search does not exist."
}{
"search_id": "e38104d5-6bd7-4d82-bc4e-0a21179d1f77",
"error": {
"reason": "unresolved_company",
"message": "A company named in the query matched no listing, or several.",
"fix": "Send filters.identifiers."
}
}{
"search_id": "e38104d5-6bd7-4d82-bc4e-0a21179d1f77",
"error": {
"message": "Search is temporarily unavailable. Try again shortly."
}
}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, when a special committee was formed. 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.
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.
A year in the query text widens the search to every year on record. To search one year, send
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.import requests
response = requests.post(
"https://api.financialdatasets.ai/search",
headers={"X-API-KEY": "your_api_key_here"},
json={
"query": "committee retainers",
"filters": {"identifiers": {"ticker": ["CCI"]}},
},
)
for result in response.json()["results"]:
print(result["title"], result["url"])
for excerpt in result["excerpts"]:
print(excerpt["text"], excerpt["citation"]["link"])
const response = await fetch("https://api.financialdatasets.ai/search", {
method: "POST",
headers: { "X-API-KEY": "your_api_key_here", "Content-Type": "application/json" },
body: JSON.stringify({
query: "committee retainers",
filters: { identifiers: { ticker: ["CCI"] } },
}),
});
const { results } = await response.json();
for (const result of results) {
console.log(result.title, result.url);
for (const excerpt of result.excerpts) {
console.log(excerpt.text, excerpt.citation.link);
}
}
curl -s -X POST "https://api.financialdatasets.ai/search" \
-H "Content-Type: application/json" \
-H "X-API-KEY: $FINANCIAL_DATASETS_API_KEY" \
-d '{
"query": "committee retainers",
"filters": { "identifiers": { "ticker": ["CCI"] } }
}'
{
"title": "Crown Castle Inc · DEF 14A 2026",
"url": "https://www.sec.gov/Archives/edgar/data/1051470/000105147026000039/cci-20260406.htm",
"date": "2026-04-06",
"excerpts": [
{
"text": "2025 Committee Retainers(a)\nBoard Committee | Committee Chair | Committee Member(b)\nAudit Committee | $30,000 | $15,000\nCEO Search Committee | $20,000 | $10,000\nCHC Committee | $25,000 | $12,500\nFiber Review Committee | $25,000 | $12,500 ...",
"citation": {
"document": "0001051470-26-000039",
"date": "2026-04-06",
"section": "Crown Castle Inc. > 2025 Committee Retainers(a)",
"link": "https://www.sec.gov/Archives/edgar/data/1051470/000105147026000039/cci-20260406.htm#:~:text=Committee%20Member%28b%29,N%26G%20Committee"
},
"attributes": { "kind": "table" }
}
]
}
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.
| Rule | Example |
|---|---|
| Say clearly what you want. Include every detail that changes the answer: the subject, the people, the period, the kind of thing. | annual cash retainers paid to directors for committee service, not retainers. |
| Write a description or a question; both work. A vague query fails in either form. | How much does Crown Castle pay directors who serve on board committees? works. What about pay? does not. |
| Name the fact when you want a value. Name the table or section when you want the whole of it. | total compensation of each named executive officer for 2025 returns the rows that hold the values. summary compensation table returns the table. |
| Send one query per item you want. | clawback policy and stock ownership guidelines as two requests, not one. |
Put the company in filters.identifiers. | committee retainers with {"ticker": ["CCI"]}. The company may also be named in the text, as in committee retainers for CCI. |
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.
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 document of each company is searched. A window keeps every document inside it in scope. “Every document since 2024” is {"after": "2024-01-01"}; one year is both bounds.
response = requests.post(
"https://api.financialdatasets.ai/search",
headers={"X-API-KEY": "your_api_key_here"},
json={
"query": "director attendance below 75% of board and committee meetings",
"filters": {
"identifiers": {"ticker": ["JPM", "BAC", "C", "WFC"]},
"date": {"after": "2024-01-01"},
},
"limit": 25,
},
)
const response = await fetch("https://api.financialdatasets.ai/search", {
method: "POST",
headers: { "X-API-KEY": "your_api_key_here", "Content-Type": "application/json" },
body: JSON.stringify({
query: "director attendance below 75% of board and committee meetings",
filters: {
identifiers: { ticker: ["JPM", "BAC", "C", "WFC"] },
date: { after: "2024-01-01" },
},
limit: 25,
}),
});
curl -s -X POST "https://api.financialdatasets.ai/search" \
-H "Content-Type: application/json" \
-H "X-API-KEY: $FINANCIAL_DATASETS_API_KEY" \
-d '{
"query": "director attendance below 75% of board and committee meetings",
"filters": {
"identifiers": { "ticker": ["JPM", "BAC", "C", "WFC"] },
"date": { "after": "2024-01-01" }
},
"limit": 25
}'
Read the response
One result per document, best first. Ten documents come back unlesslimit 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.
{
"search_id": "48805604-29b5-431f-ae85-7a405d576984",
"results": [
{
"title": "Apple Inc · DEF 14A 2026",
"url": "https://www.sec.gov/Archives/edgar/data/320193/000130817926000008/aapl014016-def14a.htm",
"date": "2026-01-08",
"source": "sec.gov",
"excerpts": [
{
"text": "Recoupment of Compensation\nThe terms of all outstanding time-based and performance-based RSU awards held by our named executive officers in 2025 allow us to recoup any shares or other ...",
"citation": {
"document": "0001308179-26-000008",
"date": "2026-01-08",
"section": "Compensation > Compensation Discussion and Analysis > Governance and Other Considerations > Recoupment of Compensation",
"link": "https://www.sec.gov/Archives/edgar/data/320193/000130817926000008/aapl014016-def14a.htm#:~:text=Governance%20and%20Other,to%20limited%20exceptions."
},
"attributes": { "kind": "text" }
},
{
"text": "Executive Compensation Policies and Practices\nWe are committed to sound executive compensation policies and practices, as highlighted in the following table.\nProhibition on hedging, pledging, and short sales | ...",
"citation": {
"document": "0001308179-26-000008",
"date": "2026-01-08",
"section": "Compensation > Compensation Discussion and Analysis > Executive Compensation Policies and Practices",
"link": "https://www.sec.gov/Archives/edgar/data/320193/000130817926000008/aapl014016-def14a.htm#:~:text=We%20have%20robust%20stock%20ownership%20guidelines,annual%20risk%20assessment%20of%20our%20compensation%20program."
},
"attributes": { "kind": "table" }
}
],
"entities": [
{ "name": "Apple Inc", "identifiers": { "cik": "0000320193", "ticker": "AAPL" } }
],
"attributes": { "document_type": "DEF 14A" }
}
]
}
| Field | Meaning |
|---|---|
search_id | The id of this search. Keep it when you report a result to us. |
results[] | One document each: title, url, date, source, excerpts, entities, attributes. |
excerpts[] | The parts of the document that answer, verbatim, best first, at most 10. Each has its own citation and attributes. |
citation | document is the document’s id at its source, date the day it became public, section the location of the passage within the document, and link opens the document at the passage, highlighted. |
attributes.kind | text or table. A table passage is the whole table, rows on lines and cells separated by |. |
entities[] | The companies the result is about, with their cik and ticker. |
warnings[] | What a partial answer is missing, each {type, message, hint}. Present only when something is. no_documents means Search holds no document for these companies in this window; its hint names the dates it does hold. Widen the window or check the identifiers before you conclude. |
Errors
| Status | When | Body |
|---|---|---|
400 | The body is not valid. | error.message names the field, for example limit: Input should be less than or equal to 100. |
404 | The caller does not have access during the alpha. | {"error": "The endpoint /search does not exist."} |
422 | The query names a company Search cannot identify. | error.reason is ambiguous_symbol or unresolved_company; error.fix says what to send. |
503 | Search is temporarily unavailable. | error.message. Try again shortly. |
Next steps
Best Practices
Write precise queries, improve one change at a time, and use the request shape for each kind of task.
Authorizations
API key for authentication.
Body
application/json
One question in plain English, 1 to 300 characters.
Required string length:
1 - 300Constraints on which documents are searched. Nothing outside a filter is returned.
Show child attributes
Show child attributes
How many results to return. A result is one document.
Required range:
1 <= x <= 100Response
The passages that answer, one result per document