grant.revoked, cuando un grant termina, y ping, cuando pides una prueba.
MyPilotIndex configura tu URL de webhook (solo https) y su secreto de firma cuando te aprueba. El secreto empieza con whsec_ y se muestra una sola vez.
Entrega
Cada evento es unPOST del evento en JSON (Content-Type: application/json). Responde con cualquier 2xx en menos de 10 segundos.
Encabezados, según el esquema Standard Webhooks:
Verificar la firma
La clave es el contenido en base64 de tu secreto después del prefijowhsec_. Calcula el HMAC sobre los bytes exactos que recibiste, no sobre un cuerpo serializado de nuevo, compara en tiempo constante y rechaza un timestamp que difiera más de cinco minutos de tu reloj.
grant.revoked
reason es pilot (el piloto te desconectó en Ajustes), operator (MyPilotIndex lo revocó) o account_deleted (el piloto borró su cuenta, así que el grant ya no aparece en ninguna lista).
Cuando lo recibas, borra lo que guardas de MyPilotIndex sobre ese piloto, como exige el acuerdo de datos. Desde ese momento, cada llamada que indique el grant responde 404.
Reintentos
Un5xx, un 408, un 429, una redirección (nunca se sigue), un timeout o una falla de conexión se reintenta con intervalos crecientes durante cerca de un día, doce intentos en total, con el mismo webhook-id y un timestamp y una firma nuevos. Un 4xx distinto de 408 y 429 se toma como un rechazo y no se reintenta.
La excepción es grant.revoked con el motivo account_deleted: su grant sale de todas las listas junto con la cuenta, así que no se puede conciliar después. Se reintenta dentro de la misma ventana ante cualquier respuesta que no sea 2xx, incluido un 4xx. Confírmalo con un 2xx en cuanto lo hayas procesado, aunque no guardes nada de ese piloto.
Si te perdiste otros eventos, concilia con GET /v1/partner/grants?status=revoked&changed_since=<time>.
Pruebas
POST /v1/partner/webhooks/test pone en cola un ping firmado hacia tu URL de webhook y responde 202 antes de la entrega. El evento ping tiene un objeto data vacío. Si falta la URL de webhook (https) o el secreto, la respuesta es 409 con el motivo webhook_not_configured.
