CanopyAPI docs

Guides

Source deposit inboxes

Give your user a deposit address on the chain where they hold funds, without mounting the widget. Use this when that chain is not the settle chain.

When you need this

GET /api/v1/intents/{id}/origins and POST /api/v1/intents/{id}/source-inbox let you build your own deposit flow from your server. You do not need the widget or a customer-session cookie.

In this API, each chain and asset a user can fund from is an origin. The deposit address for one origin is a source inbox.

If you already mount the checkout widget, you do not need either call. See the quickstart for the widget path.

List the funding options

GET /api/v1/intents/{id}/origins returns every live origin for the intent's account. The response includes:

  • each origin, with its own depositIssuable flag;
  • settleRails;
  • an intent-level sourceDepositIssuable flag.

Origins are returned even when sourceDepositIssuable is false. Show the full list and explain why an address is not available. Do not hide the list or show an empty picker.

The route returns 404 for an archived intent and for another merchant's intent. The two responses are identical.

Requestbash
curl https://www.canopypay.io/api/v1/intents/6f1b9c2e4d8a4f1b8c2e4d8a4f1b8c2e/origins \
  -H "Authorization: Bearer cnpy_sk_live_a1b2c3_<64 hex chars>" \
  -H "Canopy-Version: 2026-09-01"
200 OKjson
{
  "origins": [
    {
      "namespace": "eip155",
      "reference": "8453",
      "chainId": 8453,
      "name": "Base",
      "shortName": "Base",
      "publicRpcUrl": "https://mainnet.base.org",
      "explorerUrl": "https://basescan.org",
      "nativeName": "Ether",
      "nativeSymbol": "ETH",
      "nativeDecimals": 18,
      "token": {
        "symbol": "USDC",
        "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
        "decimals": 6
      },
      "caip19": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
      "minimumUnits": "2082500",
      "minimumDisplay": "2.0825",
      "depositIssuable": true
    }
  ],
  "settleRails": [
    {
      "id": "robinhood-mainnet:usdg",
      "chainId": 4663,
      "chainName": "Robinhood Chain",
      "token": {
        "symbol": "USDG",
        "address": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
        "decimals": 6
      },
      "explorerUrl": "https://robinhoodchain.blockscout.com",
      "status": "live",
      "default": true
    }
  ],
  "sourceDepositIssuable": true
}

Issue a deposit address

POST /api/v1/intents/{id}/source-inbox issues the deposit address for one origin, or returns it if it already exists. The address belongs to the customer bound to the intent. The body takes one of two shapes:

  • { chainId } for an EVM origin;
  • { namespace, reference, mint } for Solana.

A repeat call returns the same address, never a second one. The call is safe to retry. The 201 response carries address and caip10.

Requestbash
curl -X POST https://www.canopypay.io/api/v1/intents/6f1b9c2e4d8a4f1b8c2e4d8a4f1b8c2e/source-inbox \
  -H "Authorization: Bearer cnpy_sk_live_a1b2c3_<64 hex chars>" \
  -H "Canopy-Version: 2026-09-01" \
  -H "Content-Type: application/json" \
  -d '{ "chainId": 8453 }'
201 Createdjson
{
  "address": "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b",
  "caip10": "eip155:8453:0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b"
}

When issuance fails

Issuance can fail with four error codes. Two are retryable and two are not. The status code does not tell you which.

CodeStatusRetryWhat to do
source_inbox_unavailable503Yes, after Retry-AfterIssuance is temporarily unavailable.
source_inbox_refused500NoContact Canopy support
source_inbox_not_active503NoIssuance is turned off for this origin. Offer a different one.
customer_not_bound503Yes, after Retry-AfterThe intent's deposit customer is not set up yet. Retry later.

See also

  • Quickstart: give your user a deposit address with the widget instead.
  • Payment intents: the full contract for creating the intent this guide starts from.
  • API reference: both operations, with their full request and response shapes.