Private-credit borrower reads from SEC BDC filings, the =LATAVIS formulas behind the Excel add-in, the cited analyst, memo and brief, and document upload. This page lists only the endpoints a customer key can call today. Every example response was captured from the served API and is cut down where it shows …
Send your key in the X-API-Key header on every request to https://latavis.com/api/latavis followed by the endpoint path. A request without a key gets 401, except the public scorecard, which needs none.
Keys are personal. Sign in, open Account, and under Personal API keys choose Create key. The full key is shown once, so copy it then. You can hold two personal keys at a time. A key carries your account's role, capped at analyst; most endpoints below need an analyst key, and each says which role it needs. By default a key expires 365 days after it is created. Rotating a key gives you a new one at once and keeps the old one working for 24 hours; revoking stops it immediately. A key cannot create, rotate or revoke keys: that takes a signed-in session on the account page.
Response · no key
HTTP 401 Unauthorized
Content-Type: application/json
{
"error": "Sign in, or supply your own X-API-Key header."
}
Response · a key the server does not recognise
HTTP 401 Unauthorized
Content-Type: application/json
{
"error": "Invalid or revoked API key.",
"status_code": 401,
"timestamp": "2026-10-16T04:55:19.704026+00:00"
}
Response · a viewer key calling an analyst endpoint
Per-minute limit. Each key has a requests-per-minute limit, set from your plan when the key is created: by default 100 for Explorer, 500 for Professional, 1,000 for Institutional and 2,000 for Enterprise. GET /auth/me shows your key's own limit as rate_limit. Over the limit, the answer is 429 with a Retry-After header in seconds.
Response · over the per-minute limit (a key limited to 1 request a minute)
HTTP 429 Too Many Requests
Content-Type: application/json
Retry-After: 59
{
"error": "Rate limit exceeded. Retry after 59 seconds.",
"status_code": 429,
"timestamp": "2026-10-16T04:55:19.761996+00:00"
}
Credits. Each key is metered in credits per calendar month (UTC): 500 for Explorer, 2,500 for Professional, unlimited for Institutional and Enterprise, as on the pricing page. Today the meter charges credits only on engine routes that are not part of this API, so every endpoint on this page costs 0 credits per call. GET /auth/me and GET /usageshow your key's credit position.
Analyst budget. The analyst, the memo and starting a new brief also count against a daily budget per key: 200 calls per UTC day by default, counted on each server instance and reset at 00:00 UTC. Every analyst and memo answer reports it as llm_budget.
Response · daily analyst budget used up (captured on a server configured with a budget of 0)
HTTP 429 Too Many Requests
Content-Type: application/json
{
"error": "Daily analyst budget exhausted for this API key",
"used_today": 0,
"daily_budget": 0,
"hint": "Resets 00:00 UTC; raise via PRISM_LLM_DAILY_BUDGET.",
"status_code": 429,
"timestamp": "2026-10-16T02:19:32.234947+00:00"
}
Cold starts
After a quiet period the service starts from cold, and loading the analytics engines takes several minutes. Until they are loaded, data endpoints answer 503 with "code": "engine_warming", a Retry-After header and retry_after_seconds in the body. Nothing is charged and nothing is saved. Wait that many seconds and send the same request again. /auth/me and key management answer while the engines warm. The memo and the formula endpoint can also answer this way for a short while after the engines are up, while each loads its data for the first time; the message names which one.
Response · during a cold start
HTTP 503 Service Unavailable
Content-Type: application/json
Retry-After: 297
{
"error": "Latavis is waking from idle — the analytics engines are still warming (3s in). Sign-in works now; retry this data endpoint in about 297s.",
"code": "engine_warming",
"warm_status": "warming",
"warm_elapsed_seconds": 3,
"retry_after_seconds": 297
}
This site's proxy waits up to 420 seconds for a data endpoint, and 570 seconds for the analyst, memo and brief, before it answers 504. A retry usually succeeds once the service is warm.
Verification labels
Every successful JSON answer carries a _verification block and an X-Latavis-Verification header. The labelis the server's own sentence about how far the figure is verified; for the model outputs on this page it reads UNVERIFIED, because no benchmark is bound to them and there is no graded record of their past accuracy. Show it next to the number. Formula results also carry a verification level, L0 to L3, with the confidence cap for that level.
Endpoints
13 endpoints. Paths are relative to https://latavis.com/api/latavis. In the curl examples, LATAVIS_API_KEY is an environment variable holding your key.
Private credit
GET/api/v1/vertical/private_credit/entities
Key role: analyst.
The borrower roster of the SEC EDGAR BDC Schedule-of-Investments panel, with the panel's own census and dates. Every id it returns is a borrower name the predict endpoint resolves exactly.
Parameters for GET /api/v1/vertical/private_credit/entities
Parameter
In
Description
q
query
Case-insensitive text matched against the borrower name or BDC ticker, across the whole panel before paging. query is accepted as an alias; q wins when both are sent.
limit
query
Page size: default 500, at most 1000. The response echoes matched, returned, offset and limit.
HTTP 200 OK
Content-Type: application/json
{
"status": "ok",
"vertical_id": "private_credit",
"sample_entities": [
"techco_dl",
"healthco_ut",
"retailco_mezz",
"mfgco_abl",
"energyco_dist"
],
"count": 1,
"entity_basis": "REAL",
"entities": [
{
"entity_id": "Auctane, Inc.",
"borrower": "Auctane, Inc.",
"bdc": "ARCC, BXSL, CGBD, NMFC, OBDC",
"bdc_ticker": "ARCC",
"bdc_tickers": [
"ARCC",
"BXSL",
"CGBD",
"NMFC",
"OBDC"
],
"as_of": "2026-08-06",
"industry": "Software and Services",
"n_tranches": 5,
"total_fair_value_usd_thousands": 599404,
"on_watchlist": false,
"pd_scoreable": true,
"pd_refusal_reason": null
}
],
"entity_source": "in-process SEC EDGAR BDC Schedule-of-Investments panel — the same panel the resolver and the PD model read …",
"total_borrowers": 3034,
"total_tranches": 7828,
"total_bdcs": 14,
"n_scoreable": 3003,
"n_refused": 31,
"scoreable_share": 0.9898,
"query": "Auctane",
"matched": 1,
"offset": 0,
"returned": 1,
"limit": 3,
"panel_as_of": "2026-06-30",
"age_days": 108,
"freshness": {
"as_of": "2026-06-30",
"source": "edgar_bdc_panel",
"age_days": 108,
"sla_days": 200,
"verdict": "fresh",
"basis": "newest observation 108 days old, within 200-day serving SLA"
},
"known_residue": "Panel as of 2026-06-30 filings. Built by an automated parser from 14 BDCs' Schedules of Investments; a small number of rows (under 1% of positions) are known to carry an instrument description instead of a borrower name or a mis-scaled principal. Counts and totals are checked against each filer's own printed total: all 14 filers sit within 1%.",
"panel_filed_through": "2026-08-20",
"panel_as_of_basis": "panel_as_of is the period the 14 Schedule-of-Investments documents report as of (2026-06-30), read from each document's primary-document name; panel_filed_through is the latest filing date (2026-08-20)"
}
One borrower's credit read. prediction.borrower_object is the single served borrower object every surface reads: its tranches with lien, reference rate, par, cost, fair value, non-accrual flag, LGD and SEC filing link; the totals; the disclosed-impairment score with its 95% interval; the score band and, separately, the filed credit state; the exposure-weighted LGD; the as-of date and the source filings. The impairment score is a concurrent classification of disclosed impairment, not a probability of default. A name that is not in the panel is refused with 422 and near matches, never substituted.
Parameters for GET /api/v1/vertical/private_credit/predict/{entity_id}
Parameter
In
Description
entity_id (required)
path
The panel's own borrower string, URL-encoded, as returned by the roster (entities[].entity_id).
HTTP 200 OK
Content-Type: application/json
X-Latavis-Verification: labelled; level=L2; benchmark=none
{
"status": "ok",
"vertical_id": "private_credit",
"entity_id": "Auctane, Inc.",
"prediction": {
"borrower_object": {
"schema": "latavis.pc.borrower.v1",
"borrower": "Auctane, Inc.",
"entity_id": "Auctane, Inc.",
"requested_entity": "Auctane, Inc.",
"match_type": "exact",
"bdc_tickers": [
"ARCC",
"BXSL",
"CGBD",
"NMFC",
"OBDC"
],
"n_tranches": 5,
"tranches": [
{
"bdc_ticker": "ARCC",
"security": "First lien senior secured loan",
"lien": "first_lien",
"reference_rate": "SOFR",
"spread_bps": 575,
"principal_usd_thousands": 245300,
"cost_usd_thousands": 245300,
"fair_value_usd_thousands": 241600,
"currency": "USD",
"currency_basis": "parsed currency column",
"non_accrual": false,
"pik": false,
"industry": "Software and Services",
"maturity_date": "06/2033",
"filing_date": "2026-07-29",
"lgd": 0.4335,
"lgd_basis": "lien_table[first_lien]",
"exposure_weight": 245300,
"source_url": "https://www.sec.gov/Archives/edgar/data/1287750/000162828026050307/arcc-20260630.htm",
"doc_offset": 3059608
},
"… (4 more)"
],
"totals": {
"par_usd_mm": 608.309,
"cost_usd_mm": 601.336,
"fair_value_usd_mm": 599.404,
"fair_value_usd_thousands": 599404,
"exposure_usd_mm": 608.309,
"exposure_basis": "par",
"fair_value_price": 99.68,
"refused": {},
"unit_note": "panel money is USD thousands per tranche; totals in USD millions"
},
"currency": {
"codes": [
"USD"
],
"mixed": false,
"note": null
},
"spread_bps": 575,
"reference_rates": [
"SOFR"
],
"non_accrual": false,
"n_non_accrual": 0,
"markdown_pct": 0.0032,
"industry": "Software and Services",
"industries": [
"Software and Services",
"Internet software and services",
"… (3 more)"
],
"score": {
"label": "Disclosed-impairment score",
"impairment_score": 0.211346701371641,
"ci_low": 0.18107964868970217,
"ci_high": 0.24742290251317595,
"ci_basis": "95% bootstrap percentile band over refit coefficients",
"fit_status": "FITTED",
"refusal_reason": null,
"basis": "Concurrent classification of disclosed impairment (non-accrual OR fair value below 0.85x amortized cost), read from the SAME SEC EDGAR Schedule-of-Investments filing that supplies the model's features. There is no forward observation window, so this is NOT a probability of default over any horizon."
},
"risk": {
"label": "Moderate",
"band_index": 1,
"meaning": "near the panel impairment rate",
"basis": "Score band: Low < 15% <= Moderate < 25% <= Elevated < 35% <= High, anchored to the panel's 21% disclosed-impairment rate (in-sample impairment rate by band 9% / 21% / 33% / 38%). A label of the score only; the filed credit state is shown separately.",
"credit_state": "Performing (disclosed)",
"credit_state_basis": "no tranche on non-accrual and the filed mark is not more than 15% below cost"
},
"lgd": {
"value": 0.4335,
"basis": "exposure-weighted across 5 tranche(s) by tranche par (the borrower's exposure basis); first_lien 100%; other tranches at the monotone lien table",
"lien_mix": {
"first_lien": 1
},
"dominant_lien": "first_lien",
"weight_basis": "tranche par (the borrower's exposure basis)"
},
"impairment_weighted_loss_usd_mm": 55.7266,
"impairment_weighted_loss_label": "Impairment-weighted loss — illustrative, not a loss estimate (impairment score x LGD x exposure; the score is not a default probability)",
"as_of": "2026-06-30",
"as_of_basis": "period of report of the filings behind these tranches (primary-document name)",
"filed": "2026-08-06",
"filed_earliest": "2026-07-29",
"vintage": {
"panel_period_end": "2026-06-30",
"panel_filed_through": "2026-08-20",
"panel_filed_earliest": "2026-07-29"
},
"data_status": "REAL_DATA",
"data_status_basis": "persisted SEC EDGAR Schedule-of-Investments filings (data/sources/edgar_bdc/<TICKER>_soi.json, each carrying its sec.gov source_url)",
"source_filings": [
{
"bdc_ticker": "ARCC",
"source_url": "https://www.sec.gov/Archives/edgar/data/1287750/000162828026050307/arcc-20260630.htm",
"period_end": "2026-06-30",
"filed": "2026-07-29"
},
{
"bdc_ticker": "BXSL",
"source_url": "https://www.sec.gov/Archives/edgar/data/1736035/000173603526000016/bxsl-20260630.htm",
"period_end": "2026-06-30",
"filed": "2026-08-06"
},
"… (3 more)"
],
"related_panel_names": [],
"related_panel_names_note": "other panel spellings that look like the same issuer; NOT included in these figures (entity resolution is the parser's, not this object's)"
}
},
"_verification": {
"status": "LABELLED",
"verified": false,
"label": "NOT BENCHMARKED: this figure is graded L2 · IN-SAMPLE on the published Latavis validation record (the Accuracy page). It is not on the …",
"rail": "labelled",
"on_rail_route": false,
"level": "L2",
"as_of": "2026-06-30",
"model_id": "pc_private_credit",
"model_version": null,
"benchmark": null,
"evidence_state": "no …",
"evidence_basis": "prediction ledger: 0 graded records …",
"doctrine_fields_present": [
"score"
],
"missing": [
"benchmark_name",
"benchmark_score",
"skill_score",
"n_trials",
"regime"
]
}
}
Only prediction.borrower_object is shown from prediction; the response also carries the card fields (impairment_score, lgd, risk_rating, credit_state, fair_value_mm, not_computed, entity_resolution and more).
Response · 422 · a name the panel does not hold
HTTP 422 Unprocessable Entity
Content-Type: application/json
{
"status": "entity_not_resolved",
"vertical_id": "private_credit",
"entity_id": "Not A Borrower LLC",
"scope": "entity",
"refusal": {
"resolved": false,
"requested_entity": "Not A Borrower LLC",
"reason_code": "not_in_panel",
"reason": "'Not A Borrower LLC' is not a borrower in the EDGAR BDC Schedule-of-Investments panel this engine holds (3034 borrowers). No analysis is produced for an entity the panel does not cover.",
"near_matches": [
"Notorious Buyer, LLC",
"Notorious Holdings LLC (dba Beauty Industry Group)",
"Notorious Purchaser II, Inc. (dba Beauty Industry Group)",
"Notorious Topco, LLC",
"Nottingdale Receivables Limited (FKA TalkTalk Telecom Group Ltd)"
]
}
}
Formulas and Excel
POST/api/v1/formula
Key role: analyst.
Evaluate one or more =LATAVIS formulas. This is the call the Excel add-in makes. Each result carries its value, unit, verification level and cap, source, as-of date and provenance; a function that cannot answer returns an error sentinel such as #NOTAVAIL! and never a made-up number.
Parameters for POST /api/v1/formula
Parameter
In
Description
formula
body
One formula string. Returns a single result.
formulas
body
A list of formula strings. Returns results and count. Send formula or formulas.
HTTP 200 OK
Content-Type: application/json
{
"vertical": "PC",
"functions": [
{
"function": "DSCR",
"signature": "=PRISM.PC.DSCR(deal_id, [facility_type])",
"summary": "Debt service coverage ratio",
"returns": "ratio",
"unit": "x",
"source": "PRISM PC1 Underwriting engine",
"available": true
},
{
"function": "EXPECTED_LOSS",
"signature": "=PRISM.PC.EXPECTED_LOSS(deal_id, [facility_type])",
"summary": "Impairment-weighted loss in $mm (score x LGD x exposure) — illustrative, not a loss estimate …",
"returns": "USD millions",
"unit": "$mm",
"source": "PRISM PC2 Credit Risk engine",
"available": true
},
{
"function": "LGD",
"signature": "=PRISM.PC.LGD(deal_id, [facility_type])",
"summary": "Loss given default for a private credit facility",
"returns": "fraction (0-1)",
"unit": "prob",
"source": "PRISM PC2 Credit Risk engine",
"available": true
},
{
"function": "PD",
"signature": "=PRISM.PC.PD(deal_id, [facility_type])",
"summary": "Disclosed-impairment score for a private credit facility (concurrent; not a probability of default — function name kept for workbook compatibility)",
"returns": "score (0-1)",
"unit": "prob",
"source": "PRISM PC2 Credit Risk engine",
"available": true
},
"… (3 more)"
]
}
Analyst, memo and brief
POST/api/v1/chat
Key role: analyst.
The cited analyst. A language model answers using the same tools the console uses, and every tool call that returned a provenance envelope is listed in citations. The conversation is not stored: send the history you want considered.
Parameters for POST /api/v1/chat
Parameter
In
Description
messages (required)
body
[{"role": "user"|"assistant", "content": "…"}]. At most 100,000 characters of JSON.
Request
curl -H "X-API-Key: $LATAVIS_API_KEY" -H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "How many tranches does Auctane, Inc. have in the panel?"}]}' \
https://latavis.com/api/latavis/api/v1/chat
Response fields (200)
reply The model's answer (markdown).
citations One provenance citation per successful tool call.
tool_trace Every tool call in order: tool, args, ok, and error when it failed.
model The model id used.
turns Model round-trips taken.
figure_audit Each figure in the reply checked against the values the tools returned.
llm_budget {used_today, daily_budget} for your key.
The 200 body is written by a language model for each request, so no captured answer is shown; the fields are listed from the server code.
A cited analyst memo for one borrower. The memo opens with a server-rendered table of the borrower's facts from the served borrower object; the analysis below it is model-written and cited. Slow by nature: it reads the panel and then calls a language model.
Parameters for POST /api/v1/memo
Parameter
In
Description
entity (required)
body
The borrower, as the roster names it.
vertical
body
"PC" for private credit.
focus
body
What the memo should concentrate on, in plain words.
The cited morning brief, generated once per UTC day per server instance. When today's brief is not ready the call starts it and answers {"status": "generating"} with retry_after_seconds; poll until the body carries brief_markdown. Polls are free; starting a generation counts against your key's daily analyst budget.
Parameters for GET /api/v1/brief
Parameter
In
Description
refresh
query
1 forces a new generation (counts against the daily budget).
brief_markdown The brief (markdown), once generated.
citations, tool_trace, model, turns, figure_audit As for the analyst.
generated_at When this brief was generated (UTC).
cached true when today's brief was already generated.
Response · while generating
HTTP 200 OK
Content-Type: application/json
X-Latavis-Verification: unverified; benchmark=none; ILLUSTRATIVE
{
"status": "generating",
"detail": "Brief generation started — poll again shortly.",
"retry_after_seconds": 20,
"_verification": {
"status": "ILLUSTRATIVE",
"verified": false,
"label": "UNVERIFIED: this figure is model output that is not on the Latavis verification rail. No benchmark is bound to the model and there is no graded record of its past accuracy.",
"rail": "unverified",
"on_rail_route": false,
"level": null,
"as_of": null,
"model_id": null,
"model_version": null,
"benchmark": null,
"evidence_state": "no graded record",
"evidence_basis": "prediction ledger: 0 graded records …",
"doctrine_fields_present": [],
"missing": [
"score",
"benchmark_name",
"benchmark_score",
"skill_score",
"n_trials",
"regime"
]
}
}
Documents
POST/documents/upload
Key role: analyst.
Upload a document for text extraction (multipart field file, or JSON with filename and content_base64; at most 50 MB). The extractor is built for real-estate leases, appraisals and offering memoranda; a term sheet is stored and its text previewed, but no fields are extracted from it. Accepted types are .docx and .pdf, but PDF text extraction is not installed on the server today, so a PDF answers 422 "Extraction failed". persistence says where the document was stored.
HTTP 200 OK
Content-Type: application/json
X-Latavis-Verification: labelled; level=L2; benchmark=none
{
"as_of": "2026-08-28",
"as_of_basis": "oldest dated input in this payload (see as_of_inputs) — a scorecard is only as current as its stalest input",
"as_of_inputs": {
"live_serving_ledger": null,
"validation_record": "2026-08-28"
},
"validation_record": {
"as_of": "2026-08-28"
}
}
Only the dating fields are shown. The body also carries validation_record.rows (one dated row per model: metric, value, verification level, as-of and basis), the prediction-ledger status and the _verification block; read the rows on the accuracy page, where each figure is shown with its date.
Your key
GET/auth/me
Key role: analyst or viewer.
What the server knows about the key you sent: its role and permissions, tier, per-minute rate limit and what is left of it, and the monthly credit position. The quickest way to check a key works.
The Excel add-in calls POST /api/v1/formula with your key. In a workbook, these add-in functions read any private-credit function by name:
Excel add-in functions
In a cell
Returns
=LATAVIS.VALUE("PC", "PD", "Auctane, Inc.")
The served value. A result at verification level L0, or one with no level, comes back as a labelled string (the value followed by [L0 SYNTHETIC — not validated]), never as a bare number.
=LATAVIS.PROVENANCE("PC", "PD", "Auctane, Inc.")
One string: source | as-of date | verification level and cap | confidence.
=LATAVIS.LEVEL("PC", "PD", "Auctane, Inc.")
The verification level and its confidence cap, e.g. L2 (cap 0.7).
=LATAVIS.ASOF("PC", "PD", "Auctane, Inc.")
The as-of date of the data behind the value, or "not in payload".
Evaluate a whole formula string, with the same labelling as VALUE.
The private-credit functions offered today take a borrower name exactly as the roster gives it. The right-hand column is what POST /api/v1/formula returned for Auctane, Inc.
Private-credit formula functions
Function
What it returns
Served for Auctane, Inc.
=LATAVIS.PC.DSCR(deal_id, [facility_type])
Debt service coverage ratio (ratio)
no value: PRISM PC1 Underwriting engine — not computed for this borrower: Requires borrower EBITDA and debt service. Not disclosed in a Schedule of Investments. as of 2026-06-30
Impairment-weighted loss in $mm (score x LGD x exposure) — illustrative, not a loss estimate … (USD millions)
55.7266 $mm · L0 · as of 2026-06-30
=LATAVIS.PC.LGD(deal_id, [facility_type])
Loss given default for a private credit facility (fraction (0-1))
0.4335 prob · L0 · as of 2026-06-30
=LATAVIS.PC.PD(deal_id, [facility_type])
Disclosed-impairment score for a private credit facility (concurrent; not a probability of default — function name kept for workbook compatibility) (score (0-1))
0.211346701371641 prob · L2 · as of 2026-06-30
The disclosed-impairment score behind PC.PD classifies impairment disclosed in the same filing; it is not a probability of default over any horizon, and the function keeps its name for workbook compatibility.
Errors
HTTP status codes
Status
Meaning
400
The body or a parameter is missing or malformed. The body says which, often with an example.
401
No X-API-Key header, or a key that is invalid, revoked, expired or past its rotation grace period.
403
Your key's role does not include this endpoint.
404
No such route, or no such document id.
413
Upload larger than 50 MB.
422
The server declined to answer: a borrower name the panel does not hold (with near matches), or a document it could not extract.
429
Per-minute rate limit reached (Retry-After header), or the key's daily analyst budget is used up.
503
The service is warming after a cold start (code engine_warming, Retry-After), or the analyst is not configured on that server.
504
This site's proxy stopped waiting: after 420 s for a data endpoint, 570 s for analyst, memo and brief.
Questions about the API: request access, or write to the support address in the footer.