/api/v1/p2p/merchant/deals/payoutСтейджInitiates a payout to the provided target payment details. Checks the
merchant balance and places a USDT hold (SELL rate) before creating
the deal. Next comes synchronous cascade auto-matching: if a free
trader is available, the deal is returned as MATCHED; otherwise as
UNASSIGNED, and the re-matching worker keeps looking until the
assignment SLA expires the deal (EXPIRED, the hold is released).
Returns the deal with the recipient's target_requisite filled in and
currency as an echo of the request (the ISO code of the payout fiat
currency).
Authorization
MerchantToken MerchantSignature MerchantTimestamp The merchant's public token (64 hex characters), issued at onboarding.
In: header
HMAC-SHA256 signature (a single scheme for all endpoints).
Format: t=<unix_seconds>,v1=<hex_hmac_sha256>
where hex_hmac = HMAC-SHA256(webhook_secret, "<unix_seconds>.<raw_body>").
Replay window: 5 minutes (a 60-second drift into the future is allowed).
In: header
Unix time of the request in seconds. Signature window: 5 minutes back / 60 seconds forward.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/api/v1/p2p/merchant/deals/payout" \ -H "X-Merchant-Token: <MERCHANT_TOKEN>" \ -H "X-Timestamp: <UNIX_TIMESTAMP>" \ -H "X-Signature: t=<UNIX_TIMESTAMP>,v1=<HEX_HMAC_SHA256>" \ -H "Content-Type: application/json" \ -d '{ "amount": 500000, "currency": "RUB", "wallet_id": "d9a8fbfc-848f-43a2-9168-911ed3a04a48", "idempotency_key": "payout_order_99812", "target_requisite": "2202201234567890", "payment_method": "card_rub" }'{ "deal": { "deal_id": "8bd2590f-2345-6789-abcd-ef1234567890", "status": "MATCHED", "amount": "500000", "currency": "RUB", "created_at": "2026-08-10T12:05:00Z", "client_id": "player_42", "deal_type": "PAYOUT", "updated_at": "2026-08-10T12:05:00Z", "target_requisite": "2202201234567890" }}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "instance": "../dictionary", "errors": [ { "field": "amount", "message": "must be greater than 0", "code": "POSITIVE_REQUIRED" } ]}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "instance": "../dictionary", "errors": [ { "field": "amount", "message": "must be greater than 0", "code": "POSITIVE_REQUIRED" } ]}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "instance": "../dictionary", "errors": [ { "field": "amount", "message": "must be greater than 0", "code": "POSITIVE_REQUIRED" } ]}Create a PayIn deal (acquiring) POST POST
Creates a new incoming payment deal with optional whitelist pass matching. Idempotent: a duplicate `idempotency_key` returns the cached result. Returns the public `payment_url` that the merchant should redirect the client to.
Export deals to CSV (canonical path) GET GET
Returns the merchant's deals — PayIn (orders) AND PayOut (payouts), UNION over the ListMerchantDeals contract — as an RFC 4180 CSV document. The filters match the listing one-to-one; no pagination (a 10,000 data row limit, `truncated: true` when reached). `Accept: text/csv` returns the raw document with `Content-Disposition: attachment; filename="deals-YYYYMMDD.csv"`; any other Accept gets the JSON wrapper (`csv`/`file_name`/`row_count`/`truncated`). The legacy mirror `GET /api/v1/p2p/deals/export` (without the /merchant prefix) keeps working for wire-compat and is deprecated — build new integrations on this canonical path.