Skip to main content
An empty list can mean “there are none”, “you may not see them”, “the source never supplied them” or “the warehouse did not answer”. Records gives each of those a different signal. Every read, and every family inside a composite read, ends in one of the outcomes below, and each outcome has its own signal on the wire. This page is the one place those outcomes are defined; other pages link here.

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 in families:

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_unavailable with a reason from the table below, or 503 book_unavailable when 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, and X-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: false means no qualifying connection exists yet. Every other read would answer 409 book_unavailable.
  • scope is the person’s resolved scope: kind, selection, owner code count, and home office. home_status is ok, none or unavailable.
  • reads.account_register.state is available (an All or Platform scope) or scope_unsupported (a Self scope). This block is advisory. The account register does not check it, so a Self person marked scope_unsupported here still reads the register. code is null when the state is available; for scope_unsupported it is register_scope_unavailable, a refusal the register route does not return today.
  • reads.producer_licensure.state is available, not_derived or version_mismatch. code is null when the state is available and a refusal code otherwise.
  • read_modes lists each read surface and how it is served.
  • entitlement is present when the organization’s posture is shadow or lit for this person.
  • include_team=true adds the person’s team to entitlement.team. include_related_books defaults to true. Any value other than a boolean answers 400 invalid_request.
  • It accepts the X-Nexio-Consumer, X-Nexio-Consumer-Build and X-Nexio-Consumer-Vocabulary headers 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.
Last modified on September 25, 2026