Fiatside

Developers

Documentación de la API

Una API que devuelve el mismo desglose de comisiones que el sitio, línea por línea, sin margen oculto. Esta página describe las convenciones compartidas por todos los endpoints y establece con precisión qué está abierto hoy.

Qué está abierto hoy

El endpoint 1 está realmente expuesto y es invocable: cotización. Los demás 5 se publican como contrato, para que puedas construir antes de que se abran, y cada uno lleva una insignia explícita.

Documentamos con antelación porque ayuda a una integración. Hacerte creer que está conectado no lo haría: cada endpoint declara su estado, y las respuestas de ejemplo para endpoints abiertos son respuestas realmente obtenidas, no maquetas.

01

URL base y versionado

Conviven dos bases: la que responde hoy y la API versionada que vendrá con las claves emitidas.

Hoy
/api Live
API versionada
/api/v1 Published contract, not open

La versión vive en la ruta, no en una cabecera: una URL tiene que sobrevivir a ser pegada en un ticket. Un cambio que rompe — un campo eliminado, un tipo cambiado, semántica diferente — abre una nueva versión; la anterior se sigue sirviendo durante al menos seis meses, con su fecha de fin anunciada en el changelog. Añadir un campo no rompe: tu cliente debe ignorar los campos que no conoce.

02

Convenciones

Se mantienen en todos los endpoints, abiertos o próximos. La mayoría existen por una razón: no perder nunca un céntimo en tránsito.

Los importes son cadenas o enteros de unidades menores

Nunca un flotante. En JSON, 0.1 + 0.2 no es 0.3, y un importe grande pierde unidades menores en la serialización. Por tanto, los importes en unidades principales se envían como cadenas, y los importes internos como enteros de unidades menores con su número de decimales.

{
  "net": "912.28",
  "currency": "EUR",
  "currencyDecimals": 2
}

Los decimales dependen de la moneda

El euro tiene dos decimales, el franco CFA y el dong vietnamita no tienen ninguno. No codifiques «× 100»: lee currencyDecimals, o el campo decimals de los datos de referencia.

{ "amount": "125000", "currency": "XOF", "currencyDecimals": 0 }

Los importes de criptoactivos están en unidades base

El depósito se devuelve con su número de decimales: 8 para bitcoin, 6 para USDT, 18 para ether. El mismo ticker puede existir con diferentes decimales según la red: confía en el campo, no en tu memoria.

{ "deposit": { "amount": "1000.000000", "ticker": "USDT", "decimals": 6 } }

Marcas de tiempo

Las fechas son ISO 8601 UTC. Una excepción deliberada: rateAsOf es una marca de tiempo Unix en milisegundos, porque alimenta un cálculo de antigüedad, no una visualización. Lleva la fecha de los DATOS de mercado, no de tu solicitud: esa distinción es lo que hace detectable un precio obsoleto.

{ "rateAsOf": 1788356981608, "rateSource": "coingecko" }

Los identificadores son estables

Un identificador de activo, rail o país nunca cambia y nunca se reasigna. Un rail cerrado conserva el suyo, con su fase y motivo: tu integración puede ver por qué desapareció de tus opciones, en lugar de encontrar un hueco.

Los mensajes dirigidos a personas son bilingües

Un motivo de rechazo se devuelve en francés e inglés en el mismo objeto. Muestras el que coincida con tu usuario, sin tabla de traducción que mantener por tu parte.

{ "reason": { "fr": "…", "en": "…" } }
03

Primera llamada

No se necesita clave para cotizar. Esta llamada funciona tal cual.

Solicitudbash
curl -sS -X POST https://fiatside.com/api/quote \
  -H 'Content-Type: application/json' \
  -d '{
    "assetId": "usdt",
    "railId": "sepa_instant",
    "networkId": "tron",
    "direction": "sell",
    "amount": "1000"
  }'
Respuesta — ejemplo realjson
{
  "deposit": { "amount": "1000.000000", "ticker": "USDT", "decimals": 6 },
  "gross": "921.68",
  "net": "912.28",
  "currency": "EUR",
  "currencyDecimals": 2,
  "midRate": "0.92168430",
  "effectiveRate": "0.91228000",
  "totalCostBps": 102,
  "lines": [
    { "code": "network", "amount": "1.11", "basis": "Cout reseau tron, preleve en USDT" },
    { "code": "spread",  "amount": "8.29", "basis": "0.90 % du montant converti" }
  ],
  "settlement": { "p50Minutes": 1, "p95Minutes": 12 },
  "lockSeconds": 1800,
  "rateAsOf": 1788356981608,
  "rateSource": "mock",
  "limitError": null
}

El campo rateSource indica de dónde procede el precio. El valor «mock» es la fuente de desarrollo determinista, que no puede arrancar en producción: el proceso se niega a iniciarse en lugar de cotizar precios congelados.

04

Secciones

05

Lo que la API no hará

Los límites de una API son tan útiles de conocer como sus capacidades.

  • Sin pagos a terceros. El nombre del beneficiario debe coincidir con la identidad verificada del titular de la orden, y los rails de pago ahora comprueban el nombre contra la cuenta.
  • Sin creación de cuenta ni verificación de identidad a través de la API. Esos pasos ocurren en un flujo donde el usuario ve lo que acepta.
  • Sin clave en un parámetro de URL. Las URL terminan en registros, cabeceras de referente e historiales: una clave pasada así es una clave que revocar.
  • Sin almacenamiento en caché de una cotización por nuestra parte. La respuesta lleva Cache-Control: no-store, y tu integración no debe sortearlo: una cotización en caché es un precio obsoleto presentado como firme.
  • Sin endpoint de compra de criptoactivos. El servicio funciona en una dirección, de activo digital a moneda de curso legal.