Skip to main content
Reconciliation answers one question about a payment intent: did the funds that arrived match what was expected, and if an auto-swap ran, what did it cost? SouthPay writes a snapshot each time it checks. This endpoint returns the most recent one. Use it when a payment settled for an amount you did not expect, or when closing your books against the reports export. Paths are relative to https://api.southpay.io/api/v2.

Get the reconciliation snapshot

GET /payment_intents/{payment_intent_id}/reconciliation. Scope payments:read.
This is the only payment route that uses the payment_intents path segment. Every other payment route uses payments. The reconciliation_status field on a payment intent is a shortcut to the status returned here.

Response fields

string
required
One of final, under_investigation, disputed, closed. See statuses.
string | null
What the intent asked for, as a decimal string with trailing zeros stripped.
string | null
What actually arrived, as a decimal string.
string | null
Difference introduced by an auto-swap. Can be negative, for example "-0.001".
string | null
The coin symbol of the asset that was paid, such as USDC. This is not a fiat currency, despite the field name.
string
required
Atomic units. "0" when no snapshot exists.
string
required
Atomic units.
string
required
Atomic units, signed.
string | null
ISO 8601 timestamp of the snapshot. Null when none exists.

Before the first check

An intent that has never been reconciled, because it is unpaid or because the checker has not run yet, still returns 200, not 404. You get a placeholder:
Response 200
Treat last_checked_at: null as “not yet checked”, not as a discrepancy. currency is still filled in from the intent’s deposit address when one exists.

Statuses

Errors

Note the 404 here uses the flat string envelope, unlike most 404 responses in the API, which use {"error": {"message": …, "code": …}}.
Last modified on August 21, 2026