Skip to main content

Decision Log

Read the per-field decision log for handover audit: who decided what, the prior and final values, the action, and the reason. Filter to one pipeline or read org-wide.

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

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, or override.
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.

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"
    }
  ]
}

Errors

Error responses

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