Filings
Overview
Corporate filings on both sides of the Pacific — SEC forms, A-share reports, inquiry letters, enforcement.
- status
- live
- document id
doc_ide.g.us:861838:0001104659-23-092550- citation
[8-K 0001104659-23-092550]- updated
- 2026-10
Common calls
Find filings
POST /v1/filings/search {"query": "CEO 辞职", "filters": {"market": "us", "event_types": "officer_director_change", "filed_year": {"gte": 2023}}}Read one filing
GET /v1/filings/read/us:861838:0001104659-23-092550Everything for one company
POST /v1/filings/search {"query": "*", "filters": {"cik": "861838"}}Search 10-Q quarterlies (Postgres layer)
POST /v1/filings/search {"query": "going concern liquidity", "filters": {"form": "10-Q"}}A company's latest quarterlies
POST /v1/filings/search {"query": "*", "filters": {"form": "10-Q", "cik": "320193"}, "sort": "date"}The fine print
- Fields differ by doc_family: event (8-K) has items / event_types / counterparties / amounts; periodic has main_business / segments / key_numbers; 10-Q quarterlies have mdna_drivers / liquidity / legal_updates / new_or_changed_risks / outlook; inquiry_letter has issues / deadline / has_reply; penalty has violation_types / facts / legal_basis / parties. Filter by doc_family before reading fields.
- The 104,690 10-Q quarterlies carry no vectors by design and live only in the Postgres layer: filtering on form=10-Q (or doc_family=periodic with market=us) routes the whole query there — lexical search, sort=date and day-precision filed_at ranges, but no semantic search. Every hit is tagged with its layer and the response says which layer answered.
- Lexical search in the Postgres layer also matches model-written retrieval keywords (kw_en / kw_zh, folded into the full-text index), so a Chinese query such as 持续经营 finds English going-concern language and synonyms absent from the source text. The trade-off: the score includes that contribution and the response does not distinguish a source-text match from a keyword-only match. The keywords themselves are not returned (the store marks them recall-only).
- Financial statements from 10-K / 20-F / 10-Q are not here — use XBRL; this corpus carries structured highlights only.
- Source documents are on NAS (raw_path in level=detail); the index holds no full text.
- The index holds no full text: level=full is not available yet (source documents are on NAS (raw_path); neither layer holds the body text, only structured highlights).
Search
POST
/v1/filings/searchHybrid retrieval, one card per hit. 2 credits. Free sample:
CEO resignation.Filter fields
| field | type · ops | meaning |
|---|---|---|
| market | keyword · equs · cn | Market |
| doc_family | keyword · eq anyevent · periodic · inquiry_letter · discipline · penalty · registration · ownership · proxy · announcement | Document family |
| form | keyword · eq any8-K · 6-K · 临时公告 · 10-Q · SC 13G/A · CORRESP … 47 values, /facets lists them all | Form / document type. 10-Q lives only in the Postgres layer (no vectors, by design); filtering on it routes the whole query there |
| filed_at | datetime · range | Filing date range (day precision; Postgres layer only, so it routes the query there) |
| filed_year | integer · eq range | Filing year, range |
| fiscal_year | integer · eq range | Fiscal year, range |
| event_types | keyword · eq any | 8-K event type (closed set, see facets) |
| report_kind | keyword · eq anyannual · semi · q1 · q3 | Periodic report kind |
15 more, all usable
| field | type · ops | meaning |
|---|---|---|
| items | keyword · eq any | 8-K item number, e.g. 5.02 |
| sic | keyword · eq any | SIC industry code |
| letter_kind | keyword · eq any关注函 · 年报问询函 · 重组问询函 · 监管函 · 其他问询函 | Inquiry-letter kind |
| exchange | keyword · eq anyszse · sse | Exchange |
| issue_categories | keyword · eq any | Inquiry focus (closed set of 16, see facets) |
| violation_types | keyword · eq any | Violation type (CSRC penalties, closed set of 11) |
| company_name | keyword · eq any | Company name (exact) |
| cik | keyword · eq any | EDGAR CIK |
| sec_code | keyword · eq any | A-share code |
| tickers | keyword · eq any | US tickers |
| counterparties | keyword · eq any | Counterparties (model-extracted) |
| risk_categories | keyword · eq any | Risk categories (from 10-K) |
| party_names | keyword · eq any | Parties named in penalty / discipline documents |
| has_reply | bool · eq | Inquiry letter has a reply |
| has_ban | bool · eq | Includes a market ban |
Parameters
| Parameter | Type | Description |
|---|---|---|
| query REQUIRED | string | 1–1000 characters. Or an array of up to 5 (batch; hits become results[]). |
| top_k | integer= 10 | 1–100. |
| fields | brief · head= brief | head costs one more credit and returns the head view per hit. |
| filters | json | Filter DSL object (see Getting started); declared fields are listed above. |
| mode | hybrid · dense · bm25= hybrid | Retrieval mode. Leave it out to use the first. |
| sort | relevance · date= relevance | Order of the hits. |
| offset | integer= 0 | Pagination. |
Example
{ "domain": "filings", "query": "…", "hits": [ { "id": "us:861838:0001104659-23-092550", "score": 0.83, "brief": { … } } ], "total": null, "coverage": …, "warnings": [],
"meta": { "request_id": "req_…", "credits": { "charged": 2, "balance": 1998, "pool": "allowance" }, "latency_ms": 41, "cached": false } } Two layers. 1,211,748 documents carry vectors; the store behind them holds 1,317,571. Hits carry
layer: index | pg — pg means the match was by words, not meaning — and coverage says which layer answered (answered_by) and why a fallback did not happen (no_fallback_because). Filters that only one layer has cannot be mixed; the 400 names which belongs where.Undeclared filter fields return 400 rather than being ignored silently. Filters combine with AND;
_or / _not are available.Read
GET
/v1/filings/read/{doc_id}Three depths.
detail is the default. Free sample: us:861838:0001104659-23-092550.Levels
| level | credits | returns |
|---|---|---|
| brief | 1 | Card: the fields needed to triage, same as in search hits |
| detail (default) | 2 | Every structured field (rule-derived plus model-generated; model fields are listed in _enrich.fields) |
| full | 5 | Full text (not available yet: source documents are on NAS (raw_path); neither layer holds the body text, only structured highlights) |
Parameters
| Parameter | Type | Description |
|---|---|---|
| doc_id (path) REQUIRED | string | Document id (doc_id). |
| level | brief · detail · full= detail | How deep to read. |
| format | json · md · html= json | Response shape. |
Example
{ "domain": "filings", "id": "us:861838:0001104659-23-092550", "level": "detail", "view": "head", "data": { … } | "text": "…", "token_count": 1834, "meta": { … } } The older
GET /v1/filings/doc/{id}?view=… still works.Read many
POST
/v1/filings/readUp to 50 ids, one level. Missing ids come back with
error: "not_found" and are not charged.Parameters
| Parameter | Type | Description |
|---|---|---|
| ids REQUIRED | string[] | Document ids. |
| level | brief · detail · full= detail | Level for every id. |
Example
{ "domain": "filings", "level": "detail", "docs": [ { "id": "…", "data": { … } }, { "id": "…", "error": "not_found" } ], "meta": { … } } Facets
GET
/v1/filings/facets?field={field}Legal values for a filter field, so an agent never guesses; precomputed fields carry counts, declared enums come without. Free, no key.
Parameters
| Parameter | Type | Description |
|---|---|---|
| field REQUIRED | enum · 10 | Filter field with facets. |
| limit | integer= 50 | Max values. |
Example
{ "domain": "filings", "field": "…", "values": [ { "value": "…", "count": 3120 } ], "meta": { … } } Askregistered key+ /stream
POST
/v1/filings/askAgentic Q&A over this domain: the model turns the question into filters plus keywords from the domain's own self-description, reads the hits and answers with [filings: ] citations; /stream is NDJSON with real token deltas.
effort low / medium / high = 50 / 100 / 200 credits. Append /stream for NDJSON; the first event is always billing. A failure before the first answer_delta is refunded.Parameters
| Parameter | Type | Description |
|---|---|---|
| query REQUIRED | string | 1–2000 characters. Be specific; ask for numbers if you want numbers. |
| effort | low · medium · high= low | Reading rounds, and the price: 50 / 100 / 200 credits. Your plan caps it. |
| verbose | bool= false | Include the tool-call trace (tool_call / tool_result / thinking events when streaming). |
| top_k | integer= 10 | Speculative prefetch size. |
| stream_answer | bool= true | Streaming only: false emits one answer event instead of deltas. |
| max_rounds | integer | 0–8, overrides the effort preset. |
| force_answer_after | number | Seconds; hard cutover into the answer phase. |
| max_answer_tokens | integer= 4096 | Hitting it sets answer_truncated. |
| language | string | Answer language; defaults to the query’s. |
Example
{ "answer": "… [8-K 0001104659-23-092550] …", "sources": [ … ], "stats": { "rounds": 1, "elapsed_s": 6.2, "answer_truncated": false }, "coverage"?: { … }, "meta": { "credits": { "charged": 50, … } } } Citations are real — every id in
answer exists in this domain (format [8-K 0001104659-23-092550]). sources is the retrieval set, not the citation list. answer_truncated means incomplete.