Integration guides

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.

FieldTypeRequiredDescription
currencyStringYesThe stablecoin the channel accepts (for example USDC, EURC).
walletIdUUIDYesThe that deposits on this channel are credited to.
endUser.typeStringYesINDIVIDUAL or COMPANY.
endUser.referenceStringYesYour own identifier for this payer — the natural key for the channel.
endUser.firstName / lastNameStringFor INDIVIDUALPayer's name.
endUser.organisationNameStringFor COMPANYPayer's company name.
endUser.dateOfBirthStringFor INDIVIDUALISO date, required for compliance.
endUser.countryStringYesISO 3166-1 alpha-2 country code.
device.ipStringNoPayer's IP address, if known.
communication.notifications.urlStringYesWebhook URL for this channel's payment notifications (must be https://).
Request body
{
  "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"
    }
  }
}
Response 201
{
  "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:

StatusDescription
PROCESSINGAn incoming transaction has been detected and is awaiting confirmation.
ON_HOLDThe deposit is paused pending manual review.
COMPLETEDThe deposit was confirmed and credited to your wallet.
CANCELLEDThe deposit was cancelled.

Reference

Full channels and channel payments API reference can be found .

How is this guide?

Last updated on