/api/v1/health Returns 200 with a database connectivity probe and data_as_of, the newest filing date in the dataset. Open (no key).
curl https://hachiquant.com/api/v1/health - 200 The service and its database pool are healthy.
The read-only Hachiquant API for programmatic access.
https://hachiquant.com/api/v1No key required — every endpoint is open. Anonymous calls are rate limited per IP.
60 requests per minute per IP. Over the limit returns 429 with Retry-After.
Each period's figures are as filed in that period's own report, so every value traces to one filing. When a later annual report restates a year, the earlier figures are not replaced; the statement endpoints (view=canonical) add the restated figures alongside, in a restatement object naming the report that restated them. With history=extended, the statement endpoints (view=canonical) and /metrics also return the years before a company’s earliest report, as printed in the five-year summary of later annual reports: headline figures only, each year labelled derived_from with the report it comes from.
Fixes we have made to the data are listed on the Data corrections page.
curl https://hachiquant.com/api/v1/companies/7203 | Price | Free. There is no paid plan and no key. |
|---|---|
| REST API rate limit | 60 requests per minute per IP; over it returns 429 with Retry-After. |
| MCP server rate limit | 300 requests per minute per IP, separate from the REST limit. |
| Page size | Up to 200 rows per list request; page with offset. |
| Coverage | About 4,000 listed Japanese companies, about 10 years of statements. |
| Freshness | Data refreshes daily; each data response carries X-Data-As-Of. |
Hachiquant is also a remote MCP server, with no key and no sign-in. Add the URL below as a custom connector in Claude or ChatGPT, or in any MCP client, and the assistant can search companies, read statements and ratios, and screen the market. Every figure keeps its source filing. The MCP server has its own limit: 300 requests per minute per IP.
https://hachiquant.com/mcp claude mcp add --transport http hachiquant https://hachiquant.com/mcp Liveness and machine-readable schema.
/api/v1/health Returns 200 with a database connectivity probe and data_as_of, the newest filing date in the dataset. Open (no key).
curl https://hachiquant.com/api/v1/health /api/v1/openapi.json Returns the OpenAPI 3.1 schema you are reading. Open (no key).
curl https://hachiquant.com/api/v1/openapi.json Search and company identity.
/api/v1/companies Free-text search over securities code and JP/EN name. Matching is Unicode-normalized on both sides (NFKC + case folding, hiragana folded to katakana, whitespace and . , ・ ' - ignored), so full-width (MINKABU), half-width katakana (トヨタ), hiragana (とよた) and ideographic-space (株式会社 極洋) spellings all match; a former English name noted on the filing cover page stays matchable. Ranking: securities-code prefix, then exact name, then name prefix (a leading or trailing 株式会社 / (株) / 有限会社 / 合同会社 is ignored, so 日立 finds 株式会社日立製作所 as a prefix), then English acronym (the initials of the English name's words, legal forms skipped: mufg finds Mitsubishi UFJ Financial Group, jt Japan Tobacco), then substring; within each tier, companies still filing rank above ones with no filing in the 18 months before the newest filing (delisted, merged), then the larger company by revenue in its newest annual report (total assets when it states no revenue; so トヨタ or 日立 lands on the group flagship; companies stating neither rank after), then the shorter matching name, then the code.
| q | query | string | Securities code or name substring (JP or EN), any width. Empty q lists the universe, code-ordered. A q that normalizes to nothing (only separators) matches nothing. Longer than 200 characters returns 400. |
|---|---|---|---|
| limit | query | integer | Maximum rows (default 50, max 200; larger values are capped). Non-integer values return 400. |
| offset | query | integer | Rows to skip, for paging the full universe. Non-integer values return 400. |
curl https://hachiquant.com/api/v1/companies?q=toyota /api/v1/companies/{ticker} Identity and extended profile for a single company, resolved from its ticker. The identity is the filer of the code's newest filing (ties broken by submission time, then doc_id).
| ticker required | path | string | Securities code without the trailing check digit, e.g. 7203 for Toyota. The 5-character securities code (72030), a .T or .JP suffix, lowercase letters and full-width characters are normalized to it. Values containing control characters (e.g. an embedded percent-encoded NUL) return 400; any other value that does not normalize to four ASCII digits or uppercase letters returns 404. |
|---|
curl https://hachiquant.com/api/v1/companies/7203 Statements, filings, and raw XBRL facts.
/api/v1/line-items Every canonical statement line in display order, with its labels, role, section and the XBRL elements that satisfy it. The layout that view=canonical statements are placed on by key: a line a filing does not report is absent from that period's lines but present here. Static data; open (no key).
curl https://hachiquant.com/api/v1/line-items /api/v1/companies/{ticker}/income-statements Period-by-period income statements, newest first. Each period carries its raw XBRL records, or with view=canonical its canonical lines.
| ticker required | path | string | Securities code without the trailing check digit, e.g. 7203 for Toyota. The 5-character securities code (72030), a .T or .JP suffix, lowercase letters and full-width characters are normalized to it. Values containing control characters (e.g. an embedded percent-encoded NUL) return 400; any other value that does not normalize to four ASCII digits or uppercase letters returns 404. |
|---|---|---|---|
| view | query | canonical | canonical returns each period's canonical line items (lines, plus basis) in place of its raw XBRL records: the normalized statement the web financials page renders, resolved within one consolidation scope. An annual period that the next annual report restates also carries that report's figures under restatement. Any other value returns 400. |
| history | query | extended | extended also returns the years before the company's earliest served period, as printed in the five-year summary (主要な経営指標等の推移) of its later annual reports: usually four more fiscal years (FY2012–FY2015 for a company whose first stored annual report is FY2016). They follow the served periods, newest first, and each carries derived_from naming the report it was printed in. Each year comes from the newest annual report that prints it (a later restatement of a summary figure wins), in one consolidation scope (consolidated when the summary prints consolidated figures, else parent-only), one reporting standard and one currency, decided for that year. Only the headline lines a summary prints are present (revenue or a bank's ordinary revenue, ordinary or pre-tax income, net income, comprehensive income, total assets, net assets or owners' equity, the three cash-flow totals and cash); on /metrics, only the roe, equity_ratio, eps and bvps it prints, every other metric null with five_year_summary. A derived year repeats its source report's doc_id (that report's own period is in the same response), so key periods by doc_id and period_end together, or check derived_from. Derived years exist only where the source summary facts carry their context dates (every report sampled from 2016 on does); none precede a company's first fiscal period, and a stub year under 181 days is left out. On the statement endpoints it requires view=canonical. Without it, responses are unchanged. Any other value returns 400. |
curl https://hachiquant.com/api/v1/companies/7203/income-statements?view=canonical /api/v1/companies/{ticker}/balance-sheets Period-by-period balance sheets, newest first.
| ticker required | path | string | Securities code without the trailing check digit, e.g. 7203 for Toyota. The 5-character securities code (72030), a .T or .JP suffix, lowercase letters and full-width characters are normalized to it. Values containing control characters (e.g. an embedded percent-encoded NUL) return 400; any other value that does not normalize to four ASCII digits or uppercase letters returns 404. |
|---|---|---|---|
| view | query | canonical | canonical returns each period's canonical line items (lines, plus basis) in place of its raw XBRL records: the normalized statement the web financials page renders, resolved within one consolidation scope. An annual period that the next annual report restates also carries that report's figures under restatement. Any other value returns 400. |
| history | query | extended | extended also returns the years before the company's earliest served period, as printed in the five-year summary (主要な経営指標等の推移) of its later annual reports: usually four more fiscal years (FY2012–FY2015 for a company whose first stored annual report is FY2016). They follow the served periods, newest first, and each carries derived_from naming the report it was printed in. Each year comes from the newest annual report that prints it (a later restatement of a summary figure wins), in one consolidation scope (consolidated when the summary prints consolidated figures, else parent-only), one reporting standard and one currency, decided for that year. Only the headline lines a summary prints are present (revenue or a bank's ordinary revenue, ordinary or pre-tax income, net income, comprehensive income, total assets, net assets or owners' equity, the three cash-flow totals and cash); on /metrics, only the roe, equity_ratio, eps and bvps it prints, every other metric null with five_year_summary. A derived year repeats its source report's doc_id (that report's own period is in the same response), so key periods by doc_id and period_end together, or check derived_from. Derived years exist only where the source summary facts carry their context dates (every report sampled from 2016 on does); none precede a company's first fiscal period, and a stub year under 181 days is left out. On the statement endpoints it requires view=canonical. Without it, responses are unchanged. Any other value returns 400. |
curl https://hachiquant.com/api/v1/companies/7203/balance-sheets?view=canonical /api/v1/companies/{ticker}/cash-flow-statements Period-by-period cash flow statements, newest first.
| ticker required | path | string | Securities code without the trailing check digit, e.g. 7203 for Toyota. The 5-character securities code (72030), a .T or .JP suffix, lowercase letters and full-width characters are normalized to it. Values containing control characters (e.g. an embedded percent-encoded NUL) return 400; any other value that does not normalize to four ASCII digits or uppercase letters returns 404. |
|---|---|---|---|
| view | query | canonical | canonical returns each period's canonical line items (lines, plus basis) in place of its raw XBRL records: the normalized statement the web financials page renders, resolved within one consolidation scope. An annual period that the next annual report restates also carries that report's figures under restatement. Any other value returns 400. |
| history | query | extended | extended also returns the years before the company's earliest served period, as printed in the five-year summary (主要な経営指標等の推移) of its later annual reports: usually four more fiscal years (FY2012–FY2015 for a company whose first stored annual report is FY2016). They follow the served periods, newest first, and each carries derived_from naming the report it was printed in. Each year comes from the newest annual report that prints it (a later restatement of a summary figure wins), in one consolidation scope (consolidated when the summary prints consolidated figures, else parent-only), one reporting standard and one currency, decided for that year. Only the headline lines a summary prints are present (revenue or a bank's ordinary revenue, ordinary or pre-tax income, net income, comprehensive income, total assets, net assets or owners' equity, the three cash-flow totals and cash); on /metrics, only the roe, equity_ratio, eps and bvps it prints, every other metric null with five_year_summary. A derived year repeats its source report's doc_id (that report's own period is in the same response), so key periods by doc_id and period_end together, or check derived_from. Derived years exist only where the source summary facts carry their context dates (every report sampled from 2016 on does); none precede a company's first fiscal period, and a stub year under 181 days is left out. On the statement endpoints it requires view=canonical. Without it, responses are unchanged. Any other value returns 400. |
curl https://hachiquant.com/api/v1/companies/7203/cash-flow-statements?view=canonical /api/v1/companies/{ticker}/filings Filing (document) metadata for a company, so consumers can reach the original filing (by doc_id). Also available at /documents. Newest first: by filing date, then submission time, then doc_id, so same-day filings keep a stable order. By default every stored document type is listed except quarterly-report amendments (150) that no statement serves; a 150 that is its period's served filing (the doc_id the statements and metrics cite) is listed too. doc_type selects types explicitly (including every 150). Withdrawn documents are listed with their withdrawal_status. quarter and fiscal_year place each filing in the company's own fiscal calendar, exactly as the statement endpoints do.
| ticker required | path | string | Securities code without the trailing check digit, e.g. 7203 for Toyota. The 5-character securities code (72030), a .T or .JP suffix, lowercase letters and full-width characters are normalized to it. Values containing control characters (e.g. an embedded percent-encoded NUL) return 400; any other value that does not normalize to four ASCII digits or uppercase letters returns 404. |
|---|---|---|---|
| doc_type | query | string | Comma-separated document type codes to keep, e.g. 120,130. Entries that are not three digits return 400. |
| from | query | string | Earliest filing date (date), inclusive, YYYY-MM-DD. Invalid dates return 400. |
| to | query | string | Latest filing date (date), inclusive, YYYY-MM-DD. Invalid dates return 400. |
| limit | query | integer | Maximum rows; absent returns every match. Non-integer values return 400. |
| offset | query | integer | Matches to skip. Non-integer values return 400. |
curl https://hachiquant.com/api/v1/companies/7203/filings /api/v1/companies/{ticker}/document-data Raw parsed XBRL facts (power/debug use, and the way to verify a figure against its filing). With doc_id, every fact of that one filing, whatever its document type — annual (120), semi-annual (160), amendments. Without doc_id, every fact of the company's legacy quarterly reports (140) only: quarterly reports stopped being filed in April 2024, so the default is empty for annual-only or newer filers. A filing under non-disclosure (disclosure_status 2) yields no facts (200 []): the official disclosure shows only a notice for it.
| ticker required | path | string | Securities code without the trailing check digit, e.g. 7203 for Toyota. The 5-character securities code (72030), a .T or .JP suffix, lowercase letters and full-width characters are normalized to it. Values containing control characters (e.g. an embedded percent-encoded NUL) return 400; any other value that does not normalize to four ASCII digits or uppercase letters returns 404. |
|---|---|---|---|
| doc_id | query | string | A doc_id from /filings (e.g. S100Y8NY). A doc_id that is not one of this company's filings — unknown, or another company's — returns 404. |
curl https://hachiquant.com/api/v1/companies/7203/document-data?doc_id=S100Y8NY Computed ratios and the fundamental valuation block.
/api/v1/companies/{ticker}/metrics Trimmed-core fundamental metrics for every reporting period, newest first. Ratios are decimals (0.18 = 18%) and current_ratio is a multiple; eps and bvps are per-share amounts and fcf an amount in base units, all in the period's currency. A metric that cannot be computed is null, and null_reasons says why: an input not reported, a zero denominator, a change of standard, scope or currency against the prior year, and more.
| ticker required | path | string | Securities code without the trailing check digit, e.g. 7203 for Toyota. The 5-character securities code (72030), a .T or .JP suffix, lowercase letters and full-width characters are normalized to it. Values containing control characters (e.g. an embedded percent-encoded NUL) return 400; any other value that does not normalize to four ASCII digits or uppercase letters returns 404. |
|---|---|---|---|
| history | query | extended | extended also returns the years before the company's earliest served period, as printed in the five-year summary (主要な経営指標等の推移) of its later annual reports: usually four more fiscal years (FY2012–FY2015 for a company whose first stored annual report is FY2016). They follow the served periods, newest first, and each carries derived_from naming the report it was printed in. Each year comes from the newest annual report that prints it (a later restatement of a summary figure wins), in one consolidation scope (consolidated when the summary prints consolidated figures, else parent-only), one reporting standard and one currency, decided for that year. Only the headline lines a summary prints are present (revenue or a bank's ordinary revenue, ordinary or pre-tax income, net income, comprehensive income, total assets, net assets or owners' equity, the three cash-flow totals and cash); on /metrics, only the roe, equity_ratio, eps and bvps it prints, every other metric null with five_year_summary. A derived year repeats its source report's doc_id (that report's own period is in the same response), so key periods by doc_id and period_end together, or check derived_from. Derived years exist only where the source summary facts carry their context dates (every report sampled from 2016 on does); none precede a company's first fiscal period, and a stub year under 181 days is left out. On the statement endpoints it requires view=canonical. Without it, responses are unchanged. Any other value returns 400. |
curl https://hachiquant.com/api/v1/companies/7203/metrics /api/v1/companies/{ticker}/valuation The fundamental valuation block (quality / return / leverage metrics) for the latest period, or the trailing-twelve-month window with ?ttm=true. The latest annual is never a stub annual shorter than 181 days (e.g. an eight-day final report); such a period stays in /metrics. Market multiples (P/E, EV/EBITDA, …) are omitted until the market-price source lands. On the latest annual, industry_percentiles ranks the company within its TSE 33 industry on eight ratios (rank, peer count n and top_pct), omitting a metric with fewer than 10 peers. The response is a single object, so a known company with no computable period is a 404 with message No financial data for ticker … (No annual data to anchor TTM for ticker … with ttm), while an unknown ticker is No company for ticker …; GET /companies/{ticker} tells the two apart.
| ticker required | path | string | Securities code without the trailing check digit, e.g. 7203 for Toyota. The 5-character securities code (72030), a .T or .JP suffix, lowercase letters and full-width characters are normalized to it. Values containing control characters (e.g. an embedded percent-encoded NUL) return 400; any other value that does not normalize to four ASCII digits or uppercase letters returns 404. |
|---|---|---|---|
| ttm | query | boolean | Return trailing-twelve-month metrics instead of the latest period's: the latest ~12-month annual plus the next fiscal year's interim minus the same interim a year earlier. When that window cannot be formed (no newer interim yet, as for a March year-end company until its half-year report), the response is the latest annual exactly as without ttm, labelled as itself with the same values and null_reasons (until 2026-10-12 its roe/roa were recomputed on closing balances and its eps, bvps and growth were null), but never with industry_percentiles. A flow the annual reports but the interim pair does not is left out of the window, and a metric null for that reason says interim_not_reported. Values other than true/false return 400. |
curl https://hachiquant.com/api/v1/companies/7203/valuation Rank the universe by fundamental metrics.
/api/v1/screener Ranks companies by each company's latest annual values from the precomputed metrics (refreshed daily). Freshness: by default a company whose filing_status is no_longer_filing (no original annual, quarterly or semi-annual report for more than 548 days before the newest one in the data; the same rule as /companies) is left out; include_stale=true keeps them. Listed investment vehicles (J-REITs, ETFs and other funds filing under ordinance 030; entity_type: investment_vehicle on /companies) are always left out, since corporate ratios do not apply to them; they stay in search and on their own company pages. Before 2026-10 this was a 730-day rule on the latest annual period_end. The latest annual is the same period /valuation serves: the newest full-length annual period (a stub annual shorter than 181 days never counts), with whatever metrics it has, possibly none (the row then has empty metrics). Filters: add <metric>_min and/or <metric>_max query parameters (e.g. roe_min=0.1, equity_ratio_max=0.8). A company must report every filtered metric to match. Valid metric keys: gross_margin, operating_margin, net_margin, roe, roa, revenue_growth, eps, eps_growth, current_ratio, equity_ratio, bvps, fcf. Non-numeric (or NaN) bounds and non-integer limit/offset return 400. An unrecognized sort key falls back to ticker order, and any order other than asc sorts descending. Industry: industry=3700 or industry=transportation-equipment keeps one TSE 33 sector's companies: the rows whose industry object has that code or slug (the 33 values are listed in the Industry schema). The sector's English or Japanese name also works (Transportation Equipment, 輸送用機器); slugs and English names match in any case. total counts the matches, and the filter combines with the bounds, sort, paging and include_stale. One value per request: a repeated industry, or a value that names no sector, returns 400 listing the 33 slugs. Companies without a sector (industry: null) never match.
| roe_min | query | number | Example lower bound. The same <metric>_min / <metric>_max pattern works for every metric key (see description). A bound on any other name (a misspelling such as roe_minimum, or an unserved metric such as per_min) is ignored without error, like any unknown query parameter; the response does not echo the filters it applied. |
|---|---|---|---|
| roe_max | query | number | Example upper bound. |
| sort | query | gross_margin | operating_margin | net_margin | roe | roa | revenue_growth | eps | eps_growth | current_ratio | equity_ratio | bvps | fcf | Metric key to order by; omit to order by ticker. A key outside this list is ignored without error and the results come back in ticker order; the response does not echo the sort it applied. |
| order | query | asc | desc | Sort direction. Any value other than asc sorts descending. |
| limit | query | integer | Maximum rows (default 50, max 200; larger values are capped). Non-integer values return 400. |
| offset | query | integer | Rows to skip. Non-integer values return 400. |
| include_stale | query | boolean | true keeps companies that are no longer filing (filing_status: no_longer_filing; see Freshness). Values other than true/false return 400. |
| industry | query | string | TSE 33 sector to keep: its four-digit code (3700), slug (transportation-equipment) or name (Transportation Equipment, 輸送用機器). Surrounding spaces are ignored; slugs and English names match in any case. The industry object serves the code and slug, and the Industry schema lists all 33. One value per request: repeating the parameter, or a value that names no sector, returns 400 listing the slugs. |
curl https://hachiquant.com/api/v1/screener /api/v1/industries The 33 TSE industry sectors in sector-code order (since 2026-10-09), each with its code, slug and English and Japanese names (as in the Industry schema), the number of companies it has in the screener's default universe, and the quartiles of the eight ranking metrics across those companies. Companies: the screener's default universe: currently filing operating companies (not no_longer_filing, no investment vehicles), each on its latest full-length annual. companies equals the screener's total for industry=<code> without include_stale; a company without a sector is in no industry. A sector with no such company is still listed, with 0. Quartiles: for each of roe, roa, net_margin, operating_margin, gross_margin, equity_ratio, revenue_growth and eps_growth, the 25th percentile, median and 75th percentile of the sector's companies that have a value, by linear interpolation between the closest ranks (the method of NumPy's default and Excel's PERCENTILE.INC), with n, the companies counted. A metric with fewer than 10 values is omitted, the same rule as industry_percentiles on /valuation, whose n it matches. Computed from the daily precomputed metrics, so it changes when they do. Takes no parameters.
curl https://hachiquant.com/api/v1/industries Changes within /api/v1 are additive; a breaking change ships under a new version.