Skip to main content
Use the Daimo API directly to build a custom deposit experience. This works with any language or framework, no React required.

Overview

The deposit flow has four steps:
  1. Create a session: server-side, with your API key
  2. Choose a payment method: client-side, with the client secret
  3. Wait for deposit: show the deposit address, poll for status
  4. Handle completion: process the result

Step 1: Create a session

Create a session on your server. Never expose your API key to the client.
To deliver to Solana (USDC only), use a Solana destination instead: set type to "solana", use a base58 wallet address and the USDC mint as tokenAddress, and omit chainId and calldata. Everything else (payment methods, polling, webhooks) is identical.
Pass session.clientSecret and session.sessionId to your client.

Step 2: Choose a payment method

On the client, call the payment methods endpoint. This transitions the session from requires_payment_method to waiting_payment. EVM deposit (any EVM chain):
The response includes a receiverAddress in result.session.paymentMethod. Display this EVM address to the user - they send tokens to it from any supported chain.
Tron USDT deposit:
The response includes a tron.receiverAddress in result.session.paymentMethod, a temporary Tron address. Display it to the user so they can send USDT to it. If result.tron.deeplinks.trustWallet is present, you can open that URL to send the same amount from Trust Wallet’s USDT on Tron flow.
Solana deposit:
The response includes solana.serializedTx, a hex-encoded serialized Solana transaction for the user’s wallet to sign and submit. This preserves a one-click wallet experience on Solana: swap, transfer, or bridge actions are bundled into one signed transaction. Unlike EVM and Tron, there is no receiverAddress for type: "solana".
Fiat: The user pays in local currency via one of the fiat rails your org has enabled (e.g. Interac in Canada, ACH or Apple Pay in the US, or SEPA in Europe). Daimo hosts the payment and identity-verification flow at fiat.hostedUrl; open it in a WebView or new browser tab. The session progresses through waiting_paymentprocessingsucceeded like any other payment method, and Daimo delivers the stablecoin to your destination once the fiat transfer settles.
Pass paymentMethod.fiatMethod (one of the supported rails, e.g. interac) to pin the hosted flow to one rail. If omitted, the hosted page shows every fiat method enabled for the org.
The hostedUrl is returned only once from the createPaymentMethod call; store it on the client. It is not included when retrieving the session later. See Native WebView for loading the hosted URL on iOS and Android, or React Native for DaimoFrameRN.
Fiat rails are enabled per-org. To request access, contact us.

Step 3: Wait for session completion

Poll for status updates to the session after the user has paid.
If you know the user’s transaction hash, pass it as txHash to speed up detection.

Step 4: Handle completion

Check for terminal statuses:
  • succeeded - funds delivered
  • bounced - delivery failed (e.g. contract call reverted). Funds returned to refund address.
  • expired - session timed out
In the succeeded and bounced case, destination.delivery.txHash refers to the settlement transaction.