---
title: "Bulk manually reconcile records"
method: POST
path: "/reconciliation/records/reconcile"
tags: ["ReconciliationRecords"]
---

# Bulk manually reconcile records

`POST /reconciliation/records/reconcile`

Marks multiple reconciliation records as manually reconciled in a single bulk operation, capturing operator supplied reasons and comments. Records must not already be in a reconciled resolution. The response includes a summary of successes and failures.

## Request body

- object — Payload used to bulk manually reconcile multiple records. Both `tagSlugs` and `reasons` are optional — manual reconciliation can run without any tags. When both are supplied, `tagSlugs` is the source of truth and `reasons` is ignored. The same tag set applies to every record in the batch.
  - `id` string[], required — List of record identifiers to reconcile.
  - `tagSlugs` string[] — Slugs of merchant-catalog tags to attach to every record in the batch as part of the reconcile action. Validated against the merchant tag catalog once before any DB write.
  - `reasons` string[] — Deprecated. Use `tagSlugs` instead. Existing values continue to work and are coerced into the tag slug list when `tagSlugs` is empty; they will also be persisted on the published `manual-reconciliation-action` analytics event so downstream dashboards keep working. This field may be removed in a future major release.
  - `comments` string, nullable — Optional operator comments associated with the manual reconciliation.

## Response `200`

Bulk reconciliation completed. See response for individual record outcomes.

- object — Response containing the outcome of a bulk manual reconciliation operation.
  - `success` integer, required — Number of records that were successfully reconciled.
  - `total` integer, required — Total number of records processed.
  - `failed` integer, required — Number of records that failed to reconcile.
  - `result` object[], required — Individual outcome for each record in the request.
    - `id` string, uuid, required — Identifier of the record.
    - `currentResolution` 'RECONCILED' | 'UNRECONCILED' — The resolution state of the record after the operation.
    - `currentStatus` 'OPEN' | 'FOREIGN' | 'DISCREPANCY' | 'MATCHED' | 'MANUALLY_RECONCILED' | 'MANUALLY_MATCHED' | 'MISSING_FROM_PSP' | 'MISSING_FROM_ACQUIRER' | 'MISSING_FROM_MERCHANT' — The status of the record after the operation.
    - `error` string — Error message if the reconciliation of this record failed. Only present when the record failed to reconcile.

## Other responses

- `400` — Bad Request.
- `401` — Unauthorized.
- `403` — Forbidden.
- `429` — Too Many Requests.
- `500` — Internal Server Error.

---

[API](https://skmtc.net/payrails/apis/payrails-api-reference.md) · [All operations](https://skmtc.net/payrails/apis/payrails-api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/payrails/payrails-api-reference/revisions/9dd2f0158582/schema)
