# Cotizaciones (/docs/quotes)

<Endpoint method="POST" path="/v1/quotes" href="/docs/api/quotes/create-quote" />

| Campo | Obligatorio | Qué es |
| --- | --- | --- |
| `source_currency` | Sí | La moneda que sale de tu saldo. |
| `destination_currency` | Sí | La moneda que recibe el beneficiario. |
| `amount` | Sí | El monto. |
| `amount_side` | Sí | `destination`: el monto es lo que **recibe** el beneficiario. `source`: es lo que **sale** de tu saldo. |
| `method` | Para un pago | El método del beneficiario. |

```json title="201"
{
  "id": "quo_01m3sgaz0000000000000000",
  "status": "open",
  "method": "bank_transfer",
  "source": {
    "currency": "USDT",
    "principal": "100.000000",
    "platform_fee": "0.500000",
    "tenant_markup": "0.000000",
    "total": "100.500000"
  },
  "destination": { "amount": "350.00", "currency": "PEN" },
  "rate": "3.500000000000000000",
  "created_at": "2026-10-18T14:00:10Z",
  "expires_at": "2026-10-18T14:01:40Z"
}
```

| Campo | Qué es |
| --- | --- |
| `source.total` | Lo que se descontará de tu saldo: `principal + platform_fee + tenant_markup`. |
| `source.tenant_markup` | Tu margen, si tienes uno configurado. Se acredita en tus `earnings`. |
| `destination.amount` | Lo que recibe el beneficiario. |
| `rate` | Unidades de destino por unidad de origen, con los márgenes incluidos. |
| `expires_at` | Hasta cuándo vale el precio. |

## Reglas [#reglas]

- **Una cotización paga una sola operación.** Al usarla pasa a `used`; usarla otra vez responde `409 quote_already_used`.
- **Vence.** Normalmente en unos 90 segundos, a veces antes. Usa `expires_at`, no una cuenta fija. Vencida responde `422 quote_expired`: pide otra.
- **Debe coincidir con el beneficiario.** Su `method` y su `destination_currency` deben ser los del beneficiario, o recibes `422 quote_mismatch`.
- Si el pago falla por falta de fondos, la cotización ya quedó usada: pide una nueva para reintentar.

Errores de precio: `pricing_unavailable` (no hay precio ahora), `amount_too_small`, `same_currency`.
