Skip to main content
Les webhooks sont le moyen recommandé pour recevoir les résultats d’un monitor. Lorsqu’un monitor se déclenche, Pubrio envoie une requête POST avec une charge utile JSON à l’URL que vous avez configurée — en temps réel.

Prérequis

  • Une clé API Pubrio avec accès aux monitors
  • Un point de terminaison HTTPS accessible publiquement (ou une URL de test depuis usewebhook.com)
Test rapide : utilisez usewebhook.com pour générer une URL de webhook temporaire et gratuite. Vous pouvez inspecter chaque charge utile entrante sans rien déployer.

Étape 1 : créer un Monitor avec une destination webhook

Réponse :
L’objet headers ajoute des en-têtes HTTP personnalisés à chaque envoi (utile pour l’authentification). L’objet body ajoute des champs personnalisés à la racine de la charge utile du webhook.
Conservez le signature renvoyé dans la réponse — vous en aurez besoin pour vérifier les charges utiles entrantes. Il n’est renvoyé qu’à la création, via le point de terminaison Signature Reveal, ou depuis Monitor Lookup avec is_signature_reveal: true.

Étape 2 : valider votre connexion webhook

Utilisez le point de terminaison Validate Webhook pour tester que votre point de terminaison est joignable. Cela envoie une charge utile d’exemple avec des données de substitution — aucun crédit n’est consommé, aucun signal réel n’est récupéré.
Une réponse réussie renvoie la charge utile d’exemple qui a été envoyée et la réponse que votre point de terminaison a retournée — pour que vous puissiez confirmer que la connexion fonctionne avant de passer en production.

Étape 3 : tester avec des données réelles

Une fois la connexion validée, déclenchez une exécution réelle avec le point de terminaison Process Try. Cela récupère de vrais signaux et les livre à votre webhook — utilisez tried_at avec une date passée récente pour vous assurer que des données sont disponibles :
Contrairement à validate, le point de terminaison try exécute un vrai scan et consomme des crédits. Utilisez-le pour vérifier que les charges utiles réelles arrivent correctement et obtenir une estimation rapide des résultats avant le déclenchement du scan planifié.

Étape 4 : vérifier les signatures

Chaque monitor dispose d’une signature unique permettant de vérifier que les charges utiles entrantes proviennent bien de Pubrio.
Chaque livraison porte deux en-têtes : x-pubrio-signature (le secret révélé ci-dessus) et x-pubrio-signature-256 (HMAC-SHA256 hexadécimal du corps brut de la requête, avec ce secret comme clé). Vérifiez le HMAC sur les octets reçus avant de parser le JSON.

Structure de la charge utile du webhook

Les charges utiles diffèrent selon le detection_mode du monitor :
En mode signal_first, la charge utile contient un tableau signals de premier niveau :
Chaque entrée de signal contient les détails du signal ainsi que les entreprises et personnes enrichies associées.
Les champs body personnalisés issus de destination_config apparaissent à la racine de la charge utile (par exemple, "pipeline": "my-webhook" s’il est configuré dans votre destination).

Signaux d’expansion

Aux côtés de jobs, news et advertisements, un monitor peut surveiller les signaux d’expansion — la preuve datée qu’une entreprise entre sur un nouveau marché ou s’y développe. Ajoutez expansions à signal_types :
Les filtres d’expansion utilisent le vocabulaire de Expansion Search, et non celui des offres d’emploi/actualités/publicités — froms et tos pour le corridor, plus stages, scopes, momentum, freshness, signal_types, signal_subtypes, signal_strengths, source_types et window_days. Résolvez les slugs valides depuis Expansion Reference.
Un webhook livre les signaux d’expansion dans l’unité d’enregistrement du moniteur. Dans l’unité signal par défaut (signal_first), chaque entrée est un signal brut (HIRE, AD, OFFICE…) dont companies[0] porte la fiche (entreprise, marché) ; country_code est le marché. Définissez record_unit: "company" pour recevoir une entrée par entreprise avec ses signaux imbriqués. Le digest e-mail regroupe toujours par entreprise et marché.

Empreinte cloud

DNS est le signal d’empreinte cloud : une entreprise qui déploie de l’infrastructure cloud ou d’hébergement sur un marché. Restreignez un monitor d’expansion via signal_types dans les filtres :
Chaque livraison contient evidence_url, une page Pubrio qui étaye le signal. Le détail brut de l’infrastructure n’est jamais inclus. Pour recevoir les mêmes hôtes sous forme de flux d’événements avec des filtres par fournisseur, région et ville, utilisez le type de signal dédié cloud_footprints ci-dessous.

Charge utile des signaux d’expansion

La signification de chaque champ figure dans la Référence des champs d’expansion. Pour récupérer les mêmes lignes à la demande plutôt que via un déclencheur, utilisez Expansion Signal Search.

Signaux d’empreinte cloud

