Auf dieser Seite
- Entpackte Erweiterung installieren
- Beginnen Sie mit einer realen Aufgabe.
- Anreicherung in eine gespeicherte Liste zurückschreiben.
- Unternehmens-Homepage prüfen
- REST API
- Einen begrenzten Auftrag erstellen
- Häufige Fehler
- KI-Suchantwort prüfen
- Suchen Sie einen Bereich und rufen Sie weitere Seiten ab
- Recherche innerhalb eines Polygons planen
- Exportieren Sie die gespeicherte Seitenkette.
- Analysieren Sie Rezensionsthemen mit zitierten Belegen.
- Kundenbericht erstellen und freigeben
- Erstellen einer gespeicherten PDF-Datei
- Empfangen Sie signierte Auftragsbelege.
- Ergebnisse an Google Tabellen, Zapier, Make oder n8n senden
- Wichtige Abgrenzungen
Entpackte Erweiterung installieren
Die Erweiterung verbindet sich mit Ihrer Workspace-API. Die Verteilung über den Chrome- und Edge-Store ist nicht genehmigt.
- Erweiterungspaket herunterladen und entpacken.
- In Chrome
chrome://extensionsöffnen. In Edgeedge://extensionsöffnen. Entwicklermodus aktivieren, „Entpackt laden“ auswählen und den entpackten Ordner auswählen. - Öffnen Sie die Erweiterung und wählen Sie „Mit MapsScraper.dev verbinden“. Melden Sie sich auf der geöffneten Seite an, wo der Inhaber oder ein Administrator des Arbeitsbereichs freigibt; die Erweiterung erhält dann einen eigenen Schlüssel für diese Browsersitzung. Alternativ können Sie einen Arbeitsbereich-API-Schlüssel mit dem Zugriff „Begrenzte Aufgaben lesen und ausführen“ aus „API und Schlüssel“ einfügen.
- Wählen Sie Ihre Sprache, übernehmen Sie Ihre aktuelle Maps-Suche, legen Sie Datensatz- und Einheitenlimit fest und starten Sie. Die Suche wird nur gesendet, wenn ihre Schätzung in Ihr Einheitenlimit passt.
- Verwenden Sie „Ursprüngliche Übermittlung wiederherstellen“, wenn eine Antwort verloren geht. Wenn die Sitzung beendet wurde, prüfen Sie den Aufgabenverlauf, bevor Sie die Übermittlung wiederholen.
Beginnen Sie mit einer realen Aufgabe.
- Erstellen Sie einen Arbeitsbereich und öffnen Sie „Unternehmen entdecken“.
- Geben Sie eine Abfrage mit dem Standort ein, z. B. „Zahnärzte in Austin, TX“.
- Wählen Sie Ihr Datensatzlimit und optionale Filter. Filter werden nach dem Abruf angewendet.
- Überprüfen Sie die maximale Einheitennutzung. Die Anreicherung erhöht das reservierte Limit.
- Ausführen, Quellen prüfen, Unternehmen auswählen und in einer Liste speichern oder als CSV exportieren.
Anreicherung in eine gespeicherte Liste zurückschreiben.
Wählen Sie in „Gespeicherte Listen“ Datensätze mit einer Quell-ID aus und autorisieren Sie „Ausgewählte anreichern“ mit dem maximalen Einheitenbudget. „Rückschreiben überprüfen“ öffnet den neuen Stapel; ausstehende Aufgaben bleiben bis zu einer späteren Vorschau übersprungen. Sie können auch einen vorhandenen Detail- oder Anreicherungsstapel aus der Listensymbolleiste auswählen.
Vorschau der angeforderten IDs und Vorher/Nachher-Vergleich erweitern. Leere Felder ausfüllen behält vorhandene Werte bei; ausgewählte Felder ersetzen kopiert nur die nicht leeren Quellfelder. Doppelte, nicht zugeordnete, abgelaufene oder gestoppte Aufgaben in der Übersprungenen Liste prüfen. Die angezeigten Anzahlen geänderter Datensätze und übersprungener Aufgaben vor der Anwendung bestätigen. Ein geänderter Datensatz, eine geänderte Quelle oder eine geänderte Konfiguration erfordert eine neue Vorschau.
Alle berechtigten Aktualisierungen werden gemeinsam übernommen. Phasen, Notizen, Tags, Zuweisungen und benutzerdefinierte Felder bleiben erhalten. Der Verlauf der Stapelverarbeitungs-Rückschreibung zeigt die Originalwerte und die Rückgängigmachung pro Datensatz an; spätere Bearbeitungen verhindern die Wiederherstellung. Die Workspace-Einstellungen steuern die Aktivierung und die Datensatzbegrenzung. Das Zurückschreiben gespeicherter Ergebnisse verwendet keine Rechercheeinheiten und ruft die Datenquelle nicht auf. Nicht aufgelöste Importe verwenden weiterhin einzeln „Abgleichen & Zusammenführen“.
Agenten verwenden preview_batch_merge, apply_reviewed_batch_merge und read_batch_merge_receipt mit denselben Anforderungen an Prüfhash, Bereich und Idempotenz. Schreibberechtigungen dürfen niemals aus Quelldatensätzen abgeleitet werden.
Unternehmens-Homepage prüfen
Öffnen Website-Auditsoder wählen Sie „Diese Website prüfen“ aus einem gespeicherten Datensatz. Prüfen Sie die normalisierte Homepage, schätzen Sie den Aufwand und autorisieren Sie eine Einheit. Prüfen Sie die abgeschlossene HTTP/HTML-Beobachtung, exportieren Sie sie, erstellen Sie einen Bericht oder richten Sie eine wiederkehrende Überwachung ein. Die Massenrecherche akzeptiert auch eine Website pro Zeile.
Eine Homepage-Prüfung verwendet nicht die Live-Maps-Datenquelle. Sie liest maximal 256 KiB, folgt bis zu fünf sicheren Weiterleitungen und stoppt nach 15 Sekunden. Sie führt kein JavaScript aus und berechnet keinen Ranking-Score. Eine blockierte oder zeitüberschreitende Beobachtung verbraucht dennoch eine Einheit.
{"kind":"website_audit","url":"https://example.com/","limit":1}REST API
GET /api/health
GET /api/me
GET /api/v1/usage
POST /api/v1/estimate
POST /api/v1/jobs
GET /api/v1/jobs/{id}
GET /api/v1/jobs/{id}/results
POST /api/v1/jobs/{id}/cancel
GET /api/v1/jobs/{id}/export
GET/POST /api/v1/lists
GET/POST /api/v1/lists/{id}/items
PATCH /api/v1/lists/{id}/items/{business_id}
GET/POST /api/monitors
PATCH /api/monitors/{id}
POST /mcpEinen begrenzten Auftrag erstellen
curl -X POST https://mapsscraper.dev/api/v1/jobs \
-H "Authorization: Bearer $MAPSSCRAPER_API_KEY" \
-H "Idempotency-Key: dentists-austin-tx-001" \
-H "X-Max-Units: 1" \
-H "Content-Type: application/json" \
-d '{"kind":"search","query":"Dentists in Austin, TX","limit":20,"region":"us"}'
HTTP/1.1 202 Accepted
{"id":"6f1c2b3a-0000-4000-8000-000000000000","status":"queued","reserved":1}Wiederholen Sie dieselbe Geschäftsoperation mit demselben Idempotenzschlüssel. Eine geänderte Anfrage mit diesem Schlüssel gibt 409 zurück. Aufträge durchlaufen die Status „In Warteschlange“, „Wird ausgeführt“, „Abgeschlossen“, „Teilweise“, „Fehlgeschlagen“, „Abgebrochen“ oder „Unsicher“. Eine unsichere Anfrage an die Datenquelle erfordert einen Abgleich statt einer automatischen kostenpflichtigen Wiederholung.
Die meisten Aufgaben verbrauchen eine Einheit. Kontaktanreicherung bei einer Suche oder einem Ranking-Snapshot reserviert eine weitere Einheit pro angefordertem Datensatz und berechnet nur gelieferte Datensätze. Unternehmensdetails verbrauchen eine Einheit, mit Kontakten zwei; Anreicherung verbraucht zwei. Setzen Sie X-Max-Units mindestens auf die Schätzung.
Schätzen Sie in Python die Aufgabe ab, erstellen Sie den Job mit der Bibliothek requests, warten Sie auf einen Endstatus und lesen Sie die gespeicherten Ergebnisse:
import os
import time
import uuid
import requests
API = "https://mapsscraper.dev/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['MAPSSCRAPER_API_KEY']}"}
task = {"kind": "search", "query": "Dentists in Austin, TX", "limit": 20, "region": "us"}
# An estimate reserves nothing.
units = requests.post(f"{API}/estimate", json=task, headers=HEADERS, timeout=30).json()["units"]
# Keep the key: a retry of the same task must send it again.
key = str(uuid.uuid4())
job = requests.post(
f"{API}/jobs",
json=task,
headers={**HEADERS, "Idempotency-Key": key, "X-Max-Units": str(units)},
timeout=30,
)
job.raise_for_status()
job_id = job.json()["id"]
while True:
status = requests.get(f"{API}/jobs/{job_id}", headers=HEADERS, timeout=30).json()["status"]
if status not in ("queued", "running"):
break
time.sleep(5)
if status in ("completed", "partial"):
page = requests.get(
f"{API}/jobs/{job_id}/results",
params={"offset": 0, "limit": 100},
headers=HEADERS,
timeout=30,
).json()
for business in page["items"]: # follow page["next_offset"] for more
print(business.get("name"), business.get("phone_number"), business.get("website"))Häufige Fehler
Jede Fehlerantwort ist JSON mit einem stabilen Code, manche enthalten zusätzliche Details. Verzweigen Sie anhand des Codes; mehrere Codes können denselben HTTP-Status haben.
{"error":{"code":"TASK_BUDGET_TOO_LOW","details":{"needed":11,"max_units":5}}}| HTTP-Status | Fehlercode | Details |
|---|---|---|
400 | VALIDATION_ERRORINVALID_JSONINVALID_TASKIDEMPOTENCY_KEY_REQUIRED | Der Body, ein Header oder ein Parameter fehlt oder ist ungültig. Korrigieren Sie die Anfrage, bevor Sie es erneut versuchen. |
400 | TASK_BUDGET_REQUIRED | X-Max-Units fehlt oder ist keine ganze Zahl von 1 bis 10000. |
401 | UNAUTHORIZED | Melden Sie sich an oder verwenden Sie einen gültigen Schlüssel. |
403 | INSUFFICIENT_SCOPEWORKSPACE_ACCESS_REVOKED | Ihr Schlüssel oder Ihre Mitgliedschaft erlaubt diese Aktion nicht. |
404 | NOT_FOUND | Die Ressource existiert in diesem Arbeitsbereich nicht. |
405 | METHOD_NOT_ALLOWED | MCP akzeptiert nur POST-Anfragen. GET und DELETE liefern diesen Code mit dem Header Allow: POST. |
409 | IDEMPOTENCY_CONFLICT | Ein Idempotenzschlüssel wurde für eine geänderte Anfrage wiederverwendet. |
409 | JOB_NOT_CANCELLABLE | Die Aufgabe wurde bereits an die Datenquelle gesendet oder ist abgeschlossen und kann daher nicht abgebrochen werden.details.status |
410 | RESULT_EXPIRED | Das aufbewahrte Ergebnis ist abgelaufen. Starten Sie eine neue Aufgabe, um es erneut abzurufen. |
410 | WORKSPACE_UNAVAILABLE | Der Arbeitsbereich wird gerade gelöscht. Anfragen an ihn werden abgelehnt. |
422 | TASK_BUDGET_TOO_LOW | Die Schätzung liegt über Ihrem Budget in X-Max-Units.details.needed, details.max_units |
422 | INSUFFICIENT_BALANCE | Die verfügbaren Einheiten liegen unter dem Maximum der Aufgabe.details.needed, details.available |
422 | DAILY_BUDGET_EXCEEDED | Die Aufgabe würde das tägliche Einheitenlimit des Workspace überschreiten.details.needed, details.daily_limit, details.used_today |
422 | PENDING_LIMIT_REACHED | Es befinden sich bereits zu viele Aufgaben in der Warteschlange oder in Ausführung.details.pending, details.max_pending |
422 | WORKSPACE_LIMIT_OR_BALANCE_EXCEEDED | Die verfügbaren Einheiten oder ein Aufgabenlimit des Arbeitsbereichs reichen nicht aus. |
423, 409 | WORKSPACE_DELETION_PENDING | Der Arbeitsbereich befindet sich in der Übergangsfrist vor der Löschung. Änderungen werden mit 423 abgelehnt, während Lesen, Exporte, Kontoaktionen und schreibgeschützte MCP-Tools weiterhin funktionieren. Ein 409 mit diesem Code oder WORKSPACE_NOT_ACTIVE tritt nur auf, wenn die Löschung beginnt, während eine Aufgabe angenommen wird. |
429 | RATE_LIMITED | Ein Ratenlimit wurde erreicht. Warten Sie die in Retry-After angegebenen Sekunden und versuchen Sie es dann erneut. |
429 | RESEARCH_DAILY_LIMIT_REACHED | Das heutige Kontingent für Live-Recherche ist aufgebraucht. Warten Sie die in Retry-After angegebenen Sekunden bis zum nächsten UTC-Tag. Es wird nichts reserviert. |
500 | INTERNAL_ERROR | Ein unerwarteter Fehler ist aufgetreten. Versuchen Sie es später mit demselben Idempotenzschlüssel erneut. |
503 | PROVIDER_NOT_CONFIGURED | Live-Recherche ist für diesen Arbeitsbereich nicht freigegeben, oder die Datenquelle der Aufgabe ist nicht konfiguriert. |
KI-Suchantwort prüfen
Die Sichtbarkeit der KI-Suche behält eine Google AI Overview-Beobachtung bei: die Frage, das Land, die Sprache, optional die Stadtpräferenz, den Antworttext und sichere Zitationslinks. Fügen Sie bis zu fünf Markennamen und Domains hinzu, überprüfen Sie das Maximum von einer Einheit und autorisieren Sie die Aufgabe anschließend explizit. Ihr Administrator muss den Arbeitsbereich aktivieren und eine lizenzierte Quelle verbinden.
Überprüfen Sie den Verlauf oder exportieren Sie Nachweise ohne erneuten Aufruf der Datenquelle. Vergleichen Sie Baselines nur, wenn die Suchanfrage, das Gebietsschema und die Ziele übereinstimmen. Eine fehlende Übersicht bedeutet unbekannte Sichtbarkeit; die Zitationsreihenfolge entspricht nicht dem Suchrang. Unvollständige Nachweise können keine negative Übereinstimmung herstellen. Multi-Engine-Tracking ist nicht verfügbar.
Um einen festen Satz von Fragen zu verfolgen, kann ein verifizierter Eigentümer oder Administrator eine wiederkehrende Serie planen: bis zu 10 Prompts, alle 24 bis 720 Stunden, für höchstens 30 Beobachtungen innerhalb von 90 Tagen. Prüfen Sie die maximalen Einheiten für die gesamte Serie und bestätigen Sie sie ausdrücklich. Eine Serie pausiert, wenn sich ihre Autorisierung oder Konfiguration ändert oder eine Beobachtung fehlschlägt oder unsicher ist; das Fortsetzen erfordert eine neue Vorschau.
Suchen Sie einen Bereich und rufen Sie weitere Seiten ab
Wählen Sie in Explore eine Textposition, eine Punktpräferenz, einen Radius oder einen Begrenzungsrahmen. Die Punktpräferenz ist keine Begrenzung. Ergebnisse mit Radius und Rahmen schließen außerhalb oder unbrauchbar liegende Koordinaten aus und behalten die Ausschlussanzahl bei. Die Arbeitsbereichseinstellungen steuern Radius und Rahmengröße. Teilen Sie einen Bereich, der die Antimeridiane schneidet; eine begrenzte Stichprobe beweist keine vollständige Abdeckung.
Rezensionen und Fotometadaten erlauben bis zu 100 Datensätze pro Quellseite. Öffnen Sie nach Abschluss eines Ergebnisses die Ergebnisseiten in „Erkunden“ oder im Aufgabenverlauf. Überprüfen Sie die genauen Quelloptionen, aktivieren Sie das Kontrollkästchen für die Autorisierung und legen Sie ein Budget für den Abruf einer weiteren Seite fest. Sortierung, Sprache, Übersetzung und Filter bleiben für die Kette unverändert. Fehlende oder wiederholte Cursor, Ablauf, konfigurierte Limits und unsichere Ergebnisse stoppen die Fortsetzung.
Das Lesen der nächsten gespeicherten Datensatzseite und das Exportieren einer vorhandenen Seite rufen die Datenquelle nicht auf. Das Abrufen einer neuen Quellseite ist ein separater kostenpflichtiger Vorgang. Lesen Sie für SDK und Agenten die Fortsetzungsvorschau und übermitteln Sie dann die genaue Aufgabe mit einem stabilen Idempotenzschlüssel und einem expliziten Budget. Planen oder stapeln Sie keine Cursorfortsetzungen.
Recherche innerhalb eines Polygons planen
Wählen Sie in „Erkunden“ die Option „Polygonbegrenzung“ für eine Anfrage mit begrenztem Rechteck und exakter Polygonfilterung. Wählen Sie in der Massenrecherche die Option „Polygonbegrenzung“, um ein GeoJSON-Polygon zu importieren oder einzufügen, seine Form zu überprüfen und Zeilen, Spalten und Datensätze pro Zelle auszuwählen. Die schematische Darstellung zeigt Koordinaten und geplante Zellen; es handelt sich nicht um eine Straßenkarte.
Positionen verwenden [Längengrad, Breitengrad]. Schließen Sie jeden Ring, indem Sie seine erste Position wiederholen; der erste Ring ist der äußere Rand, und bis zu vier zusätzliche Ringe sind ausgeschlossene Löcher. Selbstüberschneidungen, sich berührende oder überlappende Löcher und Antimeridiankreuzungen werden abgelehnt. Verwenden Sie separate Polygone über die Datumsgrenze hinweg. Arbeitsbereichseinstellungen begrenzen Positionen, Spannweite und geplante Zellen.
„Zellen überprüfen & Gesamtbudget“ ruft die Datenquelle nicht auf. Überprüfen Sie jede beibehaltene Zelle, legen Sie die maximale Anzahl an Einheiten fest und bestätigen Sie explizit vor der Ausführung. Alle Aufgaben werden zusammen reserviert oder keine wird zugelassen. Belege bewahren den ursprünglichen Plan und die Konfigurationsversion. Ein Quellenergebnis wird sowohl nach Polygon als auch nach Zelle gefiltert; gemeinsame Kanten können zu doppelten Unternehmenseinträgen führen. Die angeforderte Datensatzanzahl ist ein Maximalwert, keine vollständige Erfassung.
Agenten verwenden preview_polygon_plan, gefolgt von create_reviewed_polygon_batch, mit exakt demselben Kompaktplan, Vorschau-Hash, Bestätigungs-, Stabilitätsschlüssel- und Gesamtbudget. Verwenden Sie die vorhandenen Steuerelemente für Batchverlauf, Stornierung und Ergebnis-/Export pro Vorgang. Unsichere Ergebnisse werden niemals automatisch erneut gescannt.
Exportieren Sie die gespeicherte Seitenkette.
Öffnen Sie auf den Ergebnisseiten „Mehrseitige Exporte“ und wählen Sie „Vollständigen Export der Prüfkette prüfen“. Überprüfen Sie die Seiten anhand der ausgewählten Aufgabe, wählen Sie, ob der erste Datensatz für jede exakte ID oder alle Datensätze beibehalten werden sollen, und bestätigen Sie anschließend den privaten Export. Dabei werden keine neuen Daten abgerufen oder Rechercheeinheiten verwendet. Exporte werden auch in den Datensteuerungen mit Fortschritts-, Stornierungs- und Integritätsbestätigungen angezeigt.
Nach Abschluss des Vorgangs können Sie JSONL, JSON, CSV oder Excel herunterladen. Doppelte IDs mit geändertem Inhalt werden als Konflikte gewertet; der erste Datensatz bleibt erhalten. Datensätze ohne IDs bleiben separat. Jede Quellseite verfügt über einen eigenen verifizierten JSONL-Abschnitt, sodass eine fehlgeschlagene Übertragung abschnittsweise fortgesetzt werden kann. Excel unterstützt bis zu 5 MB an gespeicherten Abschnitten; größere Exporte verwenden die Streaming-Formate. CSV speichert zusätzliche Spalten in extra_fields_json.
Eigentümer und Administratoren konfigurieren in den Einstellungen tägliche Anfragen, ausstehende Exporte, Seiten- und Quellbyte-Limits sowie die Aufbewahrungsdauer. Es gilt immer das früheste Ablaufdatum der Quelle. Behalten Sie die vollständige Markierung beim Konsum von JSON oder JSONL bei und überprüfen Sie heruntergeladene Teile anhand ihrer SHA-256-Prüfbelege. Eine eingefrorene Kette ist eine gespeicherte Stichprobe, kein Nachweis für eine vollständige Marktabdeckung.
Analysieren Sie Rezensionsthemen mit zitierten Belegen.
Beginnen Sie mit einem Rezensionsstatistikbericht unter „Berichte“. Ein Eigentümer oder Administrator aktiviert die KI-Rezensionsanalyse unter „Einstellungen & Nutzung“ und legt tägliche Versuche, ausstehende Aufgaben, die Anzahl der Auszüge und die Lebensdauer der Warteschlange fest. Diese Funktion ist standardmäßig deaktiviert.
Wählen Sie „Eingabe der Analyse prüfen“, um die genauen Auszüge und das Modell zu überprüfen, bevor Sie eine Generierung autorisieren. Bis zu 40 verschiedene Auszüge und 10 KB Auszugstext werden in Berichtsreihenfolge ausgewählt. Eine Generierung hat eigene Obergrenzen für die KI-Analyse und verwendet keine Maps-Wallet-Einheiten. Fehlgeschlagene oder abgebrochene Versuche werden weiterhin gezählt.
Jedes gespeicherte Thema enthält geprüfte Zitate und Quellenangaben. Die Zählungen basieren auf eindeutigen zitierten Auszügen, Themen können sich überschneiden und KI-Interpretationen können fehlerhaft sein. Das Ergebnis wird als separater Bericht geöffnet: Prüfen Sie ihn unter Berichte und wählen Sie dann aus, was Sie teilen oder als PDF exportieren möchten. Wenn Sie die Spalte „Rezensionsauszug“ ausblenden, wird auch die KI-Analyse ausgeblendet.
Auszüge ohne unterstützte Kundenerfahrung können eine Bestätigung mit unzureichenden Nachweisen ohne Bericht zurückgeben. Der Versuch wird dennoch auf die Limits angerechnet. Prüfen Sie die Eingabe, bevor Sie eine andere Analyse autorisieren. Ein Funktions-Upgrade stoppt ältere Genehmigungen in der Warteschlange vor der Auswertung; prüfen Sie eine neue Vorschau. Bestehende Berichte behalten ihr ursprüngliches Modell und ihre ursprüngliche Prompt-Version.
Belege zeigen Ergebnisse in der Warteschlange, laufende, abgeschlossene, fehlgeschlagene, unsichere, abgebrochene oder abgelaufene Ergebnisse an. Ein Abbruch verhindert die Berichtserstellung, obwohl eine ausgelöste Analyse weiterhin auf die Limits angerechnet wird. Unsichere Aufrufe werden nie automatisch wiederholt. API, SDK und MCP verwenden denselben Vorschau-Hash, dieselbe explizite Bestätigung und denselben Idempotenzschlüssel.
Kundenbericht erstellen und freigeben
Erstellen Sie in „Berichte“ einen Bericht aus abgeschlossenen Recherchen. Bearbeiten Sie Titel, Marke, Abschnittsreihenfolge und Spalten für Nachweise und speichern Sie die Präsentation. Die Workspace-Einstellungen bieten Standard-Markenfarben, ein eingebettetes PNG-Logo, die Website des Herausgebers und eine Fußzeile. Vorhandene gespeicherte Präsentationen ändern sich nur, wenn Sie sie bearbeiten oder die Workspace-Standardeinstellungen anwenden.
Der freigegebene geprüfte Bericht zeigt die exakte öffentliche Projektion. Nicht ausgewählte Nachweisfelder und ausgeblendete Abschnitte werden vom gespeicherten Snapshot ausgeschlossen. Quellabfragen sind standardmäßig privat; die Methodik bleibt sichtbar. Wählen Sie alle Empfänger mit dem Link oder bis zu 25 verifizierte E-Mail-Konten aus, legen Sie ein Ablaufdatum fest und bestätigen Sie explizit Inhalt und Zielgruppe. Sie können auch ein Freigabepasswort festlegen und dieses separat vom Link senden. Die Workspace-Richtlinie kann Passwörter für jede Ergebnis-/Berichtsfreigabe vorschreiben. Es wird keine Einladung oder E-Mail versendet.
Kopieren Sie den vollständigen Link einmal. Das Geheimnis bleibt in seinem Fragment erhalten und wird nicht im Browserspeicher abgelegt. Ein Empfänger mit eingeschränktem Zugriff meldet sich mit einem verifizierten Konto an, öffnet den ursprünglichen Link und gibt das Freigabepasswort ein, wenn er dazu aufgefordert wird. Passwörter können nicht wiederhergestellt werden; bei Verlust eines Passworts muss dieses widerrufen und ein Ersatzlink erstellt werden. Die Gültigkeitsdauer ist durch die Aufbewahrungsfrist der Quelle begrenzt. Datenkontrollen können zukünftigen Zugriff verhindern; gelöschte Berichte, abgelaufene Quellen und pausierte Arbeitsbereiche verhindern neue Lesevorgänge. Heruntergeladene Kopien können nicht wiederhergestellt werden. JSON und die Browserfunktionen „PDF drucken/speichern“ verwenden die angezeigte Darstellung. „Gespeichertes PDF generieren“ erstellt eine private Datei aus der gespeicherten Version im A4- oder Letter-Format und im Hoch- oder Querformat. Fertige Dateien können einer passenden, geprüften Freigabe hinzugefügt werden und übernehmen deren Zugriffsregeln.
Agenten verwenden preview_report_delivery, update_report_presentation, create_reviewed_report_share, list_report_shares und revoke_report_share. Für die Veröffentlichung sind die geprüfte Version, der Snapshot-Hash, ein stabiler Idempotenzschlüssel und eine explizite Freigabeberechtigung erforderlich. Externe Forschungstexte können diese Berechtigung nicht erteilen.
Erstellen einer gespeicherten PDF-Datei
Speichern Sie die Präsentation, wählen Sie Papier und Ausrichtung beim PDF-Export und generieren Sie anschließend. Der Verlauf zeigt Anfragen in der Warteschlange, Rendering-Prozesse, abgeschlossene und abgebrochene Anfragen mit Download- oder Abbruchoptionen an. Die Arbeitsbereichseinstellungen steuern die Aktivierung, tägliche Anfragen, ausstehende Anfragen und die Aufbewahrungsdauer. Dateien verfallen mit ihren Quellen oder nach Ablauf der konfigurierten Aufbewahrungsfrist, je nachdem, was zuerst eintritt. Das Rendering verbraucht keine Forschungseinheiten. Fehlgeschlagene oder unsichere Renderings erfordern eine neue explizite Anfrage; sie werden nicht automatisch wiederholt.
Agenten verwenden generate_report_pdf mit der geprüften Version, dem Snapshot-Hash, confirmed_render und einem Idempotenzschlüssel. list_report_pdfs und get_report_pdf prüfen Empfangsbestätigungen; cancel_report_pdf stoppt die ausstehende Veröffentlichung. Generieren erstellt keine Freigabe und sendet keine Nachricht. Routen für private Downloads und Empfängeranhänge sind in OpenAPI verfügbar.
Empfangen Sie signierte Auftragsbelege.
Fügen Sie in den Integrationen einen öffentlichen HTTPS-Empfänger hinzu. Speichern Sie dessen einmaliges Signaturgeheimnis sicher, aktivieren Sie die Zustellung unter Einstellungen & Nutzung und aktivieren Sie anschließend explizit das Ziel. Wählen Sie abgeschlossene, teilweise abgeschlossene, fehlgeschlagene, unsichere oder abgebrochene Jobereignisse aus. Tests senden lediglich ein Testflag und Metadaten.
Jede Zustellung enthält zwei Signaturverfahren. Bei Standard Webhooks besteht webhook-signature aus v1, gefolgt vom base64-kodierten HMAC-SHA256 über webhook-id, webhook-timestamp und den exakten Roh-Body der Anfrage, jeweils durch Punkte verbunden. Der Schlüssel ist die base64-Dekodierung des Texts nach whsec_.
Das ursprüngliche Verfahren bleibt unverändert: X-LocalOS-Signature ist v1= gefolgt vom hexadezimalen HMAC-SHA256 über X-LocalOS-Timestamp, einen Punkt und den Roh-Body, mit dem gesamten whsec_-Geheimnis als Text als Schlüssel. Wählen Sie das Geheimnis anhand von X-LocalOS-Key-ID.
Verlangen Sie bei beiden Verfahren einen Zeitstempel innerhalb von fünf Minuten und vergleichen Sie Signaturen in konstanter Zeit. Die Ereignis-ID in webhook-id und X-LocalOS-Event-ID bleibt über Wiederholungen gleich: Speichern Sie sie eindeutig, bevor Sie Änderungen anwenden, und bestätigen Sie Duplikate mit einer 2xx-Antwort.
Standard-Webhooks-Signatur in Node.js prüfen:
// Verifies a webhook delivery with Web Crypto only, so it runs on
// Node.js 20+, Deno, Bun and Cloudflare Workers without dependencies.
// const event = await verifyWebhook({ secret, headers, body });
// secret: "whsec_..." or, while rotating, ["whsec_new", "whsec_old"].
// headers: a Headers object or a plain map such as req.headers.
// body: the raw body as text or bytes, before any JSON parsing.
// Returns the parsed event. Otherwise throws an error whose code says
// why the delivery must not be trusted.
export class WebhookVerificationError extends Error {
constructor(code) {
super(code);
this.name = "WebhookVerificationError";
this.code = code;
}
}
const encoder = new TextEncoder();
function header(headers, name) {
if (typeof headers.get === "function") {
return headers.get(name) ?? undefined;
}
for (const [key, value] of Object.entries(headers)) {
if (key.toLowerCase() === name) {
return Array.isArray(value) ? value[0] : value;
}
}
return undefined;
}
function base64(value) {
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(value) || value.length % 4) {
return null;
}
try {
return Uint8Array.from(atob(value), (c) => c.charCodeAt(0));
} catch {
return null;
}
}
// Checks every byte, so the time taken does not reveal a mismatch.
function sameBytes(a, b) {
if (a.length !== b.length) return false;
let difference = 0;
for (let i = 0; i < a.length; i++) difference |= a[i] ^ b[i];
return difference === 0;
}
export async function verifyWebhook({
secret,
headers,
body,
toleranceSeconds = 300,
}) {
if (!Number.isFinite(toleranceSeconds) || toleranceSeconds < 0) {
throw new RangeError("toleranceSeconds must be 0 or more");
}
const fail = (code) => new WebhookVerificationError(code);
const keys = [secret]
.flat()
.map((value) =>
typeof value === "string" ? base64(value.replace(/^whsec_/, "")) : null,
);
if (!keys.length || keys.some((key) => !key?.length)) {
throw fail("WEBHOOK_SECRET_INVALID");
}
const id = header(headers, "webhook-id");
const timestamp = header(headers, "webhook-timestamp");
const signatures = header(headers, "webhook-signature");
if (!id || !timestamp || !signatures) {
throw fail("WEBHOOK_HEADER_MISSING");
}
if (!/^\d{1,12}$/.test(timestamp)) {
throw fail("WEBHOOK_TIMESTAMP_INVALID");
}
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > toleranceSeconds) {
throw fail("WEBHOOK_TIMESTAMP_OUT_OF_RANGE");
}
const subtle = globalThis.crypto?.subtle;
if (!subtle) throw fail("WEBHOOK_CRYPTO_UNAVAILABLE");
const raw =
typeof body === "string" ? encoder.encode(body) : new Uint8Array(body);
const prefix = encoder.encode(`${id}.${timestamp}.`);
const signed = new Uint8Array(prefix.length + raw.length);
signed.set(prefix);
signed.set(raw, prefix.length);
const expected = await Promise.all(
keys.map(async (key) => {
const hmac = await subtle.importKey(
"raw",
key,
{ name: "HMAC", hash: "SHA-256" },
false,
["sign"],
);
return new Uint8Array(await subtle.sign("HMAC", hmac, signed));
}),
);
// Any listed v1 signature may match; at most 16 are checked.
const verified = signatures
.split(" ")
.filter(Boolean)
.slice(0, 16)
.some((entry) => {
const [version, value] = entry.split(",", 2);
const given = version === "v1" && value ? base64(value) : null;
return given !== null && expected.some((d) => sameBytes(given, d));
});
if (!verified) throw fail("WEBHOOK_SIGNATURE_INVALID");
try {
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(raw));
} catch {
throw fail("WEBHOOK_PAYLOAD_INVALID");
}
}Die Zustellung erfolgt mindestens einmal. Netzwerkfehler, Zeitüberschreitungen und jede Antwort außerhalb von 2xx werden wiederholt, auch Weiterleitungen, denen nie gefolgt wird. Bis zu acht Versuche verteilen sich auf etwa 28 Stunden: nach 5 Sekunden, 5 Minuten, 30 Minuten, 2 Stunden, 5 Stunden, dann zweimal nach 10 Stunden, oder später, wenn der Empfänger Retry-After sendet (bis zu einem Tag). Eine 410-Gone-Antwort pausiert das Ziel und bricht seine ausstehenden Zustellungen ab, bis Sie es fortsetzen. Versuche und Fehler erscheinen unter Integrationen. Das Pausieren oder Entfernen eines Ziels bricht ausstehende Belege ab; bereits zugelassene Anfragen können innerhalb von zehn Sekunden abgeschlossen werden. Gespeicherte Zustellbelege enthalten keine Unternehmensdatensätze, Suchbegriffe, Kontozugangsdaten oder Antwortinhalte des Empfängers.
Ergebnisse an Google Tabellen, Zapier, Make oder n8n senden
Diese Rezepte nutzen nur die oben beschriebenen signierten Webhooks und die REST API. Eine Zustellung enthält Aufgaben-ID, Status, berechnete Einheiten und Ergebnisanzahl, aber keine Ergebniszeilen. Behandeln Sie sie als Signal: Entnehmen Sie ihr data.job_id und lesen Sie dann die Aufgabe und ihre Zeilen über die API mit einem schreibgeschützten Schlüssel. Diese Anfragen sind authentifiziert, daher stammen die Zeilen immer aus Ihrem eigenen Arbeitsbereich, auch wenn jemand eine Zustellung fälscht.
Erstellen Sie diesen Schlüssel in API & Schlüssel mit dem Zugriff „Vorhandene Ergebnisse lesen“. Er kann Aufgaben und Exporte lesen, aber keine kostenpflichtige Recherche starten. Jedes Rezept nutzt die allgemeinen Webhook-, Code- und HTTP-Request-Funktionen des Tools; MapsScraper.dev hat in diesen Tools keine eigene App.
Jedes Rezept stellt zwei GET-Anfragen mit dem Schlüssel, gesendet als Authorization: Bearer <key>: zuerst GET /api/v1/jobs/{job_id} und nur wenn dessen status gleich completed oder partial ist, danach GET /api/v1/jobs/{job_id}/export für die Zeilen.
So funktioniert die Zustellung
- Antworten Sie innerhalb von 10 Sekunden mit einem beliebigen 2xx-Status und erledigen Sie langsame Arbeit danach.
- Wiederholungen verwenden denselben Header
webhook-id. Speichern Sie ihn und überspringen Sie bereits verarbeitete Zustellungen. - Eine fehlgeschlagene Zustellung wird wiederholt, bis zu 8 Versuche über etwa 28 Stunden, oder später, wenn Ihr Empfänger
Retry-Aftersendet. Weiterleitungen werden nicht verfolgt. - Eine Antwort
410 Gonepausiert das Ziel und bricht seine ausstehenden Zustellungen ab. Reparieren Sie den Empfänger und schalten Sie das Ziel dann wieder ein.
n8n
Verwenden Sie einen Webhook node, der sofort antwortet, für jede Anfrage einen HTTP Request node mit dem Schlüssel in Zugangsdaten vom Typ Header Auth und dazwischen einen IF node, der den Status prüft. Dieses Rezept prüft die Signatur nicht, sondern verlässt sich stattdessen auf die authentifizierten Anfragen.
Zapier
Der Trigger Catch Raw Hook von Zapier gibt den Body ungeparst zusammen mit den Headern weiter, daher prüft dieses Rezept auch die Signatur. Fügen Sie einen Schritt Code by Zapier hinzu, der JavaScript ausführt, und setzen Sie in seinen Input Data: body auf den rohen Body, id, timestamp und signature auf die Header webhook-id, webhook-timestamp und webhook-signature sowie secret auf das Signaturgeheimnis. Jeder, der den Zap bearbeiten kann, kann dieses Geheimnis sehen.
const crypto = require("crypto");
const { body, id, timestamp, signature, secret } = inputData;
const fresh =
/^\d+$/.test(timestamp || "") &&
Math.abs(Date.now() / 1000 - Number(timestamp)) <= 300;
const key = Buffer.from(
String(secret).replace(/^whsec_/, ""),
"base64",
);
const expected = crypto
.createHmac("sha256", key)
.update(`${id}.${timestamp}.${body}`)
.digest();
const signed = String(signature || "")
.split(" ")
.some((entry) => {
const [version, value = ""] = entry.split(",");
const given = Buffer.from(value, "base64");
return (
version === "v1" &&
given.length === expected.length &&
crypto.timingSafeEqual(given, expected)
);
});
const valid = Boolean(id) && fresh && signed;
if (!valid) return { valid };
return { valid, job_id: JSON.parse(body).data.job_id };Fügen Sie einen Filterschritt hinzu, der nur fortfährt, wenn valid wahr ist, und stellen Sie dann die beiden Anfragen mit GET-Anfrageschritten. Zapier beantwortet die Zustellung mit 200, ob die Prüfung besteht oder nicht, daher stoppt der Filter, nicht die Antwort, eine Zustellung, die sie nicht besteht.
Make
Verwenden Sie ein Modul Custom webhook, das den JSON-Body in Felder zerlegt, für jede Anfrage ein HTTP-Modul und dazwischen einen Filter, der den Status prüft. Make beantwortet die Zustellung selbst mit 200. Wie das n8n-Rezept prüft auch dieses die Signatur nicht, sondern verlässt sich auf die authentifizierten Anfragen.
Google Sheets
Sheets ruft die Zeilen selbst ab, statt sie zugestellt zu bekommen. Öffnen Sie in Ihrer Tabelle Extensions und dann Apps Script und fügen Sie dieses Skript ein. Fügen Sie unter Project Settings eine Skripteigenschaft namens MAPSSCRAPER_API_KEY mit einem schreibgeschützten API-Schlüssel hinzu, damit der Schlüssel weder in den Zellen noch im Code steht.
const API = "https://mapsscraper.dev/api/v1";
function getJson(path) {
const key = PropertiesService.getScriptProperties()
.getProperty("MAPSSCRAPER_API_KEY");
if (!key) throw new Error("Add the MAPSSCRAPER_API_KEY script property.");
const response = UrlFetchApp.fetch(API + path, {
headers: { Authorization: "Bearer " + key },
muteHttpExceptions: true,
});
const status = response.getResponseCode();
const text = response.getContentText();
if (status !== 200) {
throw new Error("HTTP " + status + ": " + text.slice(0, 200));
}
return JSON.parse(text);
}
// Text that starts with =, +, - or @ gets an apostrophe,
// so Sheets keeps it as text instead of running a formula.
function cell(value) {
if (value === null || value === undefined) return "";
if (typeof value === "object") value = JSON.stringify(value);
const formula = typeof value === "string" && /^[=+\-@]/.test(value);
return formula ? "'" + value : value;
}
function importLatestSearch() {
const jobs = getJson("/jobs?page_size=25&kind=search").items;
const job = jobs.find(
(item) => item.status === "completed" || item.status === "partial",
);
if (!job) return;
const path = "/jobs/" + job.id + "/export?format=json";
const rows = getJson(path).items || [];
if (!rows.length) return;
const columns = [];
rows.forEach((row) => Object.keys(row).forEach((name) => {
if (!columns.includes(name)) columns.push(name);
}));
const values = [columns].concat(
rows.map((row) => columns.map((name) => cell(row[name]))),
);
const book = SpreadsheetApp.getActive();
const sheet =
book.getSheetByName("MapsScraper") || book.insertSheet("MapsScraper");
sheet.clearContents();
sheet.getRange(1, 1, values.length, columns.length).setValues(values);
}Führen Sie importLatestSearch aus, um die neueste abgeschlossene Suche in ein Tabellenblatt namens MapsScraper zu kopieren. Um es nach Zeitplan zu aktualisieren, fügen Sie unter Triggers einen zeitgesteuerten Trigger für importLatestSearch hinzu. Apps Script beendet eine Ausführung nach 6 Minuten und kann keine Antwort über 50 MB abrufen. Lesen Sie größere Aufgaben daher seitenweise über GET /api/v1/jobs/{job_id}/results.
Wichtige Abgrenzungen
Fehlende Website bedeutet, dass die Datenquelle keine Website geliefert hat. Dies beweist nicht, dass ein Unternehmen keine Website besitzt. Ranking-Snapshots zeigen die Ergebnisreihenfolge einer Datenquelle, nicht die vollständige lokale SEO-Übersicht. Die Rezensionserfassung ist kein KI-generierter Stimmungsbericht. Fotos sind Metadaten, keine lizenzierten Bild-Downloads. Wiederkehrende Suchen speichern Snapshots, vergleichen stabile Identitäten und erstellen Benachrichtigungen im Workspace-Posteingang. Signierte Webhook-Empfangsbestätigungen sind optional und enthalten nur Aufgabenmetadaten; die CRM-spezifische Feldsynchronisierung bleibt separat.
