API
Webhooks
AutoRadar envoie un POST JSON à votre URL https à chaque événement. Créez un webhook depuis votre espace développeur ou par l'API (POST /webhooks) : le secret de signature (whsec_…) n'est affiché qu'une seule fois.
Événements
search.completed— Une recherche asynchrone (POST /searches) est terminée : identifiant, statut et nombre d'offres.alert.match— Une alerte du compte a trouvé une ou plusieurs nouvelles offres.price.drop— Le prix d'une offre suivie a baissé.
Corps : {"id":"evt_…","type":"…","created_at":"…","data":{…}}, 64 Ko au plus (listes tronquées au-delà, avec data.truncated). Un événement webhook.test est envoyé par le bouton de test.
Vérifier la signature (obligatoire)
L'en-tête AutoRadar-Signature vaut t=<horodatage unix>,v1=<signature>. La signature est le HMAC-SHA256, en hexadécimal, du texte <t>.<corps brut> avec votre secret complet (préfixe whsec_ compris).
- Lisez le corps BRUT, avant tout décodage JSON (un JSON re-sérialisé ne donne pas la même signature).
- Recalculez le HMAC et comparez-le en temps constant (jamais avec
==). - Refusez un horodatage écarté de plus de 300 secondes de votre horloge (anti-rejeu).
- Ignorez un événement déjà traité : l'en-tête
AutoRadar-Deliveryidentifie l'événement et reste identique lors des réessais.
import crypto from "node:crypto";
// rawBody : le corps BRUT (texte exact reçu), pas un objet JSON re-sérialisé.
export function verifyAutoRadar(secret, header, rawBody, toleranceS = 300) {
if (!header || header.length > 512) return false;
const parts = Object.fromEntries(header.split(",").map((p) => p.trim().split("=", 2)));
const t = Number(parts.t);
if (!Number.isInteger(t) || !/^[0-9a-f]{64}$/.test(parts.v1 ?? "")) return false;
if (Math.abs(Math.floor(Date.now() / 1000) - t) > toleranceS) return false; // anti-rejeu
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
const got = Buffer.from(parts.v1, "hex");
return got.length === expected.length && crypto.timingSafeEqual(got, expected); // temps constant
}
// Express : app.post("/autoradar/webhook", express.raw({ type: "application/json" }), (req, res) => {
// const raw = req.body.toString("utf8");
// if (!verifyAutoRadar(process.env.AUTORADAR_WEBHOOK_SECRET, req.get("AutoRadar-Signature"), raw)) return res.sendStatus(400);
// const deliveryId = req.get("AutoRadar-Delivery"); // ignorez un identifiant déjà traité (idempotence)
// const event = JSON.parse(raw);
// res.sendStatus(200); // répondez vite (5 s au plus), traitez ensuite
// });Livraison et réessais
- Répondez 2xx en moins de 5 secondes, puis traitez l'événement de votre côté. Les redirections ne sont pas suivies (3xx = échec).
- En cas d'échec, nouvel essai après 1 min, 5 min, 30 min, 2 h, 6 h, 14 h, puis abandon. Le journal des livraisons est visible dans votre espace et par
GET /webhooks/{id}. - Après de nombreux échecs consécutifs, le webhook est désactivé et vous êtes prévenu par e-mail. Il cesse aussi si la clé qui l'a créé est révoquée.
- URL acceptées : https, adresse publique (pas d'adresse privée ni interne), sans identifiants dans l'URL.