Preparing for our Brazil VASP license 💜
We’re getting close to applying for our VASP license in Brazil, and part of that preparation reaches the API. Transaction limits will be split by transaction type, and the onboarding questionnaire gets simpler, with monthly income and revenue questions and fixed lists for most answers. Your customers will also accept terms of service with each Lumx legal entity they work with, and your webhooks will tell you when those terms change. Here is what changes and what your integration needs to handle.Enhancement:- Terms of service come before verification
verification.link is only returned once the TERMS_OF_SERVICE requirement is APPROVED, so read the customer again after acceptance to get it. See Terms of Service.- Transaction limits per transaction type
transactionLimits now returns separate limits for onramp, offramp and transfer. Each one has the same single, daily and monthly structure you already know. Update your integration to read the bucket that matches the transaction you’re creating. See Transaction limits.Before
After
POST /customers/{id}/limit-requests now requires a type field (ONRAMP, OFFRAMP or TRANSFER), and each type can have its own pending request. Limit request responses include type, which is null for requests created before this change.Request (POST /customers/{id}/limit-requests, excerpt)
- Individual additional information
PATCH /customers/{id}/additional-information for individuals now requires monthlyIncomeInUSD, and professionalSituation, sourceOfFunds and transactionCounterparties only accept the values listed under Accepted values below.Request (PATCH /customers/{id}/additional-information)
- Business additional information
monthlyRevenueInUSD is now required and monthlyTransactionVolumeInUSD takes a range instead of free text. businessActivity, sourceOfFunds and transactionCounterparties only accept the values listed under Accepted values below.Request (PATCH /customers/{id}/additional-information)
- Individual associated parties
monthlyIncomeInUSD on POST /customers/{id}/associated-parties, and you’ll also get it back when you read associated parties. Business associated parties stay the same.Request (POST /customers/{id}/associated-parties)
Accepted values
professionalSituation (individual)
professionalSituation (individual)
sourceOfFunds (individual)
sourceOfFunds (individual)
transactionCounterparties (individual)
transactionCounterparties (individual)
sourceOfFunds (business)
sourceOfFunds (business)
transactionCounterparties (business)
transactionCounterparties (business)
monthlyTransactionVolumeInUSD (business)
monthlyTransactionVolumeInUSD (business)
businessActivity (business)
businessActivity (business)
400, including values we accepted before this change. Customers you onboarded earlier keep their previous answers in additionalInformation.Deprecated:-
Removed from individual additional information:
jurisdictions,involvedActivities. -
Removed from business additional information:
jurisdictions,involvedActivities,annualRevenue,complianceAndAML,monthlyVolumeInUSD,transactionVolumeInUSD. Send the expected monthly volume inmonthlyTransactionVolumeInUSDinstead. -
Renamed in business additional information:
companyTypeis nowbusinessActivity, with the new list of values above.
Terms of service will go live next week. If in doubt, contact the Lumx operations team.
- Terms of service webhooks
customer.tos.pending brings everything you need to send the customer to the new terms. tosLink is the acceptance page and stops working at expiresAt. graceUntil is the deadline to accept. url points to the terms themselves. If the link expires, generate a new one with Create TOS acceptance link.customer.tos.pending
customer.tos.updated is a heads-up only. Share the updated url with your customer if you’d like, there’s nothing for them to sign.customer.tos.updated
customer.tos.signed fires every time the customer signs: during onboarding, after accepting new terms, and when recovering from MISSING_TOS.customer.tos.signed
graceUntil, their verification status moves to MISSING_TOS and they can’t create on-ramps, off-ramps or transfers until they sign. You’ll receive customer.missing_tos with statusReason.reason set to TOS_GRACE_EXPIRED.customer.missing_tos (excerpt)
GBP accounts and FPS are live 🇬🇧
New feature:- GBP accounts
GBP in the accounts array when you create a customer to provision a GBP virtual account, subject to your project’s allowed currencies. Track it with GET /accounts.Request
Response (GET /accounts)
- FPS on-ramps
rail: "FPS" (Faster Payments Service) with sourceCurrency: "GBP". The response returns the sort code and account number to pay into under state.payment.identifier.Request
Response
- FPS destinations
rail: "FPS" and currency: "GBP". The identifier is the 6-digit sortCode and 8-digit accountNumber. bank and holder are required, but their addresses only need country. SEPA destinations follow the same rule.Request
Response
- EUR and GBP autoconversion rules
sourceDepositInfo returns the SEPA (iban, bic) or FPS (sortCode, accountNumber) details to share with the sender. As with USD, deposits are matched to the account, so each customer can have one active EUR rule and one active GBP rule at a time. See Autoconversion Rules.Request
Response (GBP)
Response (EUR)
- SEPA routing and cut-off times
rail: "SEPA". See Payment rail cut-off times.- Immediate EUR account activation
ACTIVE right after the customer is APPROVED, instead of waiting up to 1 business day for a banking partner review. GBP accounts activate the same way. See Activation timelines.For complete coverage details, see Coverage.New account statuses and lifecycle 🏦
New feature:- New account statuses
AWAITING_ONBOARDING (account created, customer not yet verified), REQUESTED (customer approved, provisioning requested), REJECTED (account application rejected), and INACTIVE (customer deactivated), in addition to the existing PROVISIONING, RFI, and ACTIVE. The CLOSED status was merged into INACTIVE, and the account.closed webhook event was removed. See Accounts for the lifecycle.- New webhook events
account.awaiting_onboarding, account.requested, account.rejected, and account.inactive fire on the new transitions. During the migration, account creation emits both account.awaiting_onboarding and the legacy account.provisioning, so existing integrations keep working.Subscribe to the new
account.* events on the dashboard’s webhook settings to receive the new lifecycle notifications.Limit increase requests via API 📈
New feature:- Limit increase requests
- Upload a supporting document with
POST /customers/{id}/documentsusing one of the new document types:LIMIT_REQUEST_BANK_STATEMENT,LIMIT_REQUEST_TAX_RETURN, orLIMIT_REQUEST_FINANCIAL_STATEMENTS. - Create the request with
POST /customers/{id}/limit-requests. - Track it with the read endpoints or subscribe to the
customer.limit_request.*webhook events. Thestatusmoves fromIN_REVIEWtoAPPROVED,PARTIALLY_APPROVED, orREJECTED.
USD autoconversion rules 💵
New feature:- USD autoconversion rules
sourceDepositInfo carries the bank details for the ACH, FEDWIRE, and SWIFT rails. Each customer can have one active USD rule at a time. See Autoconversion Rules.- Optional simulate-deposit reference
reference is now optional on POST /autoconversion-rules/simulate-deposit and is not used for USD simulations.New error response contract 🚨
Enhancement:- Standardized error responses
code field, a requestId for support requests, and field-level details in validationErrors on validation failures. Handle errors by code and not by message. See the full catalog in Errors.IP allowlisting for API keys 🔒
Enhancement:- IP allowlisting
https://api.lumx.io), sandbox stays open to requests from any IP. During the current grace period nothing is blocked, even for keys that already have an allowlist. Enforcement starts on September 21, 2026, when the production API begins rejecting requests from IPs outside the allowlist, so register your server IPs before then.Stellar network support ⭐
New feature:- Stellar network
"blockchain": "STELLAR" on on-ramps and exchange rate requests to settle USDC on the Stellar network. On-ramp only for now. See Coverage and Stablecoin Wallets.Autoconversion rules 🔁
New feature:- Autoconversion rules
POST /autoconversion-rules and every fiat deposit that hits the account is automatically converted to USDC or USDT and delivered on-chain — no per-transaction API call. Available for BRL and MXN accounts for now. See Autoconversion Rules for the full guide.KYC reuse with Sumsub share tokens 🔁
New feature:- Reuse an existing Sumsub verification
shareToken field when creating a customer to import the existing verification instead of collecting documents again. Only available for individual customers, and requires a data-sharing agreement between you and Lumx — contact compliance@lumx.io to set it up. See the KYC Reuse guide.Account provisioning at customer creation 🏦
Enhancement:- Provision accounts at customer creation
accounts array of currency codes when creating a customer. Each currency provisions an account that enters verification and becomes ACTIVE once approved. The customer response now also returns the linked accounts with their id and currency.- Read accounts
GET /accounts. Each account is linked to a customer and runs through a verification workflow (PROVISIONING → ACTIVE). See Accounts for details.- Account webhook events
account.provisioning, account.rfi, account.active, and account.closed to receive real-time updates as an account moves through verification. See Available events.Bank accounts renamed to destinations 📦
Deprecated:- Resource renamed across the API
/bank-accounts resource is now /destinations. The bankAccountId field is now destinationId. See Destinations for the updated concept.POST /transactions/off-ramp will accept either destinationId or bankAccountId until June 19, 2026. After this date, only destinationId will be accepted.bank_account.*webhook events renamed todestinations.*
bank_account.under_verification, bank_account.approved, and bank_account.final_rejection are now destinations.under_verification, destinations.approved, and destinations.final_rejection.typefield removed from destination requests
type field is no longer documented for POST /destinations. The /destinations route will continue to accept type as an optional field until June 19, 2026 so existing integrations migrating from /bank-accounts keep working. After this date, the field will be rejected. Continue sending type on /bank-accounts; stop sending it on /destinations.Update your subscriptions on the dashboard to
start receiving the new
destinations.* events — the old event names will no
longer fire.TEMPORARY_REJECTION renamed to RFI ✏️
Deprecated:- Customer and associated party status renamed
TEMPORARY_REJECTION is now RFI (Request for Information). The rename applies to the status field on both the customer and each entry in the associatedParties array, in API responses and webhook payloads.- New
customer.rfiwebhook event
customer.rfi webhook event has been introduced. The customer.temporary_rejection event will continue to exist, but it will no longer fire — only the new customer.rfi event will be emitted. The customer.temporary_rejection event will be removed in a future release.Update your subscriptions on the dashboard to
start receiving the new
customer.rfi event.Wallets only returned for APPROVED customers 👛
Deprecated:walletsgated by verification status
wallets array is now only returned on customer responses once the customer’s verification.status is APPROVED. This also means Create a customer no longer returns wallets. Call Read a customer or register the customer.approved webhook to get notified once verification is approved and the wallets become available.Isolated retry for associated party verification 🔁
Enhancement:- Retry verification for specific associated parties
associatedPartyIds array in the request body. When provided, only the listed associated parties are sent for verification again, and any associated party not included keeps its current verification status. See Retrying verification for specific associated parties for details.Applies only to BUSINESS customers. Resubmit any corrected
documents/information for the affected associated parties before starting the
retry.
Improving customer onboarding 🛩️
Enhancement:- Auto-assign UBO role to sole shareholders
UBO to their roles array. No action required from your side.PROOF_OF_ADDRESSdocument now required
PROOF_OF_ADDRESS document is now required when uploading documents for individual customers, business customers, UBOs, and representatives. You can’t start a verification without sending this document.The proof of address document must have been issued within the last 90
days.
- Terms of service acceptance required before verification
POST request to /customers/{id}/tos with an optional redirectUrl to get the acceptance URL. Share the returned URL with your customer. The requirements array includes TERMS_OF_SERVICE until the customer has accepted. See also Read a customer.Request body (optional)
Response
Webhooks v2 🔔
Enhancement:- New webhook delivery system
eventId, eventType, and data fields. See Webhooks for details.Deprecated:- Legacy webhook format deprecated: Migrate to the new webhook format and update your signature verification to use the
webhook-id,webhook-timestamp, andwebhook-signatureheaders. See Verifying webhook signatures for implementation examples.
MXN support is now live 🇲🇽
New feature:- MXN transactions now available
- MXN bank accounts now supported
Sandbox magic numbers for testing 🪄
New feature:- Magic numbers for customer verification testing
taxId field when creating customers in sandbox to simulate different verification statuses. No API changes required, magic numbers use existing fields.Multiple roles for associated parties 🎭
Deprecated:rolechanged torolesarray in associated parties: ThePOST /customers/{id}/associated-partiesendpoint now requires arolesarray instead of the singlerolestring field. This allows associated parties to hold multiple roles simultaneously (e.g., both UBO and REPRESENTATIVE). Valid values:UBO,REPRESENTATIVE,SHAREHOLDER.
KYC/KYB API and idempotency support 🤯
New feature:- KYC/KYB verification endpoints
PATCH /customers/{id}/additional-information— Submit KYC/KYB dataPOST /customers/{id}/documents— Upload verification documentsPOST /customers/{id}/associated-parties— Add UBOs, shareholders, and representativesGET /customers/{id}/associated-parties— List associated partiesGET /customers/{id}/associated-parties/{associatedPartyId}— Read an associated partyPOST /customers/{id}/verifications— Start a verificationGET /customers/{id}/verifications/{verificationId}— Read verification status
additionalInformationin customer response
additionalInformation object with all submitted KYC/KYB data.- Multi-level corporate structures
parentId field, allowing you to nest shareholders across multiple levels of ownership hierarchy.- Idempotency support
POST, PUT, PATCH) now accept an Idempotency-Key header to prevent duplicate operations. Keys expire after 24 hours. See Idempotency for details.Individual customers and bank account holders 🥳
New feature:- Individual customer type
type: "INDIVIDUAL" for natural persons. Individual customers require name, taxId, and birthDate fields.- Individual bank account holders
birthDate is optional.- Individual bank account identifier key type as CPF
CPF as a valid keyType identifier for PIX.Enhancement:- New relationship types for bank account holders
FRIEND, RELATIVE, and EMPLOYEE to the available relationship types for bank account holders.Multi-blockchain support 🔥
New feature:- Multiple wallets per customer
wallets array includes blockchain, address, block explorer link, stablecoin balances, and default blockchain indication.- Blockchain field in transactions
blockchain field. If not specified, the project’s default blockchain is used.- Blockchain field in exchange rates
blockchain field. The response indicates which blockchain was used for rate calculation.Enhancement:- Improved balance tracking
-
walletandbalancesfields deprecated on customers: Migrate to the newwalletsarray. Affected endpoints:POST /customers,GET /customers. -
Default partner fee removed: If no
partnerFeeIdis provided, partner fees will be zero. Remove any logic that depends on a default fee. Affected endpoints:GET /partner-fees,POST /partner-fees.
Transaction limits response improved ⚡
Enhancement:- Transaction limits now include usage tracking
includeTransactionLimits=true, the transactionLimits object now returns detailed usage information with used and remaining fields for daily and monthly limits, giving you real-time visibility into your customer’s limit consumption.-
transactionLimitsno longer returned by default: ThetransactionLimitsfield is no longer included inGET /customers/{id}responses by default. Use the new query parameterincludeTransactionLimits=trueto retrieve transaction limits. -
transactionLimitsremoved from customer listing: TheGET /customersendpoint no longer returns thetransactionLimitsfield in the response array. - 10-second timelock removed from exchange rates: The 10-second timelock option is no longer available. The 30-second timelock now has no additional fees, and fees for other timelock options have been optimized.
SEPA and SWIFT are live 🚀
New feature:- SEPA support now available
- SWIFT support now available
- Purpose field now returned in transaction responses
purpose field is now included in transaction responses under the request object, providing full visibility of the original transaction intent.- Target amount visibility improved
targetAmount in the receipt object when the conversion is complete, ensuring you always have access to the final conversion amounts.- Bank account ordering updated
Bank Accounts are live 🎉
New feature:- Supplier payments now available
/bank-accounts endpoint allows you to register and manage bank accounts for supplier payments. Refer to the Create a Bank Account for details.Enhancement:-
PROCESSINGstatus renamed toTRANSFERRING_STABLECOIN -
state.blockchainmoved tostate.receipt
receipt object includes transactionHash and blockExplorerUrl fields for better transaction tracking.purposenow required for on-ramp and off-ramp transactions
purpose field. Requests without this field will be rejected.-
On-ramp:
payment.railmoved to request levelrail -
Off-ramp:
customerIdandpaymentobject removed, usebankAccountIdonly -
Exchange Rate:
railandcustomerIdparameters now required