Channels
Issue a reusable stablecoin deposit address for repeat payers
Overview
A channel is a persistent, reusable crypto deposit address for a specific payer and currency. Unlike Payments, where Volt Checkout generates a new deposit address for every transaction, a channel is created once and reused for every subsequent deposit from the same payer — useful for recurring or top-up style crypto collection outside the hosted Checkout flow.
Create the channel
Requires an Idempotency-Key header.
| Field | Type | Required | Description |
|---|---|---|---|
currency | String | Yes | The stablecoin the channel accepts (for example USDC, EURC). |
walletId | UUID | Yes | The wallet that deposits on this channel are credited to. |
endUser.type | String | Yes | INDIVIDUAL or COMPANY. |
endUser.reference | String | Yes | Your own identifier for this payer — the natural key for the channel. |
endUser.firstName / lastName | String | For INDIVIDUAL | Payer's name. |
endUser.organisationName | String | For COMPANY | Payer's company name. |
endUser.dateOfBirth | String | For INDIVIDUAL | ISO date, required for compliance. |
endUser.country | String | Yes | ISO 3166-1 alpha-2 country code. |
device.ip | String | No | Payer's IP address, if known. |
communication.notifications.url | String | Yes | Webhook URL for this channel's payment notifications (must be https://). |
{
"currency": "USDC",
"walletId": "a1b2c3d4-1234-5678-9abc-def012345678",
"endUser": {
"type": "INDIVIDUAL",
"reference": "customer-123",
"firstName": "John",
"lastName": "Smith",
"dateOfBirth": "1990-05-15",
"country": "GB"
},
"communication": {
"notifications": {
"url": "https://example.com/webhooks/channels"
}
}
}{
"id": "c1d2e3f4-1234-5678-9abc-def012345678",
"endUser": {
"type": "INDIVIDUAL",
"reference": "customer-123"
},
"currency": "USDC",
"walletId": "a1b2c3d4-1234-5678-9abc-def012345678",
"status": "OPEN",
"addresses": [
{
"network": "ETHEREUM",
"address": "0xabc...def",
"isPrimary": true
}
],
"createdAt": "2026-04-08T10:12:04Z",
"updatedAt": "2026-04-08T10:12:04Z"
}Creating a channel for a payer reference, currency and wallet combination that already has one returns 409 Conflict — it is not idempotent-as-read. Store the returned channel id from the first successful call and reuse it, rather than trying to create a new channel for the same payer each time.
Show the deposit addresses to the payer
You can show the channel's deposit addresses in your own interface or redirect the payer to a checkout page hosted by Volt.
Fetch the channel to get its deposit addresses together with rendered QR images, and the indicative rate if you want to show the expected credited amount:
Get channel details
Get channel rate
The rate is an estimate, not a locked quote — the live rate at the moment a deposit confirms on-chain is applied.
Track deposits, or wait for the webhook
Volt notifies the webhook URL you set in communication.notifications.url when creating the channel as a deposit is detected, confirmed, or cancelled — the same way as a Checkout payment. Alternatively, poll the channel's deposit history:
Each entry moves through its own status, separate from the payment statuses used for Checkout payments:
| Status | Description |
|---|---|
PROCESSING | An incoming transaction has been detected and is awaiting confirmation. |
ON_HOLD | The deposit is paused pending manual review. |
COMPLETED | The deposit was confirmed and credited to your wallet. |
CANCELLED | The deposit was cancelled. |
Reference
Full channels and channel payments API reference can be found here.
How is this guide?
Last updated on