Cotizaciones (FX)
La API de Cotizaciones FX te permite solicitar y fijar tasas de cambio para un corredor de divisas y un monto específicos. El quoteId devuelto garantiza la tasa durante una ventana fija, protegiéndote a ti y a tu cliente de las fluctuaciones cambiarias durante el flujo de la transacción.
Cómo Funciona el Pricing
Dos componentes determinan el costo para el usuario final:
- Spread FX — Tu margen sobre la tasa de cambio, configurado por corredor por Inyo durante el onboarding.
- Comisión por Transacción — Una comisión por transacción, también configurada durante el onboarding. Según tu contrato, es posible que puedas sobrescribir las comisiones a nivel de cotización (p. ej., para ofertas promocionales de "cero comisión").
Tipos de Monto
Al solicitar una cotización, el campo amountType controla cómo se aplican las comisiones:
| Tipo | Comportamiento | Ejemplo (comisión = $4, monto = $100) |
|---|---|---|
NET | La comisión se agrega sobre el monto. Se convierte el monto completo. | El remitente paga $104. $100 se convierten a la moneda de destino. |
GROSS | La comisión se deduce del monto. Solo se convierte el remanente. | El remitente paga $100. $96 se convierten a la moneda de destino. |
Solicitar una Cotización
Endpoint: POST /organizations/{tenant}/payout/quotes
Autenticación: Nivel de agente (x-api-key + x-agent-id + x-agent-api-key)
Cuerpo de la Solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
fromCurrency | string | Sí | Moneda de origen (ISO 4217), p. ej., USD |
toCurrency | string | Sí | Moneda de destino (ISO 4217), p. ej., BRL |
toCountry | string | No | País de destino (ISO 3166-1 alpha-2) — desambigua cuando una moneda se usa en múltiples corredores |
amount | number | Sí | Monto a convertir (debe ser > 0) |
fee | object | No | Sobrescribe la comisión por defecto (si tu contrato lo permite) |
fee.amount | number | — | Monto de la comisión |
fee.currency | string | — | Moneda de la comisión (normalmente coincide con fromCurrency) |
amountType | string | No | GROSS o NET (ver arriba). Por defecto es NET. |
Solicitud de Ejemplo
curl --request POST \
--url https://{FQDN}/organizations/$TENANT/payout/quotes \
--header 'Content-Type: application/json' \
--header "x-api-key: $API_KEY" \
--header "x-agent-id: $AGENT_ID" \
--header "x-agent-api-key: $AGENT_KEY" \
--data '{
"fromCurrency": "USD",
"toCurrency": "BRL",
"amount": 1000,
"fee": {
"amount": 4.99,
"currency": "USD"
},
"amountType": "NET"
}'
Respuesta de Ejemplo
{
"quotes": [
{
"id": "f28be3f9-ad4d-4a6c-a85d-ae5515a4a158",
"agentId": "8500786a-68e9-45fd-b1d8-c590f1e06450",
"fromAsset": "USD",
"toAsset": "BRL",
"effectiveRate": 5.39023,
"totalCost": {
"amount": 1004.99,
"currency": "USD"
},
"fee": {
"amount": 4.99,
"currency": "USD"
},
"amountType": "NET",
"product": "REMITTANCE",
"expireAt": "2025-09-15T12:07:01Z",
"createdAt": "2025-09-15T11:37:01Z",
"sourceAmount": {
"amount": 1000.00,
"currency": "USD"
},
"destinationAmount": {
"amount": 5390.23,
"currency": "BRL"
}
}
]
}
Campos de la Respuesta
| Campo | Descripción |
|---|---|
id | Identificador único de la cotización. Guárdalo — es requerido para la transacción. |
fromAsset / toAsset | Monedas de origen y destino |
effectiveRate | La tasa FX aplicada a esta conversión (incluye tu spread) |
sourceAmount | El monto convertido, en la moneda de origen |
destinationAmount | El monto que recibirá el destinatario |
totalCost | Total que paga el remitente, en la moneda de origen (monto + comisión para cotizaciones NET) |
fee | La comisión por transacción aplicada a esta cotización |
amountType | NET o GROSS — cómo se aplicó la comisión |
product | Producto de la cotización — REMITTANCE |
expireAt | Timestamp ISO 8601 en que la cotización deja de ser válida |
createdAt | Timestamp ISO 8601 en que se generó la cotización |
Ejemplo Detallado de Conversión
Escenario: Convertir 1,000 USD → BRL
| Campo | Valor |
|---|---|
| Moneda de Origen | USD |
| Moneda de Destino | BRL |
| Monto de Origen | 1,000.00 USD |
| Tasa Efectiva | 5.39023000 |
| Monto de Destino | 5,390.23 BRL |
| Comisión | 4.99 USD |
| Costo Total | 1,004.99 USD |
| Producto | REMITTANCE |
| Validez de la Cotización | 30 minutos (por defecto) |
Consultar una Cotización
Endpoint: GET /organizations/{tenant}/payout/quotes/{quoteId}
Autenticación: Nivel de agente
curl --request GET \
--url https://{FQDN}/organizations/$TENANT/payout/quotes/$QUOTE_ID \
--header "x-api-key: $API_KEY" \
--header "x-agent-id: $AGENT_ID" \
--header "x-agent-api-key: $AGENT_KEY"
Usa esto para verificar si una cotización sigue siendo válida antes de enviar una transacción.
Manejo de la Expiración de Cotizaciones
Las cotizaciones son válidas por 30 minutos por defecto. La ventana es configurable por tenant (hasta 24 horas) — verifica expireAt en lugar de asumir una duración. Sigue estas pautas:
- Siempre verifica
expireAtantes de usar una cotización en una transacción. - Renueva proactivamente — solicita una nueva cotización cuando haya transcurrido ~90% del período de validez.
- Nunca almacenes cotizaciones en caché — a diferencia de los destinos y las listas de bancos, las cotizaciones son sensibles al tiempo y deben obtenerse frescas.
- Las cotizaciones expiradas serán rechazadas — si envías una transacción con un
quoteIdexpirado, la API devuelve un error400o422.
Patrón de UX Recomendado
1. User selects amount and destination → Request quote 2. Display rate, fees, and receive amount 3. Start a countdown timer based on expireAt 4. If timer reaches ~80%, show "Rate expiring" warning 5. If expired, auto-refresh and update the display 6. On "Confirm", immediately submit the transaction with the quoteId
Todos los Endpoints
| Operación | Método | Endpoint |
|---|---|---|
| Solicitar cotización | POST | /organizations/{tenant}/payout/quotes |
| Obtener cotización por ID | GET | /organizations/{tenant}/payout/quotes/{quoteId} |
