Overview
An on-ramp converts fiat money paid by a customer into a stablecoin delivered to the customer’s wallet. You can use floating rates (market-aligned at execution) or locked rates (guaranteed for a short window).Prerequisites
Before initiating an on-ramp transaction:- Verified Customer — Customer must be KYC-approved (see onboarding).
- Exchange Rate (optional) — Choose a floating or locked quote.
- Partner Fee (optional) — Configure custom fees (see partner fees).
- Currencies & rails — Use any supported fiat currency as source and any supported stablecoin as target on any supported payment rail (examples below are illustrative only).
Transaction Overview
1
Initiate On-Ramp
Create the transaction with an amount and currencies (floating rate), or
pass a locked
exchangeRateId
.2
Receive Deposit Instructions
Get rail-specific payment details (e.g., a QR Code or bank account info) and
the payment time window.
3
Fiat Deposit
The customer sends a deposit following the given instructions and time
limit.
4
Deposit Confirmation
Lumx matches your customer’s deposit to the transaction you created.
5
Stablecoin Transfer
The target stablecoin is credited to the customer’s wallet.
Creating an On-Ramp Transaction
Option 1: Floating Rate
Use current market rates determined at execution time:Request
Parameter | Type | Required | Description |
---|---|---|---|
customerId | string | Yes | UUID of the verified customer |
sourceCurrency | string | Yes | Fiat ISO code (e.g., BRL ) |
sourceAmount | string | Yes | Amount in sourceCurrency |
targetCurrency | string | Yes | Asset code (e.g., USDC , USDT , or other supported stablecoins) |
payment.rail | string | Yes | Payment rail (e.g., PIX ) |
partnerFeeId | string | No | Optional partner fee configuration |
Note: Currencies and rails above are examples only. Your integration
can use other supported currencies/assets/rails without changing the schema.
Option 2: Locked Rate
Use a pre-locked exchange rate for guaranteed conversion:Request
Parameter | Type | Required | Description |
---|---|---|---|
customerId | string | Yes | UUID of the verified customer |
exchangeRateId | string | Yes | ID of the locked exchange rate (use before expiresAt ) |
payment.rail | string | Yes | Payment rail (e.g., PIX ) |
When using
exchangeRateId
, you don’t need to input currencies/amounts;
they’re derived from the locked rate you got earlier. Attempts after expiry
will be rejected.Response
Field | Description | Present when |
---|---|---|
id | Unique transaction identifier | all statuses |
customerId | Customer identifier | all statuses |
state.status | Current status: AWAITING_FUNDS → TRANSFERRING_FIAT → TRADING → TRANSFERRING_STABLECOIN → SUCCESS /FAILED | all statuses |
state.payment.rail | Payment rail used for funding (e.g., PIX ) | all statuses |
state.payment.brCode | Rail-specific payment data (e.g., Pix Copia e Cola / QR content) | all statuses |
state.receipt.* | Conversion breakdown after settlement: rate , sourceAmount , targetAmount , currencies, fees | SUCCESS |
state.receipt.fees.lumx.* | Lumx fee components (e.g., rate , flat , currency ) | SUCCESS |
state.receipt.fees.partner.* | Partner fee components (if configured) | SUCCESS |
state.transactionHash | Hash of the on-chain delivery transaction | SUCCESS |
state.blockExplorerUrl | Link to view the on-chain transaction | SUCCESS |
Field availability is status-dependent. For locked quotes, ensure the
transaction is created and funded before the rate’s
expiresAt
;
otherwise, the transaction will be rejected or end up as failed
.On-ramp states
Field | Description |
---|---|
AWAITING_FUNDS | Waiting for the customer’s payment on the selected rail; see state.payment.* (e.g., brCode ). |
TRANSFERRING_FIAT | Payment confirmed; conversion and delivery in progress. |
TRADING | Trading for stablecoin is happening. |
TRANSFERRING_STABLECOIN | Transfering the funds to the customer’s wallet. |
SUCCESS | Transaction has been settled and the customer has received the funds. |
FAILED | Transaction failed/expired; check state.error if present. |
REFUNDING | transaction has failed and funds will be sent back to the bank account of origin. |
REFUNDED | funds have been successfully sent back. |
Transaction Monitoring
Once we receive the deposit for your transaction, we will move the funds to the destination. You can use the API to check the state of the transaction or listen to webhooks.Next steps
- Learn about Exchange Rates for guaranteed rates
- Configure Partner Fees for custom fee structures
- Explore Off-Ramp Transactions to convert stablecoins to fiat