SEO
Suivez le classement des mots-clés de recherche locale sur une grille géographique, la position des concurrents, et les insights et recommandations générés par l'IA de Sydekick.
Renvoie les mots-clés suivis, la tendance de classement mensuelle, la grille de classement et les cartes de statistiques pour un établissement. Passez keywordId pour restreindre la grille à un seul mot-clé, ou month (YYYY-MM) pour la figer sur un mois précis plutôt que sur le dernier rapport mesuré de chaque mot-clé.
Obtenir la synthèse de classement d'un établissement
/api/v1/seo/keywords{
"data": {
"keywords": [
{
"id": "cm_kw_abc123",
"keyword": "dentist near me",
"avgRank": 4.2,
"monthly": [
{
"month": "2026-01",
"rank": 5.1
},
{
"month": "2026-02",
"rank": 4.2
}
]
}
],
"months": [
{
"key": "2026-01",
"label": "Jan 2026",
"avgRank": 5.1
},
{
"key": "2026-02",
"label": "Feb 2026",
"avgRank": 4.2
}
],
"grid": [
{
"id": "cm_pt_1",
"row": 0,
"col": 0,
"lat": 30.2682,
"lng": -97.7441,
"rank": 3,
"excluded": false,
"water": false
}
],
"stats": {
"top3Pct": 44,
"top10Pct": 78,
"avgRank": 4.2
},
"statCards": {
"best": {
"keyword": "dentist near me",
"avgRank": 4.2
},
"worst": {
"keyword": "emergency dentist austin",
"avgRank": 9.6
},
"gainer": {
"keyword": "dentist near me",
"from": 5.1,
"to": 4.2
},
"dropper": {
"keyword": "family dentist",
"from": 3.8,
"to": 5.2
},
"notRankingCount": 1,
"noDataCount": 0
},
"center": {
"lat": 30.2672,
"lng": -97.7431
},
"includeWaterPoints": false
}
}Démarre le suivi d'un ou plusieurs mots-clés sur la grille de classement de recherche locale d'un établissement, en configurant la taille de grille et le rayon lors de la première configuration de l'établissement. Les mots-clés sont dédupliqués sans distinction de casse et limités à 25 par établissement. Déclenche une analyse de classement en arrière-plan pour chaque mot-clé nouvellement ajouté — interrogez GET /api/v1/seo/keywords ensuite pour voir les résultats arriver.
Ajouter des mots-clés suivis à un établissement
/api/v1/seo/keywords{
"data": {
"keywords": [
{
"id": "cm_kw_abc123",
"keyword": "dentist near me"
}
]
}
}Arrête le suivi d'un mot-clé et supprime ses rapports de classement stockés.
Retirer un mot-clé suivi
/api/v1/seo/keywords{
"data": {
"removed": true
}
}Met à jour la configuration de mesure de la grille d'un établissement : taille de grille, distance entre les points, points exclus, ou si les points de grille en eau comptent dans les statistiques. Ne transmettez que les champs à modifier. Les points en eau sont de toute façon toujours récupérés — includeWaterPoints contrôle seulement s'ils sont comptés et affichés. Le côté lecture est déjà couvert par GET /api/v1/seo/keywords, dont la réponse inclut déjà includeWaterPoints.
Mettre à jour la configuration de grille d'un établissement
/api/v1/seo/config{
"data": {
"config": {
"id": "cm_cfg_abc123",
"synupLocationId": "os_9f8e7d6c",
"clientLocationId": "cm_loc_1",
"agencyId": "cm_agency_1",
"placeId": "ChIJtXC2rwgF9YgRNh1YJHlA4vQ",
"centerLat": 30.2672,
"centerLng": -97.7431,
"gridSize": 5,
"distanceKm": 1.5,
"excludedPoints": [
{
"row": 4,
"col": 4
}
],
"generationStartedAt": null,
"lastRunStatus": "complete",
"lastError": null,
"includeWaterPoints": true,
"lastGeneratedAt": "2026-02-01T06:00:00.000Z",
"createdAt": "2026-01-10T09:00:00.000Z",
"updatedAt": "2026-02-05T10:00:00.000Z"
}
}
}Génère le rapport de classement personnalisé et à sections configurables — la même action "Télécharger le rapport" dans l'application. Renvoie du HTML rendu, pas un PDF binaire : le rendu en PDF se fait dans le navigateur (aucun moteur de rendu Chrome sans interface ne s'exécute côté serveur), donc la conversion en fichier PDF réel incombe à l'appelant, la même contrainte que celle de l'interface de l'application elle-même. Distinct de POST /api/v1/seo/reports/generate, qui ne fait que mettre en file d'attente un scan de grille de classement en arrière-plan et ne renvoie aucun document.
Télécharger un rapport de classement personnalisé
/api/v1/seo/reports{
"data": {
"html": "<style>#seo-report{width:100%;...}</style><div id=\"seo-report\"><section class=\"cover\"><h1>Ranking Analytics Report</h1><div class=\"biz\">Acme Dental — Downtown</div></section>...</div>",
"filename": "Acme_Dental_Downtown_RankingReport_Jan2026_Feb2026.pdf"
}
}Renvoie une ligne de synthèse par établissement disposant d'au moins un rapport de classement, éventuellement restreinte à un client et/ou à des tags d'établissement. Une clé restreinte à des clients spécifiques doit passer clientId.
Obtenir la synthèse de classement tous établissements
/api/v1/seo/rollup{
"data": {
"count": 2,
"rows": [
{
"id": "cm_loc_1",
"locationName": "Acme Dental — Downtown",
"city": "Austin",
"avgRank": 4.2,
"top3Pct": 44,
"top10Pct": 78,
"bestKeyword": {
"keyword": "dentist near me",
"avgRank": 4.2
},
"tags": [
"priority",
"downtown"
]
}
]
}
}Renvoie les entreprises qui dominent la grille de classement de cet établissement pour son mot-clé le plus récemment suivi, classées selon la part de la grille qu'elles occupent dans le top 3. Inclut votre propre entreprise (isYou) pour comparaison, et signale les entrées déjà présentes dans votre registre de concurrents suivis avec leur ID de registre.
Obtenir le classement des concurrents d'un établissement
/api/v1/seo/competitors{
"data": {
"count": 2,
"competitors": [
{
"id": "cm_comp_1",
"competitorId": "cm_competitor_1",
"name": "Acme Dental — Downtown",
"isYou": true,
"rating": 4.6,
"reviewCount": 210,
"avgRank": 4.2,
"top3Pct": 44,
"gridPoints": 25,
"category": "Dentist",
"website": "https://acmedental.example.com",
"keywordBreakdown": [
{
"keyword": "dentist near me",
"top3Pct": 60
}
],
"featureComparison": [
{
"feature": "Online booking",
"competitor": false,
"you": true
}
],
"hoursComparison": [
{
"day": "Monday",
"competitor": "9am–5pm",
"you": "8am–6pm"
}
]
}
]
}
}Renvoie le classement moyen mensuel de chaque concurrent sur l'historique de classement suivi de cet établissement (jusqu'aux 12 derniers mois mesurés), pour le graphique de tendance de classement. Inclut votre propre entreprise (isYou).
Obtenir les tendances de classement des concurrents dans le temps
/api/v1/seo/competitors/trends{
"data": {
"months": [
"2026-01",
"2026-02"
],
"competitors": [
{
"placeId": "ChIJtXC2rwgF9YgRNh1YJHlA4vQ",
"name": "Acme Dental — Downtown",
"isYou": true,
"monthly": [
5.1,
4.2
]
}
]
}
}Renvoie les résultats de recherche locale capturés à une seule cellule de grille pour un mot-clé, dans l'ordre de classement.
Obtenir les entreprises classées à un point de grille
/api/v1/seo/grid-point{
"data": {
"count": 1,
"businesses": [
{
"id": "cm_biz_1",
"rank": 3,
"name": "Acme Dental — Downtown",
"photoUrl": null,
"rating": 4.6,
"reviewCount": 210,
"category": "Dentist",
"address": "123 Main St, Austin, TX 78701",
"website": null,
"isYou": true
}
]
}
}Déclenche un nouveau scrape en arrière-plan de la grille de classement de recherche locale pour un établissement et/ou un mot-clé suivi spécifique. C'est une opération asynchrone : l'appel renvoie immédiatement une fois le job mis en file, et le nouveau rapport arrive de façon asynchrone — interrogez ensuite GET /api/v1/seo/keywords (ou GET /api/v1/seo/competitors, etc.) pour le voir.
Régénérer le rapport de grille de classement d'un établissement
/api/v1/seo/reports/generate{
"data": {
"generating": true
}
}