Skip to main content
System Facts es el registro compartido de lo que pasó en tus flujos de negocio. Cada servicio que participa en un flujo, llamado producer, envía un hecho inmutable cuando ocurre un momento de negocio. Se hace un pedido. Se liquida un pago. System Facts revisa cada hecho contra el contrato que registró su producer, lo almacena una sola vez y une en un solo flujo los hechos que comparten una referencia. Así preguntas qué pasó con el pedido ORD-2026-000123 y recibes todos los hechos de ese flujo, de todos los producers, en una sola respuesta. Un hecho almacenado nunca cambia. System Facts registra y correlaciona. No edita el historial.

Conceptos


Un tipo de referencia con correlation: exact une su hecho con todo hecho que lleve la misma referencia. Cuando un hecho une dos flujos, estos se fusionan en uno. El id del flujo absorbido sigue resolviendo hacia el flujo que sobrevive. Un tipo de referencia registrado con searchable: true puede listar todo hecho que lo lleve.

Integra en cuatro pasos


1

Registra los tipos de referencia

Registra cada tipo de identificador que llevan tus hechos con PUT /v1/reference-types/{type}, como acme.order_id y acme.payment_id. Hazlo desde tu pipeline de despliegue, antes de que cualquier contrato use el tipo.
2

Registra una versión de contrato

Registra una versión de cada tipo de hecho con PUT /v1/contracts/{producer}/{namespace}/{type}/{schemaVersion}. Hazlo desde tu pipeline de despliegue, antes del rollout del producer. System Facts acepta hechos solo después de que el registro tiene éxito.
3

Envía hechos

Envía un envelope por momento de negocio con POST /v1/facts. Usa la credencial de servicio del producer para el tenant.
Un primer envío responde 201.
4

Lee los flujos

Lee un flujo por su id con GET /v1/flows/{flowAggregationId}. Encuentra el único flujo de una referencia con GET /v1/flows/by-reference. Lista todo hecho que lleve una referencia searchable con GET /v1/flows.
Toda escritura es idempotente, así que un producer puede reenviar después de un timeout.

Autenticación y permisos


Toda solicitud, excepto los health probes públicos, envía Authorization: Bearer <token>. Los hechos y los flujos pertenecen al tenant del token. Los catálogos de tipos de referencia y de contratos los comparten todos los tenants del despliegue. Un permiso ausente responde 403 SF-0014. Un token ausente o inválido responde 401 SF-0013.

Convenciones


  • Tenant. El servicio siempre toma el tenant del token. Nunca lee un tenant de una ruta, de un parámetro de consulta ni de un cuerpo.
  • Escrituras idempotentes. Un primer registro o envío responde 201. La misma solicitud de nuevo responde 200 y no cambia nada. El envío de un hecho agrega duplicate: true.
  • Inmutabilidad. Una versión de contrato, un tipo de referencia y un hecho nunca cambian. Contenido distinto bajo la misma identidad responde 409. Un tipo de referencia puede ganar un mask de visualización una vez.
  • Paginación. Una lista responde una página y un nextCursor. Envíalo de vuelta como el parámetro de cursor de la página que quieres. Trátalo como opaco. Detente cuando se omita.
  • Timestamps. RFC 3339 en UTC, como 2026-10-19T14:32:10Z.
  • Tamaño. Un envelope de hecho pesa como máximo 256 KiB por defecto. Uno más grande responde 413 SF-0012.
  • Nombres. El primer segmento separado por punto de todo nombre de namespace y de tipo de referencia debe ser uno de los prefijos reservados del despliegue. El valor por defecto es lerian. Estas páginas usan acme.

Sensibilidad y valores protegidos


La sensitivity de un tipo de referencia decide cómo muestran sus valores las lecturas. Un contrato puede marcar campos del payload de la misma forma con x-sensitivity. Con mask: document, un valor masked muestra ***.456.789-** para 11 dígitos y **.345.678/0001-** para 14 dígitos. System Facts rechaza cualquier otra cantidad de dígitos al enviar. Toda clase correlaciona exactamente como none, porque la comparación parte del valor en texto claro. Todo digest almacenado lleva clave. Nunca es un hash simple. Un valor protegido vuelve con protected: true, y los campos protegidos del payload aparecen en protectedFields. Para encontrar un flujo por una referencia protegida, envía siempre el valor en texto claro. System Facts calcula su digest y lo compara con el digest almacenado.

Errores


Todo error es application/problem+json (RFC 9457) con un code estable.

Lista de errores

Consulta cada código, cuándo lo responde el servicio y si conviene reintentar.

Registrar una versión de contrato

Empieza por la operación que todo producer ejecuta primero.