Aller au contenu
05

Suivi API

Suivez l'utilisation des endpoints API, la latence, les taux d'erreur et les profils d'utilisation avec le middleware Express ou des appels manuels.

Middleware Express
import { BetterMeter } from "@bettermeter/node";
import express from "express";

const bm = new BetterMeter({
  siteId: "my-api",
  apiKey: "bm_...",
});

const app = express();

// Auto-track all requests
app.use(bm.expressMiddleware());
Suivi manuel
bm.trackApi({
  method: "POST",
  endpoint: "/api/users",    // Use patterns, not actual paths with IDs
  statusCode: 201,
  durationMs: 45,
});

Ce qui est suivi

Méthode HTTP, modèle d'endpoint, code de statut et durée. Les corps de requête/réponse, les en-têtes, les paramètres de requête et les paramètres de chemin ne sont jamais envoyés. Utilisez des modèles d'endpoint (/api/users/:id) et non des chemins réels (/api/users/abc123).

09

Référence API

La plupart des endpoints d'analytique sont des GET avec des paramètres de requête ; chaque ligne ci-dessous indique la méthode réellement acceptée. Authentifiez-vous avec Authorization: Bearer <api_key>.

Ingestion d'événements

POST /api/eventIngérer un événement (web, CLI, MCP ou API). Retourne 202.

Les événements web doivent référencer un site enregistré et l'URL de l'événement doit correspondre au domaine du site. Les événements CLI, MCP et API exigent Authorization: Bearer [api_key]; les en-têtes user-agent et client-IP transférés ne sont approuvés qu'après validation de cette clé pour le site.

Charge utile de l'événement
{
  "site_id": "example.com",
  "event_name": "pageview",        // or "cli.command", "mcp.tool", "api.request"
  "event_source": "web",           // "web" | "cli" | "mcp" | "api"
  "url": "https://example.com/page",
  "pathname": "/page",
  "hostname": "example.com",
  "referrer": "https://google.com",
  "screen_width": 1920,
  "timezone": "America/New_York",
  "user_id": "optional_user_id",
  "properties": { "key": "value" }
}

Intérêt d'inscription

POST /api/waitlistCapturer les inscriptions publiques et envoyer un courriel à l’équipe BetterMeter pour chaque nouveau prospect. L’alerte comprend des indices clairement identifiés sur le nom et l’organisation dérivés de l’adresse, l’état du compte, l’intérêt du même domaine et un lien vers la fiche d’administration. Un doublon ne déclenche pas une autre alerte.

Temps réel et heartbeat

GET /api/analytics/live?activity=1&cursor=…Nombre de visiteurs en direct. Ajoutez activity=1 pour les événements humains récents, les identifiants de visiteurs actifs, les objectifs et un curseur réutilisable. Accepte ?siteId=...
POST /api/heartbeatRecevoir les heartbeats du navigateur pour le suivi des visiteurs en direct
POST /api/hAlias furtif pour /api/heartbeat (résistant aux bloqueurs de publicités)

Endpoints de requête

La plupart des endpoints GET acceptent ?siteId=...&from=YYYY-MM-DD&to=YYYY-MM-DD ; toute exception est signalée sur la ligne concernée. Les endpoints de liste acceptent aussi limit=all lorsque vous avez besoin du jeu complet pour la pagination ou la recherche.

Les routes de trafic humain excluent par défaut le trafic automatisé connu et détecté avec une forte confiance. Utilisez includeBots=true pour obtenir les totaux non filtrés. La réponse d’aperçu inclut trafficFilter afin de rendre l’exclusion vérifiable.

Sites et accès

GET /api/sitesTous les sites auxquels l'appelant a accès, du plus récent au plus ancien
POST /api/sitesCréer un site. Session du tableau de bord uniquement — une clé API reçoit une erreur 403 avec dashboardOnly: true
GET /api/sites/[siteId]Les réglages et métadonnées d'un site
PATCH /api/sites/[siteId]Modifier les réglages du site — nom de marque, mots-clés, concurrents, filtres IP, devise (Éditeur ou Admin)
DELETE /api/sites/[siteId]Supprimer un site et tous les événements qu'il contient. Admin, et session du tableau de bord uniquement
GET /api/sites/[siteId]/membersMembres, propriétaire et invitations en attente (tous rôles)
POST /api/sites/[siteId]/membersAjouter un membre ou envoyer une invitation (Admin)
PATCH /api/sites/[siteId]/membersModifier le rôle d'un membre (Admin)
DELETE /api/sites/[siteId]/membersRetirer un membre ou annuler une invitation en attente (Admin)
POST /api/auth/verify-keyVérifier une clé API et renvoyer le compte auquel elle appartient, avec les sites que ce compte possède. Limité à 10 tentatives par minute et par IP
GET /api/billing/subscriptionForfait actuel, statut de l'abonnement, limites du forfait et consommation à ce jour

Analytique web

