Company Financials API
Company financial data from official filings: 2.75 million entities in eight markets, most of them private companies. Every figure is stored as first reported and keyed to the date its filing became public. REST in, JSON or CSV out, from curl, Python or an AI agent.
Authentication
Send a key as a bearer token.
curl "https://www.tradingagentapp.com/api/v1/fundamentals?ticker=AAPL" \
-H "Authorization: Bearer ta_live_xxxxxxxx"- Demo key: literally the word
demo. Every company in the warehouse at its most recent reported fiscal year, all fields, at the demo limits below. No signup. - Evaluation key: 30 days for a work email. Full history including
as_of, up to 1,000 entities, a daily cap, no bulk files, for internal evaluation only, one key per email domain, under an electronically signed Evaluation Order Form. Free-mail addresses get the standard free key. Get an evaluation key. - Your own key: created at /account/api-keys. Full history and
as_ofneed a Personal or Commercial data licence, which the research app's plans do not include; bulk files come with the Redistribution Licence and, where the Order Form says so, OEM. Plans and licences: /fundamentals.
Free Data (the demo key, free keys, the sample file, the data pages and per-company downloads) is supplied under the Free Licence; using it means you accept that licence. Free and demo responses say so in their licence field.
Rate limits
These are the published rate limits the licence documents refer to (Data Terms clause 22.6). A request over a limit gets HTTP 429 with Retry-After and X-RateLimit-* headers. We do not lower a paid tier's limit during a period already paid for. Whole-market bulk files are cheaper than paging the API.
| Demo key (demo) | 60 requests a minute and 2,000 a day, per IP address |
| Free key | 120 a minute and 5,000 a day, per key |
| Evaluation key (30 days) | 120 a minute and 2,000 a day, per key; each call can return a company's full history and every as_of date |
| Name search (/api/search, no key) | 120 a minute and 3,000 a day, per IP address |
| Per-company downloads (data pages) | the limits of your account's tier, counted per IP address; signed out, the free-key limits |
| Personal Licence | 300 a minute, per key; no daily cap |
| Commercial Licence | 1,000 a minute, per key; no daily cap |
| Redistribution Licence | 3,000 a minute, per key; no daily cap |
| OEM Agreement | 3,000 a minute, per key, unless the Order Form states another limit |
GET /api/v1/fundamentals
Annual accounts and financial statements from official filings: France (INPI, 1,486,844 companies with filings from 2012, mostly private), Belgium (National Bank of Belgium, 673,826 companies, statutory accounts from April 2022), Denmark (Danish Business Authority, 549,076 companies, published annual reports), Japan (FSA EDINET, 4,960 filers of an annual securities report, listed and unlisted, from 2016), New Zealand registered charities (Charities Register), and listed issuers from US SEC EDGAR (annual and quarterly, from 2014), Taiwan TWSE and Korea OpenDART. Every figure is as first reported, keyed by its filing date: query with as_of and you get only filings dated on or before that day. A later restatement never overwrites an earlier figure (Korea is an exception being fixed: see the methodology). Many Belgian and Danish filers publish gross profit rather than turnover, so revenue is sparse there; each market's manifest states its reporting basis and the methodology gives fill rates.
# works right now: public demo key, no signup
curl "https://www.tradingagentapp.com/api/v1/fundamentals?ticker=2330.TW" \
-H "Authorization: Bearer demo"
# a private French company, by SIREN
curl "https://www.tradingagentapp.com/api/v1/fundamentals?ticker=387949530.FR&view=latest" \
-H "Authorization: Bearer demo"
# what was public on 2022-01-01 (full history: see Authentication)
curl "https://www.tradingagentapp.com/api/v1/fundamentals?ticker=AAPL&as_of=2022-01-01&view=latest" \
-H "Authorization: Bearer ta_live_xxxxxxxx"| ticker | the entity's ID: see ID formats below (AAPL, E01766.JP, 387949530.FR …). Omit for the coverage index (markets, tickers, manifests). |
| as_of | ISO date: point-in-time cutoff, only rows with filed <= as_of. Default today. |
| view | history (default) or latest (one row per metric: the as-of snapshot). |
ID formats
Every entity is addressed by its register's own identifier with a market suffix. Send it as ticker; every row carries it back as ticker, with the register's raw identifier as issuer_id.
| Market | ID to send | Example | Notes |
|---|---|---|---|
| United States | ticker symbol | AAPL | SEC filers. issuer_id in each row is the CIK. |
| Japan | EDINET code + .JP | E01766.JP | E and five digits. Every filer of an annual securities report has one, listed or not. Names are in Japanese, as filed. |
| Korea | KRX stock code + .KS (KOSPI) or .KQ (KOSDAQ) | 005930.KS | Listed companies, annual. issuer_id is the OpenDART corp_code (8 digits), which the coverage check also takes. |
| Taiwan | TWSE stock code + .TW | 2330.TW | Listed companies. filed is the statutory deadline for the period. |
| France | SIREN + .FR | 387949530.FR | Nine digits, no spaces. |
| Belgium |
GET /api/search
Find an entity's ID from its name, symbol or registration number. No key; counted per IP address at the limits in the table above.
curl "https://www.tradingagentapp.com/api/search?q=solvay"
# {"results":[{"ticker":"0403091220.BE","name":"SOLVAY","market":"BE"}, …]}| q | a name, a symbol or a registration number; not case-sensitive. |
| results | up to 8 hits, each { ticker, name, market }. Pass ticker to /api/v1/fundamentals as it is. |
- Order: an exact ID first, then IDs that start with the query, then names that start with it, then names that contain it. At the same level a named entity comes before an unnamed one.
- A registration number (8 to 10 digits, with or without
.FR,.BEor.DK) is looked up directly and listed first. Here a Belgian number may be typed without its leading 0. - French, Belgian and Danish names are matched word by word, and every word you type must match: words under four characters as whole words (SAP, AXA), longer ones as the start of a word.
- Names are the register's own: Japanese and some Korean entities are named in their own script.
- The MCP server's
search_companiestool calls this endpoint.
Python — pip install pit-fundamentals
Zero-dependency package (pandas optional) with the demo key built in:
pip install pit-fundamentals
import pit_fundamentals as pf
rows = pf.fundamentals("2330.TW") # works instantly, demo key default
snap = pf.latest("AAPL", as_of="2022-01-01") # the point-in-time snapshot
# paid key: export PIT_FUNDAMENTALS_KEY=ta_live_… (code unchanged)MCP — npx pit-fundamentals-mcp
The same data as tools for an AI assistant or agent: search_companies, get_latest_fundamentals, get_fundamentals_history and get_coverage. Runs on the demo key with no signup.
claude mcp add pit-fundamentals -- npx -y pit-fundamentals-mcp
# your own key: set TRADINGAGENT_API_KEY in the server's envConfiguration for other clients: AI agents and platforms.
Notebooks — runnable on the demo key
Two worked examples, each runnable end-to-end with zero signup (open in Jupyter, VS Code, or Colab):
- The reporting-lag trap — why joining figures on period end, not filing date, lets later information into a historical study — measure the lag yourself
- Taiwan fundamentals in 5 minutes — TSMC point-in-time, and why Taiwan's single-quarter figures need no differencing
The API serves figures from official filings as they were first reported, with the date each became public and its source notice. It is data, not investment advice. The research app's own API (Quant plan) is documented separately: research app API.