POST /v1/entity-states
This is the unauthenticated, legacy path and is available for local development or migration scenarios. For production use, prefer the tenant-scoped path below.
entity_state_envelope_v1 document.
POST /v1/tenants/:tenant_id/entity-states
The recommended path for production. Tally authenticates the caller against the tenant’s membership roster, enforces subject ownership on snapshot versions ≥ 2, and records the write against your tenant’s usage quota.Path parameters
The UUID of your tenant. The authenticated principal must hold the
tenant_editor role within this tenant.Request body
Both endpoints accept an identical request body: a single JSON object conforming toentity_state_envelope_v1.
Top-level fields
Must be the literal string
"entity_state_envelope_v1". Tally rejects any other value.A client-generated UUID (v4 recommended) that uniquely identifies this snapshot across all subjects and tenants. Tally rejects a duplicate
snapshot_id with 409 conflict.The monotonically increasing version for this subject. Must be an integer ≥ 1. Tally rejects a duplicate
(subject_id, snapshot_version) pair with 409 conflict. On the tenant-scoped path, snapshot_version: 1 automatically declares your tenant as the subject’s owner; all subsequent versions require pre-existing ownership.The RFC 3339 datetime at which this snapshot was generated by the producer, e.g.
"2026-02-20T14:25:30Z". Must include a timezone offset (Z or ±HH:MM).Identifies the entity or individual this snapshot describes.
A JSON object containing the materialized identity attributes for the subject at
generated_at. Attribute values may be any JSON type — string, number, boolean, object, array, or null. The object may be sparse; you do not need to include every attribute on every snapshot. Unknown keys are preserved and returned as-is.An array of evidence metadata objects that support the attributes in this snapshot. May be empty (
[]). Each object must include:Provenance metadata describing who created this snapshot and from which system.
Optional attribution map linking JSON Pointer paths (RFC 6901) to the evidence items that support them. Keys are paths such as
"/attributes/legal_name". Values are arrays of evidence reference objects, each containing at minimum evidence_id and evidence_type, and optionally role ("primary", "corroborating", or "conflicting"). Paths absent from this object are interpreted as having no attribution.Optional RFC 6902 diff describing changes relative to the prior snapshot. Must contain
format: "rfc6902" and ops (array of JSON Patch operations). Tally treats this as metadata; the attributes object is always authoritative.Example request
The following example submits version 3 of an entity snapshot forent_acme_001 with two evidence items and an attribution map.
Responses
- 201 Created
- 400 validation_error
- 409 conflict
Tally accepted and stored the snapshot. The response body is the stored snapshot document, identical to what you submitted plus any server-side fields Tally adds (such as internal timestamps).
GET /v1/tenants/:tenant_id/subjects
List all subjects owned by a tenant, along with a summary of each subject’s latest snapshot.Path parameters
The UUID of your tenant. The authenticated principal must hold any active
api_functional_role within this tenant.Response
An array of subject summary objects.
GET /v1/entity-states/:snapshot_id
Fetch any snapshot directly by its UUID. This endpoint does not require tenant authentication and is available on the legacy path.Path parameters
The UUID of the snapshot to retrieve.
Response
Returns200 OK with the full stored snapshot envelope, or 404 not_found if no snapshot exists for the given UUID.