API para desarrolladores

Deja de consultar, nosotros te avisamos

Registra una URL y elige eventos. Enviamos un POST firmado segundos después de cada cambio y reintentamos durante hasta 24 horas si falla.

Eventos

rate.updatedUn tipo de cambio cambió en algún banco
rate.best_changedCambió la venta más barata o la compra más alta
rate.threshold_crossedUn tipo cruzó un límite que fijaste
cbe.rate_changedCambió el tipo del Banco Central
gold.updatedCambiaron los precios del oro
silver.updatedCambiaron los precios de la plata
transfer.quotes_updatedCambiaron los precios de los proveedores de transferencias
certificate.createdUn banco lanzó un nuevo certificado
certificate.rate_changedCambió la rentabilidad de un certificado
tbill.auction_resultUn resultado de subasta de letras del Tesoro
fund.price_updatedSe actualizó el precio de la participación de un fondo
status.incidentUna incidencia del servicio empezó o terminó

Qué enviamos

POST https://example.com/geneh
Geneh-Event: rate.best_changed
Geneh-Signature: t=1792118220,v1=5f2b9c1e7a

{
  "id": "evt_01JB7Q2K",
  "type": "rate.best_changed",
  "created_at": "2026-10-16T00:37:00Z",
  "data": {
    "currency": "USD",
    "side": "sell",
    "previous": { "bank": "nbe", "rate": 53.52 },
    "current": { "bank": "credit_agricole", "rate": 53.47 }
  }
}

Comprueba la firma

Cada solicitud se firma con el secreto de tu endpoint usando HMAC SHA-256. Rechaza todo lo que tenga más de 5 minutos.

import crypto from "node:crypto";

function verify(rawBody, header, secret) {
  const [t, v1] = header.split(",").map(p => p.split("=")[1]);
  const mac = crypto.createHmac("sha256", secret)
    .update(t + "." + rawBody).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - t) < 300;
  return fresh && crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(v1));
}

Entrega y reintentos

Tiempo de espera
Responde con un 2xx en menos de 10 segundos
Reintentos
8 intentos durante 24 horas, cada vez más espaciados
Duplicados
Un evento puede llegar dos veces, así que usa su id para saltar los repetidos
Orden
Compara created_at, porque el orden no está garantizado
Pausa
Pausamos un endpoint tras 3 días de fallos y te avisamos por correo, y puedes reenviar lo que te perdiste

Tus endpoints

Los webhooks están en caminoPodrás añadir endpoints aquí cuando se abran los webhooks. Vienen incluidos desde el plan Pro.
Próximamente