Webhooks
Diez eventos, un cuerpo JSON y una firma HMAC que comprobar. Suficiente para publicar en Slack, abrir un ticket o actualizar tu propio panel.
Configuración
Settings → API and MCP → Webhooks → Add endpoint: una dirección https:// y los eventos que quieras. Recibes un secreto, que se muestra una sola vez, para comprobar las firmas.
- Edit cambia la dirección y los eventos. El secreto sigue igual.
- Test envía enseguida un evento
ping, para que puedas comprobar tu receptor. - Log muestra los últimos envíos y cuántos intentos necesitó cada uno.
Eventos
| Evento | Cuándo |
|---|---|
issue.resolved |
una revisión o auditoría ya no encuentra un problema |
issue.reopened |
un problema resuelto volvió |
audit.finished |
terminó una auditoría completa (páginas, problemas abiertos, puntuaciones) |
score.changed |
la puntuación del sitio web cambió 2 puntos o más tras una auditoría |
connection.broken |
una conexión de Google o WordPress dejó de funcionar |
recheck.failed |
una revisión se ejecutó y el problema sigue ahí, una corrección escrita aún no está en la página publicada, o la revisión no se pudo ejecutar |
write.applied |
un cambio aprobado (campo SEO, llms.txt, reglas para rastreadores de IA) se escribió mediante WordPress o la app de Shopify |
write.failed |
un cambio aprobado no se pudo escribir |
write.not_live |
una revisión no encontró un valor escrito en la página publicada |
agentic.finished |
una nueva ejecución de la prueba de navegación por agentes terminó o falló |
Envío
POST https://your-endpoint
Content-Type: application/json
User-Agent: MonoRanks-Webhooks/1
X-MonoRanks-Event: recheck.failed
X-MonoRanks-Delivery: <delivery id>
X-MonoRanks-Signature: sha256=<hex>
Cada cuerpo tiene id (el id del envío), event, at, workspaceId y siteId; la mayoría también tiene host y un link a la pantalla de la app.
{
"id": "…",
"event": "recheck.failed",
"at": "2026-10-01T09:12:00.000Z",
"workspaceId": "…",
"siteId": "…",
"issue": { "id": "…", "ruleId": "SEO-ONP-011", "title": "Missing meta description", "severity": "serious", "pages": 3 },
"crawlId": "…",
"reason": "still_present",
"recheck": { "present": 3, "checked": 4 },
"link": "https://app.monoranks.com/sites/…/issues/…"
}
Lo que añade cada evento:
issue.resolved,issue.reopened:issue(id,ruleId,title,severity,pages) ycrawlId.audit.finished:crawlId,status,pagesCrawled,openIssuesyscore(site,health,aeo).score.changed:from,to,deltaysince.connection.broken:connection(por ejemplogscowordpress) yerror.recheck.failed:issue,reason(still_present,not_liveoerror) yrecheck(present,checked).write.applied,write.failed,write.not_live: un evento por lote aprobado, conbatchId,issueIds,source(wordpressoshopify) y hasta 50changes, cada uno conurl,field,value,statusyerror. Enwrite.not_live, cada cambio tiene ademásnotLiveReasonyliveValue(lo que muestra la página).agentic.finished:jobId,url,strategy,status(doneofailed),passeddeapplicable, las comprobaciones que fallan (failing) yerror.
Responde con cualquier 2xx en menos de 20 segundos. Cualquier otra respuesta se vuelve a intentar.
Comprobar la firma
La firma es un HMAC-SHA256 del cuerpo sin procesar de la solicitud con el secreto de tu endpoint:
import { createHmac, timingSafeEqual } from 'node:crypto';
const expected = 'sha256=' + createHmac('sha256', SECRET).update(rawBody).digest('hex');
const ok = timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-monoranks-signature']));
Usa el cuerpo tal como llega, no una copia serializada de nuevo.
Preguntas frecuentes
¿Y si mi endpoint no responde?
Un envío fallido se vuelve a intentar a los 1, 5, 15 y 60 minutos, cinco intentos en total. Tras 20 fallos seguidos, el endpoint se desactiva. Cada envío tiene un id en la cabecera X-MonoRanks-Delivery para que puedas descartar duplicados.
¿Puedo filtrar por sitio web?
El cuerpo lleva el id del sitio web (siteId) y normalmente su host; filtra por tu lado. Los endpoints son por espacio de trabajo.
Añadí un endpoint antes de que existieran los eventos nuevos. ¿Los recibo?
No. Un endpoint conserva los eventos que tiene marcados. Edítalo para añadir los nuevos.