ORD-2026-000123 and get every fact of that flow, from every producer, in one answer.
A stored fact never changes. System Facts records and correlates. It does not edit history.
Concepts
A reference type with
correlation: exact links its fact to every fact that carries the same reference. When one fact links two flows, they merge into one. The absorbed flow id still resolves to the surviving flow.
A reference type registered with searchable: true can list every fact that carries it.
Integrate in four steps
1
Register the reference types
Register each kind of identifier your facts carry with
PUT /v1/reference-types/{type}, such as acme.order_id and acme.payment_id. Do this from your deploy pipeline, before any contract uses the type.2
Register a contract version
Register a version of each fact type with
PUT /v1/contracts/{producer}/{namespace}/{type}/{schemaVersion}. Do this from your deploy pipeline, before the producer rolls out. System Facts accepts facts only after the registration succeeds.3
Send facts
Send one envelope per business moment with A first send answers
POST /v1/facts. Use the producer’s service credential for the tenant.201.4
Read the flows
Read a flow by its id with
GET /v1/flows/{flowAggregationId}. Find the one flow of a reference with GET /v1/flows/by-reference. List every fact that carries a searchable reference with GET /v1/flows.Authentication and permissions
Every request except the public health probes sends
Authorization: Bearer <token>. Facts and flows belong to the tenant of the token. The reference-type and contract catalogs are shared by every tenant of the deployment.
A missing permission answers
403 SF-0014. A missing or invalid token answers 401 SF-0013.
Conventions
- Tenant. The service always takes the tenant from the token. It never reads a tenant from a path, a query parameter or a body.
- Idempotent writes. A first registration or send answers
201. The same request again answers200and changes nothing. A fact send addsduplicate: true. - Immutability. A contract version, a reference type and a fact never change. Different content under the same identity answers
409. A reference type can gain a displaymaskonce. - Paging. A list answers one page and a
nextCursor. Send it back as the cursor parameter of the page you want. Treat it as opaque. Stop when it is omitted. - Timestamps. RFC 3339 in UTC, such as
2026-10-19T14:32:10Z. - Size. A fact envelope is at most 256 KiB by default. A larger one answers
413SF-0012. - Names. The first dotted segment of every namespace and reference-type name must be one of the reserved prefixes of the deployment. The default is
lerian. These pages useacme.
Sensitivity and protected values
The
sensitivity of a reference type decides how reads show its values. A contract can mark payload fields the same way with x-sensitivity.
With
mask: document, a masked value shows ***.456.789-** for 11 digits and **.345.678/0001-** for 14 digits. System Facts refuses any other digit count at send time.
Every class correlates exactly as none does, because matching starts from the clear value. Every stored digest is keyed. It is never a plain hash.
A protected value comes back with protected: true, and protected payload fields are listed in protectedFields. To find a flow by a protected reference, always send the clear value. System Facts digests it and matches the stored digest.
Errors
Every error is
application/problem+json (RFC 9457) with a stable code.
Error list
Look up every code, when the service answers it, and whether to retry.
Register a contract version
Start with the operation every producer runs first.

