---
title: "Run a reconciliation"
method: POST
path: "/reconciliations/{id}/run"
---

# Run a reconciliation

`POST /reconciliations/{id}/run`

## Request

- Base URL: `https://api.endclose.com/v1`
- URL: `https://api.endclose.com/v1/reconciliations/{id}/run`
- Auth: API key in header `X-API-KEY`

Starts a batch run of the matching engine over the reconciliation's unmatched records and active rules, the same run as Run in the app. The run works in the background: poll `GET /reconciliations/{id}`, whose `current_run` is this run while it is pending or running and whose `last_run` is it once it has completed or failed. Only batch reconciliations can be run on demand; continuous reconciliations match each record as it arrives. A reconciliation has at most one run in progress.

## Path parameters

- `id` string, required

## Headers

- `Idempotency-Key` string

## Response `202`

Run queued

- object
  - `reconciliation_id` string
  - `run` ReconciliationRun: A single execution of a reconciliation's batch or continuous matching pipeline.
    - `id` string, uuid
    - `kind` 'batch' | 'continuous'
    - `status` 'pending' | 'running' | 'completed' | 'failed' | 'cancelled'
    - `trigger` 'manual' | 'rule_activated' | 'agent' | 'record_created' | 'ingestion': What initiated this run. `ingestion` runs are queued automatically once an import lands, so rollup (many_to_one) rules apply to the new records.
    - `total_records` integer: Total records considered by the run
    - `processed_records` integer: Records processed so far
    - `matched_records` integer: Records that were matched during the run
    - `rule_summary` object, nullable: Per-rule match counts, populated as the run progresses
    - `progress` integer: Processing progress as a percentage (0-100)
    - `started_at` string, date-time, nullable
    - `completed_at` string, date-time, nullable

## Other responses

- `404`: Reconciliation not found
- `409`: A run of this reconciliation is already pending or running. The body's `run` is that run, which you can poll instead.
- `422`: The reconciliation is continuous, so it has no on-demand run

## Changes

- **2026-10-29** `159f9ed3dbf4`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/endclose/apis/end-close-api/changes/reconciliations/:id/run/post.md)

---

[API](https://skmtc.dev/endclose/apis/end-close-api.md) - [All operations](https://skmtc.dev/endclose/apis/end-close-api/llms.txt) - [OpenAPI document](https://skmtc.dev/endclose/apis/end-close-api/revisions/dfe0fde00f12?raw)
