Read the primary source text
read_primary_textRead the FULL TEXT of filings and announcements — with proof links and a knowledge cutoff.
★ NOT `search_filings`. That one ranks passages by similarity and hands you fragments; this hands
you whole documents so you can read what was actually said and where it sat in the filing.
Similarity is not importance, and a fragment cannot show you its own context.
★ POINT-IN-TIME: pass `as_of` (YYYY-MM-DD). The cutoff is applied in SQL on the source's declared
knowledge-time column BEFORE the row limit, so a bounded read is a true prefix of what was
knowable, not a random subset of it. **Without `as_of` the read is NOT point-in-time** and says
so in `warnings`.
★ NO SENTIMENT, NO SCORES — deliberately. Judging the text is your job. A stored score is one
model's output on one day; after that model changes, the stale number still sits in the table
looking exactly like a fresh one.
★ READ `corpus_reality` BEFORE CONCLUDING ANYTHING. The full-text corpus is SMALL and the
response says how small. One source carries ~1M rows of TITLES ONLY — a large row count there is
breadth, not depth, and "what did they say about it" is not answerable from titles.
★ A ticker that returns nothing appears in `coverage.missing`. That means nothing is held for it
under those filters — NOT that the company disclosed nothing. Do not fill the gap.
Args:
source: which corpus, e.g. 'announcements_fulltext' or 'mops_major_event'.
tickers: restrict to these codes, e.g. ['2330'].
as_of: knowledge cutoff (YYYY-MM-DD).
since: optional lower bound on the same knowledge-time column.
limit: max documents (these are whole documents; keep it small).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ||
| limit | No | ||
| since | No | ||
| source | Yes | ||
| tickers | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||