Abonnez-vous aux evenements EduGame et recevez-les dans votre backend avec une latence inferieure a 2 secondes. 60 types d'evenements couvrent tout le cycle de vie pedagogique, de la generation d'examen a la correction de copie papier.
P95 mesure. Chaque event est pousse des qu'il est commite en base.
En-tete X-EduGame-Signature avec HMAC-SHA256. Rejet des replays par timestamp.
Backoff exponentiel sur 24h en cas de 5xx ou timeout. Quota par endpoint tracke.
Vous abonnez vos endpoints a un sous-ensemble via des patterns glob : exam.*, paper.correction.*, ou * pour tous.
curl -X POST https://api.edugame.cc/v1/webhooks \
-H "Authorization: Bearer $EDUGAME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.votre-app.com/hooks/edugame",
"events": ["exam.*", "paper.correction.completed"],
"secret": "whsec_your_own_generated_secret"
}'Le secret fourni est utilise pour signer chaque livraison. Conservez-le cote serveur uniquement : il ne vous sera jamais retourne par l'API.
import crypto from 'node:crypto'
function verify(rawBody: string, signature: string, secret: string): boolean {
const [timestamp, received] = signature.split(',')
const ts = timestamp.split('=')[1]
const sig = received.split('=')[1]
// Reject events older than 5 minutes
if (Date.now() / 1000 - Number(ts) > 300) return false
const expected = crypto
.createHmac('sha256', secret)
.update(`${ts}.${rawBody}`)
.digest('hex')
return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))
}Comparez toujours avec timingSafeEqual pour resister aux attaques par timing. Rejetez les events dont le timestamp est plus ancien que 5 minutes pour prevenir les attaques de replay.
{
"id": "evt_01HXXXX...",
"type": "exam.generation.completed",
"created_at": "2026-04-17T10:23:54.812Z",
"api_version": "v1",
"account_id": "acc_...",
"idempotency_key": "idem_...",
"data": {
"exam": {
"id": "exam_...",
"subject": "mathematiques",
"level": "terminale",
"nodeCount": 12
}
}
}