Changelog
Track API and documentation updates, including new features, behavior changes, and fixes.
2026-07-02
- Customers with expected monthly volume of €1,000 or more are now assigned enhanced KYC (previously €15,000).
2026-07-01
POST /customers/{customerId}/documentsnow acceptsDRIVERS(driver's license) andRESIDENCE_PERMIT(residence permit) asidDocTypevalues, in addition toPASSPORT,ID_CARD, andPROOF_OF_ADDRESS.- Verification links returned by
POST /customers/{customerId}/kycare now referred to as "KYC flow links". - Deprecated legacy KYC levels (
customers-flow,customers-ui-flow,customers-ui-flow-enhanced,customers-api-basic,customers-api-enhanced). Existing customers on these levels are unaffected. - Customers with an EU/EEA proof of address now complete an additional EU declaration step, surfaced as an extra questionnaire step in
kyc.steps.
2026-06-29
- When the verification link (
kycFlowLink) is embedded in an iframe, the page now forwards Sumsub verification events to the parent window viawindow.postMessage(idCheck.onApplicantSubmitted,idCheck.onApplicantStatusChanged, andidCheck.onError), so your UI can detect submission, approval, rejection, and errors. See "Detecting events in an iframe" in the integration guide.
2026-06-27
POST /customers/{customerId}/kycnow returns the stable Compose-hosted verification link for hosted customer verification, including customers with an existing applicant record.
2026-06-26
POST /customers/{customerId}/kycnow continues returning a Sumsub WebSDK link for existing customers with an in-progress legacy verification, while new customers receive the hosted Compose verification link when available.
2026-06-19
POST /customers/{customerId}/virtual-accountnow supports corporate customers via API key. Corporate customers must have KYC approved and a complete business address and registration number on file before creation. Contact support if onboarding is incomplete.POST /customers/{customerId}/documentsno longer acceptsDRIVERS(driver's license) orRESIDENCE_PERMIT(residence permit) asidDocTypevalues. The accepted values are nowPASSPORT,ID_CARD, andPROOF_OF_ADDRESS. Requests using the removed types will receive a400response.
2026-06-07
GET /customers/{customerId}now includes anidentityobject withnationality,countryOfResidence, anddateOfBirth(ISOYYYY-MM-DD) for licensed organizations.
2026-06-01
POST /customers/{customerId}/kycnow returns a stable Compose-hosted verification link (https://www.auth.compose.finance/en/signup?c={customerId}) instead of a time-limited Sumsub WebSDK URL.
2026-05-28
- Fiat deposit, withdrawal bank, and transaction payloads are keyed by
paymentRail(SEPA,FEDWIRE,SWIFT) rather than currency alone. Each response variant includes only the bank identifiers for that rail: SEPA usesibanandbic; Fedwire usesaccountNumberandroutingNumber; SWIFT usesaccountNumber,bic, and beneficiary bank details (bankName,bankAddress,bankCountrywhere applicable). - USD SWIFT is supported end to end.
GET /customers/{customerId}/depositcan return SWIFT deposit instructions (account number and BIC). Create USD withdrawal banks withpaymentRail: "SWIFT";bankName,bankAddress, andbankCountryare required. You may pass an IBAN inaccountNumberfor SWIFT banks. POST /customers/{customerId}/withdrawal/banksrequirescurrency(EURorUSD) andpaymentRail. Existing integrations that send onlycurrencycontinue to work and receive the default rail for that currency (EUR → SEPA, USD → FEDWIRE).GET /customers/{customerId}/depositacceptspaymentRailas the primary query parameter. Thecurrencyparameter remains supported and selects the default rail whenpaymentRailis omitted.GET /customers/{customerId}/transactionsandGET /customers/{customerId}/transactions/{transactionId}includepaymentRailon each transaction. For withdrawals, rail-specific bank fields are on the nestedwithdrawalBankobject.GET /ratesaccepts optionalpayment_rail(SEPA,FEDWIRE, orSWIFT) so USD quotes can use Fedwire or SWIFT fee rules. Responses includepayment_railfor the rail used in the quote (your request value or the currency default).
2026-05-24
GET /ratesresponses may now include an optionaldeveloper_feeobject (amount,currency,developerSpreadFeeBps) when quoting a fiat-to-crypto deposit withcustomer_idand the customer has an enabled deposit wallet with a spread fee configured. Platform fees remain infee/fee_currency; quote amounts are unchanged.
2026-05-18
GET /ratesnow accepts an optionaldeposit_modelquery parameter (REFERENCEorVIRTUAL_ACCOUNT, case-insensitive). When omitted, the cheapest available deposit channel is selected automatically so the quote matches the price you will actually pay. Ignored for withdrawals.
2026-05-15
POST /customersnow accepts bothindividualandcorporatevalues foraccountType.- Corporate customers requesting a KYC link now receive guidance that onboarding will be completed by email.
- Added
kyc.rejectionobject toGET /customers/{customerId}response. Populated withrejectLabels[]andreviewRejectType(FINALorRETRY) when the customer is currently in a rejected KYC state;nullotherwise. GET /customers/{customerId}may now include an optionalkyc.rejection.clientCommentstring with a human-readable rejection reason when the verification provider supplied one.
2026-04-29
- Added USD rails across customer deposit and withdrawal APIs.
GET /customers/{customerId}/depositnow supports bothcurrency=eurandcurrency=usd. EUR responses includeiban/bic; USD responses include FedWireaccountNumber/routingNumber.POST /customers/{customerId}/withdrawal/banksnow accepts currency-specific bank details: EUR usesiban/bic, while USD usesaccountNumber/routingNumber.GET /customers/{customerId}/withdrawal/banksreturns the same currency-specific format.- Withdrawal responses from
POST /customers/{customerId}/withdrawal,GET /customers/{customerId}/transactions, andGET /customers/{customerId}/transactions/{transactionId}now returnwithdrawalBankdetails in the correct format for the withdrawal currency (EUR or USD). GET /ratesnow supports USD quotes for theUSD->USDCpair.
2026-03-17
- Added
GET /api/v2/ratesendpoint for indicative exchange rate quotes. Returns a stateless quote for fiat↔crypto currency pairs (EUR ↔ USDC, EURC) including fees. source_currencyandtarget_currencyquery parameters onGET /api/v2/ratesare case-insensitiveexchangeRatedescription on deposit, withdrawal, and rate quote responses now clarifies the formula:targetAmount = sourceAmount × exchangeRate (before fees)
2026-03-12
POST /customers/{customerId}/documentsandPOST /customers/{customerId}/kyc/submitnow return403when manual KYC upload is unavailable for your organization.
2026-03-09
- Added
referencefield to deposit and withdrawal transaction responses. For deposits, this is the inbound bank reference included in the transfer. For withdrawals, this is the reference included in the outbound bank transfer (transaction id).
2026-03-04
- Added
GET /balancesendpoint to retrieve custodial and non-custodial (Safe wallet) balances for your organization, includingavailableBalanceandlockedBalance - Added nullable
addressobject (addressLine1,city,country) toGET /customers/{customerId}response. Returns verified address from KYC or stored metadata when available,nullotherwise. - Added optional
countryfield toPOST /customers/{customerId}/withdrawal/banksrequest body (ISO 3166-1 alpha-2 code). Auto-resolved from KYC/metadata for CUSTOMER recipients; required explicitly for OTHER_INDIVIDUAL and OTHER_BUSINESS. Returns 400 if address cannot be resolved. - Standardized error response descriptions and examples for 401, 403, and 500 across all endpoints
- Renamed
currencyTickertocurrency(lowercased) inGET /developer-feesresponse sourceCurrencyinPOST /customers/{customerId}/withdrawalis now case-insensitiveaccountTypeinPOST /customersis now case-insensitiverecipientTypeinPOST /customers/{customerId}/withdrawal/banksis now case-insensitive
2026-02-25
- Added
addressLine1,city, andcountrytoGET /customers/{customerId}/withdrawal/banksresponses
2026-02-24
- Renamed
tickertocurrencyacross deposit wallet request/response payloads (/customers/{customerId}/deposit/walletsand/customers/{customerId}/deposit/wallets/{walletId}) - Renamed deposit wallet filter query parameter
tickertocurrencyonGET /customers/{customerId}/deposit/wallets - Renamed withdrawal bank wallet field
tickertocurrencyinGET /customers/{customerId}/withdrawal/banksandPOST /customers/{customerId}/withdrawal/banksresponses
2026-02-23
- Added
walletstoGET /customers/{customerId}/withdrawal/banksandPOST /customers/{customerId}/withdrawal/banksresponses POST /customers/{customerId}/withdrawal/banksnow auto-creates a linked withdrawal wallet and returns it when successful
2026-02-20
- Added
GET /customers/{customerId}/kyc/addressendpoint to retrieve a customer's verified address - Made
addressLine1andcityoptional forCUSTOMERrecipient type — address is auto-resolved from KYC data when not provided - Changed
recipientTypeenum values fromMYSELF/INDIVIDUAL/BUSINESStoCUSTOMER/OTHER_INDIVIDUAL/OTHER_BUSINESS
2026-02-19
- Added
isThirdPartyfield to withdrawal bank responses - Third-party withdrawal banks now require approval (
PENDING_APPROVALstatus)
Webhooks
Previous Page
Get balances GET
Returns custodial (account) and non-custodial (Safe wallet) balances for your organization. **Custodial balances** are grouped by asset and summed across chains. These represent funds held on your behalf by Compose. **Non-custodial balances** are queried on-chain from your organization's Safe wallet. Each entry includes the chain and token contract address.

