Every claim in this response is defensible in an IC meeting or audit. Most competing "AI fund classification" APIs return plausible-sounding prose you cannot verify. This endpoint is different. For each claim you get:
Principal Investment Strategies, Principal Investment Risks, Expense Example, Portfolio Manager Commentary),An analyst can click a URL, jump to the section, Ctrl-F the quote, and have the source paragraph in front of them in ten seconds. No more "trust me, the AI read the prospectus."
Summary, mandate (including benchmark), portfolio construction, exposures (risk drivers + key holdings/buckets), implementation (replication + derivatives + securities lending), distributions & taxes, costs & leakage, sensitivities (macro/market/mechanics), and use cases & failure modes (best/bad/failure).
Every section and array item carries a sources array of machine-verified citations.
Citations draw from: prospectus (485BPOS / 497 / N-1A), N-CSR / N-CSRS (annual / semi-annual shareholder reports), N-CEN (annual fund census), N-PORT (quarterly holdings), and issuer-website.
200 OK โ model is readyReturns the full ExposureModel JSON. Stable and safe to cache client-side.
202 Accepted โ model is being generatedThe model for this fund has never been built. A background job has been queued (or one was already in flight).
Generation takes a few minutes. The job fetches the fund's latest prospectus, N-CSR, and N-CEN directly from SEC EDGAR, passes them to the AI along with strict citation requirements, verifies every quote against the filing text, and writes the result.
Poll this same endpoint with the same symbol โ once the job completes you will start receiving the 200 response. A reasonable poll interval is every 30 seconds.
{
"status": "generating",
"jobId": "64abfe1234567890abcdef12",
"message": "Generating exposure model โ this can take a few minutes. Call this endpoint again to retrieve the result."
}
If a generation job is already in flight for this fund โ regardless of which account queued it โ this endpoint returns the existing jobId. You will never queue two generations for the same fund series.
Generation runs server-side and does not count against your API request budget beyond the call to this endpoint.
symbol string optional Fund ticker symbol (ETF or mutual fund). Identify the entity by exactly one of: symbol, cik, cusip, composite_figi, or share_class_figi. At least one is required.
cik integer optional SEC Central Index Key (CIK).
cusip string optional CUSIP identifier (9 characters).
composite_figi string optional Composite OpenFIGI identifier.
share_class_figi string optional Share-class OpenFIGI identifier.
curl 'https://api.stockfit.io/v1/api/fund/exposure-model?symbol=SPY&cik=884394&composite_figi=BBG000BDTBL9' \
-H 'Authorization: Bearer YOUR_API_TOKEN'Model is ready. Full exposure model JSON with per-claim SEC-filing citations.
summary object Primary exposure, strategy type, who-it-is-for, what-it-is-not. Has sources[].
mandate object Investment objective, benchmark, universe (asset class / geography / instruments), constraints. Has sources[].
portfolioConstruction object Selection rules, weighting, rebalancing frequency + triggers, concentration notes. Has sources[].
exposures object Risk drivers, factor tilts, key holdings or buckets (each with own sources[]), KPI mappings. Has sources[].
implementation object Replication method, derivatives usage, securities lending, liquidity notes. Has sources[].
distributionsAndTaxes object Distribution profile, tax notes, capital gains risk. Has sources[].
costsAndLeakage object Expense ratio notes, implicit costs, tracking difference drivers. Has sources[].
sensitivities object Macro, market, and portfolio-mechanics sensitivities. Has sources[].
useCasesAndFailureModes object bestUseCases, badUseCases, failureModes โ each an array of {text, sources[]}.
provenance object Whole-model confidence + deduped source kinds that appear across citations.
confidence string (enum) Confidence level: `high`, `medium`, or `low`.
high, medium, lowsources array of string (enum) {
"summary": {},
"mandate": {},
"portfolioConstruction": {},
"exposures": {},
"implementation": {},
"distributionsAndTaxes": {},
"costsAndLeakage": {},
"sensitivities": {},
"useCasesAndFailureModes": {},
"provenance": {
"confidence": {},
"sources": [
"prospectus"
]
}
}Model generation has been queued (or one is already in flight). Poll the same URL for the finished result.
status string (enum) generatingjobId string ID of the background job
message string {
"status": "generating",
"jobId": "64abfe1234567890abcdef12",
"message": "Generating exposure model โ this can take a few minutes. Call this endpoint again to retrieve the result."
}Invalid parameters or fund not found
error string Human-readable error message
{}Missing or invalid API token
error string Human-readable error message
{}Feature not available on current plan
error string Human-readable error message
{}