---
title: "Create Payout on EVM Chains"
method: POST
path: "/v1/instances/{instance_id}/payouts/evm"
tags: ["Payouts"]
---

# Create Payout on EVM Chains

`POST /v1/instances/{instance_id}/payouts/evm`

## Path parameters

- `instance_id` string, required

## Headers

- `Idempotency-Key` string — Optional key to safely retry this request without performing the action twice. Retrying with the same key and an identical body replays the original response; reusing a key with a different body returns an error. Keys are kept for 24 hours.

## Request body

- PayoutOnEvmIn
  - `quote_id` string, required
  - `sender_wallet_address` string, required — Payout wallet address

## Response `200`

Payout started with success

- PayoutOnEvmOut
  - `id` string, required
  - `status` 'processing' | 'failed' | 'refunded' | 'completed' | 'on_hold', required — Payout general status
  - `sender_wallet_address` string, required — Payout wallet address
  - `billing_fee_amount` number, nullable — Billing fee in cents (charged via invoice at the end of the month)
  - `transaction_fee_amount` number, nullable — Transaction fee in cents (percentage-based fee)
  - `partner_fee` integer — Payout partner fee amount in cents (can be negative for rebates)
  - `tracking_complete` object, required
    - `step` 'processing' | 'on_hold' | 'pending_review' | 'pending_refund_review' | 'completed', required — Complete step
    - `status` 'tokens_refunded' | 'paid', nullable — Complete status
    - `refund_reason` string, nullable — Reason for refund when tokens are returned to sender
    - `transaction_hash` string, nullable — Complete transaction hash
    - `provider_transaction_id` string, nullable — Provider-side handle for the refund transaction (e.g. Circle transaction id)
    - `completed_at` string, nullable — Complete completed date
  - `tracking_payment` object, required
    - `step` 'processing' | 'on_hold' | 'pending_review' | 'pending_refund_review' | 'completed', required — Payment step
    - `provider_name` 'Nvio Pagos' | 'Brex' | 'Stark Bank' | 'JPMorgan Chase' | 'HSBC' | 'Inter' | 'JP Morgan Chase' | 'Bitso' | 'Citi' | 'CFSB' | 'Triple A Technologies' | 'Portage Bank', nullable — Payment provider name
    - `provider_integration` 'veem' | 'zenus' | 'checkbook' | 'onemoney' | 'bitso' | 'starkbank' | 'triplea' | 'infinitus', nullable — Machine-readable integration that executed the fiat leg. Unlike provider_name (a client-facing bank label), this uniquely identifies the integration — e.g. zenus vs checkbook, which share the "JPMorgan Chase" label.
    - `provider_transaction_id` string, nullable — Payment provider transaction id
    - `provider_status` 'canceled' | 'failed' | 'returned' | 'sent', nullable — Payment provider status
    - `provider_error_reason` string, nullable — Provider error reason when payment fails (e.g. invalid_key, wrong_parameters)
    - `provider_uetr` string, nullable — Unique end-to-end transaction reference (UETR). Populated once the wire is confirmed by the network; null while the payment is in flight or when the rail does not expose it (e.g. ACH).
    - `provider_imad` string, nullable — Fed Input Message Accountability Data (IMAD). Domestic Fedwire payments only; null on ACH and SWIFT.
    - `provider_reference` string, nullable — Provider (JPMorgan/Zenus) payment reference captured from the ACCOUNT.ACCOUNT booking webhook (Zenus contractSource.sourceRef). Present for some ACH/wire payouts; a bank-side reference, not the formal ACH network trace number.
    - `provider_clearing_system` string, nullable — Clearing system that processed the payment (e.g. FED, CHIPS, ACH, SWIFT).
    - `forced_provider` 'zenus' | 'veem', nullable — Ops-set per-payout provider override (backoffice Reroute tab). When present it wins over the instance payment_route and default routing at send time. Left in place after the send as an audit marker of the forced route.
    - `recipient_name` string, nullable — Recipient name
    - `recipient_tax_id` string, nullable — Recipient tax id
    - `recipient_bank_code` string, nullable — Recipient bank code
    - `recipient_branch_code` string, nullable — Recipient branch code
    - `recipient_account_number` string, nullable — Recipient account number
    - `recipient_account_type` string, nullable — Recipient account type
    - `coelsa_id` string, nullable — COELSA transaction reference ID for ARS transfers (Argentine national banking system)
    - `end_to_end_id` string, nullable — BACEN Pix end-to-end transaction ID (govt Pix ID)
    - `estimated_time_of_arrival` '5_min' | '5_30_min' | '30_min' | '2_hours' | '1_business_day' | '2_business_days' | '5_business_days', nullable — Estimated time of arrival
    - `completed_at` string, nullable — Payment completed date
    - `refund_review_reason` 'amount_threshold' | 'time_window' | 'late_cancellation_no_live_run' | 'master_account_return', nullable — Why the payout was routed to the Pending Refunds review queue instead of auto-refunding after a provider cancellation
    - `refund_review_detected_at` string, nullable — When the provider cancellation was routed to the Pending Refunds review queue
    - `refund_review_actioned_at` string, nullable — Atomic claim marker: set the moment an operator approves a Pending Refunds entry, before the refund is sent, so a concurrent approve call cannot re-claim the same payout
  - `tracking_transaction` object, required
    - `step` 'processing' | 'on_hold' | 'pending_review' | 'pending_refund_review' | 'completed', required — Payout transaction step
    - `status` 'failed' | 'found', nullable — Payout transaction status
    - `transaction_hash` string, nullable — Blockchain transaction hash
    - `completed_at` string, nullable — Payout transaction completed date
    - `provider_transaction_id` string, nullable — Provider-side handle for the on-chain leg (e.g. Circle CPN payment id).
    - `provider_error_reason` string, nullable — Provider error reason when the crypto collection fails (e.g. erc20_allowance_insufficient, ESTIMATION_ERROR: execution reverted)
    - `ledger_in_transaction_id` string, nullable — Ledger transaction ID for the IN (crypto deposit) transaction
    - `ledger_out_transaction_id` string, nullable — Ledger transaction ID for the OUT (fiat withdrawal) transaction
  - `tracking_liquidity` object, nullable
    - `step` 'processing' | 'on_hold' | 'pending_review' | 'pending_refund_review' | 'completed', required — Payout liquidity step
    - `provider_transaction_id` string, nullable — Payment provider transaction id
    - `provider_status` 'deposited' | 'converted' | 'withdrawn', nullable — Payment provider status
    - `estimated_time_of_arrival` '5_min' | '5_30_min' | '30_min' | '2_hours' | '1_business_day' | '2_business_days' | '5_business_days', nullable — Estimated time of arrival
    - `completed_at` string, nullable — Payout transaction completed date
  - `tracking_documents` object, nullable
    - `step` 'processing' | 'on_hold' | 'pending_review' | 'pending_refund_review' | 'completed', required — Documents step
    - `status` 'waiting_documents' | 'compliance_reviewing', nullable — Documents status
    - `reviewed_by` string, nullable — Reviewer email/name
    - `completed_at` string, nullable — Documents completed date
  - `customer_id` string, nullable
  - `bank_account_id` string, nullable
  - `offramp_wallet_id` string, nullable
  - `payable_id` string, nullable — The payable this payout executes, when it pays a payable instead of a bank account.

