---
title: "List reconciliation exceptions"
method: GET
path: "/reconciliation_exceptions"
---

# List reconciliation exceptions

`GET /reconciliation_exceptions`

Returns a paginated list of exceptions, optionally filtered by reconciliation or status. Each row includes data-stream metadata and an aggregates summary so you can render a queue without a follow-up request per row.

## Query parameters

- `reconciliation_id` string
- `status` 'open' | 'investigating' | 'dismissed' | 'resolved'
- `limit` integer
- `offset` integer

## Response `200`

Paginated list of exceptions

- object
  - `data` ReconciliationException[]
    - `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
  - `has_more` boolean
  - `offset` number

## Other responses

- `401` — Unauthorized

---

[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)
