---
title: "Update a reconciliation exception"
method: PATCH
path: "/reconciliation_exceptions/{id}"
---

# Update a reconciliation exception

`PATCH /reconciliation_exceptions/{id}`

Update the title, description, or status of an exception.

## Path parameters

- `id` string, required

## Request body

- object
  - `title` string
  - `description` string
  - `status` 'open' | 'investigating' | 'dismissed' | 'resolved'

## Response `200`

Exception updated

- ReconciliationException — A reconciliation exception represents unmatched overdue records that need human attention. Exceptions are scoped to a (reconciliation, data_stream) tuple and managed by the sweeper job — record membership is computed on read from the set of unmatched records whose `overdue_at` has passed.
  - `id` integer
  - `reconciliation_id` integer, required — The reconciliation this exception belongs to
  - `reconciliation_name` string — Name of the parent reconciliation
  - `data_stream_id` integer, required — The data stream this exception is scoped to
  - `data_stream_name` string — Human-readable name of the scoped data stream
  - `data_stream_key` string — Immutable key of the scoped data stream
  - `title` string, required
  - `description` string
  - `status` 'open' | 'investigating' | 'dismissed' | 'resolved'
  - `created_at` string, date-time
  - `updated_at` string, date-time
  - `opened_at` string, date-time, nullable — When the exception most recently transitioned into an open state. Distinct from `created_at` so reopening is tracked cleanly.
  - `closed_at` string, date-time, nullable — When the exception most recently transitioned into a resolved or dismissed state. Cleared on reopen.
  - `assignees` object[]
    - `id` integer
    - `workos_user_id` string
  - `decimal_places` integer — Number of decimal places (2 for USD)
  - `aggregates` ExceptionAggregates — Summary statistics for the (filtered) set of unmatched overdue records behind an exception.
    - `record_count` integer — Number of matching overdue unmatched records
    - `total_amount` integer — Sum of signed amounts in cents (debits are negative)
    - `debit_count` integer — Count of records with amount < 0
    - `debit_sum` integer — Sum of debit amounts in cents (non-positive)
    - `credit_count` integer — Count of records with amount > 0
    - `credit_sum` integer — Sum of credit amounts in cents (non-negative)
    - `avg_age_days` number — Average age in days since each record's `overdue_at`
    - `oldest_at` string, date-time, nullable — Transaction date of the oldest record in the slice
    - `newest_at` string, date-time, nullable — Transaction date of the newest record in the slice
  - `filtered_aggregates` ExceptionAggregates — Summary statistics for the (filtered) set of unmatched overdue records behind an exception.
    - `record_count` integer — Number of matching overdue unmatched records
    - `total_amount` integer — Sum of signed amounts in cents (debits are negative)
    - `debit_count` integer — Count of records with amount < 0
    - `debit_sum` integer — Sum of debit amounts in cents (non-positive)
    - `credit_count` integer — Count of records with amount > 0
    - `credit_sum` integer — Sum of credit amounts in cents (non-negative)
    - `avg_age_days` number — Average age in days since each record's `overdue_at`
    - `oldest_at` string, date-time, nullable — Transaction date of the oldest record in the slice
    - `newest_at` string, date-time, nullable — Transaction date of the newest record in the slice
  - `comments` object[] — Comments on this exception, oldest first
    - `id` integer
    - `body` string
    - `author_workos_id` string
    - `mentions` integer[] — User IDs mentioned in the comment
    - `created_at` string, date-time
  - `investigation` AgentInvestigationSession — An agent-run investigation into an exception's record slice.
    - `id` integer
    - `status` string — Investigation status (e.g. pending, running, completed, failed)
    - `outcome` 'match_found' | 'no_match' | 'needs_review' | 'null', nullable — Standardized outcome of a completed investigation. `match_found` = confident candidate matches; `no_match` = thorough search returned nothing; `needs_review` = candidates found but signals are weak. Null when the session is not yet completed or failed.
    - `recommendation_text` string, nullable — Agent's recommendation once the investigation completes
    - `confidence_score` number, nullable — Agent confidence in its recommendation (0.0-1.0)
    - `candidate_records_searched` integer, nullable — Number of candidate records the agent evaluated
    - `suggested_record_ids` integer[], nullable — Records the agent suggests linking to this exception
    - `filter_params` object, nullable — Filter parameters the session was scoped to, if any. Matches the filter shape on `GET /reconciliation_exceptions/{id}`.
    - `completed_at` string, date-time, nullable
    - `created_at` string, date-time
  - `investigation_sessions` AgentInvestigationSession[] — Up to the five most recent investigation sessions, newest first. Exceptions may accumulate multiple sessions as the overdue set evolves.
    - `id` integer
    - `status` string — Investigation status (e.g. pending, running, completed, failed)
    - `outcome` 'match_found' | 'no_match' | 'needs_review' | 'null', nullable — Standardized outcome of a completed investigation. `match_found` = confident candidate matches; `no_match` = thorough search returned nothing; `needs_review` = candidates found but signals are weak. Null when the session is not yet completed or failed.
    - `recommendation_text` string, nullable — Agent's recommendation once the investigation completes
    - `confidence_score` number, nullable — Agent confidence in its recommendation (0.0-1.0)
    - `candidate_records_searched` integer, nullable — Number of candidate records the agent evaluated
    - `suggested_record_ids` integer[], nullable — Records the agent suggests linking to this exception
    - `filter_params` object, nullable — Filter parameters the session was scoped to, if any. Matches the filter shape on `GET /reconciliation_exceptions/{id}`.
    - `completed_at` string, date-time, nullable
    - `created_at` string, date-time

## Other responses

- `404` — Exception not found

---

[API](https://skmtc.net/endclose/apis/end-close-api.md) · [All operations](https://skmtc.net/endclose/apis/end-close-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/endclose/end-close-api/revisions/613ceff68dc7/schema)
