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.
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());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).
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.
{
"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 directPOST /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 ancienPOST /api/sitesCréer un site. Session du tableau de bord uniquement — une clé API reçoit une erreur 403 avec dashboardOnly: trueGET /api/sites/[siteId]Les réglages et métadonnées d'un sitePATCH /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 uniquementGET /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 IPGET /api/billing/subscriptionForfait actuel, statut de l'abonnement, limites du forfait et consommation à ce jourAnalytique web
GET /api/analytics/overviewVisiteurs, pages vues, sessions + % de variation et hasPreviousPeriodData pour les fenêtres de comparaison videsGET /api/analytics/all-sitesVue consolidée de tous les sites auxquels l'appelant a accès ; prend from et to, sans siteIdGET /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 IAGET /api/analytics/timeseriesTendance quotidienne visiteurs/pages vuesGET /api/analytics/ai-trafficRépartition des référencements IA par plateformeGET /api/analytics/bots?limit=allTrafic robots/crawlersGET /api/analytics/countries?limit=allVisiteurs par paysGET /api/analytics/devicesRépartition par type d'appareilGET /api/analytics/browsers?limit=allRépartition par navigateurGET /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 chronologiePATCH /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 chacunePATCH /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'appelantGET /api/analytics/events?limit=allÉvénements personnalisésGET /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ériodeGET /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ésGET /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 clicGET /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/sourceGET /api/analytics/marketingPerformance marketing : campagnes, pages d’atterrissage, mix de canaux, trafic de campagne vs autre traficGET /api/analytics/channelsRépartition par canalGET /api/analytics/session-statsStatistiques de sessionsGET /api/analytics/sessions?limit=allListe des sessionsAnalytique CLI
GET /api/analytics/cli-overviewInvocations, appelants, taux de succèsGET /api/analytics/cli-commands?limit=allCommandes les plus utiliséesGET /api/analytics/cli-timeseriesActivité CLI quotidienneAnalytique MCP
GET /api/analytics/mcp-overviewInvocations, appelants, taux de succèsGET /api/analytics/mcp-tools?limit=allOutils les plus utilisésGET /api/analytics/mcp-clients?limit=allRépartition par clientGET /api/analytics/mcp-timeseriesActivité MCP quotidienneAnalytique API
GET /api/analytics/api-overviewInvocations, appelants, taux d'erreurGET /api/analytics/api-endpoints?limit=allEndpoints les plus sollicitésGET /api/analytics/api-timeseriesActivité API quotidienneObjectifs de conversion
GET /api/analytics/goalsLister tous les objectifs de conversion avec les conversions, les visiteurs convertis uniques et les taux de conversionPOST /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 conversionDELETE /api/analytics/goals/[goalId]Supprimer un objectif de conversionGET /api/analytics/goals/suggestAnalyser les tendances de trafic et suggérer des cibles de conversion à forte valeurBuilder
GET /api/builders/dashboardsLister les dashboards personnalisés enregistrés d'un site et son menu latéral de dashboardsPOST /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ésPOST /api/builders/reportsCréer un modèle de rapportGET /api/builders/reports/[reportId]Obtenir un modèle de rapportPATCH /api/builders/reports/[reportId]Mettre à jour un modèle de rapportDELETE /api/builders/reports/[reportId]Supprimer un modèle de rapportPOST /api/builders/reports/previewPrévisualiser le plan d'un rapportClassements de recherche et visibilité IA
GET /api/analytics/brandRapport de visibilité des classements de recherchePOST /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é APIPOST /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 classementPOST /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é APIGET /api/analytics/backlinksProfil de backlinksGET /api/analytics/ai-mentionsMentions de marque par chatbots IAPOST /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 IAPulse AI
GET /api/pulse/insightsAnomalies, tendances, opportunités et variations par domaineGET /api/pulse/healthScore de santé produit (0-100)GET /api/pulse/briefingBriefing quotidien ou hebdomadaireGET /api/pulse/forecastPrévision de trafic/utilisationGET /api/pulse/compareComparaison de périodesGET /api/pulse/alertsLister les alertes de surveillancePOST /api/pulse/alertsCréer une règle d'alerteDELETE /api/pulse/alertsSupprimer une règle d'alerteGET /api/pulse/notificationsObtenir les notificationsPATCH /api/pulse/notificationsMarquer les notifications comme luesPOST /api/pulse/chatChat Pulse en continu avec des réponses adaptatives liées aux visiteursGET /api/pulse/conversationsLister vos fils de discussion Pulse pour un sitePOST /api/pulse/conversationsDémarrer un nouveau fil de discussion PulseGET /api/pulse/conversations/[id]Un fil avec tout son historique de messagesPATCH /api/pulse/conversations/[id]Renommer un fil de discussionDELETE /api/pulse/conversations/[id]Supprimer une discussion et ses messagesGET /api/pulse/screenshotCapturer une page d’atterrissage de votre site comme image authentifiée et de même origineDé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 chacuneGET /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 requiseGET /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 datesGET /api/integrations/adsLister les comptes publicitaires connectés d'un sitePOST /api/integrations/adsConnecter un compte publicitaire Meta avec un jeton d'utilisateur systèmeDELETE /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