---
title: "OTC quotes vs standard quotes for large BRL on-ramps: how a 10-second quote works"
seoTitle: "OTC vs standard quotes for large BRL on-ramps"
description: "An OTC quote prices a large BRL to USDT on-ramp through an OTC desk, locks for 10 seconds, and lists fees as lines. When to pick it over a standard quote."
date: "2026-10-01"
updated: "2026-10-01"
category: "stablecoins"
author: "BlindPay Team"
faq:
  - q: "What is an OTC quote in a crypto on-ramp?"
    a: "An OTC (over-the-counter) quote is a price for a large conversion set directly by a trading desk rather than taken from the standard rate. In an on-ramp it prices a block of local currency into stablecoins at one rate for the whole amount. At BlindPay, OTC quotes cover BRL paid over Pix into USDT, from $5,000 USD equivalent."
  - q: "How long does a BlindPay OTC quote last?"
    a: "Ten seconds, compared with 5 minutes for a standard payin quote. The short window is for accepting the price: your backend creates the payin from the quote inside those 10 seconds. The payer then has until 23:59 Brasília time to send the Pix, or until the next day's cutoff if the quote was created after 23:59."
  - q: "What is the minimum amount for an OTC quote?"
    a: "At BlindPay, $5,000 USD equivalent. Below that, the quote fails with PAYOUTS_AMOUNT_BELOW_MINIMUM and you use a standard payin quote instead. The receiver's per-transaction limit still applies on top, which defaults to $10,000 to $50,000 depending on the KYC tier and can be raised through a limit increase request."
  - q: "Why is the rate on an OTC quote equal to the market rate?"
    a: "Because fees are not built into the exchange rate on an OTC quote. On a BlindPay OTC quote, blindpay_quotation equals commercial_quotation, and the fees show up in flat_fee and partner_fee_amount instead. On a standard quote, blindpay_quotation is the rate net of BlindPay's fee. Compare the two by the stablecoin amount received, not by the rate."
  - q: "What happens if the payer never sends the Pix on an OTC quote?"
    a: "BlindPay waits for the deposit until the 23:59 Brasília time cutoff, which is also when the Pix code expires. If the deposit never arrives, the payin fails and a flat $100.00 penalty is added to the quote's billing fee. A standard Pix payin waits up to 30 minutes, with a reconciliation check, before it is marked failed."
---

An OTC quote prices a large on-ramp through an over-the-counter desk instead of the standard rate. At BlindPay it covers BRL paid over Pix into USDT, starts at $5,000 USD equivalent, and locks for 10 seconds instead of 5 minutes. The rate equals the market rate, and fees appear as separate lines.

That makes it a different tool, not a premium version of the standard quote. It fits a backend that can act in seconds and a payer who will send the same day. It does not fit a confirmation screen where a person reads the number first.

**Key takeaways**

- OTC quotes at BlindPay: BRL over Pix in, USDT out, $5,000 USD equivalent minimum, 10-second window.
- The 10 seconds are for accepting the price. The payer has until 23:59 Brasília time to send the Pix.
- On an OTC quote, `blindpay_quotation` equals `commercial_quotation`. Fees live in `flat_fee` and `partner_fee_amount`.
- If an OTC deposit never arrives, a flat $100.00 penalty is added to the quote's billing fee.
- Compare an OTC quote and a standard quote by the USDT received for the same reais, never by the rate alone.

## What is an OTC quote?

An OTC quote is a price agreed directly between two parties for a specific size, instead of a rate taken from a screen or an exchange order book. "Over the counter" just means bilateral.

