Originating a stablecoin payout

Send stablecoins from one of your stablecoin Internal Accounts to an external wallet by creating a Payment Order with type: "stablecoin".

Example use cases:

  • Fund a neobank or exchange wallet
  • Send stablecoins to an international recipient

Before you send a stablecoin payout, make sure you have a stablecoin Internal Account and a Counterparty whose External Account holds the destination wallet address.

🚧

Travel Rule

Payouts of 3,000 or more need Travel Rule details on the receiving External Account: whether the wallet is hosted or self-hosted, the VASP that holds a hosted wallet, and who the recipient is. Payment Orders missing them are rejected with a 422. See Travel Rule requirements.

Blockchain Network Selection

The requested_account_number_types value determines the blockchain network for the provisioned address. For example, ethereum_address provisions an EVM-compatible address. To use another network, request the matching account_number_type.

See Supported stablecoins & blockchain networks before you create the counterparty.


Create the Payment Order

curl --request POST \
  -u ORGANIZATION_ID:API_KEY \
  --url https://app.moderntreasury.com/api/payment_orders \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "stablecoin",
    "amount": 100000,
    "direction": "credit",
    "currency": "USDC",
    "originating_account_id": "<STABLECOIN_INTERNAL_ACCOUNT_ID>",
    "receiving_account_id": "<RECEIVING_EXTERNAL_ACCOUNT_ID>"
  }'

amount uses the coin's smallest unit as an integer. For example, USDC uses 6 decimals, so 10000000 = 10.00 USDC.

Stablecoin wallet addresses are validated and screened before payment execution. Payouts of 3,000 or more are also checked for Travel Rule details on the receiving External Account.

Stablecoin Payment Order Response

{
  "id": "c5f4009c-bdd6-4cc1-84b2-17974ac9e77a",
  "object": "payment_order",
  "type": "stablecoin",
  "amount": 100000,
  "direction": "credit",
  "currency": "USDC",
  "status": "approved",
  "effective_date": "2026-04-29",
  "priority": "normal",
  "originating_account_id": "<STABLECOIN_INTERNAL_ACCOUNT_ID>",
  "receiving_account_id": "<RECEIVING_EXTERNAL_ACCOUNT_ID>",
  "receiving_account_type": "external_account",
  "receiving_account": {
    "id": "<RECEIVING_EXTERNAL_ACCOUNT_ID>",
    "object": "external_account",
    "account_type": "hosted_wallet",
    "party_name": "Acme Payments",
    "party_type": "business",
    "party_address": {
      "line1": "1 Market Street",
      "locality": "New York",
      "region": "NY",
      "postal_code": "10001",
      "country": "US"
    },
    "account_details": [
      {
        "id": "ba9eb4d1-2423-4c05-a65b-e69ad78fe489",
        "object": "account_detail",
        "account_number": "0x1234567890abcdef1234567890abcdef12343f9a",
        "account_number_safe": "3f9a",
        "account_number_type": "ethereum_address"
      }
    ],
    "routing_details": [
      {
        "id": "8c0a6b1e-4f3d-4f0e-9a51-2f6a3c1d7e44",
        "object": "routing_detail",
        "routing_number": "<VASP_ROUTING_NUMBER>",
        "routing_number_type": "vasp",
        "bank_name": "Coinbase",
        "payment_type": null
      }
    ]
  },
  "counterparty_id": "fb9d6c24-da0b-4b43-81ef-e84440d928c0",
  "description": null,
  "statement_descriptor": null,
  "remittance_information": null,
  "metadata": {},
  "transaction_ids": [],
  "created_at": "2026-04-29T15:30:00Z",
  "updated_at": "2026-04-29T15:30:00Z"
}

Track the payment

Subscribe to Payment Order webhooks to follow the payment through its lifecycle:

  • payment_order.completed — the transfer has settled on chain.
  • payment_order.processing — (optional) the transfer is in flight on the network.

On-chain stablecoin transfers cannot be returned once settled.