POST /api/autoramps and read it with GET /api/autoramps/{autoramp_id}. In the Partner Dashboard, Autoramps live on the Routes page: it’s the only place that calls them routes.
How an Autoramp works
Take a EUR Autoramp that delivers EURC on Base to your customer’s wallet:1
You create it
Call
POST /api/autoramps with EUR in source_currencies, EURC on Base as destination_currency, the customer’s registered wallet in recipient_account, and the customer_id. The response comes back Authorized, with kind: "Onramp" and an empty deposit_rails. See Create an Autoramp.2
The bank opens the account
MoonPay Enterprise opens an IBAN in your customer’s name. The Autoramp moves to
DepositAccountAdded, then Approved, and register_autoramp_status fires at each step. Once it’s Approved, deposit_rails holds the IBAN, the BIC, and the beneficiary name. See Autoramp Status.3
Your customer pays in
They send €1,000 by SEPA from their bank app. MoonPay Enterprise creates a transaction for the payment and sends a
transaction webhook. You don’t make any call per deposit.4
It converts and delivers
The transaction moves through
ConversionInProgress and PayoutInProgress to Completed, with a transaction_status webhook at each step. The EUR converts at the market rate at that moment, and the EURC lands in the wallet. transaction_hash holds the on-chain hash. See Fees and Transaction Status.Autoramp kinds
Each kind matches a card on the Partner Dashboard’s Routes page:
You don’t send
kind. The API derives it from the currencies when you create the Autoramp, and it never changes afterwards:
Mint: the destination is an issuance token, such as PYUSDxRedeem: a source is an issuance tokenOnramp: the source is fiatOfframp: the destination is fiatSwap: crypto in, crypto out
Mint, not an Onramp. A fiat-to-fiat Autoramp returns 400 with "Fiat to fiat autoramps are not allowed".
Onramp Autoramp
Gives your customer a bank account in their own name, in USD, EUR, GBP, or BRL. Fiat sent to it becomes stablecoins in their wallet. See Virtual accounts for eligibility, deposit details per currency, and third-party payments.Offramp Autoramp
Gives your customer a deposit address. Stablecoins sent to it pay out as fiat to a bank account you registered. See Payouts for bank account registration, exact-out quotes, and payout rails per currency.Stable to Stable Autoramp
Gives your customer a deposit address that turns one stablecoin into another, on the same chain or across chains. For example, USDC sent on Solana arrives as EURC on Base. The recipient wallet must be on the destination chain. Stellar works only as an onramp destination, so it’s not available here.Create a Stable to Stable Autoramp
Create a Stable to Stable Autoramp
201 Created
chain inside recipient_account. The response returns the same value as blockchain inside recipient.Standing or quote-based
Every Autoramp is one of two types, shown in itssource field.
A standing Autoramp can never become quote-based. If you need locked rates later, create a quote-based Autoramp. See Quotes.
Before you create an Autoramp
1
The customer is Active
The customer’s
status is Active: terms signed, identification approved, and nothing outstanding in GET /api/customers/{customer_id}/required-signings. Otherwise POST /api/autoramps returns 403 with "Customer is not active". See Onboarding.2
The rail is Active for this customer
An
Active customer can still be waiting on a specific rail. Read GET /api/customers/{customer_id}/abilities and create the Autoramp only once its rail reads Active. A rail that isn’t Active yet returns 422 with "Customer is unable to complete the action. Consult the customer abilities API". Subscribe to the customer_fiat_abilities webhook instead of polling. See Ability Status.3
The recipient is registered
Register the wallet or bank account that receives the converted funds before you create the Autoramp, and pass the same details in
recipient_account:- Wallet: see Crypto Addresses. An unknown wallet returns
400with"Recipient wallet not verified for customer". - Bank account: see Fiat Addresses. It must reach
Registered. An account that isn’t registered yet returns400with"recipient fiat account not verified".
How many Autoramps a customer can have
- Onramp Autoramps: up to 10 per customer, counting every Autoramp that isn’t
CancelledorRejected. An Autoramp waiting on an edit, or a dormant quote-based Autoramp, still counts. The 11th returns400with"Customer has reached the maximum number of onramps. Please cancel existing onramps before creating a new one."Contact the MoonPay Enterprise team to raise the limit for a customer. Sandbox doesn’t enforce it. - Offramp, Stable to Stable, Mint, and Redeem Autoramps: don’t count toward the limit. A
MintAutoramp with a fiat source is still refused with the same error once the customer has reached it. - BRL (PIX) onramp Autoramps: one per customer.
GET /api/autoramps/check-limit, passing customer_id, deposit_account_type (for example Iban, AchWire, ChapsFps, Pix, or Wallet), and is_third_party. The response is { "can_create": true } or false.
A customer can hold several Autoramps for the same source asset, each with its own destination. For example, one EUR Autoramp that delivers USDC on Solana and another that delivers EURC on Base. Each gets its own virtual account or deposit address, unless you use pay by reference.
Create an Autoramp
- Dashboard
- API
1
Open Routes
Switch to the App view, pick your customer in View As, and open Operations → Routes.
2
Pick a card
Click the create button on the Onramp, Offramp, or Stable to Stable card.
3
Fill in the Autoramp
Choose the source and destination assets and the registered wallet or bank account that receives the output. The fee profile sits under Advanced options.
4
Copy the deposit details
Once the Autoramp is
Approved, open it and click Deliver Funds to see the bank details or deposit address.POST /api/autoramps requires an Idempotency-Key header. A missing key returns 400. Only successful responses are cached, so a retry after an error runs again. See Idempotency.Request fields
Errors
Client errors return a plain string body. The ones partners hit most:422 Unprocessable Entity
Lifecycle
A new Autoramp starts inAuthorized while MoonPay Enterprise provisions its deposit account. It moves to DepositAccountAdded when the account is attached, and to Approved once the account is verified. Share deposit details only at Approved.
Approved is the steady state of a working Autoramp: it stays there until it’s edited or cancelled. See Autoramp Status for what triggers each status, including why an Autoramp stays at Authorized.
Pay by reference
Setpay_by_reference: true on POST /api/autoramps, with standard parameters or a signed quote, to share one virtual account across several Autoramps for the same customer. Each Autoramp returns an inbound_payment_reference of the form IR-XXXXXX. Senders must include it on every transfer so the deposit reaches the right Autoramp.
Pay by reference works when all of these hold:
- Kind:
OnramporMint - Source: a fiat currency on a EUR (
Iban), USD (AchWire), or GBP (ChapsFps) virtual account. BRL (Pix) Autoramps don’t support it
Approved, with deposit_rails filled in.
Edit an Autoramp
PATCH /api/autoramps/{autoramp_id} changes an Approved standing Autoramp. Send the customer_id that owns it, plus any of these fields:
A
Mint Autoramp can only change to another mint token, and a Redeem Autoramp only to another fiat currency.
Everything else is fixed when you create the Autoramp: the source currencies, payment references, swift_purpose_code, pay_by_reference, source_is_third_party, and batch_payout. To change any of them, cancel the Autoramp and create a new one. To change the rate on a quote-based Autoramp, attach a new quote instead.
A standing Autoramp is also called a market Autoramp. You’ll see the term here: the operation is
patchAutorampMarketById, its body is PatchAutorampMarketParameters, and a quote-based Autoramp returns "Only Autoramp market can be patched". Market means the same as source: Standalone. The optional type field on POST /api/autoramps uses it too: "market" for a standing Autoramp, "quote" for a signed quote.400 with its own plain string body:
Email confirmation (2FA)
All three fields decide where your customer’s money goes and what it costs them, so every change to them is a sensitive edit. By default, a sensitive edit moves the Autoramp toEditPending and emails your customer a confirmation link and a 6-digit code. The code expires after 10 minutes. The change takes effect once they confirm, and the Autoramp returns to Approved.
2FA is on by default for every partner. MoonPay Enterprise can turn it off for your account after reviewing your integration, to confirm that your customers always approve fee and beneficiary changes in your product, and that you show those changes to them correctly. With 2FA off, edits apply immediately and the Autoramp stays Approved. Contact the MoonPay Enterprise team to request a review.
Confirm the code in your app
Confirm the code in your app
If your customer clicks the link in the email, nothing else is needed. If they enter the code in your app instead, submit it in two calls.
-
Get the pending code for the entity. Pass the Autoramp’s ID, not a code ID:
The response carries the code’s
id, itsstatus,attempts, andexpires_at. It returns404when no code is pending because it expired or was already confirmed. -
Submit the code against that
id:codeis an integer. A string such as"123456"fails validation. Act on thestatusin the response:Confirmed: the edit is applied.Pending: the code was wrong andattemptswent up by one. Ask your customer to try again. After three wrong codes, the next submission returnsRejected, even with the right code.RejectedorExpired: the pending edit is reverted and the Autoramp keeps its previous settings. Make the edit again to send a new code.
123456 confirms any pending code. Both endpoints accept an optional X-SUB-PARTNER-ID header to scope the lookup to a sub-partner. POST /api/autoramps/{autoramp_id}/retry-auth always returns 404 with "This endpoint is no longer supported."Cancel an Autoramp
DELETE /api/autoramps/{autoramp_id} returns 204 and moves the Autoramp to Cancelled. Its deposit_rails empties, and deposits sent to its old details are returned to the sender while no other Autoramp uses them. A EUR or GBP account left idle by a cancelled Autoramp can be reused for the customer’s next Autoramp in that currency, and deposits to it then convert on the new Autoramp.
Some USD accounts don’t return an ACH deposit automatically when it matches no live Autoramp. This covers a cancelled Autoramp, an Autoramp in
EditPending, and a pay-by-reference deposit without a matching reference. If an ACH deposit doesn’t come back, contact the MoonPay Enterprise team to recover the funds.register_autoramp_status webhook for each:
- MoonPay Enterprise support cancels the Autoramp
- The customer is archived
- The Autoramp’s recipient wallet is disabled. Disabling a wallet fires no webhook of its own: only its cancelled Autoramps report it. See Disable or enable an address
Fees
Each Autoramp carries one transactional fee profile. Passfee_profile_id when you create the Autoramp, or leave it out: the most specific profile that matches the Autoramp applies, otherwise your default profile. Change it later with PATCH, which counts as a sensitive edit. Create and manage profiles in the dashboard under Fee Profiles.
Every transaction on the Autoramp reports its fees in the source currency, in fee and fee_breakdown, with a settlement method for each:
deductedImmediately: taken from the amount before payout, so the recipient receives lesssettledLater: not taken from the transfer. It appears on your monthly invoice instead
Webhooks and emails
register_autoramp_status does not fire when you cancel an Autoramp, when an Autoramp enters EditPending, when a pending edit is reverted, or when an Autoramp is rejected because the bank failed to open or closed its account. Read the Autoramp with GET /api/autoramps/{autoramp_id} after those actions. See Webhooks.
Your customer receives an email when a standing Autoramp is approved, and when an Autoramp is rejected. Quote-based Autoramps don’t send the approval email. MoonPay Enterprise can turn the Autoramp email off for your account if your product shows your customer the same account details. Contact the MoonPay Enterprise team.
What to read next
Virtual accounts
Onramp Autoramps: named bank accounts that settle into stablecoins
Payouts
Offramp Autoramps: stablecoins to a bank account
Quotes
Lock a rate, and attach new quotes to a running Autoramp
Autoramp Status
Every status an Autoramp moves through, and what triggers it