GET /api/analytics/overviewVisiteurs, pages vues, sessions + % de variation et hasPreviousPeriodData pour les fenêtres de comparaison vides
GET /api/analytics/all-sitesVue consolidée de tous les sites auxquels l'appelant a accès ; prend from et to, sans siteId
GET /api/analytics/pages?limit=allPages par nombre de visiteurs. Ajoutez limit=all pour retourner la liste complète consultable.
GET /api/analytics/sources?limit=allSources de trafic avec détection IA
GET /api/analytics/timeseriesTendance quotidienne visiteurs/pages vues
GET /api/analytics/ai-trafficRépartition des référencements IA par plateforme
GET /api/analytics/bots?limit=allTrafic robots/crawlers
GET /api/analytics/countries?limit=allVisiteurs par pays
GET /api/analytics/devicesRépartition par type d'appareil
GET /api/analytics/browsers?limit=allRépartition par navigateur
GET /api/analytics/visitors?limit=allListe des visiteurs avec activité
GET /api/analytics/visitors/findRetrouver un visiteur par e-mail, identifiant de contact CRM, ou toute paire clé/valeur de propriété (Éditeur ou Admin, car un e-mail identifie une personne nommée)
GET /api/analytics/visitors/[visitorId]Profil avec première attribution, sessions, cycle de vie et chronologie
PATCH /api/analytics/visitors/[visitorId]Mettre à jour l'identité et le cycle de vie (éditeur ou administrateur)
GET /api/analytics/visitors/[visitorId]/propertiesLire toutes les propriétés clé/valeur d'un visiteur, avec la source de chacune
PATCH /api/analytics/visitors/[visitorId]/propertiesÉcrire ou supprimer des propriétés de visiteur ; une valeur null supprime la clé (Éditeur ou Admin)
POST /api/visitor-propertiesPoint d'accès public utilisé par setProperties() du tracker ; le visiteur est déduit de la requête, jamais fourni par l'appelant
GET /api/analytics/events?limit=allÉvénements personnalisés
GET /api/analytics/events/[eventName]Un événement personnalisé en détail — déclenchements totaux, visiteurs uniques et facettes de propriétés comptées sur toute la période
GET /api/analytics/campaigns?limit=allAttribution automatique des URL de campagne (UTM + identifiants de clic)
GET /api/analytics/campaigns/[campaign]Détail d'une seule campagne — qualité des visites (taux de rebond, durée moyenne, score de qualité par rapport à la moyenne du site), performance des variantes et des mots-clés, répartitions par appareil, navigateur et pays, profil horaire, événements personnalisés
GET /api/analytics/campaigns/[campaign]/visitorsLes personnes amenées par une campagne, avec pour chacune la page d'arrivée, la variante, l'appareil, le pays et l'activité après le clic
GET /api/analytics/keywords?limit=allMots-clés (utm_term) agrégés par campagne avec qualité des visites (taux de rebond, durée moyenne) et attribution de campagne/source
GET /api/analytics/marketingPerformance marketing : campagnes, pages d’atterrissage, mix de canaux, trafic de campagne vs autre trafic
GET /api/analytics/channelsRépartition par canal
GET /api/analytics/session-statsStatistiques de sessions
GET /api/analytics/sessions?limit=allListe des sessions

Analytique CLI

GET /api/analytics/cli-overviewInvocations, appelants, taux de succès
GET /api/analytics/cli-commands?limit=allCommandes les plus utilisées
GET /api/analytics/cli-timeseriesActivité CLI quotidienne

Analytique MCP

GET /api/analytics/mcp-overviewInvocations, appelants, taux de succès
GET /api/analytics/mcp-tools?limit=allOutils les plus utilisés
GET /api/analytics/mcp-clients?limit=allRépartition par client
GET /api/analytics/mcp-timeseriesActivité MCP quotidienne

Analytique API

GET /api/analytics/api-overviewInvocations, appelants, taux d'erreur
GET /api/analytics/api-endpoints?limit=allEndpoints les plus sollicités
GET /api/analytics/api-timeseriesActivité API quotidienne

Objectifs de conversion

GET /api/analytics/goalsLister tous les objectifs de conversion avec les conversions, les visiteurs convertis uniques et les taux de conversion
POST /api/analytics/goalsCréer un nouvel objectif de conversion (URL de page vue, événement personnalisé, lien sortant ou téléchargement)
GET /api/analytics/goals/[goalId]Obtenir l'évolution actuelle et précédente sur le trafic humain seulement, les visiteurs convertis stables, l'acquisition au premier contact, l'efficacité par visiteur exposé et le momentum; includeBots=true inclut le trafic automatisé
PATCH /api/analytics/goals/[goalId]Mettre à jour la définition d'un objectif de conversion
DELETE /api/analytics/goals/[goalId]Supprimer un objectif de conversion
GET /api/analytics/goals/suggestAnalyser les tendances de trafic et suggérer des cibles de conversion à forte valeur

Builder

