Quotes let you preview the full cost and outcome of a proposed payment before you initiate it. A quote reflects the exchange rate, fees, and deliverable amount between a source and destination currency, and it is time-sensitive (quotes expire after a defined period). Quotes are central to the Ripple Payments Direct 2.0 payment flow and should be created before you call the Payments endpoint.
A quote returns the key information you need to decide whether to proceed with a payment, including:
- Source and destination amounts (
sourceAmount,destinationAmount) depending on whether you request a quote by source amount or destination amount. - Adjusted exchange rate (
adjustedExchangeRate) that reflects the rate used for conversion. - Fees (
fees) with a total fee and optional breakdown line items. - Taxes (
taxes) when applicable (taxes apply to Ripple service fees, not principal). - Timestamps and validity (
createdAt,expiresAt) and a status (ACTIVEorEXPIRED).
A typical flow is:
- Create a quote collection for a proposed payment (usually returns a single quote).
- Select a quote (use the returned quoteId).
- Create the payment using the quote information.
In Ripple Payments Direct 2.0, a quote must be accepted/used before it expires. Expired quotes are marked EXPIRED and can’t be used to create payments.
Internally, quote IDs are used in payment creation such that the quoteId used becomes the paymentId. Make sure your integration treats quote identifiers consistently across quote → payment steps.
The API uses “quote collection” terminology, but for Ripple Payments Direct 2.0 today a quote collection typically contains a single quote. A quote collection exists to support retrieval and traceability of the quoting event and to allow future expansion to multiple quote options.
Quotes are time-sensitive:
quoteStatus=ACTIVEmeans the quote can be used to create a payment.quoteStatus=EXPIREDmeans the quote is no longer valid and must be regenerated.- Use
expiresAtto implement client-side logic (for example, refresh the quote if the expiration time is near).
In jurisdictions where Ripple is required to comply with consumption tax regulations (VAT/GST, etc.), quote responses can include taxes applied to Ripple service fees (fixed/variable fee components), not to the principal payment amount.
Key aspects:
- Tax calculations provide upfront cost transparency.
- Taxes are calculated on the fees portion, not the amount being transferred.
- If no taxes apply (or the calculated tax is zero), the API will not include the
taxesobject in the response.
Use these endpoints to create and retrieve quotes:
POST /v2/quotes/quote-collection— Create a quote collection for a proposed payment.GET /v2/quotes/quote-collection/{quote-collection-id}— Retrieve a previously created quote collection.GET /v2/quotes/{quote-id}— Retrieve a specific quote by ID.
To create a quote collection, provide:
quoteAmountandquoteAmountType(SOURCE_AMOUNTorDESTINATION_AMOUNT)sourceCurrency,destinationCurrencysourceCountry,destinationCountrypayinCategory(for example,FUNDED,T_PLUS_ONE)payoutCategory(for example,BANK,CRYPTO)- Optional:
destinationBlockchainNetworkwhen quoting crypto payouts.
Quote Service errors are standardized into categories such as:
- AUTH_xxx authorization errors (missing/invalid token)
- USR_xxx validation errors (missing/invalid request fields)
- SYS_xxx internal or upstream failures
Errors return a structured object with status and an errors[] array (code, title, type, description, timestamp).
- Use
SOURCE_AMOUNTwhen the sender knows what they want to send. - Use
DESTINATION_AMOUNTwhen the sender needs the beneficiary to receive an exact amount.
Request
curl -i -X POST \
http://127.0.0.1:4000/_mock/products/payments-direct-2/api-docs/payments-direct-api/payments-direct-2-api/v2/quotes/quote-collection \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"quoteAmount": 123.45,
"quoteAmountType": "SOURCE_AMOUNT",
"sourceCurrency": "USD",
"destinationCurrency": "MXN",
"sourceCountry": "US",
"destinationCountry": "PH",
"payoutCategory": "BANK",
"payinCategory": "FUNDED",
"destinationBlockchainNetwork": "Ethereum"
}'Response (excerpt)
{
"quoteCollectionId": "11111111-aaaa-2222-bbbb-222222222222",
"quotes": [
{
"quoteId": "7ea3399c-1234-5678-8d8f-d320ea406630",
"quoteStatus": "ACTIVE",
"quoteAmountType": "SOURCE_AMOUNT",
"sourceAmount": 123.45,
"destinationAmount": 2438.19,
"sourceCurrency": "USD",
"destinationCurrency": "MXN",
"sourceCountry": "US",
"destinationCountry": "MX",
"payoutCategory": "BANK",
"payinCategory": "FUNDED",
"adjustedExchangeRate": {
"adjustedRate": 2
},
"fees": [
{
"totalFee": 12.23,
"feeCurrency": "USD",
"feeBreakdown": [
{
"calculatedFee": 2.43,
"feeName": "Service fee",
"feeDescription": "The service fee charged for this transaction."
}
]
}
],
"taxes": [
{
"totalTaxes": 5.12,
"taxCurrency": "USD",
"taxBreakdown": [
{
"taxAmount": 2.43,
"taxName": "ISS/ VAT/ GST etc",
"taxDescription": "The service fee tax charged for this transaction.",
"taxRate": 5
}
]
}
],
"createdAt": "2025-11-02T18:26:00.000123Z",
"expiresAt": "2025-11-02T18:26:00.000123Z",
"destinationBlockchainNetwork": "Ethereum"
}
]
}