Fiat lets your users deposit in local currency (CAD, USD, EUR) using familiar rails like Interac, ACH, Apple Pay, and SEPA. Daimo hosts identity verification and the deposit UI, settles the fiat transfer, and delivers the stablecoin to your destination.
Fiat rails are enabled per-org. Contact us to
request access and have specific rails enabled.
Supported rails
fiatMethod | Region | Currency |
|---|
interac | Canada | CAD |
ach | US | USD |
apple_pay | US | USD |
sepa | Europe | EUR |
How it works
Fiat options appear alongside your other payment options. When the user picks one, they’re handed off to a Daimo-hosted page that walks them through:
- Rail selection: Interac, ACH, Apple Pay, SEPA, etc. Skipped if you’ve pinned a rail.
- Identity verification: first-time users complete a short KYC step (name, address, ID). Returning users skip through.
- Payment: the user pays through their chosen rail, e.g. an Interac e-Transfer, ACH debit, Apple Pay charge, SEPA bank transfer, etc.
- Confirmation: once the fiat payment clears, the page confirms success and the user returns to your app.
The user pays in their local currency and never touches crypto. Under the hood, Daimo settles the fiat transfer and delivers funds to your destination address on the chain you specified.
Integration
Modal SDK
Include the AllFiat option in display.paymentOptions when creating the session. The modal renders the option, drives the hosted flow, and fires onPaymentCompleted on delivery.
await fetch("https://api.daimo.com/v1/sessions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DAIMO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
destination: {
type: "evm",
address: "0xYourAddress",
chainId: 8453,
tokenAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
amountUnits: "25.00",
},
display: {
title: "Deposit to Acme",
verb: "Deposit",
paymentOptions: ["AllFiat"],
},
}),
});
"AllFiat" lists every rail available. To pin the flow to a single rail, use its name ("Interac", "ACH", "ApplePay", "SEPA") instead. See Payment Options for the full reference.
| Input | Hosted page behavior |
|---|
["AllFiat"] | Lists every enabled rail for the user |
["Interac"] (or "ACH", "ApplePay", etc.) | Jumps straight into that rail |
Auth prefill
If you already know the user’s email or phone, include it in session metadata:
{
"metadata": {
"email": "account@daimo.com",
"phone": "+14155552671"
}
}
Daimo uses these values as account auth hints for fiat deposits. Signed-out users
with metadata.email skip email entry and start at OTP verification. Apple Pay
users with metadata.phone skip phone entry and start at SMS OTP verification.
They still verify each value before any account is created or reused. Phone
numbers must be E.164. If a hint is missing or invalid, Daimo shows the normal
entry step.
Custom integration
If you’re not using the modal, drive the flow yourself: create the session, then call POST /v1/sessions/{id}/paymentMethods with { type: "fiat" } to get back a fiat.hostedUrl.
Render that URL in a WebView, iframe, or new tab. The hosted page handles KYC and payment collection, and Daimo delivers the stablecoin once the fiat transfer clears. See the full four-step flow for custom integrations.
Pass the clientSecret returned by POST /v1/sessions.
fiat.hostedUrl is returned only once from POST /paymentMethods. It is
not returned from GET /v1/sessions/{id}. Store it on the client as soon
as you receive it.
Here is the fiat-specific POST /paymentMethods request and response:
curl -X POST https://api.daimo.com/v1/sessions/{sessionId}/paymentMethods \
-H "Content-Type: application/json" \
-d '{
"clientSecret": "SESSION_CLIENT_SECRET",
"paymentMethod": { "type": "fiat", "fiatMethod": "interac" }
}'
The response:
{
"session": {
"status": "waiting_payment",
"paymentMethod": {
"type": "fiat",
"fiatMethod": "interac",
"createdAt": 1700000000
}
},
"fiat": {
"hostedUrl": "https://daimo.com/webview?session=...&cs=...",
"fiatMethod": "interac"
}
}
Open fiat.hostedUrl in a WebView or a new browser tab. When the user finishes, they return to your app; poll the session or use webhooks for the final status.
Omit fiatMethod to let the user pick from every rail available, or set it to pin the flow to a specific one.
| Input | Hosted page behavior |
|---|
{ type: "fiat" } | Lists every rail available for the user |
{ type: "fiat", fiatMethod: "ach" } | Jumps straight into the ACH flow |
{ type: "fiat", fiatMethod: "sepa" } | Jumps straight into the SEPA flow |
Rendering the hosted URL
hostedUrl points to a mobile-friendly Daimo page. Three ways to render it:
- Native iOS / Android / React Native app → load in a WebView. The page posts session events back via
postMessage. Full reference and code samples in the WebView guide.
- Web app → open in a new tab or redirect. No special integration needed.
- In-page iframe → append
?layout=embed to render inline instead of as a modal.
Tracking status
Fiat sessions use the same lifecycle, statuses, and webhooks as every other session. For a full overview, see Sessions and Webhooks.
| Session status | What it means for fiat |
|---|
waiting_payment | Hosted URL is live; waiting for the user to complete the fiat transfer |
processing | Fiat payment confirmed; Daimo is delivering the stablecoin on-chain |
succeeded | Stablecoin delivered to the destination address |
bounced | On-chain delivery reverted (e.g. contract call failure); funds refunded |
expired | User didn’t complete the fiat transfer in time |
Subscribe to session.processing, session.succeeded, and session.bounced via webhooks to drive order fulfillment.
Reference
- Create Session — include
"AllFiat" or a specific rail in display.paymentOptions; optionally pass metadata.email or metadata.phone to skip fiat auth entry.
- Create Payment Method — request body
{ type: "fiat", fiatMethod? }, response fiat.hostedUrl.
- Payment Options — full list of
paymentOptions values.
- WebView — load the hosted URL in iOS, Android, and React Native.
- Sessions — payment method shape and lifecycle details.