Live survey304 models · 14 providers · 22,792 auditsAudited grill-with-docs · SAFE →What changedHow we verifyllms.txt

Agent skill · Audited from source

google-maps-scraper-kit

skill · Mahanaicoach/google-maps-scraper-kitMIT licenceAudited 31 Oct 2026 · source 2c2b01f8fe5e

★ 2,084pushed today
✓SAFEGrade B · 89/100 · 31 Oct 2026 · 2c2b01f
2,084repo stars · whole Mahanaicoach/google-maps-scraper-kit

Is it safe? Yes — SAFE, grade B (89/100). We read this skill's source at commit 2c2b01f8fe5e and observed network access and no hard-coded secrets. What it does: Google Maps scraper for lead generation. Turns a business type and a place into a clean CSV of local businesses by driving the gosom/google-maps-scraper engine, running locally in Docker as a REST API on localhost:8080.…

Ask an AI about this pageGChatGPTCClaudePPerplexityGeGeminiXGrok
More
Cite

Cite this page

ModelsAtlas. “google-maps-scraper-kit (Mahanaicoach/google-maps-scraper-kit)”. Retrieved 31 Oct 2026. https://modelsatlas.com/skills/mahanaicoach/google-maps-scraper-kit

Trust audit

Audit 0.4.1 · source read 31 Oct 2026

Trust score89/100✓SAFE B
0 critical0 high0 medium6 low1 info

SAFE means nothing in the source contradicts what the skill says it does. Grade B is shared by 16,667 of 17,602 audited skills.

What the source does

  • FilesystemNone observedNo reads or writes in the source
  • NetworkDeclared5 observations
  • ShellNone observedNo commands run in the source
  • DependenciesPinnedNothing floats
  • SecretsNone foundNo keys in source

Five audit layers

LayerWhat we checkResultFindings
L0 ProvenanceRepo owner, licence, archive status, activityPASS0
L1 Static sourceSecrets, path traversal, supply chain, hidden codePASS6
L2 InstructionsPrompt injection, authority framing, hidden directivesPASS1
L3 InventoryThe files and declarations match the sourcePASS0
L4 SandboxRun in isolation and watch behaviourSKIPPED why0

Gates applied: no behavioural pass.

Findings (7)

LOWNetwork egressnet.metadata_ip · scripts/test_scrape.py:269
F-04 Network egressCWE-200 · CWE-319Layer L1
for host in ("localhost", "127.0.0.1", "10.0.0.5", "192.168.1.1", "169.254.169.254", "::1", ""):
Why
cloud metadata endpoint: the classic SSRF credential grab
Fix
—
LOWNetwork egressnet.raw_ip · scripts/test_scrape.py:280
F-04 Network egressCWE-200 · CWE-319Layer L1
req = scrape.urllib.request.Request("http://8.8.8.8/")
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.raw_ip · scripts/test_scrape.py:281
F-04 Network egressCWE-200 · CWE-319Layer L1
self.assertIsNone(handler.redirect_request(req, None, 302, "Found", {}, "http://127.0.0.1/admin"))
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.raw_ip · scripts/test_scrape.py:298
F-04 Network egressCWE-200 · CWE-319Layer L1
self.assertEqual(scrape._fetch_html(f"http://127.0.0.1:{srv.server_port}/"), "")
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.raw_ip · scripts/test_scrape.py:482
F-04 Network egressCWE-200 · CWE-319Layer L1
with mock.patch.object(scrape, "BASE", f"http://127.0.0.1:{srv.server_port}"), \
Why
No further detail recorded for this rule.
Fix
—
LOWNetwork egressnet.raw_ip · scripts/test_scrape.py:514
F-04 Network egressCWE-200 · CWE-319Layer L1
with mock.patch.object(scrape, "BASE", f"http://127.0.0.1:{srv.server_port}"), \
Why
No further detail recorded for this rule.
Fix
—
INFOPrompt injectionprompt.conditional_escalation · .claude/skills/google-maps-scraper/SKILL.md:156
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
**Whole-city runs:** when the user says all, every or entire city, or a run returns about 120 rows
Why
No further detail recorded for this rule.
Fix
—

Audit 0.4.1 · source sha 2c2b01f8fe5e · 31 Oct 2026Report an issue or request a re-scan

Provenance

Who published it, and what the verdict is pinned to

  • PublisherMahanaicoach GitHub userOwner of the repository this skill is read from
  • Source folderMahanaicoach/google-maps-scraper-kitThe exact folder we audited
  • LicenceMITAs the repository states it
  • Commit pinned for this verdict2c2b01f8fe5eA new audit runs when the source changes
  • Repository statusNot archivedPushed today
  • Sandboxed runNot runSkills are read, not executed; layer L4 is skipped

