{"openapi":"3.0.3","info":{"title":"Nowpay Merchant API","version":"1.0.0","description":"Nowpay is a custodial USDT multi-chain payment gateway. This API is designed to be drop-in compatible with NowPayments: same `x-api-key` authentication header, same REST verb conventions, same `ipn_callback_url` webhook pattern, and the same JSON envelope for errors (`{ error: { code, message } }`).\n\n**Key differences from NowPayments** (see *Migrating from NowPayments* section in the docs page for the full table):\n- Nowpay only settles **USDT** (5 EVM networks: BSC, Polygon, Arbitrum, Optimism, Base). NowPayments supports 300+ coins.\n- Nowpay uses **ledger-scoped balances per chain** (BSC USDT, Polygon USDT, etc.) instead of a single wallet balance.\n- Nowpay payouts require an **`Idempotency-Key` header** (NowPayments does not).\n- Nowpay webhooks sign the body with **HMAC-SHA256** via the `X-Signature` header, AND additionally emit the NowPayments-style `x-nowpayments-sig` (HMAC-SHA512) header for migration friendliness.\n","contact":{"name":"Nowpay Developer Support","email":"support@nowpay.io"},"license":{"name":"Proprietary","url":"https://nowpay.io/terms"}},"externalDocs":{"description":"Human-readable docs","url":"/en/api-docs"},"servers":[{"url":"https://nowpay.finance","description":"Production gateway"},{"url":"http://localhost:3000","description":"Local development"}],"tags":[{"name":"Invoices","description":"Create and inspect payment invoices"},{"name":"Payouts","description":"Send USDT to beneficiaries"},{"name":"Balance","description":"Inspect merchant ledger balances"},{"name":"Networks","description":"List supported blockchains"},{"name":"Swaps","description":"Cross-chain USDT swaps"},{"name":"Webhooks","description":"Outgoing IPN-style event deliveries"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"Merchant API key (format `sk_live_...` or `sk_test_...`). Generated from the merchant dashboard → API Keys tab. NowPayments-compatible: the same key may also be sent as `Authorization: Bearer sk_live_...`."},"BearerAuth":{"type":"http","scheme":"bearer","description":"Alternative form: `Authorization: Bearer sk_live_...`. Functionally identical to `x-api-key`."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_amount"},"message":{"type":"string","example":"amount must be a numeric string"}}}}},"InvoiceCreateRequest":{"type":"object","required":["amount","network"],"properties":{"amount":{"type":"string","example":"50.00","description":"USDT amount to charge, as a numeric string (avoids JS float-precision loss). Minimum 0.01."},"network":{"type":"string","enum":["bsc","polygon","arbitrum","optimism","base"],"example":"polygon","description":"Chain on which the customer will pay USDT."},"external_id":{"type":"string","example":"order_abc123","description":"Merchant-internal order ID. Useful for reconciliation."},"success_url":{"type":"string","format":"uri","example":"https://shop.example.com/thanks","description":"Redirect URL after successful payment."},"cancel_url":{"type":"string","format":"uri","example":"https://shop.example.com/cart","description":"Redirect URL after cancellation / timeout."},"metadata":{"type":"object","description":"Arbitrary merchant metadata (stored as JSON).","additionalProperties":true}}},"Invoice":{"type":"object","required":["id","status","amount","network"],"properties":{"id":{"type":"string","example":"inv_abc123"},"status":{"type":"string","enum":["waiting","confirming","finished","expired","refunded"],"example":"waiting","description":"`waiting` (deposit address generated, awaiting funds), `confirming` (deposit seen on-chain, awaiting finality), `finished` (credited to merchant balance), `expired` (no deposit within 1 hour), `refunded` (manual reversal)."},"amount":{"type":"string","example":"50.00"},"paid_amount":{"type":"string","nullable":true,"example":"50.00","description":"Actual amount received (may differ from `amount` if customer over/underpays)."},"network":{"type":"string","example":"polygon"},"address":{"type":"string","example":"0x7d5a3f9c2b1e8a4d6f0c2b5a7e9d1f3c4b2a8e6d","description":"HD-derived deposit address the customer should send USDT to."},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"external_id":{"type":"string","nullable":true,"example":"order_abc123"},"overpaid":{"type":"boolean","example":false},"checkout_url":{"type":"string","format":"uri","example":"https://nowpay.finance/i/inv_abc123","description":"Hosted checkout page URL."}}},"InvoiceListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"}},"next_cursor":{"type":"string","nullable":true,"example":"inv_xyz789","description":"Cursor for the next page. `null` when there are no more results."}}},"PayoutCreateRequest":{"type":"object","required":["amount","network","address"],"properties":{"amount":{"type":"string","example":"100.00","description":"USDT to send. Numeric string. Must be ≥ chain.min_payout."},"network":{"type":"string","enum":["bsc","polygon","arbitrum","optimism","base"],"example":"polygon"},"address":{"type":"string","example":"0xRecipientAddress","description":"Beneficiary EVM address. Must be whitelisted if merchant has `require_whitelist` enabled."}}},"Payout":{"type":"object","properties":{"id":{"type":"string","example":"po_xyz789"},"status":{"type":"string","enum":["pending_review","approved","broadcasting","sent","failed","rejected"],"example":"approved","description":"`pending_review` (waiting for admin approval if above auto-approve limit), `approved` (saga triggered, funds locked), `broadcasting` (tx submitted to RPC), `sent` (tx confirmed on-chain), `failed` (broadcast rejected after retries), `rejected` (admin rejected)."},"amount":{"type":"string","example":"100.00"},"network":{"type":"string","example":"polygon"},"address":{"type":"string","example":"0xRecipientAddress"},"fee_network":{"type":"string","example":"0.5029","description":"Total network fee (gas charged + platform fee)."},"gas_estimate_usdt":{"type":"string","example":"0.0023"},"gas_charged_usdt":{"type":"string","example":"0.0029","description":"Gas estimate × padding × markup."},"platform_fee_usdt":{"type":"string","example":"0.50"},"txid":{"type":"string","nullable":true,"example":"0xabc...","description":"On-chain transaction hash. Set when status = `sent`."},"created_at":{"type":"string","format":"date-time"},"sent_at":{"type":"string","format":"date-time","nullable":true},"error":{"type":"string","nullable":true,"description":"Error message if status = `failed`."}}},"PayoutListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Payout"}}}},"PayoutEstimate":{"type":"object","description":"Fee breakdown preview for a payout.","properties":{"network":{"type":"string","example":"polygon"},"amount":{"type":"string","example":"100.00"},"gas_estimate_usdt":{"type":"string","example":"0.0023","description":"Real on-chain gas cost in USDT."},"gas_charged_usdt":{"type":"string","example":"0.0029","description":"Gas estimate × padding (1.2) × markup (1.05)."},"platform_fee_usdt":{"type":"string","example":"0.50","description":"payoutFeeFixed + amount × payoutFeeBps."},"fee_network_total":{"type":"string","example":"0.5029","description":"gas_charged + platform_fee."},"total_debited":{"type":"string","example":"100.5029","description":"amount + fee_network_total. Locked from merchant balance at payout time."},"beneficiary_receives":{"type":"string","example":"100.00","description":"Always equals `amount`."},"meta":{"type":"object","properties":{"gas_token":{"type":"string","example":"POL"},"gas_token_amount":{"type":"string","example":"0.000003"},"gas_price_wei":{"type":"string","example":"50000000"},"gas_units":{"type":"string","example":"60000"},"padding_bps":{"type":"integer","example":2000},"markup_bps":{"type":"integer","example":500},"payout_fee_fixed":{"type":"string","example":"0.50"},"payout_fee_bps":{"type":"integer","example":0},"gas_price_cached":{"type":"boolean","example":true},"token_price_cached":{"type":"boolean","example":true},"token_price_fallback":{"type":"boolean","example":false}}}}},"Balance":{"type":"object","properties":{"total":{"type":"string","example":"1250.00","description":"Total available USDT across all chains."},"locked":{"type":"string","example":"100.00","description":"Total USDT locked in pending payouts."},"by_network":{"type":"object","description":"Available balance per chain.","additionalProperties":{"type":"string"},"example":{"bsc":"250.00","polygon":"1000.00"}},"by_network_locked":{"type":"object","description":"Locked balance per chain.","additionalProperties":{"type":"string"},"example":{"bsc":"0","polygon":"100.00"}}}},"Network":{"type":"object","properties":{"code":{"type":"string","example":"polygon"},"name":{"type":"string","example":"Polygon PoS"},"chain_id":{"type":"integer","example":137},"usdt_contract":{"type":"string","example":"0xc2132D05D31c914a87C6611C10748AEb04B58e8F"},"decimals":{"type":"integer","example":6},"gas_token":{"type":"string","example":"POL"},"confirmations":{"type":"integer","example":10},"finality_strategy":{"type":"string","example":"block_count"},"is_premium":{"type":"boolean","example":false},"payout_fee_fixed":{"type":"string","example":"0.50"},"payout_fee_bps":{"type":"integer","example":0},"min_payout":{"type":"string","example":"1.00"},"hot_wallet_treshold":{"type":"string","example":"5000.00"}}},"NetworkListResponse":{"type":"object","properties":{"networks":{"type":"array","items":{"$ref":"#/components/schemas/Network"}}}},"SwapCreateRequest":{"type":"object","required":["from_network","to_network","amount"],"properties":{"from_network":{"type":"string","example":"bsc"},"to_network":{"type":"string","example":"polygon"},"amount":{"type":"string","example":"100.00"}}},"Swap":{"type":"object","properties":{"id":{"type":"string","example":"sw_abc12345"},"fee":{"type":"string","example":"0.50","description":"Swap fee (default 0.5% = 50 bps)."},"status":{"type":"string","enum":["done","failed"],"example":"done"},"from_network":{"type":"string","example":"bsc"},"to_network":{"type":"string","example":"polygon"},"amount":{"type":"string","example":"100.00"}}},"WebhookPayload":{"type":"object","description":"All webhook deliveries share the same envelope: an `event` string identifying the type, a `data` object with the resource, and a `timestamp` ISO-8601 string. The raw body is HMAC-signed and the signature is sent in the `X-Signature` (SHA-256) and `x-nowpayments-sig` (SHA-512) headers.","properties":{"event":{"type":"string","enum":["invoice.waiting","invoice.confirming","invoice.finished","invoice.expired","deposit.credited","payout.pending_review","payout.approved","payout.broadcasting","payout.sent","payout.failed","swap.done","treasury.gas_low"],"example":"invoice.finished"},"data":{"type":"object","additionalProperties":true,"description":"Event-specific payload (invoice, payout, swap, etc.)."},"timestamp":{"type":"string","format":"date-time"}}}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Optional for invoices, **required for payouts and swaps**. Replaying the same key with the same body returns the cached response (avoids double-charging on network retries). Recommended format: UUIDv4."},"ApiKeyHeader":{"name":"x-api-key","in":"header","required":true,"schema":{"type":"string"},"description":"Merchant API key (`sk_live_...` or `sk_test_...`)."}},"responses":{"Unauthorized":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"missing_auth","message":"missing or malformed Authorization header"}}}}},"Forbidden":{"description":"API key lacks the required scope, or merchant KYB is not approved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"insufficient_scope","message":"scope 'payout' required"}}}}},"RateLimited":{"description":"Rate limit exceeded (60 req/min per API key).","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"60"},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"0"},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix epoch seconds."},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded — see X-RateLimit-Reset header"}}}}}}},"security":[{"ApiKeyAuth":[]}],"paths":{"/api/v1/invoices":{"post":{"tags":["Invoices"],"summary":"Create an invoice","description":"Creates a new payment invoice. Nowpay generates an HD-derived deposit address on the requested chain, queues a webhook delivery for `invoice.waiting`, and returns the hosted checkout URL. NowPayments-equivalent: `POST /v1/invoice`.","operationId":"createInvoice","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceCreateRequest"}}}},"responses":{"201":{"description":"Invoice created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"},"example":{"id":"inv_abc123","status":"waiting","address":"0x7d5a3f9c2b1e8a4d6f0c2b5a7e9d1f3c4b2a8e6d","amount":"50.00","network":"polygon","expires_at":"2026-01-01T12:00:00.000Z","checkout_url":"https://nowpay.finance/i/inv_abc123"}}}},"400":{"description":"Invalid request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"description":"Idempotency-Key reused with different body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}},"get":{"tags":["Invoices"],"summary":"List invoices","description":"Returns a paginated list of invoices for the authenticated merchant, or a single invoice if `?id=` is supplied. NowPayments-equivalent: `GET /v1/invoice` (list) or `GET /v1/invoice/{id}` (single).","operationId":"listInvoices","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"name":"id","in":"query","schema":{"type":"string"},"description":"Return a single invoice by ID. Mutually exclusive with `cursor`."},{"name":"status","in":"query","schema":{"type":"string","enum":["waiting","confirming","finished","expired","refunded"]},"description":"Filter by status."},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":100},"description":"Page size (max 100)."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor returned in `next_cursor` of the previous page."}],"responses":{"200":{"description":"List of invoices (or single invoice if `?id=` supplied).","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Invoice"},{"$ref":"#/components/schemas/InvoiceListResponse"}]},"example":{"data":[{"id":"inv_abc123","external_id":"order_123","amount":"50.00","status":"finished","network":"polygon","address":"0x7d5a3f9c2b1e8a4d6f0c2b5a7e9d1f3c4b2a8e6d","created_at":"2026-01-01T11:00:00.000Z","expires_at":"2026-01-01T12:00:00.000Z"}],"next_cursor":null}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Invoice not found when `?id=` is supplied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/payouts":{"post":{"tags":["Payouts"],"summary":"Create a payout","description":"Requests a USDT payout to a beneficiary address. Funds are locked immediately via a double-entry ledger transaction. If the amount is below the merchant's `autoApproveLimit`, the payout saga runs automatically; otherwise it enters `pending_review` and an admin must approve (with 2FA for large amounts). NowPayments-equivalent: `POST /v1/payout`.","operationId":"createPayout","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"},"description":"**Required.** Replay-safe key (UUIDv4 recommended)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutCreateRequest"}}}},"responses":{"202":{"description":"Payout accepted (queued for saga).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"},"example":{"id":"po_xyz789","status":"approved","fee_network":"0.5029","gas_estimate_usdt":"0.0023","gas_charged_usdt":"0.0029","platform_fee_usdt":"0.50","amount":"100.00","network":"polygon","address":"0xRecipientAddress","created_at":"2026-01-01T12:30:00.000Z"}}}},"400":{"description":"Invalid request, missing Idempotency-Key, below minimum, or invalid address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Address not whitelisted, or emergency stop active.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Insufficient balance, or daily limit exceeded, or payouts frozen by reconciliation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}},"get":{"tags":["Payouts"],"summary":"List payouts","description":"Returns the merchant's payouts (newest first). NowPayments-equivalent: `GET /v1/payout`.","operationId":"listPayouts","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["pending_review","approved","broadcasting","sent","failed","rejected"]},"description":"Filter by status."},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":100}}],"responses":{"200":{"description":"List of payouts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutListResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/payouts/estimate":{"get":{"tags":["Payouts"],"summary":"Estimate payout fees","description":"Previews the fee breakdown for a payout **before** the merchant commits. The numbers returned here are exactly what will be locked from the merchant's balance on the subsequent `POST /api/v1/payouts` call (gas prices are cached for 30 s, so minor drift may occur — absorbed by the +20% padding). NowPayments-equivalent: `GET /v1/estimated-price`.","operationId":"estimatePayout","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"name":"network","in":"query","required":true,"schema":{"type":"string","enum":["bsc","polygon","arbitrum","optimism","base"]}},{"name":"amount","in":"query","required":true,"schema":{"type":"string"},"description":"USDT amount (numeric string, e.g. `\"100.50\"`)."}],"responses":{"200":{"description":"Fee breakdown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutEstimate"}}}},"400":{"description":"Missing `network`/`amount`, below minimum, or chain inactive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/balance":{"get":{"tags":["Balance"],"summary":"Get merchant balance","description":"Returns the merchant's available + locked USDT balances, broken down by chain. Nowpay uses a per-chain ledger (BSC USDT and Polygon USDT are NOT fungible — moving between them requires a swap). NowPayments-equivalent: `GET /v1/balance`.","operationId":"getBalance","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"responses":{"200":{"description":"Balance object.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"},"example":{"total":"1250.00","locked":"100.00","by_network":{"bsc":"250.00","polygon":"1000.00"},"by_network_locked":{"bsc":"0","polygon":"100.00"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/networks":{"get":{"tags":["Networks"],"summary":"List supported networks","description":"Returns all active chains, their USDT contract addresses, confirmation thresholds, and payout fee configuration. NowPayments-equivalent: `GET /v1/currencies` (different shape — Nowpay returns only the 5 supported EVM chains).","operationId":"listNetworks","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"responses":{"200":{"description":"Network list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkListResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/api/v1/swaps":{"post":{"tags":["Swaps"],"summary":"Cross-chain USDT swap","description":"Converts USDT from one chain to another via a ledger-only transfer (no on-chain DEX). Subject to a 0.5% swap fee (50 bps) and a liquidity guard — the destination chain treasury hot wallet must hold sufficient USDT. NowPayments has no direct equivalent (NowPayments treats each coin as independent).","operationId":"createSwap","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"},"description":"**Required.**"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapCreateRequest"}}}},"responses":{"201":{"description":"Swap completed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Swap"},"example":{"id":"sw_abc12345","fee":"0.50","status":"done","from_network":"bsc","to_network":"polygon","amount":"100.00"}}}},"400":{"description":"Invalid request, or same from/to network.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"description":"Insufficient balance on source chain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/webhooks/incoming":{"post":{"tags":["Webhooks"],"summary":"Webhook delivery (incoming to merchant)","description":"Nowpay **delivers** webhook events to your registered endpoint URL (set in the merchant dashboard → Webhooks tab). This path is a documentation placeholder — your endpoint URL is whatever you configured. Each delivery includes the `X-Signature` (HMAC-SHA256), `x-nowpayments-sig` (HMAC-SHA512), `X-Timestamp` (Unix seconds, anti-replay), and `X-Event` (event name) headers. Receivers MUST verify the signature against the raw body and reject requests with a timestamp older than 5 minutes.","operationId":"receiveWebhook","security":[],"parameters":[{"name":"X-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"HMAC-SHA256(rawBody, secret). Hex-encoded. Nowpay-native."},{"name":"x-nowpayments-sig","in":"header","required":true,"schema":{"type":"string"},"description":"HMAC-SHA512(rawBody, secret). Hex-encoded. NowPayments-compatible (same algorithm + header name)."},{"name":"X-Timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Unix seconds at send time. Reject if `|now - X-Timestamp| > 300`."},{"name":"X-Event","in":"header","required":true,"schema":{"type":"string"},"description":"Event name (e.g. `invoice.finished`)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPayload"},"examples":{"invoiceFinished":{"summary":"invoice.finished","value":{"event":"invoice.finished","data":{"invoiceId":"inv_abc123","merchantId":"mer_xyz","network":"polygon","amount":"50.00","address":"0x7d5a3f9c2b1e8a4d6f0c2b5a7e9d1f3c4b2a8e6d","paid_amount":"50.00","txid":"0xabc123...","overpaid":false},"timestamp":"2026-01-01T12:05:30.000Z"}},"payoutSent":{"summary":"payout.sent","value":{"event":"payout.sent","data":{"payoutId":"po_xyz789","merchantId":"mer_xyz","chain":"polygon","amount":"100.00","fee":"0.5029","address":"0xRecipientAddress","txid":"0xdef456...","auto_approved":true},"timestamp":"2026-01-01T12:35:00.000Z"}}}}}},"responses":{"200":{"description":"Acknowledged (delivery marked as delivered). Any non-2xx triggers retry."}}}}}}