REST API reference
Wisesheets Financial Data API
Standardized income statements, balance sheets, cash flow, and financial metrics for US stocks, sourced from SEC filings and built so every number can be traced back to XBRL.
Create a free account to get your API key.
Get your API keyUse with AI agents
Wisesheets ships a hosted MCP (Model Context Protocol) server, so AI agents and code editors that support MCP can pull financial data directly, no code required. Add the URL below as a custom connector or MCP server, then ask for company financials, prices, or metrics in plain language.
MCP server URL
https://mcp.wisesheets.io/v1/mcp?apikey=your_api_keyReplace your_api_key with your Wisesheets API key. Sign in to have it filled in automatically.
Add it to your agent
Every app calls this feature something slightly different, but the flow is the same: add a custom connector or MCP server that points at the URL above.
In Claude, look for Settings → Connectors.
- 1Open Settings → Connectors in Claude (web or desktop).
- 2Scroll to the bottom and click "Add custom connector".
- 3Enter Wisesheets as the name and paste the MCP server URL above (with your API key) as the Remote MCP server URL, then click Add.
- 4Click Connect on the connector, then enable it in a chat from the tools (+) menu.
Custom connectors are in beta and available on Free, Pro, Max, Team, and Enterprise (Free is limited to one). On Team and Enterprise, an Owner must first add the connector under Organization settings → Connectors before members can connect.
Custom connector and MCP support varies by app and plan. If your agent doesn't support remote MCP servers yet, use the REST API instead.
Quick Start
The Wisesheets API is a standard REST API that authenticates with a Bearer token. The base URL is https://api.wisesheets.io/v1/. Every response follows the same envelope structure with a data array and a meta object, so you write your parsing logic once and reuse it across every endpoint. The examples below cover Python, JavaScript, cURL, and Google Sheets Apps Script.
1. Set your environment variable
export WISESHEETS_API_KEY="wsh_live_your_key_here"2. Make your first call
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/financials/?tickers=AAPL&metrics=revenue&period=latest",6 headers={"Authorization": f"Bearer {api_key}"},7)8data = resp.json()["data"][0]9print(f"{data['companyName']} revenue: {data['value']{"}"}")Authentication
Every request to the Wisesheets API requires a Bearer token passed in the Authorization header. Your API key is a secret, so store it in an environment variable or a secrets manager and read it at runtime. Keys are scoped to your account and plan, and you can inspect your current quota and capabilities at any time via the /v1/me/ endpoint.
# Good: key in an environment variable
curl "https://api.wisesheets.io/v1/financials/?tickers=AAPL&metrics=revenue" \
-H "Authorization: Bearer $WISESHEETS_API_KEY"
# Bad: key hardcoded in source
curl "https://api.wisesheets.io/v1/financials/?tickers=AAPL&metrics=revenue" \
-H "Authorization: Bearer wsh_live_abc123..."Ask your AI Assistant
“Store my Wisesheets API key in a .env file and read it from there in my script, don't paste the key directly into the code.”
Search Companies
GETThe discovery surface for every company the API covers. With no query it returns a deterministic, paginated listing of all filers. Pass q to match against ticker symbol, CIK, or company name using substring matching. Use it to power typeahead search in your application, resolve tickers from natural language, or explore which companies fall within a specific SIC industry code before you query their financials.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/companies/?q=apple&limit=2",6 headers={"Authorization": f"Bearer {api_key}"},7)8print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
Common parameters
Search by ticker, CIK, or company name. Use 2+ characters; 3+ enables broader name matching.
Rows per page. Defaults to 25; maximum is 100.
Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"data": [
{ "ticker": "AAPL", "cik": "0000320193", "name": "Apple Inc.", "exchange": "Nasdaq", "sic": "3571", "sicDescription": "Electronic Computers" },
{ "ticker": "APLE", "cik": "0001418121", "name": "Apple Hospitality REIT, Inc.", "exchange": "NYSE", "sic": "6798", "sicDescription": "Real Estate Investment Trusts" }
],
"meta": { "returned": 2, "nextCursor": "eyJvIjoyfQ" }
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Search Companies endpoint and summarize the result for me.”
Company Profile
GETReturns a reference profile for a single company. Pass a ticker symbol like AAPL or a 10-digit CIK. The API treats all-digit tokens as CIKs (left-padded to 10 digits) and everything else as a case-insensitive ticker. The response tells you which datasets are available for that company, which is useful for checking coverage before you build a workflow around a specific ticker.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/companies/AAPL",6 headers={"Authorization": f"Bearer {api_key}"},7)8print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
Common parameters
Ticker or CIK in the URL path. Tickers are case-insensitive; numeric values are treated as CIKs.
Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"data": {
"name": "Apple Inc.",
"ticker": "AAPL",
"cik": "0000320193",
"exchange": "Nasdaq",
"sic": "3571",
"sicDescription": "Electronic Computers",
"fiscalYearEnd": "0926",
"availableDatasets": ["financials", "filings"]
}
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Company Profile endpoint and summarize the result for me.”
EOD Prices
GETReturns persisted end-of-day price rows from the Wisesheets historical price store. Use period=latest for one row per ticker, period=last252d for a trailing trading-day window, period=2024-01-03 for a single date, or period=2024-01-01..2024-03-31 for a paginated date range. Values come back as strings to preserve DECIMAL/BIGINT precision, so parse them client-side. The GET variant resolves up to 25 tickers and 10,000 rows per request; for larger batches use the POST variant below. Date and date-range periods paginate via meta.nextCursor, while latest and trailing-day periods set meta.truncated when more rows exist than the limit.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/prices/eod?tickers=AAPL,MSFT&period=latest&fields=close,adjClose,volume",6 headers={"Authorization": f"Bearer {api_key}"},7)8print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
Common parameters
Ticker symbols to query, such as AAPL,MSFT. Separate multiple tickers with commas. Symbols are uppercased and de-duplicated; up to 25 per request.
Time selector. One of latest (most recent row per ticker), lastNd such as last252d (trailing N trading days, N up to 25,000), YYYY-MM-DD (a single date), or YYYY-MM-DD..YYYY-MM-DD (an inclusive date range). Future dates are rejected for exact-date and range periods.
Price fields to return, comma-separated. Allowed: open, low, high, close, adjClose, volume, unadjustedVolume, change, changePercent, vwap, changeOverTime, label, lastUpdated. Defaults to close,adjClose,volume. symbol and date are always included.
Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"data": [
{ "symbol": "AAPL", "date": "2024-03-28", "close": "171.48", "adjClose": "170.94", "volume": "65672690" }
],
"meta": {
"requested": {
"tickers": ["AAPL", "MSFT"],
"period": "2024-01-01..2024-03-31",
"fields": ["close", "adjClose", "volume"],
"order": "desc",
"includeLive": false
},
"returned": 1,
"nextCursor": "eyJ2IjoxLCJzIjoiQUFQTCIsImQiOiIyMDI0LTAzLTI3In0",
"truncated": false,
"missingSymbols": ["MSFT"]
}
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the EOD Prices endpoint and summarize the result for me.”
Batch EOD Prices
POSTThe same end-of-day price endpoint as the GET, with parameters sent in a JSON body. Use this for batch workflows: it resolves up to 250 tickers and 50,000 rows per request. The batch endpoint requires the bulk_access plan feature in addition to price_data. Pagination, period grammar, field selection, and the string-typed response values all behave exactly as in the GET variant.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.post(5 "https://api.wisesheets.io/v1/prices/eod",6 headers={"Authorization": f"Bearer {api_key}"},7 json={"tickers": ["AAPL", "MSFT", "GOOGL"], "period": "last252d", "fields": ["close", "adjClose", "volume"]},8)9print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
Body parameters
Ticker symbols to query, such as ["AAPL", "MSFT"]. Symbols are uppercased and de-duplicated; up to 250 per request.
Time selector. One of latest, lastNd such as last252d (trailing N trading days, N up to 25,000), YYYY-MM-DD, or YYYY-MM-DD..YYYY-MM-DD. Future dates are rejected for exact-date and range periods.
Price fields to return, such as ["open", "high", "low", "close", "volume"]. Allowed: open, low, high, close, adjClose, volume, unadjustedVolume, change, changePercent, vwap, changeOverTime, label, lastUpdated. Defaults to ["close", "adjClose", "volume"]. symbol and date are always included.
{
"tickers": [
"AAPL",
"MSFT",
"GOOGL"
],
"period": "last252d",
"fields": [
"close",
"adjClose",
"volume"
]
}Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"data": [
{ "symbol": "AAPL", "date": "2024-03-28", "close": "171.48", "adjClose": "170.94", "volume": "65672690" }
],
"meta": {
"requested": {
"tickers": ["AAPL", "MSFT"],
"period": "2024-01-01..2024-03-31",
"fields": ["close", "adjClose", "volume"],
"order": "desc",
"includeLive": false
},
"returned": 1,
"nextCursor": "eyJ2IjoxLCJzIjoiQUFQTCIsImQiOiIyMDI0LTAzLTI3In0",
"truncated": false,
"missingSymbols": ["MSFT"]
}
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Batch EOD Prices endpoint and summarize the result for me.”
Query Financials
GETThe core endpoint. Returns standardized financial observations for one or more companies as (company, metric, period) tuples. Every value comes back as a decimal string with a source object that includes the XBRL tag, accession number, and filing date, so your application always knows exactly where a number came from. The GET variant resolves up to 100 tickers; for batch workflows across larger universes, use the POST variant below. Choose layout=long for time-series analysis, layout=wide to get a company per row with metrics as columns, or layout=grouped to get statements organized by period. The asReported flag lets you read raw XBRL facts before standardization.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/financials/?tickers=AAPL&metrics=revenue&period=latest",6 headers={"Authorization": f"Bearer {api_key}"},7)8print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
Common parameters
Ticker symbols to query, such as AAPL or MSFT. Separate multiple tickers with commas. Required unless you provide ciks or sic.
Metric keys to return, such as revenue,net_income,gross_margin. Use /v1/metrics to discover valid keys.
Periods to return. Examples: latest, last5y, last8q, FY2024, Q3-2025, 2021..2025, 2024-09-30, or asof:2024-12-31. Default is latest.
Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"data": [
{
"cik": "0000320193",
"ticker": "AAPL",
"companyName": "Apple Inc.",
"metric": "revenue",
"periodEnd": "2025-09-27",
"fiscalYear": 2025,
"fiscalPeriod": "FY",
"value": "416161000000",
"unit": "USD",
"source": {
"kind": "reported",
"tag": "RevenueFromContractWithCustomerExcludingAssessedTax",
"taxonomy": "us-gaap",
"accession": "0000320193-25-000079",
"filingDate": "2025-10-31"
}
}
],
"meta": {
"requested": {
"tickers": ["AAPL"],
"metrics": ["revenue"],
"period": "latest",
"layout": "long",
"frequency": "annual",
"asReported": false
},
"returned": 1,
"missing": [],
"layout": "long",
"period": { "selector": "latest", "frequency": "annual" }
}
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Query Financials endpoint and summarize the result for me.”
Batch Financials
POSTThe same canonical observation endpoint as the GET, with parameters sent in a JSON body. Use this when you're working with more than 100 tickers or when URL length would otherwise be a constraint. The batch endpoint resolves up to 1,000 tickers per request, making it the right choice for full-universe screeners, sector-wide pulls, or any workflow that touches a large equity universe in one shot.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.post(5 "https://api.wisesheets.io/v1/financials/",6 headers={"Authorization": f"Bearer {api_key}"},7 json={"tickers": ["AAPL", "MSFT"], "metrics": ["revenue", "net_income"], "period": "last5y"},8)9print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
Body parameters
Ticker symbols to query, such as ["AAPL", "MSFT"]. Batch requests support up to 1,000 resolved companies. Required unless you provide ciks or sic.
Metric keys to return, such as ["revenue", "net_income"]. Use /v1/metrics to discover valid keys.
Periods to return. Examples: latest, last5y, last8q, FY2024, Q3-2025, 2021..2025, 2024-09-30, or asof:2024-12-31. Default is latest.
{
"tickers": [
"AAPL",
"MSFT"
],
"metrics": [
"revenue",
"net_income"
],
"period": "last5y",
"layout": "long"
}Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"data": [
{
"cik": "0000320193",
"ticker": "AAPL",
"companyName": "Apple Inc.",
"metric": "revenue",
"periodEnd": "2025-09-27",
"fiscalYear": 2025,
"fiscalPeriod": "FY",
"value": "416161000000",
"unit": "USD",
"source": {
"kind": "reported",
"tag": "RevenueFromContractWithCustomerExcludingAssessedTax",
"taxonomy": "us-gaap",
"accession": "0000320193-25-000079",
"filingDate": "2025-10-31"
}
}
],
"meta": {
"requested": {
"tickers": ["AAPL"],
"metrics": ["revenue"],
"period": "latest",
"layout": "long",
"frequency": "annual",
"asReported": false
},
"returned": 1,
"missing": [],
"layout": "long",
"period": { "selector": "latest", "frequency": "annual" }
}
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Batch Financials endpoint and summarize the result for me.”
Financial Statements
GETA convenience endpoint for the standard three-statement model. Pass a ticker and get back the income statement, balance sheet, and cash flow statement grouped by period, with line items ordered as they appear in the filing. Useful when you want the full statement structure rather than individual metrics, for example when building a financial model, populating a research template, or generating a company writeup. Missing line items are omitted rather than returned as nulls.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/statements/AAPL?frequency=annual&period=latest&statements=income_statement",6 headers={"Authorization": f"Bearer {api_key}"},7)8print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
Common parameters
Ticker or CIK in the URL path. Tickers are case-insensitive; numeric values are treated as CIKs.
Which statement sections to return. Use income_statement, balance_sheet, cash_flow, or comma-separated combinations. Omit to return all three.
Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"company": { "ticker": "AAPL", "cik": "0000320193", "name": "Apple Inc." },
"frequency": "annual",
"data": [
{
"period": { "label": "FY2025", "end": "2025-09-27" },
"filing": { "accessionNumber": "0000320193-25-000079", "filingDate": "2025-10-31" },
"statements": {
"income_statement": {
"lines": [
{ "metric": "revenue", "label": "Revenue", "value": "416161000000", "unit": "USD" },
{ "metric": "cost_of_revenue", "label": "Cost Of Revenue", "value": "220960000000", "unit": "USD" }
]
}
}
}
]
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Financial Statements endpoint and summarize the result for me.”
Metric Catalog
GETThe Wisesheets API standardizes 231 financial metrics across every company it covers, from revenue and net income to niche ratios like tangible book value per share and unlevered free cash flow. The /v1/metrics/ endpoint is the authoritative list of every metric key the API understands. Use it to discover available metrics, filter by statement type or unit type, populate a UI picker, or generate typed enums in your SDK. Pass ?metric=<key> to get a single entry with its full definition.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/metrics/?q=revenue",6 headers={"Authorization": f"Bearer {api_key}"},7)8print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
Common parameters
Search metric keys and labels by text, such as revenue or margin.
Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"data": [
{
"metric": "revenue",
"label": "Revenue",
"description": "Top-line revenue recognized in the period, after returns and allowances.",
"statements": ["income_statement"],
"unitType": "monetary",
"isCalculated": false,
"supportedFrequencies": ["annual", "quarterly"]
},
{
"metric": "net_income",
"label": "Net income",
"description": null,
"statements": ["income_statement"],
"unitType": "monetary",
"isCalculated": false,
"supportedFrequencies": ["annual", "quarterly"]
}
]
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Metric Catalog endpoint and summarize the result for me.”
Inspect API Key
GETReturns the authenticated caller's identity, key metadata, subscription status, effective plan (features, limits, capabilities), and current quota windows. Use it to confirm your key is valid, surface plan capabilities in a UI, and monitor remaining requests for the current minute and month before a reset. The quota counters are non-consuming, so calling this endpoint does not count against your limit.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/me/",6 headers={"Authorization": f"Bearer {api_key}"},7)8print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
This endpoint takes no parameters.
Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"user": {
"userId": "5f1c2c1e-3f8f-4f9a-9c0a-7c2b1d4e1f00",
"email": "you@example.com",
"stripeCustomerId": "cus_QzExampleCustomer"
},
"key": {
"apiKeyId": "b6c8a9d2-1e4f-4a3b-9c11-8d5e2a0fbc77",
"name": "Production key",
"status": "active",
"displayPrefix": "wsh_live_4f2",
"displaySuffix": "8f2a",
"expiresAt": null
},
"subscription": {
"status": "active",
"stripeSubscriptionId": "sub_1QzExampleSubscription"
},
"plan": {
"planCode": "pro",
"displayName": "Pro",
"stripeProductId": "prod_QzExamplePro",
"stripePriceId": "price_1QzExamplePro",
"features": {
"price_data": { "enabled": true, "value": null },
"dividends_data": { "enabled": true, "value": null },
"fundamentals": { "enabled": true, "value": null },
"key_metrics": { "enabled": true, "value": null },
"history_years": { "enabled": true, "value": 15 },
"bulk_access": { "enabled": true, "value": null }
},
"limits": {
"monthlyRequests": 80000,
"requestsPerMinute": 600,
"historyYears": 15
},
"capabilities": {
"bulkAccess": true,
"fullHistory": false,
"prioritySupport": false,
"commercialUse": false
}
},
"quota": {
"available": true,
"minute": { "limit": 600, "remaining": 598, "resetSeconds": 42 },
"month": { "limit": 80000, "remaining": 78760, "resetSeconds": 1247400 }
}
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Inspect API Key endpoint and summarize the result for me.”
Health Check
GETA liveness and data-freshness probe. Returns 200 when the API can reach its database and 503 otherwise. The dataFreshness field is the most recent filing date available across the dataset; data syncs within 15 minutes of a new filing. It's a useful signal for applications that care about data recency, like earnings reaction systems or filing monitors.
1import requests, os23api_key = os.environ["WISESHEETS_API_KEY"]4resp = requests.get(5 "https://api.wisesheets.io/v1/health/",6 headers={"Authorization": f"Bearer {api_key}"},7)8print(resp.json())Start with the common fields. Advanced parameters use API defaults until you open and edit them.
This endpoint takes no parameters.
Get an API key to run live requests
You can still review the example response below. Create a free key when you're ready to try this endpoint with real data.
{
"status": "ok",
"db": "ok",
"dataFreshness": "2026-06-08"
}Ask your AI Assistant
“Using the Wisesheets API with my key in .env, call the Health Check endpoint and summarize the result for me.”