Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.daimo.com/llms.txt

Use this file to discover all available pages before exploring further.

Advanced options for creating sessions via POST /v1/sessions. See also: Create Session.

Prefilled Amount (amountUnits)

Pass destination.amountUnits to lock the deposit to an exact amount. The user skips amount selection and proceeds directly to the payment flow.
curl -X POST https://api.daimo.com/v1/sessions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destination": {
      "type": "evm",
      "address": "0xYourAddress",
      "chainId": 8453,
      "tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "amountUnits": "25.00"
    },
    "display": {
      "title": "Deposit to Acme",
      "verb": "Deposit"
    }
  }'
FieldTypeDescription
amountUnitsstring, optionalFixed amount in token units (e.g. "25.00" for $25 USDC). When omitted, the user chooses the amount.
If the user pays slightly less or more (due to bridge fees or price changes), the session still completes. Any variance is visible in the session response and webhooks.

Contract Calls (calldata)

Pass destination.calldata to execute an arbitrary contract call with deposited funds. When using calldata, destination.address is the contract being called.

How it works

  1. Daimo delivers the destination token to the contract
  2. A token approval of the deposit amount is made to the contract
  3. The contract is called with the provided calldata
  4. If the call succeeds, the session completes normally
  5. If the call reverts, funds are sent to refundAddress instead, and the session status becomes bounced

Contract requirements

Your contract must handle variable input amounts. Specifically, it should:
  1. Check the allowance of the destination token from msg.sender
  2. Use transferFrom to pull the full allowance
This is true even when amountUnits is set. While over- or under-payments are rare with a fixed amount, they cannot be guaranteed to never happen.
function deposit(address token, uint256 /* amount */, address recipient) external {
    uint256 allowance = IERC20(token).allowance(msg.sender, address(this));
    require(allowance > 0, "no allowance");
    IERC20(token).transferFrom(msg.sender, address(this), allowance);
    _processDeposit(token, allowance, recipient);
}

Example: generating calldata with viem

import { encodeFunctionData } from "viem";

const calldata = encodeFunctionData({
  abi: [
    {
      name: "deposit",
      type: "function",
      inputs: [
        { name: "token", type: "address" },
        { name: "amount", type: "uint256" },
        { name: "recipient", type: "address" },
      ],
      outputs: [],
      stateMutability: "nonpayable",
    },
  ],
  functionName: "deposit",
  args: [tokenAddress, amount, recipientAddress],
});
curl -X POST https://api.daimo.com/v1/sessions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destination": {
      "type": "evm",
      "address": "0xYourContract",
      "chainId": 8453,
      "tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "amountUnits": "100.00",
      "calldata": "0x..."
    },
    "display": {
      "title": "Stake USDC",
      "verb": "Stake"
    },
    "refundAddress": "0xYourRefundAddress"
  }'

Error handling

If your contract call reverts:
  • The session status becomes bounced
  • Funds are sent to the refundAddress you specified
Always provide a refundAddress when using calldata to ensure funds are recoverable.

Payment Options

Optionally pass display.paymentOptions to control which payment methods appear and in what order. When omitted, all available methods are shown.

Categories

OptionDescription
"AllFiat"All eligible fiat methods configured for the org
"AllAddresses"Deposit address options for all supported EVM chains
"AllExchanges"All exchange options (Coinbase, Binance, Lemon)
"AllWallets"All supported wallet deeplinks (MetaMask, Trust, Phantom, etc.)

Fiat

OptionDescription
"Interac"Interac hosted fiat flow
"ApplePay"Apple Pay hosted fiat flow
"ACH"ACH hosted fiat flow
"SEPA"SEPA hosted fiat flow

Deposit Addresses

OptionDescription
"Tron"Tron USDT deposit address
"Arbitrum"Arbitrum deposit address
"Base"Base deposit address
"Optimism"Optimism deposit address
"Polygon"Polygon deposit address
"Ethereum"Ethereum deposit address
"BSC"BSC (BNB Chain) deposit address

Exchanges

OptionDescription
"Coinbase"Coinbase onramp
"Binance"Binance Connect
"Lemon"Lemon cash-out

Cash App

OptionDescription
"CashApp"Cash App payment via Lightning

Wallets

OptionDescription
"MetaMask"MetaMask wallet
"Trust"Trust Wallet
"Phantom"Phantom wallet
"Rainbow"Rainbow wallet
"BaseApp"Base (Coinbase Wallet)
"Bitget"Bitget wallet
"OKX"OKX wallet
"Zerion"Zerion wallet
"ConnectedWallet"Use already-connected browser wallet (no prompt, errors if none)
"AutoconnectInjectedWallets"Auto-connect injected browser wallet
When paymentOptions is omitted, the default is ["AllWallets", "AllExchanges", "AllAddresses"]. CashApp, Tron, AllFiat, and individual chain addresses must be explicitly included. Array order defines display order. A single option skips the selection screen (e.g. ["Lemon"] goes straight to Lemon). Nested arrays control wallet ordering within a group:
{
  "paymentOptions": ["AllExchanges", ["MetaMask", "Trust", "Phantom"]]
}
This shows exchanges first, then a wallet group with MetaMask, Trust, and Phantom in that order. Nested arrays only support wallets.
curl -X POST https://api.daimo.com/v1/sessions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destination": {
      "type": "evm",
      "address": "0xYourAddress",
      "chainId": 8453,
      "tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "amountUnits": "10.00"
    },
    "display": {
      "title": "Deposit USDC",
      "verb": "Deposit",
      "paymentOptions": ["Coinbase", "Binance"]
    }
  }'