Ajoutez cloud_footprints à signal_types pour recevoir un enregistrement par hôte qu’une entreprise met en place sur un marché hors de son pays : un nouveau serveur chez un fournisseur cloud ou d’hébergement, ou un serveur qui a changé de région ou de pays. C’est la même preuve d’infrastructure que lit le signal d’expansion DNS, livrée comme un simple flux d’événements plutôt qu’une étape de marché : chaque hôte, dans l’ordre d’arrivée, avec les filtres propres à l’empreinte, sans étape, score ni fenêtre.
Chaque signal porte provider, cloud_region, city, novelty, country_code, country_name, event_date, un display_label localisé comme AWS · Frankfurt et evidence_url. Les noms d’hôte et adresses IP bruts ne sont jamais inclus. L’infrastructure du marché domestique ne fait pas partie de ce flux.

Règles de livraison

Ce qu’est un enregistrement

Un enregistrement est ce que comptent les plafonds et ce que constitue une entrée de livraison. Par défaut il suit le mode de détection : signal_first livre des signaux (une entrée signals[] par offre, annonce, article ou signal d’expansion), company_first livre des entreprises (une entrée companies[] par entreprise avec ses signaux imbriqués). Utilisez record_unit pour choisir explicitement ; par exemple record_unit: "company" sur un moniteur d’annonces signal_first livre une entrée par annonceur au lieu d’une par annonce.

Exclure des entreprises

excluded_companies (plus excluded_domains et excluded_linkedin_urls, résolus comme companies) est une liste à ne jamais livrer : une entreprise exclue est écartée avant l’enrichissement et la facturation dans les deux modes, et une liste de suivi company_first l’ignore tant qu’elle reste sur la liste. Jusqu’à 100 000 entreprises par moniteur, de quoi accueillir un export CRM des clients existants. Dans Update Monitor, envoyez companies_mode ou excluded_companies_mode à add / remove pour ne modifier que les entrées envoyées, sans renvoyer toute la liste.

Plafonds

Une liste de n’importe quelle taille se lit page par page : Company Search avec company_groups: [source_group_id] (ou excluded_group_id) ; les deux ids sont renvoyés par Lookup Monitor, qui renvoie aussi les listes complètes.

Le plus récent d’abord

Par défaut, un monitor livre dans l’ordre d’arrivée, le plus ancien d’abord, et un plafond reporte le reste : le retard d’une journée est traité avant les signaux plus récents. Avec is_newest_first: true, c’est l’inverse : chaque exécution livre les enregistrements les plus récents, et ce qu’un plafond laisse de côté est ignoré définitivement, jamais mis en file d’attente. Cela vaut pour chaque type de signal et pour un monitor qui reprend après une pause ou un budget quotidien épuisé.

Déduplication et nouvelle livraison

  • Un signal n’est jamais livré deux fois. Chaque livraison réussie journalise les clés des signaux qu’elle portait, et chaque exécution écarte tout candidat déjà présent dans ce journal, pour tous les types de signaux. Offres, actualités et annonces conservent en plus un curseur par type, donc un signal livré n’est même pas récupéré à nouveau.
  • company_dedupe_days: N garantit qu’une entreprise apparaît dans au plus une livraison par N jours, tous types de signaux du moniteur confondus ; ses signaux suivants dans la fenêtre sont ignorés.
  • Chaque payload porte metadata.monitor_log_id (la ligne de cette tentative dans les Journaux statistiques) et metadata.parent_monitor_log_id (null à la première tentative ; lors d’une nouvelle tentative, automatique ou via Relancer le traitement, l’id de la première tentative). Les mêmes signaux ne peuvent vous revenir que par une telle tentative ; dédupliquez donc sur parent_monitor_log_id || monitor_log_id. Une relance renvoie le payload de la première tentative tel quel ; envoyez is_use_original_payload: false pour réappliquer d’abord les règles actuelles (exclusions et les deux registres), auquel cas une relance sans rien à livrer est ignorée avec le code 40085.

Destination e-mail

Pour les équipes qui préfèrent la livraison par e-mail, définissez destination_type sur "email" :
Pubrio prend en charge la livraison d’e-mails en marque blanche pour les agences et les équipes. Contactez-nous pour en savoir plus sur la personnalisation du domaine expéditeur et de l’image de marque.

Dépannage

  • Vérifiez que votre point de terminaison est accessible publiquement (pas derrière un pare-feu ou un VPN)
  • Assurez-vous qu’il renvoie un code de statut 200 — les autres codes sont traités comme des échecs
  • Utilisez le point de terminaison Validate Webhook pour tester la connectivité
  • Consultez les Statistic Logs pour les messages d’erreur et les codes de réponse
Si votre webhook renvoie systématiquement des codes non-200, le monitor se met en pause après avoir atteint max_failure_trigger échecs consécutifs. Corrigez le problème puis réactivez via Update Monitor.
Si une livraison échoue et que des tentatives sont configurées, vous pouvez recevoir plusieurs fois la même charge utile. Utilisez triggered_at ou l’identifiant de journal pour dédupliquer de votre côté.
Réduisez max_records_per_trigger pour limiter le nombre d’enregistrements par livraison. Vous pouvez aussi restreindre vos filtres pour réduire le volume de signaux correspondants.
Dernière modification le 8 octobre 2026