GET /api/builders/dashboardsLister les dashboards personnalisés enregistrés d'un site et son menu latéral de dashboards
POST /api/builders/dashboardsCréer un dashboard personnalisé
GET /api/builders/dashboards/[dashboardId]Obtenir un dashboard personnalisé
PATCH /api/builders/dashboards/[dashboardId]Mettre à jour un dashboard personnalisé
DELETE /api/builders/dashboards/[dashboardId]Supprimer un dashboard personnalisé
GET /api/builders/reportsLister les modèles de rapport enregistrés
POST /api/builders/reportsCréer un modèle de rapport
GET /api/builders/reports/[reportId]Obtenir un modèle de rapport
PATCH /api/builders/reports/[reportId]Mettre à jour un modèle de rapport
DELETE /api/builders/reports/[reportId]Supprimer un modèle de rapport
POST /api/builders/reports/previewPrévisualiser le plan d'un rapport

Classements de recherche et visibilité IA

GET /api/analytics/brandRapport de visibilité des classements de recherche
POST /api/analytics/brandLancer un rapport de marque complet et l'enregistrer pour le suivi historique ; utilise à défaut les mots-clés enregistrés du site (Éditeur ou Admin, forfait avec suivi de marque)
GET /api/analytics/brand/historyDonnées historiques de classement. Session du tableau de bord uniquement — cette route n'accepte pas de clé API
POST /api/analytics/brand/compareComparaison avec les concurrents — envoyez siteId en POST, competitors et queries étant facultatifs (Éditeur ou Admin, forfait avec suivi de marque)
GET /api/analytics/brand/alertsRègles d'alerte de classement
POST /api/analytics/brand/alertsCréer une règle d'alerte de classement (Éditeur ou Admin)
PATCH /api/analytics/brand/alertsActiver ou désactiver une règle d'alerte (Éditeur ou Admin)
DELETE /api/analytics/brand/alerts?id=…Supprimer une règle d'alerte ; l'identifiant de la règle passe dans la chaîne de requête (Éditeur ou Admin)
GET /api/analytics/brand/exportExporter les données de classement. Session du tableau de bord uniquement — cette route n'accepte pas de clé API
GET /api/analytics/backlinksProfil de backlinks
GET /api/analytics/ai-mentionsMentions de marque par chatbots IA
POST /api/analytics/ai-mentionsLancer une analyse des mentions IA en arrière-plan et renvoyer un identifiant de tâche ; interrogez GET /api/analytics/ai-mentions/job?id=… pour suivre l'avancement (Éditeur ou Admin)
GET /api/analytics/ai-mentions/historyHistorique des mentions IA

Pulse AI

GET /api/pulse/insightsAnomalies, tendances, opportunités et variations par domaine
GET /api/pulse/healthScore de santé produit (0-100)
GET /api/pulse/briefingBriefing quotidien ou hebdomadaire
GET /api/pulse/forecastPrévision de trafic/utilisation
GET /api/pulse/compareComparaison de périodes
GET /api/pulse/alertsLister les alertes de surveillance
POST /api/pulse/alertsCréer une règle d'alerte
DELETE /api/pulse/alertsSupprimer une règle d'alerte
GET /api/pulse/notificationsObtenir les notifications
PATCH /api/pulse/notificationsMarquer les notifications comme lues
POST /api/pulse/chatChat Pulse en continu avec des réponses adaptatives liées aux visiteurs
GET /api/pulse/conversationsLister vos fils de discussion Pulse pour un site
POST /api/pulse/conversationsDémarrer un nouveau fil de discussion Pulse
GET /api/pulse/conversations/[id]Un fil avec tout son historique de messages
PATCH /api/pulse/conversations/[id]Renommer un fil de discussion
DELETE /api/pulse/conversations/[id]Supprimer une discussion et ses messages
GET /api/pulse/screenshotCapturer une page d’atterrissage de votre site comme image authentifiée et de même origine

Dépenses publicitaires et revenus

GET /api/analytics/ad-spendDépenses de campagne rapprochées du trafic mesuré
GET /api/analytics/conversionsEnregistrements CRM portant l’un de nos identifiants de clic publicitaire ; wonOnly=true pour les affaires gagnées seulement, withAds=true pour retrouver l’annonce à l’origine de chacune
GET /api/analytics/ad-creativeL’annonce à l’origine d’une visite — exacte si l’URL portait l’identifiant de l’annonce ou son nom, au niveau de la campagne si seule la campagne est connue, et aucune correspondance si ni l’un ni l’autre — ou toutes les annonces synchronisées d’une campagne avec list=true. Résout une visite unique plutôt qu’une période : aucune plage de dates n’est requise
GET /api/analytics/ad-creative/[creativeId]/imageLe visuel de l’annonce, servi depuis notre propre origine afin que les URL des CDN des régies n’atteignent jamais le navigateur. Prend siteId et aucune plage de dates
GET /api/integrations/adsLister les comptes publicitaires connectés d'un site
POST /api/integrations/adsConnecter un compte publicitaire Meta avec un jeton d'utilisateur système
DELETE /api/integrations/ads?id=…Déconnecter un compte publicitaire par son identifiant ; les dépenses déjà enregistrées sont conservées (Admin)
POST /api/integrations/ads/syncRécupérer les dépenses maintenant plutôt qu'attendre la synchronisation nocturne