ZZanoraDocs

Get paid

How each sale settles to your wallet, where to see sales, and how to register a payout destination and move money to your bank or a USDC address.

How a sale settles

  1. A buyer's call succeeds, and they get a signed receipt straight away.
  2. Moments later, settlement credits your settlement wallet with the price less the platform fee (3% by default, rounded down to the cent). A $1.00 sale adds "97".
  3. A failed call earns nothing: the buyer was refunded.
Terminal
curl -s "https://api.zanora.dev/v1/receipts?limit=50" -H "x-api-key: $ZANORA_API_KEY"   # your sales
curl -s https://api.zanora.dev/v1/wallets/$SETTLEMENT_WALLET/balance -H "x-api-key: $ZANORA_API_KEY"

In the console: Seller → Sales and Seller → Earnings. Your settlement wallet id came back at signup (tenant.walletId). GET /v1/wallets with your provider key also returns it.

Register a payout destination

You register a destination once, per rail and asset:

Raildestinationassetchain
bank_transfer (ACH, wire, SEPA)the external account id your bank rail gave you, ext_…. Account numbers never go through ZanoraUSD
usdc_basea USDC address on Base, 0x…USDCbase
Terminal
curl -s -X PUT https://api.zanora.dev/v1/providers/$PROVIDER_ID/payout-destination \
  -H "x-api-key: $ZANORA_API_KEY" -H 'content-type: application/json' \
  -d '{"destination":"ext_…","asset":"USD"}'

Changes are frozen for 24 hours

Your first destination is usable immediately. Changing it freezes payouts to that rail and asset for 24 hours and sends an alert, because redirecting payouts is the first thing a stolen credential is used for. The freeze applies to the rail and asset, not the address, so naming the new address directly in a payout doesn't get around it. Registering the same address with different letter case isn't a change.

GET /v1/providers/$PROVIDER_ID/payout-destinations lists what's registered and when each becomes usable.

Request a payout

Terminal
curl -s -X POST https://api.zanora.dev/v1/payouts -H "x-api-key: $ZANORA_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"walletId":"'"$SETTLEMENT_WALLET"'","amountMinor":"9700","rail":"bank_transfer"}'

You don't send a destination: the payout goes to the one registered for that rail. In the console: Seller → Earnings → Pay out.

A payout isn't finished when the call returns:

StatusMeans
submittedyour wallet has been debited and the payment rail has the instruction. Money is in transit
confirmedthe rail confirmed it arrived: minutes for USDC, typically 1–2 business days for bank transfers
returnedthe rail sent it back, for example because an account was closed. Your wallet is re-credited with a new entry

Follow it with GET /v1/rail/transactions.

Why a payout might be refused

CodeMeansDo
DESTINATION_COOLING_DOWNthe destination changed less than 24 hours agowait. It lifts on its own
SANCTIONED_ADDRESSsanctions screening blocked the USDC destinationemail support@zanora.dev
TREASURY_UNAVAILABLEa screening or pricing service is down, so the payout is paused rather than guessedretry later
COVERAGE_SHORTFALLpayouts are paused while the platform reconcilesretry later
INSUFFICIENT_FUNDSthe amount is more than the available balancerequest less
NOT_SUPPORTEDthis deployment has no payout rail for that currencycheck GET /v1/rail/providers