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 , 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 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.
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 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 .
How is this guide?
Last updated on