SEO
Verfolgen Sie lokale Keyword-Rankings auf einem geografischen Raster sowie die Wettbewerberposition.
Liefert verfolgte Keywords, den monatlichen Ranking-Trend, das Ranking-Raster und Kennzahlkarten für einen Standort. Übergeben Sie keywordId, um das Raster auf ein einzelnes Keyword zu beschränken, oder month (YYYY-MM), um es auf einen bestimmten Monat statt auf den zuletzt gemessenen Bericht jedes Keywords festzulegen.
Ranking-Übersicht eines Standorts abrufen
/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
}
}Beginnt die Verfolgung eines oder mehrerer Keywords auf dem lokalen Ranking-Raster eines Standorts und konfiguriert beim ersten Einrichten des Standorts die Rastergröße und den Radius. Keywords werden ohne Beachtung der Groß-/Kleinschreibung dedupliziert und sind auf 25 pro Standort begrenzt. Löst für jedes neu hinzugefügte Keyword einen Hintergrund-Ranking-Scan aus — fragen Sie danach GET /api/v1/seo/keywords per Polling ab, um die Ergebnisse eintreffen zu sehen.
Verfolgte Keywords zu einem Standort hinzufügen
/api/v1/seo/keywords{
"data": {
"keywords": [
{
"id": "cm_kw_abc123",
"keyword": "dentist near me"
}
]
}
}Beendet die Verfolgung eines Keywords und löscht dessen gespeicherte Ranking-Berichte.
Ein verfolgtes Keyword entfernen
/api/v1/seo/keywords{
"data": {
"removed": true
}
}Aktualisiert die Raster-Messkonfiguration eines Standorts: Rastergröße, Abstand zwischen Punkten, ausgeschlossene Rasterpunkte oder ob Wasser-Rasterpunkte in die Statistik einfließen. Übergeben Sie nur die zu ändernden Felder. Wasserpunkte werden ohnehin immer abgefragt — includeWaterPoints steuert nur, ob sie gezählt und angezeigt werden. Die Lese-Seite wird bereits von GET /api/v1/seo/keywords abgedeckt, dessen Antwort includeWaterPoints bereits enthält.
Raster-Konfiguration eines Standorts aktualisieren
/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"
}
}
}Erstellt den gebrandeten, in Abschnitte konfigurierbaren Ranking-Bericht — dieselbe Aktion "Bericht herunterladen" in der App. Liefert gerendertes HTML, kein binäres PDF: Das Rendern zu PDF geschieht im Browser (serverseitig läuft kein Headless-Chrome-Renderer), sodass das Erzeugen einer tatsächlichen PDF-Datei beim Aufrufer liegt — dieselbe Einschränkung, die die eigene UI der App hat. Unterscheidet sich von POST /api/v1/seo/reports/generate, das nur einen Hintergrund-Scan des Ranking-Rasters einreiht und kein Dokument liefert.
Einen gebrandeten Ranking-Bericht herunterladen
/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"
}
}Liefert eine zusammenfassende Zeile je Standort mit mindestens einem Ranking-Bericht, optional eingeschränkt auf einen Kunden und/oder Standort-Tags. Ein auf bestimmte Kunden beschränkter Schlüssel muss clientId übergeben.
Standortübergreifendes Ranking-Rollup abrufen
/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"
]
}
]
}
}Liefert die Unternehmen, die das Ranking-Raster dieses Standorts für sein zuletzt verfolgtes Keyword dominieren, gerankt danach, wie viel des Rasters sie in den Top 3 belegen. Enthält das eigene Unternehmen (isYou) zum Vergleich und markiert Einträge, die bereits in Ihrer Wettbewerber-Verfolgungsliste stehen, mit deren Registrierungs-ID.
Wettbewerber-Rangliste eines Standorts abrufen
/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"
}
]
}
]
}
}Liefert den durchschnittlichen Rang je Monat für jeden Wettbewerber über die verfolgte Ranking-Historie dieses Standorts (bis zu den letzten 12 gemessenen Monaten), für das Rang-Trend-Diagramm. Enthält das eigene Unternehmen (isYou).
Wettbewerber-Rangtrends im Zeitverlauf abrufen
/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
]
}
]
}
}Liefert die an einer einzelnen Rasterzelle für ein Keyword erfassten lokalen Suchergebnisse, in Rangfolge.
Unternehmen an einem Rasterpunkt abrufen
/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
}
]
}
}Löst einen Hintergrund-Rescan des lokalen Ranking-Rasters für einen Standort und/oder ein bestimmtes verfolgtes Keyword aus. Dies ist fire-and-forget: Der Aufruf kehrt sofort zurück, sobald der Job eingereiht ist, und der neue Bericht trifft asynchron ein — fragen Sie danach GET /api/v1/seo/keywords (oder GET /api/v1/seo/competitors usw.) per Polling ab, um ihn zu sehen.
Ranking-Raster-Bericht eines Standorts neu generieren
/api/v1/seo/reports/generate{
"data": {
"generating": true
}
}