Get SEC filings
curl --request GET \
--url https://api.financialdatasets.ai/filings \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/filings"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.financialdatasets.ai/filings', 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/filings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/filings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.financialdatasets.ai/filings")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/filings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"filings": [
{
"cik": 123,
"accession_number": "<string>",
"filing_type": "<string>",
"report_date": "2023-12-25",
"filing_date": "2023-12-25",
"ticker": "<string>",
"url": "<string>"
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "Not Found",
"message": "Ticker XXXX not found"
}SEC Filings
SEC Filings API (10-K, 10-Q, 8-K)
List the SEC filings (10-K, 10-Q, 8-K, and more) of 22,000+ US tickers, with 30+ years of history, updated in real time from SEC EDGAR.
GET
/
filings
Get SEC filings
curl --request GET \
--url https://api.financialdatasets.ai/filings \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/filings"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.financialdatasets.ai/filings', 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/filings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/filings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.financialdatasets.ai/filings")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/filings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"filings": [
{
"cik": 123,
"accession_number": "<string>",
"filing_type": "<string>",
"report_date": "2023-12-25",
"filing_date": "2023-12-25",
"ticker": "<string>",
"url": "<string>"
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "Not Found",
"message": "Ticker XXXX not found"
}Overview
The Financial Datasets SEC filings API lists every filing a US public company has submitted to the SEC, including 10-Ks, 10-Qs, and 8-Ks. It covers 22,000+ tickers with 30+ years of history, updated in real time, pulled directly from SEC EDGAR (data provenance). To get the text of one section, such as Item 1A Risk Factors or Item 7 MD&A, use the Items endpoint. You can call it as a REST endpoint with an API key, or from Claude, ChatGPT, Cursor, and other AI apps through the MCP server, or pay per request with x402. Pricing starts at $20. To get started, please create an account and grab your API key at financialdatasets.ai. You will use the API key to authenticate your API requests.Coverage
| Tickers | Years of Coverage | Updated |
|---|---|---|
| 22,000+ | 30+ years | Real-time |
Available Tickers
You can fetch a list of available tickers with aGET request to:
https://api.financialdatasets.ai/filings/tickers/
Available Filing Types
You can fetch a list of valid filing types with aGET request to:
https://api.financialdatasets.ai/filings/types/
Getting Started
There are only 3 steps for making a successful API call:- Add your API key to the header of the request as
X-API-KEY. - Add query params like
tickerto filter the data. - Execute the API request.
ticker in your query params.
Example
Filings
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set your query params
ticker = 'AAPL'
limit = 10
# create the URL
url = (
f'https://api.financialdatasets.ai/filings'
f'?ticker={ticker}'
f'&limit={limit}'
)
# make API request
response = requests.get(url, headers=headers)
# parse filings from the response
filings = response.json().get('filings')
Filtering by Filing Type
Use thefiling_type query param to filter filings.
- Single type:
?ticker=AAPL&filing_type=10-K - Multiple types: repeat the param (same pattern as multi-
itemfiltering), e.g.?ticker=AAPL&filing_type=10-Q&filing_type=10-K
FilingsWithMultipleTypes
import requests
headers = {"X-API-KEY": "your_api_key_here"}
url = "https://api.financialdatasets.ai/filings"
params = [
("ticker", "AAPL"),
("filing_type", "10-Q"),
("filing_type", "10-K"),
]
response = requests.get(url, headers=headers, params=params)
filings = response.json().get("filings")
FAQ
Which SEC forms are included?
Every filing the company submits to EDGAR, including 10-K, 10-Q, and 8-K. Usefiling_type to get one form, or repeat it to get several.
How fast do new filings show up?
New filings are added in real time.Can I get the text of a 10-K section?
Yes. The Items endpoint returns the raw text of an item from a 10-K, 10-Q, or 8-K, such as Item 1A Risk Factors or Item 7 MD&A, so you do not parse the full document.Can an AI agent use this data?
Yes. Claude, ChatGPT, Cursor, and other MCP clients reach it through the Financial Datasets MCP server. An agent with a wallet can also pay per request with x402, with no account.Authorizations
API key for authentication.
Query Parameters
The Central Index Key (CIK) of the company.
The ticker symbol.
Filter by one or more filing types. Repeat the query parameter to pass multiple values (e.g. filing_type=10-Q&filing_type=10-K).
Available options:
10-K, 10-Q, 8-K, 20-F, 6-K The maximum number of filings to return (default: 10). This is the total across all pages, not a page size: each page holds up to 10 records, linked by next_page_url.
Required range:
x >= 1Opaque pagination cursor from a previous response's next_page_url. When provided, all other query parameters are ignored: the cursor carries the original request's filters. Treat it as opaque; do not construct or modify it.