Zum Inhalt springen
Documentation

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).

  1. Lisez le corps BRUT, avant tout décodage JSON (un JSON re-sérialisé ne donne pas la même signature).
  2. Recalculez le HMAC et comparez-le en temps constant (jamais avec ==).
  3. Refusez un horodatage écarté de plus de 300 secondes de votre horloge (anti-rejeu).
  4. Ignorez un événement déjà traité : l'en-tête AutoRadar-Delivery identifie 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.
Webhooks AutoRadar : événements et vérification de la signature · AutoRadar