Skip to main content

Move USDC

POST /transfers is the same single endpoint used for fiat transfers — you get crypto behavior by setting currency to a crypto code (e.g. BASE-USDC) instead of USD. Two shapes are supported:

  • Wallet → wallet (crypto) — move USDC between two accounts' crypto wallets, e.g. player → casino (a buy-in) or casino → player (a payout). Same request shape as paying winnings, just with a crypto currency.
  • Crypto cash-out — push a crypto wallet balance to an external bank account; the USDC is converted to USD and settles via ACH. Same request shape as a fiat cash-out, just with a crypto currency on the source side.
Crypto is not instant like a fiat internal transfer

A fiat wallet-to-wallet transfer posts synchronously (200, born posted). A crypto wallet-to-wallet transfer is not instant — it's created pending and dispatched over the crypto rail, landing dispatched. The response is 202 Accepted, not 200. Read the final state from GET /transfers/{id} or a transfer.* webhook.

Move USDC between wallets

Both sides are addressed by account id, exactly like an internal fiat transfer — only the currency differs:

curl -i -X POST \
https://sandbox-api.pathly.io/transfers \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: usdc_2026-07-13_peter_01' \
-d '{
"source_account": "5b3f0c2e-1d4a-4e8b-9c7a-2f6d8e0a1b22",
"destination_account": "<YOUR_MERCHANT_ACCOUNT_ID>",
"amount": 5000000,
"currency": "BASE-USDC",
"reference": "cash game buy-out"
}'
  • source_account / destination_account address each side's crypto wallet for currency — the player's and the casino's, in either direction.
  • amount is in the smallest unit of the currency (USDC has 6 decimals: 5000000 = 5.00 USDC).
  • The Idempotency-Key header is required, as on every POST /transfers call.

Response

HTTP/1.1 202 Accepted
Location: /transfers/e4f5a6b7-...

POST /transfers returns no body; read the created transfer from the Location header or subscribe to transfer.* webhooks (see webhooks). The transfer is born pending, then dispatched once handed to the crypto rail; the destination wallet's balance updates when the movement completes. For the full request and response — including the crypto variants of the schema — see the Create a transfer API reference.

Cash out USDC to a bank account

To let a player cash out their crypto wallet directly to a bank account, use the same cash-out shape as a fiat push (see Let a player cash out), but set source_account's wallet currency to the crypto code:

curl -i -X POST \
https://sandbox-api.pathly.io/transfers \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: usdc_cashout_2026-07-13_peter_02' \
-d '{
"source_account": "5b3f0c2e-1d4a-4e8b-9c7a-2f6d8e0a1b22",
"destination_payment_method": "<PLAYER_BANK_PAYMENT_METHOD_ID>",
"amount": 5000000,
"currency": "BASE-USDC"
}'

The USDC is converted to USD and pushed via ACH to the player's bank account on file. This follows the same async, 202, bank-leg lifecycle as a fiat cash-out (pendingdispatchedsettled, or returned if the bank rejects it) — see Let a player cash out for the KYX requirement and lifecycle detail, and webhooks to track the outcome. For the full request and response, see the Create a transfer API reference.

Loading the wallet first

A crypto wallet only has USDC to move once it's been funded on-chain — see Load a crypto wallet.