Skip to main content

Decision Log

Read the append-only field review decision log: who decided what, prior and final values, action, and reason. Filter to one pipeline or read the org-wide log.

Read the field-review decision log as JSON. The log is the append-only audit trail of every review resolution: for each decision it records who decided, the field, the action (approve, correct, override), the prior and final values, the triggering gate, and the reason note. This is the handover artifact a customer reviews to see exactly how every held value was settled.

Filter to a single run with pipeline_id, or omit it for the org-wide log across every run. Each entry ties back to its pipeline, document, and field, and carries the decider: API-driven resolutions are attributed to the api actor, while app resolutions carry the reviewer's name. The log is ordered newest decision first.

Decisions are immutable once written: resolving the same field again appends a new row rather than editing the old one, so the log is a complete chronological record. For a spreadsheet-friendly export of the same data, use the CSV decisions export endpoint. This endpoint requires an API key with the read scope.

The decision log is append-only. A field resolved more than once produces one row per decision, so the log reads as a complete chronological history rather than a current-state snapshot.
GET/v1/field-reviews/decisions

Query parameters

pipeline_idstringScope to one pipeline run (UUID). Omit for the org-wide log.

curl

curl -s "https://api.talonic.com/v1/field-reviews/decisions?pipeline_id=a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -H "Authorization: Bearer tlnc_your_api_key"

Response

Response fields

totalintegerTotal number of decisions matching the filter.
entriesarrayDecision log rows, newest first.
entries[].idstringDecision row UUID.
entries[].pipelineIdstringPipeline run the decision belongs to.
entries[].pipelineDocumentIdstringPipeline document the field belongs to.
entries[].documentIdstringSource document UUID.
entries[].documentNamestring | nullSource document filename.
entries[].fieldKeystringResolved field key.
entries[].triggerTypestringWhat parked the field: gate or declarative.
entries[].stageNamestring | nullTriggering validation gate name, if any.
entries[].actionstringapprove, correct, override, or recommend — a reviewer's advisory proposal on a field they could not decide directly. A recommend row carries no authority: it never appears in the CSV export.
entries[].priorValuestring | nullValue before the decision.
entries[].finalValuestring | nullValue after the decision.
entries[].reasonstring | nullAudit note recorded with the decision.
entries[].decidedBystring | nullUser UUID, or null for system / API actors.
entries[].decidedByNamestring | nullDecider label (api for API-driven decisions).
entries[].decidedAtstringISO 8601 decision timestamp.
entries[].recommendedActionstring | nullSet only on a recommend row: the action (approve or correct) the recommender proposed. Null on every other row.
entries[].recommendationIdstring | nullCredit link: the recommend row this decision confirmed or overruled, if the decider acted on one. Null when no recommendation preceded the decision.
entries[].recommendedByNamestring | nullName of the reviewer who made the linked recommendation, denormalized from recommendationId. Null when recommendationId is null.
entries[].decidedByEmailstring | nullEmail of the deciding user, joined live from the user record. Null for machine actors, API-key decisions, and deleted users.
entries[].recommendedByEmailstring | nullEmail of the reviewer who made the linked recommendation. Null when recommendationId is null or that user record no longer exists.

Response

{
  "total": 1,
  "entries": [
    {
      "id": "dec_uuid_1",
      "pipelineId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "pipelineDocumentId": "pd_uuid_1",
      "documentId": "doc_uuid_1",
      "documentName": "lease_oct.pdf",
      "fieldKey": "total_amount",
      "triggerType": "gate",
      "stageName": "Amount reconciliation",
      "action": "correct",
      "priorValue": "12,500.00",
      "finalValue": "12500.00",
      "reason": "Stripped thousands separator to match field format.",
      "decidedBy": null,
      "decidedByName": "api",
      "decidedAt": "2024-09-14T11:20:05.000Z",
      "recommendedAction": null,
      "recommendationId": null,
      "recommendedByName": null,
      "decidedByEmail": null,
      "recommendedByEmail": null
    }
  ]
}

Errors

Error responses

401unauthorizedMissing or invalid API key.
429rate_limitedToo many requests. Retry after the period indicated in the Retry-After header.

Frequently asked questions

How are API-driven decisions attributed?+
Resolutions made through the API are recorded with `decidedByName` of `api` and a null `decidedBy` user id, so they are attributable without forging a user record. App resolutions carry the reviewer's name and, when the user record still exists, their email (`decidedByEmail`).
Can I get the whole organization's log at once?+
Yes. Omit `pipeline_id` to read the org-wide decision log across every run. Pass `pipeline_id` to scope to a single run for a per-run handover.
Can a decision log entry be edited or deleted?+
No. Decisions are immutable once written. Resolving the same field again appends a new row rather than editing the old one, so the log is a complete chronological record of every human decision.