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",
"deviationUsd": "-0.27"
}
}
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 assetSymbol units. Decimal string. Paid outcomes only.51.42
assetSymbolstringYesThe asset both crypto amounts are denominated in (e.g. USDT). Paid outcomes only.USDT
deviationUsdstring (decimal)YesSigned USD value of received − expected. Negative = underpaid, positive = overpaid, "0" = exact. Decimal string. Paid outcomes only. For open-amount payments it appears only on MISMATCH, computed against the gateway minimum (amountUsd).-0.27

"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-scoped404 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.