Webhooks

Recibe cada código por POST en tu servidor en cuanto llega, firmado con el secreto de tu webhook y con reintentos durante unas dos horas.

Insertar
Vista previa de la tarjeta
<a href="https://numestri.com/docs/es/webhooks"><img src="https://numestri.com/docs/_api/public/orgs/25229885-9620-4c08-bd2e-a0d0d74ac8b6/spaces/ef21e0c3-966d-4b03-b6d2-e66d449835d4/pages/17b9f35e-c103-4bbf-b704-1cc21d7557f0/social-card.svg?v=3e7ae33eec8b" alt="Webhooks" width="600" height="315"></a>

Añade una URL de webhook en el panel, en Desarrolladores, y te enviaremos cada código por POST en cuanto llegue, tanto en los pedidos de un solo uso como en cada mensaje que reciba un número alquilado. Solo HTTPS.

Qué enviamos

POST /hooks/numestri HTTP/1.1
Content-Type: application/json
X-Numera-Event: sms.received
X-Numera-Signature: 9f2c1a…
X-Numera-Delivery: whk_8c1f…
X-Numera-Attempt: 1

{
  "orderid": "JRJ5UEXS",
  "sms": "140722",
  "full_sms": "140722 is your Telegram verification code.",
  "timestamp": "2026-10-14 07:42:11pm"
}

Cabecera

Significado

X-Numera-Event

sms.received o rental.received.

X-Numera-Signature

HMAC-SHA256 del cuerpo sin procesar, con tu secreto de firma del webhook como clave, en hexadecimal.

X-Numera-Delivery

Es el mismo en cada reintento de una notificación: úsalo para ignorar las repeticiones.

X-Numera-Attempt

1 en el primer intento; después va aumentando.

Verificar la firma

Tu secreto de firma (whsec_…) se muestra en Desarrolladores cuando añades el webhook. Es independiente de tus claves de API, así que puedes crear y eliminar claves sin romper la verificación. Comprueba cada entrega antes de fiarte de ella:

import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(rawBody, signature, signingSecret) {
  const expected = createHmac("sha256", signingSecret).update(rawBody).digest("hex");
  const a = Buffer.from(expected, "hex");
  const b = Buffer.from(signature ?? "", "hex");
  // Primero la longitud: timingSafeEqual lanza un error si no coincide.
  return a.length === b.length && timingSafeEqual(a, b);
}

Verifica con el cuerpo de la petición sin procesar, antes de que cualquier análisis del JSON lo vuelva a serializar.

Confirmación y reintentos

  • Responde con cualquier 2xx en un plazo de 8 segundos para confirmar la recepción.

  • Cualquier otra respuesta se reintenta, ocho intentos en total, repartidos a lo largo de unas dos horas (10 s, 30 s, 2 min, 5 min, 15 min, 30 min, 1 h).

  • Tras 50 entregas fallidas consecutivas, el webhook se pone en pausa. Vuelve a guardar la URL en Desarrolladores para reactivarlo.

  • Enviar prueba, en Desarrolladores, entrega un ejemplo firmado, para que puedas comprobar tu receptor antes de que un código real dependa de él.

Cambiar el secreto

Cambiar secreto genera uno nuevo al instante. Actualiza tu receptor justo después: a partir de ese momento, las entregas se firman con el nuevo secreto.

Actualizado