Public fundamentals endpoints require an API key via x-api-key.
Insider and 13F endpoints use the same API-key model, while website login and billing flows use bearer auth separately.
The API is built for application reads, not raw SEC exploration.
The response surface stays stable while the meta object explains completeness, selection policy, sector-aware caveats, and delayed-disclosure expectations.
/v1/company/:symbol/fundamentals/latest Use this first for the best available current normalized company fundamentals row. /v1/company/:symbol/metrics/latest Use this for ratios, TTM values, and YoY outputs built from the strongest recent period. /v1/company/:symbol/insiders/transactions Use this for normalized insider activity from SEC ownership forms 3, 4, and 5. /v1/institutions/:managerCik/holdings/latest Use this for the latest quarterly 13F holdings snapshot for one manager CIK. /v1/institutions/holdings/latest?managerCiks=... Use this to fetch multiple manager-CIK 13F snapshots in one bulk API call. /account/me Use this for the account snapshot covering subscription, usage, and API keys. Public fundamentals endpoints require an API key via x-api-key.
Insider and 13F endpoints use the same API-key model, while website login and billing flows use bearer auth separately.
A lightweight machine-readable spec is available at /openapi.json.
It covers the current public fundamentals routes, auth schemes, stable error envelope, and the response meta contract.
Signup, create a bearer token, mint an API key, and call the SEC-derived API surface.
curl -X POST http://localhost:3001/auth/signup \
-H "content-type: application/json" \
-d '{"name":"Demo User","email":"demo@example.com","password":"supersecure"}'
curl -X POST http://localhost:3001/auth/login \
-H "content-type: application/json" \
-d '{"email":"demo@example.com","password":"supersecure"}'
curl -X POST http://localhost:3001/account/api-keys \
-H "authorization: Bearer YOUR_JWT" \
-H "content-type: application/json" \
-d '{"label":"Local dev"}'
curl http://localhost:3001/v1/company/AAPL/fundamentals/latest \
-H "x-api-key: YOUR_API_KEY" import requests
base_url = "http://localhost:3001"
signup = requests.post(
f"{base_url}/auth/signup",
json={
"name": "Demo User",
"email": "demo@example.com",
"password": "supersecure"
}
)
login = requests.post(
f"{base_url}/auth/login",
json={
"email": "demo@example.com",
"password": "supersecure"
}
)
jwt_token = login.json()["token"]
api_key_response = requests.post(
f"{base_url}/account/api-keys",
headers={"Authorization": f"Bearer {jwt_token}"},
json={"label": "Local dev"}
)
api_key = api_key_response.json()["apiKey"]
fundamentals = requests.get(
f"{base_url}/v1/company/AAPL/fundamentals/latest",
headers={"x-api-key": api_key}
)
print(fundamentals.json()) GET /v1/company/:symbol/fundamentals/latest
Returns the best available annual or quarterly fundamentals row for the symbol.
Selection prefers recent rows with more populated core statement fields.
{
"data": {
"symbol": "AAPL",
"periodType": "quarterly",
"fiscalYear": 2026,
"fiscalPeriod": "Q1",
"periodEnd": "2025-12-27",
"revenue": 143756000000,
"gross_profit": 69231000000,
"operating_income": 50852000000,
"net_income": 42097000000,
"operating_cash_flow": 53925000000,
"free_cash_flow": 51552000000
},
"meta": {
"coverage_class": "complete",
"completeness": "6/6",
"populated_fields": 6,
"total_fields": 6,
"missing_fields": [],
"notes": [
"Fundamentals are served from stored SEC-derived normalized data, not live SEC requests.",
"Null values usually mean the issuer did not expose a stable comparable fact for that period."
],
"selected_period_end": "2025-12-27",
"selected_period_type": "quarterly"
}
} GET /v1/company/:symbol/metrics/latest
Returns derived metrics from the richest recent period.
For financial institutions, the API stays on the latest period and suppresses ratios that are not meaningfully comparable.
{
"data": {
"symbol": "JPM",
"periodEnd": "2025-12-31",
"gross_margin": null,
"operating_margin": null,
"net_margin": 0.31268259,
"current_ratio": null,
"debt_to_equity": null,
"roa": 0.01289249,
"roe": 0.15740071,
"fcf_margin": null,
"ttm_revenue": null,
"ttm_net_income": null,
"revenue_yoy": 0.41766968,
"eps_yoy": 0.65591398,
"ocf_yoy": null
},
"meta": {
"coverage_class": "sector_limited",
"completeness": "5/13",
"populated_fields": 5,
"total_fields": 13,
"missing_fields": ["gross_margin", "operating_margin", "current_ratio", "debt_to_equity", "fcf_margin", "ttm_revenue", "ttm_net_income", "ocf_yoy"],
"notes": [
"Metrics may come from the richest recent period instead of the absolute newest row when that produces better TTM and YoY coverage.",
"Financial-institution issuers omit non-comparable ratios such as debt_to_equity, current_ratio, fcf_margin, and some TTM fields."
],
"selected_period_end": "2025-12-31",
"selected_period_type": "annual"
}
} GET /v1/company/:symbol/insiders/transactions
Returns normalized company-level insider activity from SEC ownership forms 3, 4, and 5.
Transaction rows keep the original SEC code while also classifying the action into buy, sell, award, exercise, or other.
{
"data": [
{
"symbol": "AAPL",
"accessionNo": "0000320193-26-000012",
"formType": "4",
"filingDate": "2026-02-03",
"reportingOwnerName": "Example Executive",
"transactionDate": "2026-01-31",
"transactionCode": "S",
"transactionType": "sell",
"shares": 12500,
"pricePerShare": 211.34
}
],
"meta": {
"count": 1,
"notes": [
"Insider transactions are normalized from SEC forms 3, 4, and 5.",
"The original SEC transaction code is retained alongside a friendlier transactionType classification."
]
}
} GET /v1/institutions/:managerCik/holdings/latest
Returns the latest quarterly 13F snapshot for a tracked institutional manager.
Bulk manager reads are also available with /v1/institutions/holdings/latest?managerCiks=0001067983,0001166559.
{
"data": [
{
"manager": {
"cik": "0001067983",
"managerName": "Berkshire Hathaway Inc.",
"filingCount": 12,
"latestReportPeriod": "2025-12-31"
},
"holdings": [
{
"managerCik": "0001067983",
"managerName": "Berkshire Hathaway Inc.",
"accessionNo": "0000950123-26-001234",
"filingDate": "2026-02-14",
"reportPeriod": "2025-12-31",
"issuerName": "APPLE INC",
"issuerSymbol": "AAPL",
"valueThousands": 71234567,
"shares": 300000000,
"sharesType": "SH"
}
]
}
],
"meta": {
"count": 1,
"notes": [
"13F holdings are quarterly institutional disclosures and should be treated as delayed snapshots.",
"Bulk 13F reads are grouped by manager CIK and should be queried by manager identity, not company symbol."
]
}
} coverage_class is a fast classification: complete, partial, or sector_limited.
completeness is a quick populated-field score for the relevant response category.
missing_fields lists null fields so clients can branch without hardcoding assumptions.
notes explains null semantics and sector-aware suppression behavior.
x-api-key is required on public API routes.
Free plan limits are currently 5 requests per minute and 100 per day.
Paid plan limits are currently 120 requests per minute and 10,000 per day.
Null does not usually mean the API failed.
It usually means the issuer did not expose a stable comparable SEC fact for that field and period.
Errors are returned as a stable JSON envelope.
{
"error": {
"code": "missing_api_key",
"message": "Provide an API key using the x-api-key header."
}
}
Common codes include missing_api_key, invalid_api_key, inactive_subscription,
rate_limit_exceeded, symbol_not_found, fundamentals_unavailable, and
validation_error.