API Documentation
One endpoint, one promise: ask what was knowable about a company on a date, and that's exactly — and only — what you get back.
Machine-readable: OpenAPI 3.1 spec — /openapi.json · live check: /status
Authentication
Send your API key with every request, either way:
x-api-key: tvd_your_key_here # or Authorization: Bearer tvd_your_key_here
Keys are issued on subscription and deactivated on cancellation. One key per subscription — don't share it. Two daily limits apply (5,000 requests, 2,500 distinct tickers) — see Limits.
GET/v1/fundamentals
Returns, for each concept, the most recent fiscal period whose 10-K had been filed on or before as_of — the point-in-time view. Note the boundary is inclusive: a 10-K filed on as_of itself counts as knowable that day (filings often land after market close — use the prior day if you need strict before-the-open semantics).
Query parameters
Response fields
Example
curl "https://tradevodata.com/v1/fundamentals?ticker=AAPL&as_of=2024-06-30&concept=Revenue" \ -H "x-api-key: tvd_your_key_here"
{
"ticker": "AAPL",
"as_of": "2024-06-30",
"data_through": "2026-07-24",
"count": 1,
"fundamentals": [{
"concept": "Revenue",
"fiscal_year": 2023,
"period_end": "2023-09-30",
"filed": "2023-11-03",
"lag_days": 34,
"value": 383285000000,
"latest_value": 383285000000,
"restated": false,
"qa_status": "clean"
}]
}Note the answer is FY2023, not FY2024 — on 2024-06-30 the FY2024 10-K had not been filed yet. That is the whole product.
Python
The official client. as_of is a requiredargument on every query — there is no way to ask it for “Apple's revenue”, only for what was knowable on a given date, which is how lookahead bias stops being something you can write by accident. Zero dependencies; pandas is optional.
pip install tradevodata
import tradevodata as tv
df = tv.sample() # free 40-company sample — no API key needed
client = tv.Client(api_key="tvd_...") # or set TRADEVODATA_API_KEY
client.fundamentals("AAPL", as_of="2024-06-30") # -> FY2023
client.snapshot(as_of="2024-06-30", concept="Revenue", to_pandas=True)Source: github.com/christianpichichero-max/tradevodata-py · PyPI
Note: as of June 2024, the newest knowable Apple annual revenue is FY2023 — FY2024 wasn't filed until 2024-11-01. That's the product.
Python (plain requests)
import requests
r = requests.get(
"https://tradevodata.com/v1/fundamentals",
params={"ticker": "AAPL", "as_of": "2024-06-30"},
headers={"x-api-key": "tvd_your_key_here"},
)
for f in r.json()["fundamentals"]:
print(f["concept"], f["value"], "known since", f["filed"])R
library(httr)
r <- GET(
"https://tradevodata.com/v1/fundamentals",
query = list(ticker = "AAPL", as_of = "2024-06-30"),
add_headers(`x-api-key` = "tvd_your_key_here")
)
for (f in content(r)$fundamentals) {
cat(f$concept, f$value, "known since", f$filed, "\n")
}Errors
An empty result with count: 0 and a note means the ticker exists but nothing had been filed on or before your as_of.
GET/v1/health
Public liveness check (no key needed): returns { ok, rows, db_ms }.
Limits
Two independent daily limits per key. Both reset at 00:00 UTC, and every 429 carries a Retry-After header with the seconds until reset.
The honest why: the dataset is the product. A real backtest touches a few hundred names; a full-universe scrape is all 5,193. The ticker cap sits between those two on purpose — it's an anti-bulk-extraction wall, not a revenue lever. For whole-universe work, don't fight the cap — use the bulk endpoints below (included in your plan).
Bulk & cross-section
For whole-universe work — cross-sectional screens, factor backtests — don't loop the per-ticker endpoint. Both are included in your $49/mo plan.
curl -H "x-api-key: tvd_..." https://tradevodata.com/v1/download -o tradevodata.csv.gz curl -H "x-api-key: tvd_..." "https://tradevodata.com/v1/snapshot?as_of=2024-06-30&concept=Revenue"
Coverage & semantics
- 5,193 US companies · 313,001 point-in-time rows · 7 concepts · up to 12 fiscal years.
- Annual data from 10-K and 10-K/A filings (SEC EDGAR XBRL). Quarterly is on the roadmap.
- filed is the earliest filing that reported the value — across synonym XBRL tags, so re-tagged values keep their true first-public date.
- Support: email us. Manage billing at /account.