Each snapshot captures the full identity state of a subject at a point in time. Snapshots are immutable and form a cryptographic chain.
A snapshot is Tally’s core record type. Every time you write identity data for a subject — whether for the first time or as an update — you are creating a snapshot. Snapshots are immutable, sequentially versioned, and cryptographically chained so that you always have a tamper-evident audit trail of how a subject’s identity has evolved over time.
A snapshot is a complete, self-contained capture of a subject’s identity state at a specific point in time. It is expressed as an Entity State Envelope v1 — a JSON document with a defined set of required and optional fields described in this page.Every conforming envelope includes these required top-level fields:
Field
Type
Description
envelope_version
"entity_state_envelope_v1"
Identifies the envelope schema version
snapshot_id
UUID string
Globally unique identifier for this snapshot
snapshot_version
integer ≥ 1
Sequential version number per subject
generated_at
RFC 3339 datetime
When the identity state was materialized
subject
object
subject_type + subject_id identifying the subject
attributes
object
The full materialized identity state
evidence
array
Evidence records backing the attributes
audit
object
Who created this snapshot and when
Here is a complete, minimal snapshot for an entity subject:
The attributes field is a free-form JSON object — it accepts any shape you
provide. Tally validates required envelope structure but does not constrain
your attribute vocabulary. See Subjects for the
canonical attribute schemas Tally recommends for interoperability.
Snapshots are numbered sequentially per subject, starting at 1. Each version is immutable — you never edit or delete a snapshot. Instead, when a subject’s identity state changes, you create a new snapshot with an incremented snapshot_version.
Never reuse a snapshot_id. Each snapshot must have a UUID that is unique
across all snapshots in the platform. If you submit a snapshot with a
duplicate snapshot_id, Tally will return a 409 Conflict error.
Evidence records provide the documentary basis for the attributes in a snapshot. Each entry in the evidence array describes a source document or data artifact that supports one or more attribute values.Required evidence fields:
Field
Type
Description
evidence_id
string
A stable, unique ID for this evidence record within the snapshot
evidence_type
string
A producer-defined type label, e.g., "government_registry_extract"
If an evidence record includes a locator, the target resource must be independently access-controlled. Possession of the locator string does not grant access to the underlying artifact.
The optional attribute_paths field creates fine-grained attribution: it maps individual JSON Pointer paths within attributes to one or more evidence records. This lets you trace exactly which document sourced each field in the snapshot.
When submitting snapshot v2 or later, you can include a diff object that explicitly records what changed relative to the previous version. Diffs use RFC 6902 JSON Patch format and target paths under /attributes.
This example (from relationship-change.snapshot.json) records that a beneficial owner’s stake changed from 35% to 40%, and that the relationship was reviewed on 2026-02-20.Allowed diff operations are add, remove, replace, and test. The move and copy operations are not permitted. The attributes object is always the authoritative state — the diff is a derived convenience and does not affect how Tally stores or hashes the snapshot.
Including a diff is optional but recommended for v2+ snapshots. It makes
audit reviews and downstream change-detection significantly easier, and the
API’s diff endpoints can use the embedded diff to return faster responses.
GET /v1/subjects/{subject_type}/{subject_id}/snapshots/latestReturns the highest-versioned snapshot for the subject. Add ?verify=hash or ?verify=chain to include integrity metadata.
By version
GET /v1/subjects/{subject_type}/{subject_id}/snapshots/{snapshot_version}Returns the exact snapshot at a given version number.
By ID
GET /v1/snapshots/{snapshot_id}Retrieves a snapshot by its UUID regardless of subject. Useful when you already have a snapshot_id from a grant or webhook payload.
Full history
GET /v1/subjects/{subject_type}/{subject_id}/snapshotsReturns a paginated list of all snapshots for the subject, ordered by snapshot_version descending by default.
All read endpoints accept a view parameter: view=full (default) returns the complete envelope JSON; view=header returns just the snapshot_id, snapshot_version, subject, and generated_at fields without the full attributes payload.For full endpoint reference, see API Reference → Snapshots.