## Other responses

- `400` — Possible error codes: `BANK_ACCOUNTS_INCOMPLETE`, `BANK_ACCOUNTS_INVALID_BANK_CODE`, `BANK_ACCOUNTS_INVALID_ROUTING`, `BANK_ACCOUNTS_NOT_APPROVED`, `BANK_ACCOUNTS_NOT_FOUND`, `BANK_ACCOUNTS_PARTNER_NOT_SUPPORTED`, `BANK_ACCOUNTS_RTP_NOT_SUPPORTED`, `BLOCKCHAIN_NETWORK_NOT_SUPPORTED`, `CUSTOMERS_COUNTRY_NOT_SUPPORTED`, `CUSTOMERS_INVALID_PHONE`, `CUSTOMERS_INVALID_TAX_ID`, `CUSTOMERS_KYC_TYPE_NOT_AVAILABLE`, `CUSTOMERS_NAME_INVALID`, `CUSTOMERS_ONBOARDING_INCOMPLETE`, `FILES_UNREADABLE`, `PAYABLES_ALREADY_PAID_OR_EXPIRED`, `PAYABLES_ALREADY_PAID_OR_IN_FLIGHT`, `PAYABLES_AMOUNT_NEGATIVE`, `PAYABLES_BANK_ACCOUNT_INVALID`, `PAYABLES_CODE_UNRESOLVABLE`, `PAYABLES_CURRENCY_MUST_BE_BRL`, `PAYABLES_DESTINATION_NOT_SUPPORTED`, `PAYABLES_DOCUMENT_INVALID`, `PAYABLES_DUPLICATE`, `PAYABLES_NOT_CANCELABLE`, `PAYABLES_PIX_AMOUNT_REQUIRED`, `PAYOUTS_AMOUNT_BELOW_MINIMUM`, `QUOTES_ALREADY_USED`, `QUOTES_EXPIRED`, `VALIDATION_FAILED`, `VALIDATION_INVALID_REQUEST`, `VIRTUAL_ACCOUNTS_DOCUMENTS_REQUIRED`, `VIRTUAL_ACCOUNTS_NOT_FOUND`, `VIRTUAL_ACCOUNTS_PARTNER_NOT_ELIGIBLE`, `VIRTUAL_ACCOUNTS_PROVISION_FAILED`. See the Error responses section for retry semantics.
- `401` — Possible error codes: `AUTH_UNAUTHORIZED`. See the Error responses section for retry semantics.
- `403` — Possible error codes: `AUTH_FORBIDDEN`. See the Error responses section for retry semantics.
- `404` — Possible error codes: `CUSTOMERS_NOT_FOUND`, `PAYABLES_NOT_FOUND`. See the Error responses section for retry semantics.
- `422` — Possible error codes: `CUSTOMERS_INVALID_DATA`. See the Error responses section for retry semantics.
- `429` — Possible error codes: `AUTH_RATE_LIMITED`. See the Error responses section for retry semantics.
- `500` — Possible error codes: `FILES_UNREADABLE`, `INTERNAL_ERROR`, `VIRTUAL_ACCOUNTS_PROVISION_FAILED`. See the Error responses section for retry semantics.
- `502` — Possible error codes: `VIRTUAL_ACCOUNTS_PROVISION_FAILED`. See the Error responses section for retry semantics.

---

[API](https://skmtc.dev/blindpay/apis/blindpay-api.md) · [All operations](https://skmtc.dev/blindpay/apis/blindpay-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/blindpay/blindpay-api/revisions/470de27afb7b/schema)
