The outcome state model
One rule sits under all of these: a bound that cuts rows is reported. A composite family reports it as partial coverage with a reason, and a read whose statement has a declared row ceiling fails as a whole when the rows exceed it (409
book_unavailable, reason result_too_large).
Per-family coverage
A composite read (a dedicated read that composes many families in one call; see Composite reads and dedicated routes) reports each family infamilies:
When the data was read: the serving block
Every read of connected data (family reads, registers, and the keyed and composite reads) is a current read: Nexio queries your warehouse live, at request time, and does not hold the read to a fixed warehouse instant. Notes, workflow states and the action list are the exception: they are read from Nexio’s own action ledger (see Writes and the action ledger), not from the warehouse. The task register merges tasks from the action ledger with follow-ups read from the warehouse. The owner directory (GET /records/owners) is also an exception: it is held in server memory for up to 15 minutes per seat and scope. So is risk evidence (GET /records/accounts/{clientKey}/risk-evidence): a repeat read within 10 minutes can answer from the evidence already assembled, with that assembly’s original serving times. Document content (GET /records/documents/{relationKey}/content) is fetched from the system of record directly and returns the file’s own bytes with no envelope. Every JSON read under /api/v1/records carries a serving block that says which connection answered and when the read ran, except the responses in Which responses carry each block. It looks like this:
What a current read gives you:
- One statement is consistent. Where a response’s rows and numbers come from one warehouse statement, they describe the same data. Page, totals and facets says which registers compute everything in one statement.
- Separate statements are not a snapshot. A response built from several statements (a composite read, or a register whose page and numbers come from separate statements) runs each of them separately against current data. A source change between them can make them disagree.
- Every request reads again, except the owner directory and risk evidence reads above. Two reads seconds apart can differ, and each page of a register walk is a new read. When the data changes during a walk says what that means for paging.
- Date measures use the read’s date. In force, days to expiration and similar measures are computed against the date of the request’s read time.
- A failed read is refused. When the warehouse cannot answer, the read answers 409
book_unavailablewith a reason from the table below, or 503book_unavailablewhen the statement queue is busy.
Which responses carry each block
Every JSON read under/api/v1/records carries both a serving block and a scope block, except these responses:
Response headers
Caching and invalidation
There is no push invalidation for Records reads. Nothing notifies you when source data changes. Re-read when you need current data. If you cache, key the entry on everything that shapes the answer: the credential, the acting principal and scope, the route and its parameters, andX-Nexio-Engine-Build. Store serving.as_of with the entry so you know when it was read. A new engine build can compute the same read differently, so a build change invalidates the entry.
Preflight with the status read
GET /api/v1/records/status tells an application, before its first read, whether a connection is available and how the person resolves. It is the one read that answers an identity or scope refusal as data: when a qualifying connection exists, a person who cannot be served gets 200 with scope.refused set (identity_unmapped, identity_needs_review, identity_suspended, identity_stale or scope_unavailable), not a 403. Assertion and lens refusals still answer with their HTTP status. With no qualifying connection, the read admits the caller as other governed routes do, so an identity refusal answers with its HTTP status: for example, a request with neither an acting principal nor a registered service identity gets 403 identity_unmapped.
has_published: falsemeans no qualifying connection exists yet. Every other read would answer 409book_unavailable.scopeis the person’s resolved scope: kind, selection, owner code count, and home office.home_statusisok,noneorunavailable.reads.account_register.stateisavailable(anAllorPlatformscope) orscope_unsupported(aSelfscope). This block is advisory. The account register does not check it, so aSelfperson markedscope_unsupportedhere still reads the register.codeisnullwhen the state isavailable; forscope_unsupportedit isregister_scope_unavailable, a refusal the register route does not return today.reads.producer_licensure.stateisavailable,not_derivedorversion_mismatch.codeisnullwhen the state isavailableand a refusal code otherwise.read_modeslists each read surface and how it is served.entitlementis present when the organization’s posture isshadoworlitfor this person.include_team=trueadds the person’s team toentitlement.team.include_related_booksdefaults to true. Any value other than a boolean answers 400invalid_request.- It accepts the
X-Nexio-Consumer,X-Nexio-Consumer-BuildandX-Nexio-Consumer-Vocabularyheaders as diagnostics. They do not affect authorization.
200 OK
status is always null today. entitlement is omitted in this example because the organization’s posture is dark.
book_unavailable reasons and retry guidance
book_unavailable means the read could not be served now. It is not a server fault and it is not an empty answer.
Other status codes on Records reads:
Cursor and filter errors are on Registers and pagination. Authority refusals are on Authority and scope.
Next
Get status
Endpoint reference.
Errors
Every error code on the platform.