---
title: "Preview Reconciling Item"
method: POST
path: "/extensions/roboledger/{graph_id}/operations/preview-reconciling-item"
tags: ["RoboLedger: Ledger & Events"]
---

# Preview Reconciling Item

`POST /extensions/roboledger/{graph_id}/operations/preview-reconciling-item`

## Request

- Base URL: `https://api.robosystems.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.robosystems.ai/extensions/roboledger/{graph_id}/operations/preview-reconciling-item`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Read what changed on a reconciling item — an event whose source-system payload changed after it was posted (list them with list-event-blocks is_reconciling_item=true). Returns the posted entries against the accepted payload, the per-account net difference, which disposition applies by default, and anything blocking the others. Writes nothing. Run this before resolve-reconciling-item and agree the treatment with the user — restate moves prior months' figures, catch_up does not.

**Idempotency**: supply an `Idempotency-Key` header to make safe retries; replays within 24 hours return the same envelope. Reusing the key with a different body returns HTTP 409 Conflict.

## Path parameters

- `graph_id` string, required

## Headers

- `Idempotency-Key` string, nullable

## Request body

- PreviewReconcilingItemRequest: Read what changed on a reconciling item, and what resolving it would do.
  - `event_id` string, required: Event id (evt_ prefixed) to inspect

## Response `200`

Successful Response

- OperationEnvelopeReconcilingItemPlan
  - `operation` string, required: Kebab-case operation name
  - `operationId` string, required: op_-prefixed ULID for audit and SSE correlation
  - `status` 'completed' | 'pending' | 'failed', required: Operation lifecycle state
  - `result` ReconcilingItemPlan: What changed upstream, and what each disposition would do about it.
    - `event_id` string, required
    - `external_id` string, nullable
    - `source` string, required
    - `event_type` string, required
    - `event_status` string, required
    - `drift_detected_at` string, date-time, nullable: When the sync first saw this difference
    - `default_disposition` 'restate' | 'catch_up' | 'acknowledge', required: What resolve would do with no disposition given: restate while every affected period is open and nothing blocks it, catch_up otherwise.
    - `default_posting_date` string, date, nullable: Where a catch-up entry would land by default
    - `affected_posting_dates` string[]: Posting dates of the event's entries
    - `closed_periods` string[]: Names of closed periods the event's entries sit in
    - `prior_entries` ReconcilingItemEntrySummary[]
      - `entry_id` string, nullable: Entry id; null for the accepted side, which is not posted yet
      - `external_id` string, nullable
      - `posting_date` string, date, nullable
      - `memo` string, nullable
      - `status` string, nullable: Entry status; null on the accepted side
      - `total_debit` integer
      - `total_credit` integer
    - `accepted_entries` ReconcilingItemEntrySummary[]
      - `entry_id` string, nullable: Entry id; null for the accepted side, which is not posted yet
      - `external_id` string, nullable
      - `posting_date` string, date, nullable
      - `memo` string, nullable
      - `status` string, nullable: Entry status; null on the accepted side
      - `total_debit` integer
      - `total_credit` integer
    - `delta` ReconcilingItemDeltaLine[]: Per-account net change; empty when none
      - `element_id` string, nullable: CoA element id; null when the account is unmapped
      - `element_external_id` string, nullable: Source-system account id, when the line carried one
      - `element_code` string, nullable: Account code
      - `element_name` string, nullable: Account name
      - `prior_net` integer, required: Net of the posted entries, debit-positive
      - `accepted_net` integer, required: Net of the new payload, debit-positive
      - `delta` integer, required: accepted_net - prior_net
    - `no_gl_effect` boolean: The change moves no money — a memo or reference edit. catch_up posts nothing; restate still regenerates so the entries carry the new text.
    - `restate_blockers` string[]: Why restate is unavailable, if it is: a closed period, an entry that was reversed or is not posted, or entries from elsewhere sharing this event's transaction.
    - `unmapped_element_external_ids` string[]: Accounts in the new payload with no mapping in this graph. Both dispositions that write need them mapped first.
  - `at` string, required: ISO-8601 UTC timestamp
  - `createdBy` string, nullable: User ID that initiated the operation
  - `idempotentReplay` boolean: True when this envelope came from the idempotency cache — the underlying command did not execute again. False on fresh executions.

## Other responses

- `400`: Invalid request
- `401`: Authentication required
- `403`: Access denied
- `404`: Resource not found
- `409`: Idempotency-Key conflict — key reused with different body
- `422`: Validation error
- `429`: Rate limit exceeded
- `500`: Internal server error

---

[API](https://skmtc.dev/robosystems/apis/robosystems-api.md) · [All operations](https://skmtc.dev/robosystems/apis/robosystems-api/llms.txt) · [OpenAPI document](https://skmtc.dev/robosystems/apis/robosystems-api/revisions/e661e2d5ca6a?raw)