What it tells the agent

Full source on GitHub ↗

Its description: Google Maps scraper for lead generation. Turns a business type and a place into a clean CSV of local businesses by driving the gosom/google-maps-scraper engine, running locally in Docker as a REST API on localhost:8080.…

---
name: google-maps-scraper
description: Google Maps scraper for lead generation. Turns a business type and a place into a clean CSV of local businesses by driving the gosom/google-maps-scraper engine, running locally in Docker as a REST API on localhost:8080. Returns 8 lead fields by default (name, phone, email, website, category, address, rating and review count), plus optional social profiles (Instagram, Facebook, LinkedIn, TikTok, YouTube, X), row filters such as businesses without a website, or all 36 raw fields. Use when the user wants a lead list, "a list of [businesses] in [place]", local business data, contact enrichment for places (emails, phones, socials), or a whole-city run past Google's ~120 results per search. Do not use for scraping Instagram, TikTok, YouTube, X or any other social media platform directly.
---

# Google Maps Scraper

Turn a business type and a location into clean lead rows by driving the local engine's job API.

## Mental model
The engine (gosom/google-maps-scraper) runs as a local Docker container with a REST API at
`http://localhost:8080`. It has no auth, so it stays bound to localhost. A scrape is an **async job**:
create it, poll until it is done, then download a CSV. One job can run many keywords. Each result has
up to **36 raw fields**.

