Dashboard

Exposure model

GET/api/fund/exposure-model

ETF Pro

๐Ÿ”’ Audit-grade by construction

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:

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."

What's in the model

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.

Source document types

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.

Two possible response shapes

โœ… 200 OK โ€” model is ready

Returns the full ExposureModel JSON. Stable and safe to cache client-side.

โณ 202 Accepted โ€” model is being generated

The 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."
}

Deduplication

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.

Cost

Generation runs server-side and does not count against your API request budget beyond the call to this endpoint.

Get API key Try it live in the API explorer

Query parameters

Example request

curl 'https://api.stockfit.io/v1/api/fund/exposure-model?symbol=SPY&cik=884394&composite_figi=BBG000BDTBL9' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'

Responses

200 OK

Model is ready. Full exposure model JSON with per-claim SEC-filing citations.

Response schema

  • 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`.

      Allowed values: high, medium, low
    • sources array of string (enum)

Example response

{
  "summary": {},
  "mandate": {},
  "portfolioConstruction": {},
  "exposures": {},
  "implementation": {},
  "distributionsAndTaxes": {},
  "costsAndLeakage": {},
  "sensitivities": {},
  "useCasesAndFailureModes": {},
  "provenance": {
    "confidence": {},
    "sources": [
      "prospectus"
    ]
  }
}

202 Accepted

Model generation has been queued (or one is already in flight). Poll the same URL for the finished result.

Response schema

  • status string (enum)
    Allowed values: generating
  • jobId string

    ID of the background job

  • message string

Example response

{
  "status": "generating",
  "jobId": "64abfe1234567890abcdef12",
  "message": "Generating exposure model โ€” this can take a few minutes. Call this endpoint again to retrieve the result."
}

400 Bad Request

Invalid parameters or fund not found

Response schema

  • error string

    Human-readable error message

Example response

{}

401 Unauthorized

Missing or invalid API token

Response schema

  • error string

    Human-readable error message

Example response

{}

403 Forbidden

Feature not available on current plan

Response schema

  • error string

    Human-readable error message

Example response

{}