API para desenvolvedores

Pare de consultar, nós avisamos

Cadastre uma URL e escolha eventos. Enviamos um POST assinado segundos após cada mudança e tentamos de novo por até 24 horas se falhar.

Eventos

rate.updatedUma cotação mudou em algum banco
rate.best_changedA venda mais barata ou a compra mais alta mudou
rate.threshold_crossedUma cotação passou de um limite que você definiu
cbe.rate_changedA cotação do Banco Central mudou
gold.updatedOs preços do ouro mudaram
silver.updatedOs preços da prata mudaram
transfer.quotes_updatedOs preços dos provedores de transferência mudaram
certificate.createdUm banco lançou um novo certificado
certificate.rate_changedO rendimento de um certificado mudou
tbill.auction_resultUm resultado de leilão de títulos do tesouro
fund.price_updatedO preço da cota de um fundo foi atualizado
status.incidentUm incidente no serviço começou ou terminou

O que 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 }
  }
}

Verifique a assinatura

Cada requisição é assinada com o segredo do seu endpoint usando HMAC SHA-256. Rejeite tudo que tiver mais 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 e novas tentativas

Tempo limite
Responda com 2xx em até 10 segundos
Novas tentativas
8 tentativas em 24 horas, cada vez mais espaçadas
Duplicados
Um evento pode chegar duas vezes, então use o id para ignorar repetições
Ordem
Compare created_at, porque a ordem não é garantida
Pausa
Pausamos um endpoint após 3 dias de falhas e avisamos você por e-mail, e você pode reenviar o que perdeu

Seus endpoints

Os webhooks estão chegandoVocê vai adicionar endpoints aqui quando os webhooks abrirem. Eles vêm com o Pro e planos acima.
Em breve