POST /quotes. What changes is where you are sending:
- To an account — internal or external, with or without currency conversion
- To an UMA address
Choosing the right method
- Account: Pay an internal or external account. Grid converts when the currencies differ and settles over local payment rails (e.g., ACH, RTP, SEPA Instant, PIX, FPS) when they match. Also covers sending to a crypto wallet address when configured.
- UMA: Send using a Universal Money Address. Ideal for global counterparties on networks.
Sending to an Account
Every payment to an internal or external account goes throughPOST /quotes, whether or not
the currencies differ. The quote prices the transfer — amounts, fees, and, when converting,
a locked exchange rate — and creates the transaction that carries the money.
What varies is when you execute it:
- In one request. Set
immediatelyExecuteand Grid creates and executes the quote together. Use this when you don’t need to put rate or fee details in front of your user before the money moves. - In two steps. Create the quote, show your user what the transfer will cost, then call execute before the quote expires. Use this whenever your UX surfaces rates or fees — which includes same-currency transfers, where there is no exchange rate but there can still be fees worth showing.
Create and execute a quote
1
Create a quote
Request a quote to lock in the exchange rate and get transfer details:
Success (201 Created)
Same-currency transfers use this exact request. The two currencies simply match, and
the quote comes back with an
exchangeRate of 1 — the fee fields are still populated.
Add "immediatelyExecute": true to create and execute in this one request and skip the
next two steps.Locked currency side determines which amount is fixed:
SENDING: Lock the sending amount (receiving amount calculated based on exchange rate)RECEIVING: Lock the receiving amount (sending amount calculated based on exchange rate)
remittanceInformation is optional. Use it to send a reference that travels with the payment to the recipient (max 80 characters). This populates the ACH Addenda record, FedNow/RTP remittance information, or wire OBI field depending on the payment rail.Including purpose of payment
Including purpose of payment
For external account or UMA destinations, some payment corridors require a purpose of payment. Include the Purpose of payment codes:
purposeOfPayment field in the quote request:GIFT- Personal giftSELF- Transfer to yourselfGOODS_OR_SERVICES- Payment for goods or servicesEDUCATION- Education-related expensesHEALTH_OR_MEDICAL- Medical or healthcare expensesREAL_ESTATE_PURCHASE- Real estate transactionTAX_PAYMENT- Tax paymentLOAN_PAYMENT- Loan repaymentUTILITY_BILL- Utility bill paymentDONATION- Charitable donationTRAVEL- Travel-related expensesFAMILY_SUPPORT- Family support or remittanceSALARY_PAYMENT- Salary or wage paymentOTHER- Other purpose (may require additional documentation)
2
Review quote details
Skip this step and the next by setting
immediatelyExecute on the quote. Otherwise,
before executing, review the quote to ensure:- Exchange rate is acceptable
- Fees are as expected
- Receiving amount meets requirements
- Quote hasn’t expired (check
expiresAt)
Quoted fees may fluctuate between quotes. Some underlying fee components
are denominated in the receiving currency, so their equivalent in the
sending currency moves with the FX rate. The fee shown in the quote is
locked only for the lifetime of that quote — a new quote for the same
transfer may return a different total.
3
Execute the quote
Confirm and execute the quote to initiate the transfer:
Success (200 OK)
Once executed, the quote creates a transaction and the transfer begins processing. The
transactionId can be used to track the payment.Real-time funding sources: If your quote uses a real-time funding source (USDC, BTC, RTP, or FedNow), you don’t call the execute endpoint. Instead, send a payment to the account specified in the quote’s
paymentInstructions. Grid detects the deposit and processes the transfer automatically.4
Monitor completion
After execution, a transaction is created and progresses through If a transaction fails, Grid initiates a refund automatically. You’ll receive
PENDING → PROCESSING → COMPLETED or FAILED. You’ll receive OUTGOING_PAYMENT.<STATUS> webhooks as the transaction progresses. The webhook body contains the full transaction resource:OUTGOING_PAYMENT.REFUND_PENDING followed by OUTGOING_PAYMENT.REFUND_COMPLETED or OUTGOING_PAYMENT.REFUND_FAILED. The transaction’s refund object tracks the refund status and reference.For the full state diagram, refund object details, and all webhook scenarios (including bank returns and manual cancellations), see the Transaction Lifecycle guide.
Funding with cryptocurrencies
Transfers can be funded via USDC and BTC on popular blockchains including Solana, Base, Lightning and Spark. When you create a quote specifying the source currency as USDC or BTC, the response includes payment instructions for multiple funding options.Supported blockchains
Create a quote for USDC-funded transfer
Request a quote that provides blockchain funding options:Success (201 Created)
Transaction processing
Grid automatically detects blockchain deposits and processes the transfer once funds are received:1
Send USDC to the provided address
Transfer the exact amount of USDC specified in
totalSendingAmount to your chosen blockchain wallet address.2
Grid detects the deposit
Grid monitors the blockchain for incoming deposits. You’ll receive an
INTERNAL_ACCOUNT.BALANCE_UPDATED webhook when the deposit is confirmed:3
Transfer executes automatically
Once the deposit is confirmed, Grid executes the cross-currency transfer. You’ll receive See the Transaction Lifecycle guide for all possible status transitions and refund handling.
OUTGOING_PAYMENT.<STATUS> webhooks as the transfer progresses:Sending to an UMA Address
Send to an UMA address when the receiver is identified by their UMA handle, e.g., $alice@example.com. You’ll look up the receiver, create a quote, and then fund.Look up the recipient
Response
Success (200 OK)
senderCustomerInfo (applies to either tab).
Create a quote
Execute payment (just-in-time)
Use thepaymentInstructions from the quote to instruct your bank to push funds. Include the exact reference provided.
Execute payment (prefunded)
Existing internal account balances will be used to fund the payment. Use the lookup Id above to confirm the payment and execute the quote.Execute the quote
Track status
Listen forOUTGOING_PAYMENT webhooks until the transaction reaches COMPLETED or FAILED.
You can also query for the transaction with the following snippet: