Subjects
A subject is the unit of identity. Every subject is identified by two fields:| Field | Values |
|---|---|
subject_type | entity or individual |
subject_id | Stable identifier within its type namespace. You assign this — Tally does not generate it. |
The envelope
All identity data is stored inside anentityStateEnvelopeV1. The envelope has three top-level concerns:
attributes— the identity payload. An open map: any key/value is accepted. The canonical v1 field lists define the expected fields for entity and individual subjects, but you can store additional attributes alongside them.evidence— the provenance array. Each entry records where a piece of data came from, when it was verified, and by whom.audit— who created this snapshot, when, and from what source.
attribute_paths field optionally links specific attribute values to specific evidence entries — this is the per-field provenance model.
Canonical v1 fields
Entity subjects (subject_type: "entity")
legal_name, entity_kind (always "organization"), legal_form, legal_form_code, formation_jurisdiction_code, registry_identifier, formation_date, registered_address, entity_status, lei, tax_identifier, website
Individual subjects (subject_type: "individual")
name (first_name, middle_name, last_name, name_suffix), birth_date, nationalities, residential_address, tax_identifier, email, phone
These fields are TypeScript contracts in @tally/schema. Additional attributes can be stored freely in the open attributes map.
Writes
Identity state is written in two patterns:- Initial creation —
POST /v1/tenants/{tenant_id}/entity-statescreates the first snapshot (version 1) for a new subject. - Updates — subsequent changes use the propose-then-apply flow with RFC 6902 JSON Patch. See Updates.