Skip to main content
Before creating an intent, you can fetch indicative quotes to show users estimated pricing across all available providers. This helps users compare rates and make informed decisions.

What Are Indicative Quotes?

Indicative quotes are non-binding price estimates for display purposes only. They show what a user would approximately receive for a given amount.
All quotes are indicative only. Actual transactions always execute at market price at the time of settlement — there is no rate lock at any point in the flow. Market conditions and provider rates can change between fetching a quote and executing a transaction.

When to Use Quotes

  • Price comparison UI — Show users rates from multiple providers before they commit
  • Fee transparency — Display a breakdown of network, processing, and partner fees
  • Pre-intent validation — Verify a currency pair and amount are supported before building forms

Request Parameters

ParameterTypeRequiredDescription
srcCurrencyCodestringYesSource currency (e.g., USD, USDC_ETH)
destCurrencyCodestringYesDestination currency (e.g., USDC_GNO, BRL)
srcAmountstringYesAmount to convert (decimal string)
countryCodestringYesISO 3166-1 alpha-2 country code (e.g., US, BR)

Fetching Quotes

curl -X GET 'https://api.ramp.gnosis.io/v1/intent/quote?srcCurrencyCode=USD&destCurrencyCode=USDC_GNO&srcAmount=100.00&countryCode=US' \
  -H 'Authorization: Basic ${CREDENTIALS}'
const credentials = btoa(`${CLIENT_ID}:${CLIENT_SECRET}`);

const response = await fetch(
  'https://api.ramp.gnosis.io/v1/intent/quote?' + new URLSearchParams({
    srcCurrencyCode: 'USD',
    destCurrencyCode: 'USDC_GNO',
    srcAmount: '100.00',
    countryCode: 'US'
  }),
  {
    headers: { 'Authorization': `Basic ${credentials}` }
  }
);

const { quotes } = await response.json();

Response Structure

{
  "quotes": [
    {
      "providerId": "bridge",
      "type": "ONRAMP",
      "rail": "ACH",
      "hasIndicativePrice": true,
      "destAmount": "98.50",
      "exchangeRate": "0.9850",
      "fees": {
        "currencyCode": "USD",
        "totalFee": "1.50",
        "networkFee": "0.50",
        "processingFee": "0.75",
        "partnerFee": "0.25"
      }
    },
    {
      "providerId": "other-provider",
      "type": "ONRAMP",
      "rail": "CARD",
      "hasIndicativePrice": false,
      "destAmount": null,
      "exchangeRate": null,
      "fees": null
    }
  ]
}

Response Fields

FieldTypeDescription
providerIdstringProvider identifier
typestringTransaction type: ONRAMP (fiat→crypto) or OFFRAMP (crypto→fiat)
railstringPayment rail: ACH, PIX, WIRE, SEPA, or CARD
hasIndicativePricebooleanWhether pricing is available (see below)
destAmountstring | nullEstimated destination amount
exchangeRatestring | nullExchange rate used for conversion (4 decimal places)
feesobject | nullFee breakdown

Fee Breakdown

FieldDescription
currencyCodeCurrency the fees are denominated in
totalFeeSum of all fees
networkFeeBlockchain/network transaction fees
processingFeeProvider’s processing charge
partnerFeeIntegration/partner fees

Understanding hasIndicativePrice

Some providers can supply indicative pricing immediately, while others cannot.
hasIndicativePriceMeaning
trueIndicative pricing available — destAmount, exchangeRate, and fees are populated
falseIndicative pricing unavailable — pricing fields are null
When hasIndicativePrice is false, the provider cannot supply indicative pricing. This can be for various reasons, including:
  • Provider does not offer indicative pricing — some providers simply don’t expose this capability
  • Provider requires user KYC first — pricing is only available after customer onboarding
  • Other provider-specific limitations
When hasIndicativePrice is false, you can still show the provider as an option. Transactions can still be initiated with this provider — they will execute at market price like all other transactions.
Coming soon: For providers that cannot supply indicative pricing, we plan to provide an estimated exchange rate based on historical transaction data to help with display purposes.

Multi-Provider Aggregation

A single quote request returns responses from all available providers for the currency pair. This lets you build comparison UIs without making multiple API calls. Individual provider failures are handled gracefully — if one provider’s quote fails, you still receive quotes from the others.

Example: Building a Price Comparison UI

async function getQuotes(srcCurrency, destCurrency, amount, country) {
  const credentials = btoa(`${CLIENT_ID}:${CLIENT_SECRET}`);

  const response = await fetch(
    `https://api.ramp.gnosis.io/v1/intent/quote?` + new URLSearchParams({
      srcCurrencyCode: srcCurrency,
      destCurrencyCode: destCurrency,
      srcAmount: amount,
      countryCode: country
    }),
    {
      headers: { 'Authorization': `Basic ${credentials}` }
    }
  );

  const { quotes } = await response.json();

  // Sort by best rate (highest destAmount)
  const availableQuotes = quotes
    .filter(q => q.hasIndicativePrice)
    .sort((a, b) => parseFloat(b.destAmount) - parseFloat(a.destAmount));

  const pendingQuotes = quotes.filter(q => !q.hasIndicativePrice);

  return { availableQuotes, pendingQuotes };
}

// Display to user
const { availableQuotes, pendingQuotes } = await getQuotes('USD', 'USDC_GNO', '100.00', 'US');

availableQuotes.forEach(quote => {
  console.log(`${quote.providerId}: ${quote.destAmount} USDC (${quote.rail})`);
  console.log(`  Rate: ${quote.exchangeRate}, Fees: ${quote.fees.totalFee} ${quote.fees.currencyCode}`);
});

pendingQuotes.forEach(quote => {
  console.log(`${quote.providerId}: Pricing unavailable — executes at market price (${quote.rail})`);
});

Next Steps

After the user selects a quote, use the providerId and rail from that quote to fetch simplified requirements:
# User selected: providerId="bridge", rail="ACH"
curl "https://api.ramp.gnosis.io/v1/intent/requirements?srcCurrencyCode=USD&destCurrencyCode=USDC_GNO&rail=ACH&providerId=bridge" \
  -u "${CLIENT_ID}:${CLIENT_SECRET}"
This returns a flat schema optimized for form rendering — no complex dependencies or oneOf conditionals.

Get Requirements

Fetch field schemas for the currency pair. Pass rail and providerId for simplified schemas.

Create Intent

Proceed with a transaction by creating an intent.