## Step 0: Check the engine is running
```bash
curl -s http://localhost:8080/api/v1/jobs >/dev/null 2>&1 && echo UP || echo DOWN
```
If `DOWN` and the working folder has `docker-compose.yml` (the full kit): run `docker compose up -d`
there, wait ~10s, and retry. No `docker-compose.yml`: see the next paragraph. If Docker is not
installed, point the user to
[SETUP.md](https://github.com/Mahanaicoach/google-maps-scraper-kit/blob/master/SETUP.md).

**Skill installed on its own?** `npx skills add` copies this file only, without
`docker-compose.yml` or `scripts/`. If the working folder has no `docker-compose.yml`, start the same
pinned engine with Docker alone:
```bash
docker run -d --name gmaps-scraper --restart unless-stopped -p 127.0.0.1:8080:8080 \
  -v gmaps_data:/gmapsdata \
  gosom/google-maps-scraper:v1.18.1@sha256:e205c02913c5a69c16fc2094b8e5b194a2f655166d2c1126d50548d216e6b1b2 \
  -web -data-folder /gmapsdata -c 4
```
The digest fixes the image to one exact build of the v1.18.1 release.

Without `scripts/scrape.py`, run Steps 1 to 3 below with `curl`. They need nothing but Docker.
The script-only features are then missing: socials, `--tech`, `--grid`, geocoding, the email crawl
and the 8-column cleanup. Set `email: true` in the job body, strip the CSV to the 8 lead fields
yourself, and if the user wants those features, point them to the README's Option A (the full kit).
This bare engine lacks the kit proxy's Host and Origin checks, so a web page in the user's browser
could reach it. Tell the user once, and offer `docker stop gmaps-scraper` when the scrape is done.

## Step 1: Create a job (`POST /api/v1/jobs`)
**Required fields. The API returns `422` without them:**
- `keywords`: array of search strings. **Bake the location into each term**: `"plumbers in Denver CO"`.
- `lat`, `lon`: **strings**, the city's coordinates: `"39.7392"`, `"-104.9903"`.
- `max_time`: integer **seconds**, the job's wall-clock limit, e.g. `300`. The API stores it as
  nanoseconds internally, but you always send seconds.
- `name`: any label for the job, e.g. `"job"` (`422 missing name` without it).
- `lang`: the 2-letter interface language, `"en"` (`422 missing lang` without it; `"eng"` is `invalid lang`).

**Recommended fields:**
- `depth` (default 10): how far to scroll, so roughly how many listings per keyword. Start at `5`.
- `zoom` `15` (city level), `radius` `10000` (meters), `fast_mode` `false`.
- **`email` `true`** only in this raw curl flow, where it is the only way to get emails. The engine
  then visits every website in a browser, which is slow and misses many. `scripts/scrape.py` keeps it
  `false` and crawls the websites itself, faster and with more hits, so prefer the script.

```bash
curl -s -X POST http://localhost:8080/api/v1/jobs \
  -H "Content-Type: application/json" \
  -d '{"name":"job","keywords":["coffee shops in Austin TX"],"lang":"en","zoom":15,
       "lat":"30.2672","lon":"-97.7431","fast_mode":false,"radius":10000,
       "depth":5,"email":true,"max_time":300}'
# → {"id":"<uuid>"}   (HTTP 201; note: lowercase "id")
```

> **Handle two things on every scrape:**
> 1. **Emails: on by default** (the script's crawl, or `email:true` on the raw API). Turn them off only if the user wants a fast run.
> 2. **Socials: ask first.** Before creating the job, ask the user once whether they also want
>    Instagram, Facebook and LinkedIn profiles (see "Social profiles" below). Never skip the question silently.

## Step 2: Poll until done (`GET /api/v1/jobs/{id}`)
The response field is `"Status"` (capital S). It moves from `working` to `ok` (success) or `failed`.

> **Harness rule:** the Bash tool **blocks foreground `sleep`**. Run the poll loop as a
> **background** Bash command (`run_in_background: true`) and read its output file when notified.
> Never poll with a foreground `sleep`.

Background poll snippet. It parses the value safely: match up to the closing quote, do not anchor on `$`.
```bash
ID="<uuid>"   # only the id from the POST response in Step 1
case "$ID" in ""|*[!0-9a-f-]*) echo "not a job id"; exit 1;; esac
for i in $(seq 1 40); do
  S=$(curl -s "http://localhost:8080/api/v1/jobs/$ID" | grep -oE '"Status":"[^"]*"' | head -1 | cut -d'"' -f4)
  echo "status=$S"
  [ "$S" = ok ] && { echo DONE; break; }
  [ "$S" = failed ] && { echo FAILED; break; }
  sleep 15
done
[ "$S" = ok ] || echo "NOT DONE after 10 min (status=$S): see Troubleshooting"
```

## Step 3: Download and parse (`GET /api/v1/jobs/{id}/download`)
```bash
ID="<uuid>"   # the same id as Step 2; each command runs in a fresh shell
case "$ID" in ""|*[!0-9a-f-]*) echo "not a job id"; exit 1;; esac
curl -sf "http://localhost:8080/api/v1/jobs/$ID/download

Excerpt, first 6,000 characters of SKILL.md, verbatim from the audited commit. It is text from someone else’s repository, quoted so you can judge it before your agent reads it.

Install

Pinned to the audited commit 2c2b01f

Download folder ↗
git clone https://github.com/Mahanaicoach/google-maps-scraper-kit.git
npx skills add mahanaicoach/google-maps-scraper-kit
npx skills add

Commands as the repository documents them: shown, never run by us. Our verdict covers commit 2c2b01f8fe5e only.

Works in which agents?

What its own text says, not a test

AgentStatusMore
Claude CodeMentioned in its text, not testedSkills for Claude Code · About Claude Code
CodexMentioned in its text, not testedSkills for Codex · About Codex
CursorMentioned in its text, not testedSkills for Cursor · About Cursor
“Mentioned” means the skill’s text names the agent. We have not run it there.

Audit history

Every audit, every source change

  1. ✓SAFE B 89 / 100

    first audit · source 2c2b01f8fe5e

README badge

For maintainers · shows the latest audit

ModelsAtlas: SAFE BMODELSATLASSAFE · B
[![ModelsAtlas: SAFE B](https://modelsatlas.com/skills/mahanaicoach/google-maps-scraper-kit/badge.svg)](https://modelsatlas.com/skills/mahanaicoach/google-maps-scraper-kit/)

The badge shows our verdict and grade for this skill, and links back to this page. It changes when the audit does.

Add this badge to your README

[![ModelsAtlas: SAFE B](https://modelsatlas.com/skills/mahanaicoach/google-maps-scraper-kit/badge.svg)](https://modelsatlas.com/skills/mahanaicoach/google-maps-scraper-kit/)

Questions about google-maps-scraper-kit

What does the google-maps-scraper-kit skill do?
Free Google Maps scraper for lead generation. Exports phones, emails, websites and socials to CSV. Runs locally in Docker, no API keys. Claude Code skill included.
Is google-maps-scraper-kit safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can google-maps-scraper-kit access on my machine?
The audit observed that it reaches the network. Each of those is consistent with what it says it does. Secrets in the source: none found.
Which assistants does google-maps-scraper-kit work with?
Its documentation mentions claude-code, codex and cursor. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (2c2b01f8fe5e), read on 2026-10-31. The repository is watched, and a new audit runs when it changes — this is the first audit.

Sources

Spotted something wrong? Report a correction · Methodology

Keep going in your AI

Opens with this page as the source. We add nothing else to the prompt.