Skip to main content

POST /payments/{id}/verify

Returns the authoritative outcome of a payment and marks it as verified by your server. This is the only response that carries the money figures — the callback and webhook are thin triggers. Concepts and the recommended flow: Verify Payments.

curl -X POST https://api-staging.finomesh.com/api/v1/payments/0d9f3a64-4f0c-4b6e-9f6e-2f4f4c1b8a21/verify \
-H "X-Api-Key: $FINOMESH_API_KEY"

Headers​

HeaderTypeRequiredDescriptionExample
X-Api-KeystringYesGateway API key. Keep it server-side only.<your-api-key>

Path parameters​

ParameterTypeRequiredDescriptionExample
idstring (UUID)YesThe payment UUID from create payment. Must belong to your gateway.0d9f3a64-4f0c-4b6e-9f6e-2f4f4c1b8a21

Request body: None.

Response — 200 OK​

{
"success": true,
"data": {
"paymentId": "0d9f3a64-4f0c-4b6e-9f6e-2f4f4c1b8a21",
"status": "ACCEPTABLE",
"checkoutMode": "HOSTED",
"isVerified": true,
"verifiedAt": "2026-06-12T10:21:43Z",
"amount": "49.99",
"currencyCode": "USD",
"amountUsd": "49.99",
"txHash": "0xabc…",
"expectedAmount": "51.69",
"receivedAmount": "51.42",
"assetSymbol": "USDT",
"receivedAssetId": "293a335d-99e9-44dc-89d1-17d27ce7fe35",
"receivedAssetSymbol": "USDT",
"receivedAmountUsd": "51.42",
"deviationUsd": "-0.27",
"depositPath": "scanner"
}
}
FieldTypeNullableDescriptionExample
paymentIdstring (UUID)NoThe payment UUID.0d9f3a64-…
statusstring (enum)NoThe verdict — one of PENDING, SUCCESS, ACCEPTABLE, MISMATCH, EXPIRED. Fulfil on SUCCESS / ACCEPTABLE.ACCEPTABLE
checkoutModestring (enum)NoHow the payment was integrated — HOSTED or API (see Embedded Checkout / API Mode).HOSTED
isVerifiedbooleanNotrue once a determined payment has been verified. Stays false for PENDING.true
verifiedAtstring (RFC 3339)YesTimestamp of the first verification. Present once verified; omitted while PENDING.2026-06-12T10:21:43Z
amountstring (decimal)NoYour invoice amount in currencyCode units. Decimal string — never a number, to preserve precision.49.99
currencyCodestringYesThe invoice currency ISO code (e.g. USD). Omitted if unresolved.USD
amountUsdstring (decimal)NoYour invoice amount converted to USD. Decimal string — never a number.49.99
openAmountbooleanNotrue for an open-amount payment — one created with no fixed amount, where the payer chooses what to send. For these, amount / amountUsd are 0 until the deposit confirms, then back-filled: what actually arrived on SUCCESS, or the gateway minimum (the expected amount) on MISMATCH. expectedAmount is always absent (nothing was quoted per-offer); deviationUsd appears only on MISMATCH — the signed shortfall against the minimum, e.g. "-2" for $8 received of a $10 minimum. Open-amount is only available to specifically-provisioned gateways; if you have not arranged it, this is always false.false
txHashstringYesThe resolving on-chain transaction hash. Paid outcomes only.0xabc…
expectedAmountstring (decimal)YesThe crypto amount the customer was quoted (the paid offer's totalValue), in assetSymbol units. Decimal string. Paid outcomes only, and absent for open-amount payments — they were never quoted.51.69
receivedAmountstring (decimal)YesWhat actually arrived on-chain, in receivedAssetSymbol units (normally the same as assetSymbol — see below). Decimal string. Paid outcomes only.51.42
assetSymbolstringYesThe asset the customer was quoted in — expectedAmount is denominated in it (e.g. USDT). Paid outcomes only.USDT
receivedAssetIdstring (UUID)YesThe asset the deposit actually arrived in. Normally the quoted asset; it differs when the customer paid in a different asset than they selected (e.g. sent native TRX to a USDT address) — the deposit is then valued at the received asset's own market price and judged in USD, and receivedAmount is denominated in this asset, not assetSymbol. Paid outcomes only.293a335d-…
receivedAssetSymbolstringYesSymbol of receivedAssetId (e.g. TRX). Compare it with assetSymbol: when they differ, do not compare receivedAmount to expectedAmount unit-for-unit — use receivedAmountUsd / deviationUsd, which are always computed in USD from the actual valuation. Paid outcomes only.USDT
receivedAmountUsdstring (decimal)YesreceivedAmount valued in USD at the received asset's market price, quantised to cents. The direct USD equivalent of what arrived — e.g. a 30 TRX deposit against a 15 USDT quote reports "10", not "30". Compare it to amountUsd for a unit-safe check in any asset situation. Present alongside deviationUsd (same availability).51.42
deviationUsdstring (decimal)YesSigned USD value of received − expected. Negative = underpaid, positive = overpaid, "0" = exact. Decimal string. Paid outcomes only. Always safe to branch on — including when the received asset differs from the quoted one. For open-amount payments it appears only on MISMATCH, computed against the gateway minimum (amountUsd).-0.27
depositPathstring (enum)YesHow the deposit reached us: scanner (paid inside the payment window — the ordinary case), late_confirmation (paid inside the window, confirmed after it closed), late_capture (paid after the window and credited anyway — see Payment Statuses), or manual_inquiry (matched from a transaction hash submitted after the fact). Present once a deposit has been recorded. You do not need to branch on it to fulfil — status remains the decision; it explains a payment that resolved after expiring.scanner
amlStatestring (enum)YesAML disposition, AML-screened gateways only — omitted on every payment screening never flagged. HELD: funds are in your held balance (totalQuarantined* on balances), excluded from totalAvailable until you cash them out. RELEASED: paid to you (drained or released by an operator). REFUNDED: returned to the customer. WITHHELD: seized.HELD
isQuarantinedbooleanYestrue while the funds sit in the held pool (amlState: "HELD"). Omitted when false.true

"Paid outcomes" = SUCCESS, ACCEPTABLE, MISMATCH — those fields appear together once a resolving transaction exists, and are omitted for PENDING / EXPIRED.

Behavior​

  • Idempotent — safe to call repeatedly; you always get the current authoritative state.
  • PENDING is a no-op — the response reports PENDING with isVerified: false; nothing is marked.
  • Quiets the webhook — verifying a payment causes any still-undelivered webhook for it to be skipped.
  • Ownership-scoped — 404 not_found for unknown IDs and for payments of other gateways.

Errors​

HTTP statusError codeMeaningHow to fix
401auth_api_key_invalidBad or missing API key.Send a valid X-Api-Key from a verified gateway.
404not_foundUnknown ID, or the payment belongs to another gateway.Check the payment ID — it must belong to your gateway.