Skip to main content
System Facts is the shared record of what happened in your business flows. Each service that takes part in a flow, called a producer, sends an immutable fact when a business moment happens. An order is placed. A payment settles. System Facts checks every fact against the contract its producer registered, stores it once, and links the facts that share a reference into one flow. Then you can ask what happened to order 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 POST /v1/facts. Use the producer’s service credential for the tenant.
A first send answers 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.
Every write is idempotent, so a producer can resend after a timeout.

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 answers 200 and changes nothing. A fact send adds duplicate: 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 display mask once.
  • 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 413 SF-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 use acme.

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.