Most of the FX market already works this way. The BIS Triennial Survey, which measured [global FX trading at $9.6 trillion per day in April 2025](https://www.bis.org/press/p250930.htm), is a survey of OTC markets: dealers quoting clients directly. An OTC desk in a ramp does the same for a block of local currency going into stablecoins. It prices the whole amount at once, which is why it exists for large tickets.

The wider family of off-ramp and on-ramp models, including standalone OTC desks, is compared in [types of crypto off-ramps](/resources/more/types-of-crypto-off-ramps). This article is about one specific quote type inside an API.

## How is a BlindPay OTC quote different from a standard payin quote?

Set `is_otc: true` on a [payin quote](/docs/payin-quotes) and eight things change.

| | Standard payin quote | OTC payin quote |
| --- | --- | --- |
| Payment method | Any supported payin method | BRL over Pix |
| Token delivered | USDC or USDT, by network | USDT |
| Minimum | Per currency, R$10.00 for BRL | $5,000 USD equivalent |
| Quote window | 5 minutes | 10 seconds |
| Rate shown | `blindpay_quotation` is net of BlindPay's fee | `blindpay_quotation` equals `commercial_quotation` |
| Fee setting | Any `currency_type` and `cover_fees` | `sender` with `cover_fees: false`, or `receiver` with `cover_fees: true` |
| Pix deposit wait | Up to 30 minutes, with a reconciliation check | Until 23:59 Brasília time |
| Deposit never arrives | Payin marked `failed` | Payin fails, plus a flat $100.00 penalty |

Anything outside the OTC scope fails with `QUOTES_OTC_NOT_SUPPORTED`. The deposit windows come from the [payins reference](/docs/payins) and the [cut-off times reference](/docs/kb/cut-off-times).

## Why does an OTC quote last only 10 seconds?

Because the desk carries the market move for a large block while the price stands. The longer the window, the more the rate can drift, and a big ticket turns a small drift into real money. [Who carries FX risk in a stablecoin payout](/resources/more/who-carries-fx-risk-stablecoin-payout) works through the math: at 1% daily volatility, a 5-minute window carries about 6 bps of typical move, a 10-second window about 1 bp.

Ten seconds is a machine window, not a human one. Network latency, a page render, and a person reading the number would use most of it. So the design assumption is that your server requests the quote and creates the payin in the same request handler.

## Why does the payer get until 23:59 when the quote lasts 10 seconds?

Because there are two clocks. The quote window is the time you have to accept the price by creating the payin. The deposit window is the time the payer has to send the Pix.

For OTC Pix payins, BlindPay waits for the deposit until 23:59 Brasília time (America/Sao_Paulo) on the same day, or the next day if the quote was created after that time. The Pix code's own expiration is set to that same cutoff. Pix itself runs [24 hours a day, every day](https://www.bcb.gov.br/en/financialstability/pix_en), so the payer can send any time before the cutoff.

The $100.00 penalty is the other half of that deal. A large price was held for most of a day. If the money never comes, the party that did not send pays for the held price.

## When should you use an OTC quote instead of a standard one?

Use the decision rule below. Every condition in the first list should be true.

**Use an OTC quote when:**

- The payer sends BRL over Pix and you want USDT delivered.
- The deposit is $5,000 USD equivalent or more.
- Your backend can create the payin within 10 seconds of the quote, with no human step in between.
- The payer will reliably send the full amount the same day.
- You prefer the fee as its own line rather than inside the rate.

**Use a standard quote when:**

- You need USDC, or the payer uses SPEI, Transfers 3.0, PSE, ACH, or another rail.
- The deposit is under $5,000 equivalent.
- A person needs to review the amount before confirming. Five minutes covers that; ten seconds does not.
- The payer's timing is uncertain, and a $100.00 penalty for a no-show is not acceptable.

[USDC vs USDT for payments](/resources/more/usdc-vs-usdt-for-payments) covers the token choice, and [how to on-ramp BRL, MXN, ARS, and COP](/resources/more/how-to-on-ramp-local-currency-latin-america) covers the standard quote for each local rail.

## How do you compare an OTC quote with a standard quote?

By the stablecoin amount received for the same reais. The rates are not comparable, because one includes the fee and the other does not.

**Illustrative example.** A payer sends R$100,000. The market rate is 5.40 BRL per USDT.

- **Standard quote:** the fee is inside the rate. Say `blindpay_quotation` is 5.4270, a 0.5% margin. The wallet receives 100,000 / 5.4270 = 18,426.39 USDT.
- **OTC quote:** the rate is the market rate, 5.40. Gross: 100,000 / 5.40 = 18,518.52 USDT, minus the fee lines.

Break-even: 18,518.52 - 18,426.39 = 92.13 USDT. With fee lines below about 92.13 USDT, the OTC quote delivers more; above it, the standard quote does. Every number here is illustrative. Pull both quotes at the same moment and compare `receiver_amount`.

[Crypto on-ramp fees explained](/resources/more/crypto-on-ramp-fees-explained) covers how to read each fee line on a payin quote.

## How do you build for a 10-second window?

Do everything that needs a person before you request the quote.

1. **Collect the amount and payer details first.** Validate the payer, the amount, and the destination wallet before pricing anything.
2. **Request the OTC quote server-side.**
3. **Create the payin immediately.** Call `POST /v1/instances/{instance_id}/payins/evm` with the quote's id as `payin_quote_id`, in the same handler. The path name is historical and covers Pix too.
4. **Show the Pix code.** The payin response carries `pix_code`, as copyable text or a QR code.
5. **Re-quote on a miss.** If creating the payin fails because the quote expired, request a new quote. Never retry with the old id.
6. **Track the deposit by webhook.** `payin.new`, `payin.update`, and `payin.complete` are listed in the [webhook events reference](/docs/learn/webhooks-events).

The quote request looks like this, with `request_amount` in minor units, so R$100,000.00 is `10000000`:

```json
{
  "blockchain_wallet_id": "bw_000000000000",
  "currency_type": "sender",
  "cover_fees": false,
  "request_amount": 10000000,
  "payment_method": "pix",
  "token": "USDT",
  "is_otc": true
}
```

Two more checks before you go live. First, limits: the maximum on any payin quote is the receiver's per-transaction limit, $10,000 to $50,000 by KYC tier by default, raised through a [limit increase](/docs/learn/limit-increase). Second, the payer's own bank applies its own Pix limits, so confirm a large payer can send the full amount in one transfer. Failed and late deposits are covered in [why crypto on-ramp deposits fail](/resources/more/why-crypto-on-ramp-deposits-fail).

## Is an OTC quote binding?

Inside its window, yes: you accept it by creating the payin before `expires_at`. That is the opposite of an indicative price, which only previews a rate. [Indicative rate vs binding quote](/resources/more/indicative-rate-vs-binding-quote-api) explains when to show each one.

Wholesale FX has rules for this distinction. The [FX Global Code](https://www.globalfxc.org/fx_global_code.htm) asks market participants to make clear whether the prices they provide are firm or merely indicative, and to disclose practices such as last look. Ask any OTC provider the same question in writing: once I accept inside the window, can you still reject or reprice?

For depth at large sizes on the payout side, run the [quote-ladder test](/resources/more/test-offramp-liquidity-depth). The terms used here are defined in the [on/off-ramp liquidity glossary](/resources/more/onramp-offramp-liquidity-glossary).

*How we know: OTC scope, windows, cutoffs, and the penalty come from BlindPay's [payin quotes](/docs/payin-quotes), [payins](/docs/payins), and [cut-off times](/docs/kb/cut-off-times) documentation.*

## What to do next

If your BRL deposits regularly clear $5,000, read the OTC section of the [payin quotes docs](/docs/payin-quotes) and wire the quote and payin calls into one server handler before testing a live Pix.

*This article is general information, not legal, tax, or financial advice.*
