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
Introduction
Ask a question in plain English and get the exact passages that answer it, each 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."
}
}Use Search when the answer is written in a document rather than stored in a field: why a CFO resigned, how a company describes a risk, what changed in guidance this quarter. One
POST /search replaces reading the filing yourself. To make a first request, start with the Quickstart. This page covers how to write queries, how to scope them, and what comes back.
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.Writing queries
query is the only required field.
An effective query is a topic of two to six words, such as committee retainers or clawback policy, with the company’s ticker in filters.identifiers. The company may also be named in the query text, as in committee retainers for CCI. Include a year to restrict the search to that year’s documents. A full question or a description of the overall task performs less well than the short form.
A query that names a company Search cannot identify is declined with a 422 rather than answered from other companies’ documents. Sending filters.identifiers resolves it.
Filter results
A filter is a constraint on which documents are searched. Nothing outside a filter is returned.Restrict to companies
filters.identifiers names the companies to search, by scheme: ticker or cik. A CIK may be sent without leading zeros. An identifier no listed company has is a 400 that names it.
Restrict by date
filters.date is a window on the day a document became public: after, before, or both, as ISO days. Both bounds are inclusive.
When the query names no year and the request sends no window, only the newest document of each company in scope is searched. A year in the query, or a date window, keeps every document inside it in scope. Use a window when the question is about a period: “every proxy since 2024” is "after": "2024-01-01".
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
}'
Output shape
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 below 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", "part": "1 of 2" }
}
],
"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 passages 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 passage that covers part of a table also carries part, for example "1 of 2". |
entities[] | The companies the result is about, with their cik and ticker. |
warnings[] | What a partial answer is missing. Present only when something is. |
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. |
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