Assess your own fees on every transaction
Charge your customers a platform fee and keep the margin—Grid collects it for you and reports it separately from network and FX costs.- Set a standing fee with
feeConfigsonPATCH /config—a variable rate in basis points, a fixed amount, or both, applied to cross-currency transactions. - Override it on a single transaction with
platformFeeOverrideonPOST /quotes, for promos, VIP pricing, or negotiated rates. No standing config required. - Both the standing config and the per-transaction override require a USD source currency today.
- Reconcile with
platformFeesIncludedon quotes andplatformFeeson outgoing transactions—your cut, broken out of the total.
Record end-user terms acceptance
Unregulated platforms must record that each customer accepted Grid’s end-user terms before their account opens.GET /customers/end-user-termsreturns the current terms URL and version.- Pass
endUserTermsConsenton customer create or update with the timestamp, IP address, terms version, and acceptance method. - Quotes fail with
END_USER_TERMS_NOT_ACCEPTEDuntil acceptance is on file.
Run KYC from your own onboarding form
Collect verification data in your own UI and submit it programmatically instead of handing customers to a hosted flow.- Enhanced due diligence—source of funds and wealth, purpose of account, expected
transaction count and volume, income and net worth ranges, PEP status—is now a set of
optional fields on the individual customer itself. Send them on
POST /customersor add them later withPATCH /customers/{customerId}; there is no separate EDD resource. POST /verificationsreturnsRESOLVE_ERRORSwith one entry per problem, each naming the exact field or accepted document types still needed, so you can fix and resubmit without guessing.- Request validation errors return every invalid field at once in
Error400.details.errors[], each with a machine-readable constraint you can render as field-level UX—no more resubmitting to discover the next error. - Individual customers and beneficial owners now share one identification vocabulary:
idType,identifier, andcountryOfIssuance.
Groundwork for EU support: SCA and Travel Rule
The API surface for the two controls EU regulation requires is now defined, so you can design against it ahead of EU corridors opening.- Strong Customer Authentication—
POST /sca/login/completereturnssessionExpiresAt, so you can prompt a re-login before the 180-day session lapses rather than discovering it as a failed payment. Quote authorization documentsSCA_SESSION_REQUIRED(409) andACCOUNT_LOCKED(423), andSCA_NOT_COMPLETEDexplains a transaction that failed on an expired challenge. - Travel Rule ownership verification—a challenge and verify flow for proving a
customer owns a self-custody wallet.
POST …/external-accounts/{id}/challengestarts verification by wallet signature or hosted liveness check, and…/verifycompletes a signature synchronously. Accounts sit atPENDING_OWNERSHIP_VERIFICATION—still usable below regulatory thresholds—and move toACTIVEon success orUNVERIFIEDon a failed attempt. A single webhook,EXTERNAL_ACCOUNT.STATUS_UPDATED, covers the whole lifecycle.
Issue your own stablecoin
Register a stablecoin with/stablecoins, then mint and burn directly against it with
/stablecoins/{stablecoinId}/mints and /stablecoins/{stablecoinId}/burns.
/stablecoins/{stablecoinId}/operations tracks each issuance through settlement.More ways to move money
- USDT on Ethereum and Plasma, alongside Tron.
- Bitcoin L1 deposit addresses as a payment instruction on quotes.
- USD accounts can describe a full wire beneficiary—bank name, checking or savings, intermediary bank and routing number, and bank-to-bank instructions.
- Businesses outside the US can register as a publicly listed company, trust, private foundation, or charity.
Know why a payment failed
Failure reasons now name outcomes you act on rather than internal processing steps.- New payout failure reasons:
PAYOUT_RETURNED,LIMIT_EXCEEDED,ACCOUNT_CANNOT_RECEIVE,ACCOUNT_INVALID, andCOMPLIANCE_REJECTED. pendingReasonon any transaction tells you when it is held for compliance review or waiting on customer action.- New limit codes:
TRANSACTION_SIZE_LIMIT_EXCEEDED(400) andDAILY_VOLUME_LIMIT_EXCEEDED(429).
Card issuance in sandbox
You can now issue cards directly in the sandbox environment. Test the full card lifecycle—cardholder setup, issuing cards, funding sources, and freezing and closing—end to end before going live, without touching production.See Cards sandbox testing to get started.Cards: real-time webhooks and full event simulation
React to card activity as it happens, and rehearse every event before going live.CARD_TRANSACTION.*fires on every state transition—authorized, partially settled, settled, refunded, and exception—carrying the full card transaction.- All ten sandbox simulate endpoints, covering balance inquiries, credit and financial authorizations, authorization advices, returns, and return reversals.
- Brand the tokenization verification codes your customers receive with
cardTokenization2faConfigon platform config.
Refund visibility on incoming payments
INCOMING_PAYMENT.REFUND_PENDING, INCOMING_PAYMENT.REFUND_COMPLETED, and
INCOMING_PAYMENT.REFUND_FAILED now fire the same way outgoing refunds already did, so
a returned deposit no longer surfaces only as a failed transaction.See Refund object.