Session lifecycle
Statuses
Terminal statuses:
succeeded, bounced, expired. Once terminal, a session cannot change status.
Credential model
Daimo uses two types of credentials:API key
Your account-wide API key. Use it server-side only for operations that require full access:- Creating sessions
- Retrieving full session details (including
clientSecretandmetadata)
Client secret
A per-session token returned when you create a session. It grants limited access to that single session:- Setting the payment method
- Checking session status
Session object
When retrieved with an API key, the full session includes:
Without an API key,
metadata and clientSecret are omitted (returns SessionPublicInfo).
Destination
tokenAddress, omits chainId, chainName, and calldata, and its delivery.txHash is a Solana transaction signature.
Payment methods
Choose the payment method experience when creating the session withdisplay.paymentMethods:
{ "mode": "auto" }shows Daimo’s localized payment picker. This is the recommended default.{ "mode": "fixed", "type": … }pins the session to one method and skips the picker.
paymentMethods for new integrations; it supersedes the legacy
display.paymentOptions array.
After the user chooses a method (or enters a fixed flow), the modal calls
POST /v1/sessions/{id}/paymentMethods. This records the concrete method,
transitions the session to waiting_payment, and returns the information needed
to complete the deposit. If you build your own UI, call this endpoint directly.
The payment instructions depend on the concrete method. Common response shapes
are shown below.
EVM
Deposit from any of our supported EVM chains. The response includes a single-usereceiverAddress in session.paymentMethod. Display this address so the user can send funds to it.
Tron
Deposit USDT from Tron. The response includes atron.receiverAddress, a single-use Tron address where the user sends USDT. It can also include tron.deeplinks.trustWallet, a Trust Wallet send link for the same address and amount.
Solana
Deposit from Solana. The response includessolana.serializedTx, a hex-encoded serialized transaction for the wallet to sign and submit.
This preserves a one-click wallet flow on Solana by bundling actions into one signed transaction.
Fiat
Hosted fiat deposit. WithpaymentMethods: { mode: "auto" }, eligible fiat
rails enabled for your org appear automatically in the user’s localized picker.
To offer exactly one rail, set display.paymentMethods to a fixed selector when
creating the session:
fiat.hostedUrl, a URL to a Daimo-hosted page that handles identity verification and the fiat transfer. Open it in a native WebView or a new browser tab; the user returns to your app after completing the flow.
POST /paymentMethods with { "type": "fiat" } and
optionally a concrete fiatMethod. A fixed session requires the matching method
(for example, fixed Interac requires fiatMethod: "interac"). An auto session
may omit fiatMethod to let the hosted page show the enabled rails.
See Fiat for the request and response, fixed
type mapping, and supported rails.
The hostedUrl is returned only once from createPaymentMethod; store it on the client. It is not included when retrieving the session later.
Fiat rails are enabled per-org. To request access, contact
us.
source object once the user’s deposit transaction is detected, containing chain info, token details, and the source transaction hash.
See Create Payment Method for full request/response details.
Customization
Use the Daimo dashboard to match the modal and hosted WebView to your brand. The org theme applies automatically when the deposit UI loads a session for your org. See Customization for the dashboard flow and JSON format.Polling for status
UsePUT /v1/sessions/{id}/check with the client secret to poll for status updates after the user has paid. This is how the modal tracks deposit progress, and how custom integrations can monitor sessions from the client side.
For most integrations, the modal handles polling automatically.