AAPL.US; see Find and resolve symbols. Every endpoint that takes an instrument expects that form; FX, benchmark, leaderboard and cache-status reads take no symbol.
Quotes and prices
POST /symbols/quotes returns only quotes Itoflow already holds and leaves out symbols it has none for. A missing quote doesn’t mean the symbol is invalid.
For supported listing markets, the price reader uses FMP intraday bars. A latest
price comes from the newest completed one-minute bar available, with no extra
15-minute delay imposed by Itoflow. The provider’s feed may itself be delayed,
and a closed market may retain an earlier session’s price. The bar keeps its
actual source time; a successful fetch does not make an older price current.
The reader accepts bars within a 14-day lookup window. The last minute bar
can differ from the official daily closing price, including after the session
ends. Use daily history when you need the daily close.
Intraday history retains its requested interval and price and volume basis.
Each listing still needs a verified provider link; missing coverage remains
unavailable rather than switching providers.
Paper trades accept a positive converted price without checking whether its
source time belongs to the current session. A market whose feed has not
published today’s bars can therefore fill a paper trade at an earlier
session’s price. The trade records when it executes, which can be later than
the price observation. Check source time separately
when deciding whether an observation is suitable for a current-session trade.
For symbol cards, a name with no linked price history is unresolved; other names
can still return cards. Provider timeouts and connection or upstream faults follow
the read rule. If a second attempt fails without an answer
from the same provider since it began, the request fails. Overlapping final
attempts can instead return partial data. Eligible
public source replies can be shared across callers until their refresh deadline,
even if the original calculation failed. A cache hit does not certify identity,
coverage or point-in-time eligibility. Historical reads preserve the provider’s
row order and include announced future events within the requested window.
Each historical reader applies its own
cutoff and validates the records it consumes.
A quote’s price is in US dollars; native_price and currency give the price in the currency it trades in. Holdings and trades keep their own currency, and your display-currency setting doesn’t change it. Convert with the FX endpoints when you need to.
Daily history and corporate actions select a provider by the listing’s market
and the requested data. A listing needs a verified link to the provider’s exact
exchange, securities identifier, share class and quoted currency. Missing or
conflicting identity can leave that listing unavailable; an exchange appearing
in a provider directory does not prove full coverage. Pence (GBp/GBX), rand
cents (ZAc/ZAC) and agorot (ILA) retain their units in native daily prices
and dividends. Share volume counts shares and never scales with currency. Symbol discovery
uses the same units: a pence listing returns GBX, rather than GBP. The
exchange directory includes the markets served by these daily routes and the
four held German floors.
In markets that require ISIN evidence, Python and TypeScript discovery check the
exact provider profile when a search row lacks it, whether you search one market
or all markets. The profile must confirm the same listing, exchange and quoted
currency before the candidate or its currency can be used. Missing or conflicting
evidence leaves the candidate out. An older link missing that evidence cannot
supply daily prices.
Frankfurt (F), Dusseldorf (DU), Munich (MU) and Stuttgart (STU) keep
EODHD daily history and actions because FMP serves a different price stream
on those floors. FMP can restate earlier raw closes after rights issues,
spin-offs and demergers; its raw history may differ from prices recorded
before those events.
The leaderboard never shows whose strategy is whose; you can see only which rows are your own.
Historical index research
For a historical index in Chat, specify the listing market, selection dates, implementation lag, liquidity rule, weighting, costs and required files. For a thematic index, Chat builds a versioned, cited research universe, then applies dated listing, liquidity and capitalization rules at each rebalance. The report states the universe’s research date, discovery sources and hindsight limits. Current classifications can inform that research universe. Reconstructing how thematic membership changed over time is a separate method to request explicitly; a current description cannot establish past membership. SEC filing availability uses a stated proxy: the later of acceptance or 06:00 New York time on its official filing date. This excludes late submissions before their assigned day. Exact website-publication times are unavailable; the report states this timing limit. The US calendar uses NYSE session dates as an aggregate market convention. This does not assign NYSE identity to a Nasdaq or other US listing; primary listing and quoted-security identity need their own dated evidence. The historical dataset reader’sprice_session_coverage() checks retained bars
against the publication’s declared market calendar. It reports missing, extra
and duplicate sessions with source pins, separately from identity and action
qualification. Optional start and end dates restrict the check to an acquired
window. Calendar failures propagate; the check never fills missing bars or
upgrades the bundle’s other coverage. Calendar functions take platform market
codes such as US, rather than a provider’s venue labels.
For a verified same-security ticker change, historical acquisition queries each
FMP ticker within its effective date range. Raw bars retain one security ID,
the actual provider symbol and source pins. Matching identity and a unique dated
transition are required; an ambiguous change never fills an ended price series.
Check session coverage and corporate actions separately.
prepare_historical_equity_dataset reads a bundle from the shared market-data
cache and builds it in the Chat sandbox when the cache has none. A large request
takes minutes. Request smaller date windows with their decision cutoffs, retain
each bundle and reconcile overlapping observations. The function makes no
automatic retries or substitutions.
Strict historical calculations need validated datasets with dated identity,
prices, quoted-class shares and corporate-action terms. The library’s source
adapters own acquisition and validation; the agent must not fill missing
financial records with web search or hand-written observations. Missing data
can prevent an exact reconstruction. When the request allows estimates, use a
disclosed proxy with a dated source and test whether reasonable alternatives
change selection, weights or conclusions. Keep estimated results distinct from
observed facts.
Statement readers fill a blank reporting currency only when statement rows
available by that row’s own availability date agree on one whole-unit currency.
The read cutoff also applies. Later filings cannot supply or veto that currency.
A section-wide currency counts only through its dated rows. Subdivision units
such as pence can block agreement but never fill a blank. A stated currency
keeps its unit. Listing and price currencies do not fill statement gaps.
Ordinary shares outstanding and EPS weighted-average shares are different
inputs. Retain measurement time, actual publication time, accession and source.
An ADR price needs shares on that receipt’s quoted-unit basis. Current ticker
metadata cannot establish a retired security’s identity, and a named subset
does not establish a complete historical market universe. A successful source
request or a diagnostic coverage report does not establish a completed index.
Research qualifies each consumed input and can combine supported readers with
checked original documents. An incomplete bundle does not make every input
unavailable; unresolved facts still need evidence before dependent calculations.
Historical capitalization can use the latest actual share count published by
each cutoff, carried forward on the price’s physical share basis. Disclose its
measurement date, publication date, age and known intervening capital changes.
This estimates capitalization; it does not assert that the exact cutoff-day
count was public. Verified price history for the same identified security
establishes that it traded by that date, without a separate IPO-completion
announcement. Price history alone supplies neither share counts nor past
business eligibility.
The dated report reader selects original annual/interim or admission reports
known at each declared decision time and returns readable text with publication
times and source pins. It keeps retained amendments separately and removes
attributes and explicitly hidden markup. The underlying originals remain
available for source checks and event research. This aids business research;
it does not establish thematic eligibility or primary-listing history.
An eligible original interim remains readable when no earlier annual or
admission report exists. Its interim role does not imply complete business
history; assess whether its actual content supports the research decision.
Reports also retain unambiguous registered symbol, security title and exchange
facts from the same issuer and filing context in registered_securities.
Publication times and original source hashes remain attached. These records
support dated listing research; they do not certify a global primary venue,
continuous listing history or a binding to today’s identifier. Incomplete or
conflicting registration facts remain unqualified.
The library reads original SEC reports and their declared share-fact attachments.
Receipt conversion terms must appear in the report or its linked securities
exhibit. It retains separate sources for the share count and quoted-unit terms;
rounded share aggregates cannot establish a receipt ratio.
An inline cover count without a class dimension can qualify only when its own
explicit declaration identifies the registered class and agrees with the fact’s
date, issuer and share units. Nearby class names cannot qualify an aggregate.
This applies to common-stock titles with or without a lettered class; a cover’s
navigation link alone does not make the count a financial-statement fact.
Historical registered ticker/class counts remain available as separate source
observations. They require dated legal continuity evidence before research can
assign them to a current listing; a shared issuer alone does not prove that link.
Requests for documents and actions also retain original material-event filings
and their declared event exhibits, with source hashes and actual publication
times. Research can derive exact action terms from this governed corpus and
retain the supporting evidence. A price factor or an empty action table cannot
substitute for that evidence.
For a newly listed company with no annual report public at the decision cutoff,
the library can retain its final IPO prospectus or latest registration as dated
listing-admission research. Offering and pro-forma quantities remain research
evidence until actual issuance and quoted-class units have been established.
The research agent calls prepare_historical_equity_dataset with one US
listed company’s share, such as AAPL.US, and historical dates and decision
cutoffs; funds are out of scope. FMP’s profile fixes the listing’s identity, the library acquires fixed-source
evidence, and the agent receives a verified, versioned bundle. Bundles stay in
the shared cache for 72 hours under a daily write limit; once that limit is
reached, a new bundle stays in the calling process only. The function accepts no
financial observations or source URLs. A publication’s coverage describes its observed records;
estimated research must declare any additional proxy convention.
For several listings, acquisition can reuse a fresh market directory while
retaining its original source hashes and retrieval times. Each listing still
needs its own identity, price, report and event evidence. Directory reuse does
not establish historical eligibility.
The universe table also retains bounded current FMP descriptions, classifications
and listing flags as current_profile_observation rows. Their
current_discovery_only scope, retrieval time and source hash identify them as
discovery metadata; they do not prove past business or primary-listing status.
The same table retains paged FMP sector/industry/venue leads as
current_screen_observation rows alongside separate retired-directory leads.
Discovery does not filter by current market cap or issuer domicile.
The dated report and share-count readers validate the requested cutoff: a
missing early report or share fact does not hide usable later observations.
An unavailable requested cutoff still fails, and full-history coverage remains
unchanged.
overview() shows retained input counts and
coverage without dumping source documents. Exact request_id and bundle_id
properties pin later reads. The discovery_leads(), raw_price_observations()
and action_observations() views retain source fields and explicitly remain
observations. A failed convenience reader does not discard that acquired data.
Research must still qualify dated identity, currency, expected sessions and
physical action terms before using it in calculations; these views never promote
incomplete coverage or fill a missing price tape.
Historical index workflows can declare the acquisition or reader helper as the
source of their price, volume and fundamental inputs. The source declaration
identifies the route; the calculation must still qualify its consumed records.
A listing’s identity comes only from FMP’s exact profile for its ticker.
Caller-provided identity overrides are refused. When ISIN discovery returns several US quotations, an exact canonical ticker
still needs matching profile identity, currency and venue; a conflicting
profile cannot redirect the request to another quotation. For public fund
filings, an equity row in USD that has no usable listing keeps its stated
weight and its match failure: historical and retired US leads from its ISIN,
derived CUSIP or ticker are matched by listing currency and price. A row that
already names a USD listing keeps that listing unchanged. The match failure
remains part of the fund-book evidence rather than being treated as a zero
weight. A quarterly filing book with an unread line is not stored; the next run
reads that quarter again. Name-based recovery requires a readable share class
or series designator to match the candidate’s exactly. An explicit class,
cls or cl followed by an unreadable token (CLASS AA, CL.AA) leaves the row unresolved even when
a candidate’s price matches. series and ser are ordinary words unless a
readable designator follows (Series A, Series 2). A class word at the end
of a name (Share Class) states no designator.
For a retired quote with a missing price tail, a request can include the
aliases family. The library qualifies a forward ticker change
only when dated provider transitions and exact security, issuer, currency and
venue evidence agree. Alias rows retain effective dates and source identities.
Use those epochs with the normal price reader and raw units; a pure rename
changes neither shares nor cash. Ambiguous chains remain unresolved. Qualified
aliases alone do not establish historical primary status, legal action terms
or complete price-session coverage.
The normal dividend reader preserves declaration, record and payment dates
when supplied by the provider. An absent payment date does not imply payment
on the ex-date. For source reconciliation, requesting actions retains FMP’s original dividend
observations in the bundle’s universe table, including declaration, record and
payment dates when supplied. Qualify amounts against the exact quoted units
and currency, and keep receivables until the sourced payment date.
A corporate-action price factor does not always change the parent’s shares.
Spin-offs require separate child entitlements at the issuer’s stated ratio.
Historical portfolios should retain source evidence and reconcile physical
shares, cash, dividends, trades and fees. An index capped at each daily close
does not establish full UCITS or intraday compliance.
For capitalization weighting, the Chat library’s proportional_weights helper
preserves the actual positive market-cap amounts and supports proportional cap
redistribution. Score-ranking weights follow a different rule. Physical trades,
fees and daily compliance still require a portfolio replay.
These are Chat research capabilities, not a historical market-cap HTTP
endpoint. The quote and analytics routes below retain their stated contracts.
Symbol analytics
GET /symbols/analytics returns the analytics a research monitor computes before it writes a report, for any 1 to 12 symbols. You don’t need a monitor, and Itoflow saves nothing to one.
Symbol analytics is rolling out: until it is turned on for your account, this route returns 404.
A figure Itoflow can’t compute is left out or
null, never zero. Itoflow keeps each result for cache.ttl_seconds, so asking again within that time returns the same computed_at. It keeps no error, so the next request computes again.
Analyst views and forward valuation depend on the symbol’s data provider.
US listings and listings on LSE, XETRA, PA, AS, SW, TO, AU, OL, KO, KQ, SHE,
ST, CO, BR, MC, WAR and HE take point fundamentals, financial statements and
earnings from FMP. It states trailing figures and no analyst forecasts. For
those symbols analyst.covered is false with a note, and the forward P/E,
PEG ratio and target price are null. Itoflow never fills them with a trailing
figure or zero. Market-wide fundamentals snapshots and fund holdings keep
their existing routes.
SHG, TSX Venture (V), London IOB (IL) and Frankfurt (F) retain EODHD
fundamentals. A listing without a verified provider binding has no point
fundamentals; Itoflow reports them as not known. Non-US statement rows use
results-release dates when valid filing dates are absent; a period end alone
never establishes when the market could have known a figure.
When a symbol’s price history times out, loses its connection or meets an
upstream error that waiting may clear, Itoflow waits 5 seconds and reads again.
If it still fails, it waits 30 seconds and reads once more. An answer ends the
retries. If the last read still fails this way, Itoflow leaves the symbol
without volume figures only if the same provider answered another request
after that last read began.
snapshot.data_receipt names the unread symbol; other symbols keep their
figures. A failed last read without an answered request in that interval
fails the whole read. If several last reads overlap the provider’s last answer
before it stops responding, they can all be left out and the read can return
the rest. Rate limits, spent quotas, refused keys, unsupported routes,
unavailable snapshots, unknown faults and calendar faults still fail the read.
Daily factor fits and month-end fills fail before storing results when read
faults leave out more than 1% of the distinct names asked for prices or metadata.
Exactly 1% is allowed. Observed gaps, such as no coverage or no currency rate,
do not count. A failed fit keeps the last publication.
Factor-model publications and return receipts use Monday through Friday.
Daily fits and month-end fills remove weekend price bars before computing
returns, including listings without exchange metadata. A weekend session’s
move enters the return of the next weekday its venue trades. Historical
publications use the latest weekday price on or before the requested cutoff;
live publications use their latest weekday price.
A token with limited scopes, such as one issued to an AI agent, needs
symbols.read.
Factor-risk covariance
For a portfolio’s factor card and factor-risk read, an open holding with no current price is left out, with no value or weight; the rest use the net asset value without it, with amissing_price_symbols warning.
POST /factor-risk/covariance returns a covariance matrix for a set of symbols from Itoflow’s factor risk model, as it stood on a past date. It uses the model snapshot from that date, so you can use it in backtests. Check provenance.classification_inputs: when it is current_static, the sector and country labels are today’s rather than that date’s.
Country factors group companies by the provider’s stated country: EODHD gives
its listing venue’s country; FMP gives its head-office country. The separate
head-office country fact drives the oversight country split.
Adding that fact does not change any country-factor assignment.
Funds have no loadings of their own, so this endpoint refuses funds with status 422. For a book that holds funds, use risk measure (POST /risk/measure); it reads through their stored holdings.
Live model price inputs use completed venue sessions. A venue that is closed
for the day uses its last completed trading bar; an open session waits for
its close and closing auction. Historical requests retain their stated cutoff.
Before a fit reads returns, it drops zero-volume flat bars before a listing’s
first trade. This check affects new fits and later reads; it does not rewrite
stored publications. Daily venue limits are checked as described below.
Keep
snapshot_as_of and base_currency with any numbers you store. Don’t compare matrices from different dates or currencies.
To learn how the model works, read How we built a cross-asset factor risk model and how it compares with Barra.
Search stored news
GET /news searches the public news and SEC filings that Itoflow has stored. It returns headlines, links and ratings, not article text. Each call works in one of four ways:
- By query. With
q, Itoflow selects possible matches by similarity, then a model judges whether those candidates bear on your words, by meaning and in any language. Items without a vector also reach the judge. This can find items that never name the subject. Each row is a story: other matches that repeat it fold into it, andrepeatscounts them. Stories come most important first. The model judges the most important candidates first and stops once the rest could not change the rows, so a search can judge far fewer items than it selected. - By company. With
symbolsormonitor_id, a model first rates the window’s news for each company, counting news about its rivals, customers, suppliers, inputs and market. The call then returns the rated items, newest first. - As a list. With none of these, the call lists the stored items, newest first, and judges nothing.
- As stories. With
order=storiesororder=stories_newestand none ofq,symbolsormonitor_id, the call lists stories and judges nothing. Repeats fold into one row per story, shown by the story’s highest-impact article in the window. Withstories, stories come by the UTC day of their first report, newest first, then by impact, then bypublished_at. Withstories_newest, the same stories come by the shown row’spublished_atdescending, theniddescending. A story keeps the day of its first report, even when that report was stored before the window. With either story order,hide_commentary=truedrops stories whose shown row hasis_event_p < 0.5, before the call applieslimit; a row at exactly 0.5 stays.
coverage.complete says whether the reply is final: for companies, the model judged every selected candidate in the window; for a query, more judging could not change the rows. It does not mean every stored item reached the judge. Ratings for companies are kept, so a company search that stopped early goes further when you call again with the same input. A query search keeps nothing; call again with fewer days.
200 response, trimmed to one story without its url and publisher:
Results never name a monitor or its owner, and carry weights only for your own monitor through
monitor_id.
Itoflow keeps an item for 90 days when its impact is at least 2 or it rated the item notable or above for some company, and for 14 days otherwise. A minor company rating goes after 14 days.
A token with limited scopes, such as one issued to an AI agent, needs symbols.read. A monitor you don’t own returns 404, the same as a missing one. An invalid parameter returns 400; so does q with symbols or monitor_id (query_with_symbols), either story order with q, symbols or monitor_id (order_with_query), hide_commentary=true, country or sector without a story order (filter_without_stories), and q with more than 3 days (days_exceeds_query_window). When a model the search needs fails after its retries, the call returns 503 with news_judge_unavailable and no partial result; retry later.
See the market-data endpoint reference for every field.
Fund books used by risk measurement
Risk measurement asks the factor worker to score missing names only when they have not joined its fitting universe. Each finished request adds every asked name permanently, including names it could not cover. Daily fits try the whole universe again. An immediate second run reports the coverage add’s refusal reason at the same publication without asking again or waiting. Daily fit refusals use the same results. A name with no recorded reason at the pinned publication reportsnot_covered. If no worker
claims a request within 60 seconds, a final status check confirms the result
before measurement continues with those names unscored. When the service cannot
report claim state, the wait keeps its ten-minute cap. A claimed request can use up to ten minutes in total, subject to the
run’s remaining time. A coverage gap does not by itself fail measurement.
POST /risk/measure reads the newest eligible stored fund book for each model
date. Each measured book and benchmark reports fund_books: the selected book’s
book_id, fund_symbol, holdings_date (the filing period), as_of, and
accepted_at. For an N-PORT filing, accepted_at is its recorded filing
acceptance instant; for provider or uploaded books it is null. The filing
period is not its publication date or its latest fetch time. It remains the
stored row’s own period even if it is later than the model date. That metadata
does not change the existing calculation rule: fund expansion is still bounded
by the model date.
A what-if book still has holdings_as_of: null: its weights came from your
request, not a saved portfolio snapshot. Use fund_books to identify the funds
looked through, not holdings_as_of. Empty fund_books means no identified
stored fund book was used. Older saved answers without the field read as an
empty array; that does not retroactively establish their book provenance.
A later repair and rebuild may change a new answer for an old model date. Keep
the book identifiers with the result when comparing runs; do not assume a model
date alone fixes the holdings input. The measurement endpoint does not repair
catalogue identifiers or rebuild books.
Factor price inputs also check sourced daily venue limits in native prices,
with one price tick of room for rounding. The check needs a dated listing
record and enough observed traded sessions to prove the listing has left its
exempt opening sessions. Missing age proof or native prices leave that bar
unchecked. Only sourced venues with checked tick bands take this check;
other venues and those with no daily limit hold nothing under this rule.
A share split the provider records within seven calendar days of the bar
excuses it, and each weekday without a bar adds one limit of room on each side.
Stored prices and published rows stay unchanged.