Verificación de endpoints
La verificación demuestra que la URL de un endpoint es tuya y está lista para recibir webhooks. Le enviamos un desafío firmado; la supera devolviendo ese desafío. Hasta que la supera, un workspace que exige verificación no le entrega nada — lo que detecta una URL mal escrita o un receptor a medio construir antes de que los eventos reales se acumulen en la cola dead-letter, e impide que cualquiera dirija nuestras entregas a un servidor que nunca las pidió.
El desafío
Al iniciar una verificación se envía un POST a la URL del endpoint, firmado con el secreto del endpoint exactamente igual que una entrega (las mismas X-Webhook-Signature y X-Webhook-Timestamp, las cabeceras personalizadas de tu endpoint y X-Webhook-Event-Type: webhook.verify):
{"type": "webhook.verify", "data": {"endpoint_id": "ep_3f9a…", "challenge": "Xb9kQ2…"}}El endpoint la supera cuando responde 2xx con el valor de challenge en cualquier parte del cuerpo de la respuesta. Un 2xx sin el token falla con challenge_not_echoed; cualquier otra cosa falla igual que fallaría una entrega.
Cómo responderlo
Comprueba la firma como haces con cada entrega y después devuelve el desafío:
event = json.loads(raw_body) # after the signature check
if event["type"] == "webhook.verify":
return Response(event["data"]["challenge"], status=200)No REST example here; showing Python.
Cómo lanzarla
En la consola, abre el menú del endpoint en la página Endpoints y elige Verify. Por la API:
curl -sX POST https://webhooks.nimbusnexus.net/v1/endpoints/ep_3f9a…/verify \
-H "Authorization: Bearer $ADMIN_KEY"{ "verified": true, "challenge_echoed": true, "status_code": 200, "error": null, "duration_ms": 142, "failure_reason": null }Un endpoint sigue verificado hasta que cambia su URL; una URL nueva tiene que volver a verificarse.
Cuándo es obligatoria
La verificación es obligatoria para un endpoint cuando está activado cualquiera de estos:
- el interruptor del workspace — Settings → Endpoint verification en la consola, o
PATCH /v1/workspacecon{"require_endpoint_verification": true}; - el interruptor del proyecto —
PUT /v1/verification-policy?project_id=…con{"required": true}, para un proyecto que la necesita cuando otros no; - tu plan, si el plan la exige. En ese caso, la consola muestra el interruptor bloqueado en activado.
GET /v1/verification-policy devuelve la regla tal como la aplica la entrega (required), junto con los dos interruptores.
Lo que se pierde un endpoint sin verificar
Cuando la verificación es obligatoria, un endpoint sin verificar se deja fuera al repartir un evento: la respuesta de la publicación lo cuenta en skipped_unverified, la consola marca el endpoint como gated y no se crea ninguna entrega para él — así que no queda nada esperando a enviarse cuando se verifique. Vuelve a publicar o a reenviar cuando la supere.
Volver a enviar queda bloqueado de la misma forma. Volver a entregar una entrega a ese endpoint, o reenviarle un evento, se rechaza con 409 endpoint_not_verified; volver a entregar en bloque o reenviar por intervalo lo deja fuera y lo cuenta en skipped_unverified. Una entrega que ya estaba en cola o reintentándose cuando el endpoint pasa a necesitar verificación — porque se activó el requisito o cambió la URL del endpoint — va a la cola dead-letter sin enviarse, con un last_error que empieza por "not verified:". Verifica el endpoint y después vuelve a entregarla.
Receptores que no pueden responder
Algunos receptores aceptan cualquier POST pero nunca devuelven un cuerpo que elijas tú — entre ellos, los incoming webhooks de Slack y los catch hooks de Zapier. No pueden superar la verificación. Si tu plan te lo permite, deja la verificación desactivada para el proyecto que les entrega; si no, pon delante un pequeño intermediario propio que responda al desafío.
Próximos pasos
- Verificación de firmas — la comprobación que hay que hacer antes de responder al desafío.
- Entregas y reintentos — qué pasa cuando el endpoint ya recibe eventos.
- Inicio rápido — de cero a una entrega verificada.