POST /transactions/off-ramp with USDC or USDT as the source. Lumx debits the customer’s wallet, converts to BRL and sends the Pix payment to the key. The customer’s BRL account is in its own name, so the recipient sees the customer as the payer. You follow each payout with offramp.* webhooks until offramp.success.
Pix runs 24/7/365 with no cut-off, so a payout does not wait for a banking day.
What you need
- An API key from the Dashboard. The examples use the sandbox base URL.
- An
APPROVEDcustomer. Wallets are enabled only after approval. - USDC or USDT in the customer’s wallet. In sandbox, run an on-ramp first: it completes on its own and credits the stablecoin to the wallet, and you can pay out from that balance.
1. Create the customer
The customer is the payer. For your own treasury it is your business, and for a platform it is each end user. Send aPOST request to /customers.
Request
NOT_STARTED and has to reach APPROVED through KYC or KYB. Subscribe to customer.approved to know when it does. Create a customer covers the full flow.
2. Register the Pix destination
A destination holds the recipient’s Pix key and the holder’s details. Send aPOST request to /destinations.
Request
id, which you use as destinationId on the payout.
Lumx verifies each holder. Check
holder.verification.status on the response or subscribe to destinations.approved and destinations.final_rejection. For SELF destinations, holder.type and holder.taxId must match the customer. Relationship values are listed in Destinations. An off-ramp to a destination that is not APPROVED fails with INVALID_PAYMENT_DESTINATION.
3. Quote the payout (optional)
Without a quote, the off-ramp converts at a floating rate. To show the recipient amount up front, request a locked quote withPOST /exchange-rates (type LOCKED, rail PIX, sourceCurrency USDC, targetCurrency BRL) and pass its id as exchangeRateId in step 4. The locked quote guide has the request, the lock durations and what happens on expiry.
4. Create the off-ramp
Send aPOST request to /transactions/off-ramp.
Request
Response (202)
Lumx does not deduct a fee from the amount that reaches the recipient. Only the recipient’s bank can charge them.
5. Track it until it settles
An off-ramp moves through these statuses:TRANSFERRING_STABLECOIN → TRADING → TRANSFERRING_FIAT → SUCCESS
If it cannot complete, it ends in FAILED. Each status change sends a webhook to the endpoint you set up under Developers > Webhooks in the Dashboard.
offramp.success (excerpt)
webhook-id, webhook-timestamp and webhook-signature headers, and deduplicate on webhook-id. If your endpoint does not return a 2xx, Lumx retries with exponential backoff. If a webhook is missed, GET /transactions/{id} returns the current state.
Timing and limits
- Pix settlement. Instant, 24/7/365, with no cut-off. These are processing targets, not guarantees. See Payment rail cut-off times.
- Holds. A transaction flagged by compliance monitoring is held for an RFI. Large transactions can get an extra risk review, which typically adds up to two business hours.
- Completion. Lumx treats the off-ramp as complete once the funds leave its banking partner. The recipient’s bank can still hold them for its own review.
- Limits. Off-ramps count only against
offramplimits, per transaction, per day and per month, counted in the USD equivalent of the payout. The minimum per transaction is the equivalent of USD 40 today, and it may change. Read the remaining headroom withGET /customers/{id}?includeTransactionLimits=true. See Transaction limits.
Common errors
Match oncode, not on message.
See Errors for the full catalog.
Related resources
Locked FX quote guide
Fix the USDC to BRL rate before you pay out.
Destinations
Holder relationships and payout targets.
Webhooks
Events, signatures and retries.
Coverage
Supported rails, networks and stablecoins.