Receiving a stablecoin payment (pay-in)
Receive stablecoins in a stablecoin Internal Account by sharing a unique blockchain address with the sender.
Modern Treasury represents inbound transfers as Incoming Payment Details (IPDs), the same object it uses for inbound fiat payments.
Example use cases:
- Add stablecoins as a payment method in your Checkout experience
- Receive stablecoins from an international sender
Get your receiving address details
Each stablecoin Internal Account has a unique blockchain address per supported network. External parties can send stablecoins directly to these addresses.
Get your account's blockchain addresses from the Internal Account object:
curl --request GET \
-u ORGANIZATION_ID:API_KEY \
--url https://app.moderntreasury.com/api/internal_accounts/<STABLECOIN_INTERNAL_ACCOUNT_ID>Use the account_details in the response to find your blockchain addresses:
{
"id": "<STABLECOIN_INTERNAL_ACCOUNT_ID>",
"object": "internal_account",
"live_mode": true,
"party_name": "Acme Payments Inc.",
"party_address": null,
"account_details": [
{
"id": "ce594f58-041c-44be-bcdb-714d9e690d78",
"object": "account_detail",
"live_mode": true,
"account_number": "0x9bE868839163E128971Bb6AE045e172Fa806E805",
"account_number_safe": "E805",
"account_number_type": "ethereum_address",
"discarded_at": null,
"created_at": "2026-04-29T00:56:58Z",
"updated_at": "2026-04-29T00:56:58Z"
},
{
"id": "749f02b0-6e31-446a-a480-12a1b002557d",
"object": "account_detail",
"live_mode": true,
"account_number": "Gjcc3Zzw9YGhftR9tEAvcBPjEAX79rTQ9GNKoKDqLjzV",
"account_number_safe": "LjzV",
"account_number_type": "solana_address",
"discarded_at": null,
"created_at": "2026-04-29T00:56:58Z",
"updated_at": "2026-04-29T00:56:58Z"
}
],
"routing_details": [],
"name": "Acme Payments USDC Account",
"metadata": {},
"legal_entity_id": "<ORGANIZATION_ENTITY_ID>",
"currency": "USDC",
"status": "active",
"created_at": "2026-04-29T00:56:58Z",
"updated_at": "2026-04-29T00:56:58Z"
}Send the relevant address to your counterparty. Modern Treasury records each inbound transfer as a transaction on your stablecoin Internal Account.
Track the incoming payment
Subscribe to Incoming Payment Detail webhooks to track the inbound transfer:
incoming_payment_detail.created— the transfer has been detected on the network.incoming_payment_detail.completed— the transfer has finalized on chain and the funds are available in your stablecoin Internal Account.
{
"event": "created",
"data": {
"id": "<INCOMING_PAYMENT_DETAIL_ID>",
"object": "incoming_payment_detail",
"internal_account_id": "<STABLECOIN_INTERNAL_ACCOUNT_ID>",
"type": "stablecoin",
"amount": 100000,
"direction": "credit",
"status": "pending",
"currency": "USDC"
}
}Wait for incoming_payment_detail.completed before you treat the balance as final. Completed on-chain transfers cannot be reversed.
For the full IPD object and webhook reference, see Incoming Payment Details.
Test in Sandbox
Call the Simulate Incoming Payment Detail endpoint to simulate a stablecoin IPD. Webhook events fire in the same order as Production, so you can validate your event-driven logic end to end.
For the full list of supported stablecoins and networks, see Stablecoins.
Updated 8 days ago