Skip to main content
A risk measure gives factor risk for 1 to 10 books on one version of the factor model, at one date or over a range of up to 60 dates. You start it, read it until it ends, and stop it if you no longer want it. Send your usual bearer token. The credential sets the owner. Do not send an owner in the body. No account flag is needed. Use a risk run for today’s full report on one book: attribution, profit and loss, scenarios and peers. Use a measure for the figures at past dates, over a range of dates, or for several books side by side.

Request

With neither as_of nor range, the measure takes the version’s newest publication. step is month_end, the default, or daily: Each date reads the newest publication of the version on or before it. Dates that share one read the same books, but each date checks the age of inputs carried forward, so their figures can differ. The answer’s model.dates says which publications exist: month-end ones from month_ends_from, daily ones from daily_from. A daily range before daily_from reads month-end publications, so use month_end for older history. A saved book is { "label", "portfolio": { "portfolio_id", "holdings_at" } }. It is the portfolio’s newest saved snapshot on or before holdings_at, a time with its offset. With no holdings_at, as_of or range, it reads the newest snapshot at the measure’s start time. Every book uses that same time. A dated request, including as_of today, uses the end of the publication’s model date in New York, so a range follows the portfolio as it was saved. holdings_as_of may be later than publication_date for an undated request. A book of weights is { "label", "holdings": [{ "symbol", "weight" }] }, with 1 to 3,000 lines. Weights are fractions of the book’s net assets; a short is below zero. With a CASH line, weights add to 1, within 0.01. Without one, the rest is cash; a book that borrows lists CASH below zero. Nothing is rescaled, and a symbol may appear once. A bare ticker is read as a US listing, so QQQ becomes QQQ.US. Funds in a book, and the benchmark, are read through their stored holdings on or before each publication’s model date.
Keep one request_key for each measure. A retry with the same key and request joins the measure it started. Within 24 hours of its end, a changed request with that key returns 409. After 24 hours, the key starts a new measure.

What moved risk

To split a change in risk between two dates D0 and D1, start one measure with model.range from D0 to D1 and the portfolio twice: held, at holdings_at D0, and live, with holdings_at left out. On D1, live against held is the trades. held on D1 against held on D0 is the market and the model. With step: "month_end", D0 is on the grid only when it is a month end; otherwise use daily.

Reading a measure

A 30 October 2026 check took about 30 seconds per date for ten books. Time varies with book size and load. Each request covers at most 60 dates; split longer ranges into more requests. Each newly launched background job has a 60-minute budget for all its phases. Initial validation, startup and stopping a timed-out job can add time before a terminal status is available. Jobs already running retain their original deadline. A measure that runs past its budget stops and reads failed with timed_out. Read running again in a few seconds. A running measure may carry progress: { dates_done, dates_total }. An ok measure has answer: A date the model has comes back with status: "ok": A date with no publication of the version in the 45 days up to it comes back with status: "missing", reason_code: "model_date_unavailable", a reason, and nearest_before and nearest_after: the nearest model dates on each side, or null. A measured book has status: "ok" and these fields: active.modelled_share_of_gross_active is the share of the gross active weight the model covers, 0 to 1. Gaps in the book and the benchmark net out by name. A null figure was not computed; it does not mean zero. A book the measure could not read on a date has status: "omitted" and a reason:

Coverage

coverage.modelled_share_of_gross is the share of the book’s gross weight the model covers, 0 to 1: not a share of net assets. Cash in the model’s currency counts in neither part. lookthrough_weight is the gross weight of funds measured through their own holdings. unmodelled_count counts every line the model left out. unmodelled lists at most 100 lines, each with symbol, signed weight, reason_code and reason. Weighted gaps come first, largest by size. A holding with no value has weight: null, code invalid_inputs, and reason “This holding could not be valued; its risk is excluded.” Null means its weight is not known. Unvalued lines sort after all weighted gaps and count in unmodelled_count. A saved book with unvalued lines measures its valued lines. Their weights divide each value by the sum of valued values, cash included and shorts negative. A warning states how many lines have no value and that shares and exposures, including the modelled share of gross, describe the valued lines. The engine may add codes; reason says each one in words. A measure does not add names to the model. To add them, start a risk run on the book: it adds each name it can score to the model’s publications from the last two years. Then measure again. A name the run could not add comes back with its reason; not_added_in_time means the run stopped waiting first, so run it again later.

Failed measures

A failed measure returns 200 with failure_code, reason and details: Finished answers stay for 24 hours after the measure ends, even after the sandbox sleeps. This store holds the result, a request hash and the end time. Cancelled and timed-out measures have no stored result.

Limits and errors

A measure counts toward the three runs an owner may have going, with risk runs, while it runs. Responses carry Cache-Control: no-store. An error body is { "error": { "code", "message" } }. 429 and 503 carry Retry-After in seconds. Call again after it; on 503, retry the start with the same key, which joins the measure it may have started.