July 21st 2026
Added
[Wallet transfers]
You can now move funds directly between wallets with a single call.
- Added POST /wallet/transfer
Transfer from any wallet you own (client wallet or one of your users' wallets) to any user wallet or linked client wallet (e.g. a subaccount). The response includes the resulting amounts on both sides, exchange rate, fee, and status, and supports your ownclient_transfer_id,notes, andmetadata.
Added
[Wallet ledger]
You can now retrieve a full, reconcilable history of balance movements for any wallet.
- Added GET /wallets/{'{wallet_token}'}/ledger
- Added GET /wallets/{'{wallet_token}'}/ledger/{'{ledger_transaction_token}'}
Every movement is returned as a ledger entry with amount, currency, timestamp, type, and a reference to the originating transaction. Entry types cover payouts, pay-ins, loads, top-ups, spendbacks, fees, credits, debits, and their reversals.
Added
[Pay-in tracking and reversal]
You can now follow a pay-in through its full lifecycle after initiating it.
- Added GET /payin/{'{user_token}'} — list all pay-ins for a user
- Added GET /payin/{'{user_token}'}/{'{payin_token}'} — check the status of a specific pay-in
- Added POST /payin/{'{user_token}'}/{'{payin_token}'}/reverse — reverse (close) a pay-in, with an optional
reason
Reversal behavior depends on how the pay-in is funded: for temporary bank accounts (ACH/wire) and issued crypto deposit wallets, reversing closes the deposit account so it accepts no further deposits.
Added
[Value-added verification services]
You can now request verification checks per transaction.
- Pay-ins accept a
value_added_servicesobject supportingcvv,avs,ani,account_updater, andthree_ds(passcavv,eci, andds_transaction_idfor 3-D Secure liability shift) - Payouts accept a
value_added_servicesobject supportingaccount_validation
Each check runs in one of three modes:SKIP,RUN(run and report, never decline), orRUN_AND_VALIDATE(decline the transaction if the check fails). Omitted checks default toSKIPfor pay-ins and to your account's configuration for payouts. Check results are returned innetwork_response.
Added
[Didit KYC]
Added support for the Didit identity verification provider.
- Added PUT /payout/user/{'{user_token}'}/kyc/didit
Link a Diditverification_session_idto a user, and MassPay will pull all applicant data and images from the Didit platform.
Improved
[Initiate pay-in response]
The POST /payin/{'{user_token}'} response now gives you more to work with for asynchronous and multi-deposit flows.
- Your
client_transfer_idis now echoed back in the response - New
depositsarray — a pay-in can be funded by multiple deposits, each with its own status (PENDING,PROCESSING,COMPLETED,FAILED,EXPIRED), amounts, andtransaction_reference network_responsenow also returns bank-transfer details when applicable (account_number,routing_number,swift_bic,bank_name,bank_address,name_on_account) and verification results (cavv_result_code,ani_result,exemption_reason_code)- Pay-ins can now report a
CANCELLEDstatus - Breaking: the
required_actionvalueCRYPTO_TRANSFERis renamed toTRANSFER, since it now covers bank transfers as well — update any matching on this value
Added a response example for pending bank-transfer (ACH/Wire) pay-ins, where the user must send funds to a generated bank account.
Improved
[Transaction history]
Transaction history now covers pay-ins and cancellations.
- The
typefilter now acceptspayinon: - Transactions can now report a
CANCELLED_AT_LATER_TIMEstatus
Improved
[Top-up returns]
GET /payout/account/topup/{'{topup_token}'} now returns a status_reason when a top-up is returned, containing the return reason code (e.g. R07 for ACH).
Improved
[Veriff media retrieval]
GET /payout/user/{'{user_token}'}/kyc/veriff/{'{session_id}'}/{'{media_id}'} now handles large media files.
- The response always includes a
url— a short-lived (2 minute) presigned link to download the file directly - Base64
contentis now only inlined for files small enough to fit within the API response size limit; useurlfor larger files
Note the response is now a single object rather than an array.
Improved
[Documentation cleanup]
- Corrected the POST /payout/spendback/{'{user_token}'} description: funds move from the user token to the source token (previously stated the reverse)
- Added request examples to POST /payin/{'{user_token}'} showing typical field usage
- Clarified descriptions across pay-in and KYC endpoints
Deprecated
[Legacy wallet routes]
The /payout/wallet balance and notification routes are deprecated in favor of new /wallet routes. The behavior is unchanged — only the path moves.
- Use GET /wallet/{'{user_token}'} instead of
GET /payout/wallet/{'USER_TOKEN'}to retrieve a user's wallets - Use PUT /wallet/{'{user_token}'} instead of
PUT /payout/wallet/{'USER_TOKEN'}to resend a balance notification
The deprecated routes continue to work for now, but new integrations should use the/walletpaths.
