Skip to main content
POST
Check compliance with your prices

Authorizations

x-api-key
string
header
required

Raw API key shown once when created in the Allocait app (Settings > API keys). Send it verbatim in this header; the server stores and compares only its SHA-256 hash. Allocait generates every key: alc_ followed by 64 lowercase hex characters. Keys issued before 2026-10-10 are 64 hex characters with no prefix and keep working. A key may carry an expiry (90 days or 1 year, or never). A malformed, unknown, revoked or expired key gets 401 with no further detail, and a malformed one is refused before any lookup. Keys cannot be created through this API.

Body

application/json
portfolio_id
string<uuid>
required
prices
object
required

Symbol-to-price map. Keys are ticker symbols, matched case-insensitively (normalised to uppercase); values are numbers, 0 or more. 0 is a real price, for example an option that expired worthless. On the agent surface, a symbol you leave out of this map is never priced from Allocait's own data (ADR-036); it comes back null, or the call is refused, depending on the endpoint. Two exceptions are the user's own numbers, not Allocait's: a held option with a mark is priced at its mark, so you may leave it out, and a price you pass for it replaces the mark for that call only and is never stored; an option past its expiry counts 0 whatever you pass (ADR-147).

Example:
scenario_id
string<uuid>

Default is the portfolio's active scenario, and only that (ADR-187, ADR-232).

Response

Compliance status computed with the prices you provided

portfolio_id
string<uuid>
scenario_id
string<uuid>
total_value
number

Total portfolio value in base currency

price_source
enum<string>

Always overrides on this surface. prices is required and checked to cover every non-cash position before this is computed (a held option that owns its price is the exception, ADR-147), so every value here is the caller's or the person's own (ADR-036). The dashboard's data_age_seconds is not carried; it measures Allocait's own stored quote, which this call never uses.

Available options:
overrides
violation_count
integer
violations
object[]

One entry per non-cash holding in an asset class whose total is outside its allocation band, each with outside_by, the class's distance from its band (ADR-113). Cash, and a class you hold nothing in, have no holding to list, so those breaches appear in class_violations only. A holding priced at 0 has no entry either (ADR-080).

class_violation_count
integer
class_violations
object[]

One entry per asset class whose total, cash included, is outside its allocation band. Every class with a band is judged, including one you hold nothing in: it sits at 0%, so a band with a minimum above 0 reads BELOW_MIN (ADR-069). The same class verdict the app shows. A class total is the net of its holdings: a short subtracts, and a total below zero counts as 0 (ADR-153).

size_violation_count
integer
size_violations
object[]

One entry per non-cash holding outside its class's range for the side it is on, by its size without a sign: a long against the position size range, a short (negative shares) against the short size range (ADR-144). The same position verdict the app shows. A holding on a side with no range is not listed. Each entry carries side.

status
enum<string>

The verdict in one word (ADR-073, ADR-080). violations when any class or size breach is listed. partial when nothing judged breaches but unchecked lists holdings no rule judged. compliant only when there is no breach and unchecked is empty. unjudged when nothing can be judged, for example a portfolio worth zero or less or a scenario with no rules. An unjudged answer lists no breach and issue_count is 0 (ADR-153).

Available options:
compliant,
partial,
violations,
unjudged
issue_count
integer

Class and size breaches together.

unchecked
object[]

Holdings no rule could judge, such as a holding with no asset class, each with the reason. A holding is judged by its class's band or by the size range for its side (a long by the position size, a short by the short size). A holding priced at 0 is judged at 0%, so it is not listed here.