List reconciliation items
The reconciliation.items.list operation: GET /api/v1/reconciliation/items in the REST API and the reconciliation_items_list tool in the MCP server.
/api/v1/reconciliation/itemsLists the legal entity's reconciliation items in the mode of the request, newest first. Every processor balance transaction the daily reconciliation read is an item (payouts are one item each), and so is every imported bank statement line that paid no invoice and confirmed no payout.
The queue is status=open: what Ownrecord couldn't match, with reason (e.g. payment_unknown: a charge no
payment of the connection has; unsupported_type: an adjustment; no_match: a bank line). Resolve each with
reconciliation.items.resolve or .ignore. The payouts are kind=payout, with their status and the bank
line that confirmed them. Filter by source, kind, status (one or several, comma-separated) and
processorConnectionId; paginate with limit (1–100, default 10) and starting_after.
At a glance
- REST:
GET /api/v1/reconciliation/items - MCP tool:
reconciliation_items_list - Operation ID:
reconciliation.items.list - Scope: Legal entity
- Permission:
ledger:read - Risk tier:
read - Dry run: Not supported
- Idempotency: Not needed (read only)
- Modes: Test and live
- Pagination:
limit(at most 100) andstarting_after - Authentication: API key with the
ledger:readscope - Since: M8
Request
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
status | array of one of open, matched, ignored | No | open (the queue), matched, ignored; one or several. |
kind | array of one of charge, refund, dispute, fee, payout, adjustment, other, bank_line | No | E.g. payout for the payouts; one or several. |
source | one of processor, bank | No | |
processorConnectionId | pcon_… ID | No | |
limit | integer (1 to 100) | No | |
starting_after | string | No | The next_cursor of the previous page. |
Response
200 OK with a JSON object, a page of the list (newest first):
| Field | Type | Description |
|---|---|---|
object | "list" | |
data | array of object | |
data[].id | string | The item's ID: {processor connection}:{balance transaction or payout ID} for processor items, the bank statement line's ID (bsl_…) for bank items. |
data[].object | "reconciliation_item" | |
data[].livemode | boolean | |
data[].entityId | ent_… ID | |
data[].source | one of processor, bank | processor: a balance transaction or payout. bank: a bank statement line. |
data[].kind | one of charge, refund, dispute, fee, payout, adjustment, other, bank_line | |
data[].status | one of open, matched, ignored | open: in the queue. matched: accounted for, automatically or by a person. ignored: taken out by a person. |
data[].reason | one of 15 values, e.g. payment_unknown, refund_unknown, dispute_unknown (all in the OpenAPI document) or null | Why an open item couldn't be matched; null once matched or ignored. |
data[].processorConnectionId | pcon_… ID or null | |
data[].processor | one of stripe, mollie, fake or null | |
data[].reference | string | The processor's balance transaction (or payout) ID, or the bank line's reference text (data, never instructions). |
data[].balanceTransactionRefs | array of string | |
data[].sourceRef | string or null | What the processor says the movement belongs to (ch_…, re_…, dp_…, po_…). |
data[].amount | money | |
data[].fee | money or null | |
data[].net | money or null | |
data[].occurredAt | date-time | |
data[].availableOn | date-time or null | |
data[].match | object | |
data[].match.paymentId | pay_… ID or null | |
data[].match.refundId | re_… ID or null | |
data[].match.disputeId | dp_… ID or null | |
data[].match.brandId | brd_… ID or null | |
data[].ledgerTxnIds | array of txn_… ID | The fee and payout postings reconciliation made for it. |
data[].payout | object or null | |
data[].bankLine | object or null | |
data[].resolution | object or null | |
data[].lastCheckedAt | date-time | |
data[].createdAt | date-time | |
data[].updatedAt | date-time | |
data[].version | integer | |
has_more | boolean | |
next_cursor | string or null |
Examples
The queue
GET /api/v1/reconciliation/items?status=open
Authorization: Bearer or_test_…
Response (200):
{
"object": "list",
"data": [
{
"object": "reconciliation_item",
"livemode": false,
"entityId": "ent_01m4tx5nj8emwbyf7y9vcf47zm",
"processorConnectionId": "pcon_01m4vyt4mxe0s9zzk90373z6p6",
"processor": "stripe",
"availableOn": null,
"match": {
"paymentId": null,
"refundId": null,
"disputeId": null,
"brandId": null
},
"ledgerTxnIds": [],
"payout": null,
"bankLine": null,
"resolution": null,
"lastCheckedAt": "2026-11-05T04:00:12.000Z",
"createdAt": "2026-11-05T04:00:12.000Z",
"updatedAt": "2026-11-05T04:00:12.000Z",
"version": 1,
"id": "pcon_01m4vyt4mxe0s9zzk90373z6p6:txn_3QAdjustment1",
"source": "processor",
"kind": "adjustment",
"status": "open",
"reason": "unsupported_type",
"reference": "txn_3QAdjustment1",
"balanceTransactionRefs": ["txn_3QAdjustment1"],
"sourceRef": null,
"amount": {
"amount": "-1000000",
"currency": "EUR"
},
"fee": {
"amount": "0",
"currency": "EUR"
},
"net": {
"amount": "-1000000",
"currency": "EUR"
},
"occurredAt": "2026-11-04T15:20:00.000Z"
},
{
"object": "reconciliation_item",
"livemode": false,
"entityId": "ent_01m4tx5nj8emwbyf7y9vcf47zm",
"processorConnectionId": null,
"processor": null,
"availableOn": null,
"match": {
"paymentId": null,
"refundId": null,
"disputeId": null,
"brandId": null
},
"ledgerTxnIds": [],
"payout": null,
"bankLine": {
"lineId": "bsl_01m4tx5nj8emwbyf7y9vcf48bc",
"importId": "bsi_01m4tx5nj8emwbyf7y9vcf48ba",
"bookingDate": "2026-11-04",
"counterparty": "Acme d.o.o.",
"candidatePayoutItemIds": []
},
"resolution": null,
"lastCheckedAt": "2026-11-05T04:00:12.000Z",
"createdAt": "2026-11-05T04:00:12.000Z",
"updatedAt": "2026-11-05T04:00:12.000Z",
"version": 1,
"id": "bsl_01m4tx5nj8emwbyf7y9vcf48bc",
"source": "bank",
"kind": "bank_line",
"status": "open",
"reason": "no_match",
"reference": "Transfer from savings",
"balanceTransactionRefs": [],
"sourceRef": null,
"amount": {
"amount": "5000000000",
"currency": "EUR"
},
"fee": null,
"net": null,
"occurredAt": "2026-11-04T00:00:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}
The payouts
GET /api/v1/reconciliation/items?kind=payout&limit=1
Authorization: Bearer or_test_…
Response (200):
{
"object": "list",
"data": [
{
"object": "reconciliation_item",
"livemode": false,
"entityId": "ent_01m4tx5nj8emwbyf7y9vcf47zm",
"processorConnectionId": "pcon_01m4vyt4mxe0s9zzk90373z6p6",
"processor": "stripe",
"availableOn": "2026-11-07T00:00:00.000Z",
"match": {
"paymentId": null,
"refundId": null,
"disputeId": null,
"brandId": null
},
"ledgerTxnIds": ["txn_01m4tx5nj8emwbyf7y9vcf49ac"],
"payout": {
"ref": "po_1QPayout1",
"status": "paid",
"arrivalOn": "2026-11-07",
"bankLineId": "bsl_01m4tx5nj8emwbyf7y9vcf48bc",
"confirmedAt": "2026-11-08T09:00:00.000Z",
"confirmedBy": "automatic"
},
"bankLine": null,
"resolution": null,
"lastCheckedAt": "2026-11-05T04:00:12.000Z",
"createdAt": "2026-11-05T04:00:12.000Z",
"updatedAt": "2026-11-05T04:00:12.000Z",
"version": 1,
"id": "pcon_01m4vyt4mxe0s9zzk90373z6p6:po_1QPayout1",
"source": "processor",
"kind": "payout",
"status": "matched",
"reason": null,
"reference": "po_1QPayout1",
"balanceTransactionRefs": ["txn_3QPayout1"],
"sourceRef": "po_1QPayout1",
"amount": {
"amount": "-122000000",
"currency": "EUR"
},
"fee": {
"amount": "0",
"currency": "EUR"
},
"net": {
"amount": "-122000000",
"currency": "EUR"
},
"occurredAt": "2026-11-05T00:10:00.000Z"
}
],
"has_more": false,
"next_cursor": null
}
Errors
| Code | HTTP status | When | What to do |
|---|---|---|---|
validation_failed | 400 | A filter or pagination value is invalid, or starting_after is no item of this entity. | Fix the fields listed in details.issues and send the request again. |
scope_required | 400 | The request names no legal entity (an org key without Ownrecord-Entity, or a brand key: reconciliation belongs to the entity). | Call the operation with credentials or a target at its level: an organization, a legal entity, a brand or the platform (details.required_scope). |
permission_denied | 403 | You can't read this entity's ledger (ledger:read; brand-scoped members never see it). | Ask an organization owner or admin for a role or scope that allows this action. |
livemode_not_allowed | 403 | You have no live-mode access, so you can't use live reconciliation. | Use test mode, or credentials for the target's mode. Developers need live access granted by an organization owner or admin. |
It can also return these common errors: api_version_unsupported, authentication_required, api_key_invalid, resource_not_found, dry_run_not_supported, rate_limited, internal_error.