How refresh requests work
The counterparty tenant calls
POST /v1/subjects/:subject_type/:subject_id/refresh-requests, supplying their requesting_tenant_id and an optional reason_code, free-text message, or list of requested_paths (JSON Pointer strings pointing to the specific attributes they need refreshed).Tally fires a
refresh_request.created event to any webhook subscriptions the subject owner has registered. The payload includes the full refresh request record so the owner can immediately see what data is being requested.The owner creates a new snapshot (via
POST /v1/tenants/:tenant_id/entity-states or the propose/apply flow), then calls POST /v1/subjects/:subject_type/:subject_id/refresh-requests/:refresh_request_id/fulfill with the new snapshot_id. This links the refresh request to the snapshot that resolves it.Create a refresh request
POST /v1/subjects/:subject_type/:subject_id/refresh-requests
Your principal must be an active member of the requesting_tenant_id with at least the tenant_reader role, and your tenant must hold an active grant to the subject (or be the owner).
Request body fields
| Field | Required | Description |
|---|---|---|
requesting_tenant_id | Yes | Your tenant’s ID — must be a valid tenant with a grant (or ownership) for this subject |
reason_code | No | A short machine-readable code describing why the refresh is needed (e.g. "annual_review", "adverse_media") |
message | No | A human-readable message to the subject owner |
requested_paths | No | Array of JSON Pointer strings specifying which attributes need refreshing |
expires_at | No | ISO 8601 datetime after which this request should be considered stale |
Do not include
origin_type in your request body — it is server-derived. Tally sets it to "counterparty" if your tenant holds a grant to the subject, or "owner" if your tenant is the subject owner.201 Created response wraps the new record in a refresh_request key:
Get a refresh request
GET /v1/subjects/:subject_type/:subject_id/refresh-requests/:refresh_request_id
Both the subject owner and the requesting tenant can call this endpoint. Tally checks that your principal belongs to either the owning tenant or the requesting_tenant_id on the record.
status field follows this lifecycle:
| Status | Meaning |
|---|---|
pending | Created and awaiting fulfillment |
fulfilled | The owner has submitted a new snapshot and resolved the request |
expired | The expires_at timestamp passed without fulfillment |
cancelled | The request was cancelled before fulfillment |
List refresh requests
GET /v1/subjects/:subject_type/:subject_id/refresh-requests
Query parameters
| Parameter | Description |
|---|---|
requesting_tenant_id | Filter to requests from a specific tenant. If omitted, returns all requests for the subject — requires owner access. |
limit | Number of results per page (default 50, max 200) |
cursor | Base64url pagination cursor from a previous response |
Fulfill a refresh request (as owner)
POST /v1/subjects/:subject_type/:subject_id/refresh-requests/:refresh_request_id/fulfill
Once you have submitted a new snapshot, call this endpoint to link it to the pending refresh request. Your principal must be an active member of the subject’s owning tenant.
"status": "fulfilled" and the resolved_snapshot_id populated:
resolved_snapshot_id must correspond to an existing snapshot for the same subject. If the snapshot does not match the subject, or if a different snapshot has already been used to fulfill this request, Tally returns 409 Conflict.
Refresh requests expire automatically. Always check
expires_at before attempting to fulfill a request. Tally will return a 409 Conflict with status set to "expired" or "cancelled" if you try to fulfill a request that is no longer in "pending" status. To handle a re-request after expiry, ask the grantee to create a new refresh request.