Systems Lab

Agent skill

scrapercity-cli

Runs ScraperCity from a terminal with the scrapercity CLI (npm package scrapercity 1.0.17): login and key handling, all 27 commands and their flags, start-poll-download in shell scripts, daily cron pulls of only new records with db-leads and db-local using excludeDelivered and after cursors, CSV piping, and CI jobs.

activeNeeds a keyActs undeclared2,398 words

Filed under Pricing and packaging.

From scrapercity/gtm-skills · 31 skill entries · 0 · pushed 2026-11-02

What it does when it runs

Runs ScraperCity from a terminal with the scrapercity CLI (npm package scrapercity 1.0.17): login and key handling, all 27 commands and their flags, start-poll-download in shell scripts, daily cron pulls of only new records with db-leads and db-local using excludeDelivered and after cursors, CSV piping, and CI jobs. Produces a CLI run spec with exact commands, a cost estimate from catalog prices, the script, the schedule and failure handling. Use when the user wants ScraperCity in bash, cron, a Makefile or GitHub Actions, asks what a CLI flag does, hits a CLI error, or asks for a command the CLI may not have.

Automated analysis of the skill and the 10 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • INSTANTLY_API_KEY
  • RAW_KEY
  • SCRAPERCITY_API_KEY
  • YOUR_SCRAPERCITY_API_KEY
Hosts it reaches
  • api.instantly.ai
  • app.scrapercity.com
  • aws.amazon.com
  • curl.se
  • developer.instantly.ai
  • docs.github.com
  • docs.npmjs.com
  • jqlang.org
  • man7.org
  • pubs.opengroup.org
  • scrapercity.com
  • www.crexi.com
  • www.gnu.org
  • www.rfc-editor.org
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shellwrites files

Ask about scrapercity-cli

Opens your assistant with this page's recorded context. Check the linked sources before relying on it.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/scrapercity/gtm-skills.git /tmp/gtm-skills
git -C /tmp/gtm-skills sparse-checkout set "skills/scrapercity/scrapercity-cli"
mkdir -p ~/.claude/skills/scrapercity-cli
cp -R "/tmp/gtm-skills/skills/scrapercity/scrapercity-cli/." ~/.claude/skills/scrapercity-cli/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 31 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add scrapercity/gtm-skills
/plugin

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs INSTANTLY_API_KEY, RAW_KEY, SCRAPERCITY_API_KEY, YOUR_SCRAPERCITY_API_KEY, which you have to obtain separately.

Reproduced in full from scrapercity/gtm-skills/blob/46d446143690c8048b17817aecf36990ea6880e5/skills/scrapercity/scrapercity-cli/SKILL.md, which is licensed MIT (skill frontmatter). 2,398 words, 25 headings.

ScraperCity CLI

Overview

This skill turns a ScraperCity job into commands and scripts that run unattended: a count check, a cost estimate, a start command that captures the runId, a poll, a download to a named file, and a schedule. It covers every command and flag in scrapercity 1.0.17, read from bin/cli.mjs and lib/client.mjs and exercised against a stubbed network on 2026-10-13.

The mistakes it prevents:

  • Scripting around a flag that does not exist, or a command the CLI does not have (there is no property-lookup command in 1.0.17).
  • Treating db-leads output as an export. It prints the total, the next cursor and the first 3 rows only.
  • Combining flags that the 1.0.17 parser mixes into other values, such as scrapercity builtwith Shopify --name x, which searches for the technology "Shopify x".
  • A cron job that dies silently because cron has neither a PATH to node nor SCRAPERCITY_API_KEY.
  • A daily pull that re-buys or re-downloads yesterday's records because it skipped --exclude-delivered or paged with --page.

When to Use

Use it when the user says:

  • "Give me the command to scrape plumbers in Denver" or "what does --after do?"
  • "Write a script that pulls new leads every morning."
  • "Run ScraperCity in GitHub Actions" or "in a Makefile."
  • "Validate this CSV's emails from the terminal, then push the good ones into Instantly."
  • "scrapercity says Unknown command" or "No API key."
  • "Is there a CLI command for property lookup / the ecommerce database / webhooks?"

Use a different skill for nearby jobs:

JobSkill
Using ScraperCity from Claude, Cursor or another AI clientscrapercity-mcp
HTTP calls from Python, Node, Clay, n8n or Zapierscrapercity-api, scrapercity-integrations
Designing Lead Database filtersscrapercity-lead-database
Designing Local Business Database searchesscrapercity-local-business-database
What to do with the emails after validationemail-list-cleaner, cold-email-list

Prerequisites

  • Node.js 18 or newer. Run with npx -y [email protected] <command> (pinned, no install prompt) or install once with npm i -g [email protected] and call scrapercity <command>.
  • An API key from app.scrapercity.com/dashboard/api-docs in SCRAPERCITY_API_KEY, or saved by scrapercity login.
  • jq for scripts that write database rows to files. curl for the REST calls the CLI does not cover.
  • For db-leads and db-local: Growth ($149/mo) or Scale.

Authoritative Foundations

SourceWhat it contributes here
scrapercity 1.0.17 bin/cli.mjs and lib/client.mjsThe command list, every flag and its default, the key lookup order, what each command prints, exit codes, and the parser behavior documented in references/gaps-and-quirks.md. The only source for CLI behavior. The README and SKILL tables in the CLI repo carry outdated prices; this skill does not use them.
references/scrapercity-catalog.mdEvery price, endpoint and input schema; the command list for 1.0.17.
references/scrapercity-agent-patterns.mdWallet first, count first, a go-ahead before every paid run, polling cadence, error and retry tables, CSV naming.
references/scrapercity-platform.mdPlans, 100 records per database request, excludeDelivered, after, 100,000 new records a day.
npm docsnpx --package, -y to skip the install prompt, version pinning.
POSIX crontab and shellCron runs with a minimal environment; five time fields; set -e exit behavior.
GitHub Actions docsschedule cron in UTC, encrypted secrets, artifacts.
scrapercity.com/api-docs100 API requests a minute per key, 10 concurrent scrapes, results kept 48 hours, database allowance resets at midnight UTC.

Details and routing: references/framework-notes.md.

Workflow

1. Set up the key once

npx -y [email protected] login          # prompts for the key, writes ~/.scrapercityrc (owner-only)
export SCRAPERCITY_API_KEY=...           # or this; the variable wins over the file
npx -y [email protected] wallet         # proves the key; prints plan, balance, used, renewal

On a shared machine or CI, skip login and use the environment variable from a secret store.

2. Map the job to commands

Use references/command-reference.md. If a tool has no command or a needed flag is missing (see references/gaps-and-quirks.md), use the REST call shown there, or the MCP tool.

3. Count before you pull

SourceCount commandCost
Lead Databasedb-leads <filters> --limit 1 and read the first line (N total leads, page 1 of P)$0 wallet
Local Business Databasedb-local <filters> --limit 1$0 wallet
Any scraperA capped test (maps --limit 25, yelp --limit 5, store-leads --total-leads 100)Catalog price

A total of 0 prints as ? total leads. Treat ? as zero.

4. Estimate and confirm

Multiply billable units by catalog price for every step, including the CLI defaults you did not override (maps 500 places, apollo 1,000 leads, store-leads 1,000 leads). Show the table and get a go-ahead before any paid run. For a recurring job, show the monthly total too.

5. Start, capture the run id, poll, download

RUN=$(npx -y [email protected] maps -q "roofing contractor" -l "Dallas, TX" --limit 300 | awk '/Run ID:/ {print $3}')
npx -y [email protected] poll "$RUN" --interval 30
npx -y [email protected] download "$RUN" -o "maps-roofing-dallas-tx-$(date +%Y%m%d)-${RUN:0:8}.csv"

poll checks every --interval seconds (default 15), stops after one hour, exits 1 on FAILED, CANCELLED or timeout, and does not download. Use --interval 30 or more. Apollo never goes through poll: register a webhook at app.scrapercity.com/dashboard/webhooks and check status every few minutes.

6. Schedule the recurring part

Daily new-record pulls use --exclude-delivered with an --after cursor that starts at 0 each day. The CLI prints the next cursor as Next page: --after N; loop until it stops printing one or the daily target is reached. To write the rows to a file, use the REST loop in references/scripting-patterns.md, since the CLI shows only 3 rows per call. Run cron after 00:00 UTC, when the allowance resets.

7. Handle failure in the script

Every failure exits 1 and prints ✗ plus the server's message to stderr. The HTTP code is not printed (except HTTP N when the server sent no message), so branch on the message text. Use the error table in references/scrapercity-agent-patterns.md.

8. Deliver the spec

Fill templates/output-template.md and run python3 scripts/check-output.py spec.md. The checker rejects commands and flags that 1.0.17 does not have.

ScraperCity Implementation

Commands in 1.0.17 (27 plus help)

GroupCommands
Account and runslogin, wallet, runs, status, poll, download, cancel, logs
B2B peopleapollo, db-leads, website-finder
Enrichmentemail-find, email-validate, mobile-find, people-find
Local businessmaps, yelp, angi, db-local
Ecommerce and technologystore-leads, builtwith (Tech Stack Search)
Real estatezillow-agents, crexi, distress-list
Otherbizbuysell, airbnb, criminal

Not in 1.0.17: a property lookup command, an ecommerce database command, webhook management, an Apollo status command, JSON output mode. Workarounds in references/gaps-and-quirks.md.

Database count and cursor loop (CLI only)

npx -y [email protected] db-leads --title "VP Sales, Head of Sales" --not-title "Assistant, Intern" \
  --company-country "United States" --min-employees 50 --max-employees 200 \
  --keywords saas --has-email --exclude-delivered --after 0 --limit 100
# 4812 total leads, page 1 of 49
# Next page: --after 98765

List flags take commas: --industry, --country, --state, --seniority, --department, --company-country, --company-state, --not-industry (db-leads) and --category, --country, --not-category (db-local). db-local --location takes semicolons because places contain commas: --location "Houston, TX; Austin, TX; 78701".

Worked cost estimate

Request: a morning job on Growth that adds 400 new VP Sales leads and 100 new Texas dentists a day, validated before they reach the sequencer, for 30 days.

LineUnits per monthUnit priceCost per month
db-leads new leads (400 a day, cursor loop)12,000included in Growth$0.00
db-local new businesses (100 a day)3,000included in Growth$0.00
email-validate on every new email15,000$0.00169$25.35
Total$25.35

Per day that is $0.85 and the month is $25.35, which is 16% of Growth's $159 monthly credit. Show the monthly figure once and get an explicit approval before turning on cron. Database pulls use 400 of the Lead Database's 100,000 a day allowance and 100 of the Local Business Database's.

Output Format

A CLI run spec in Markdown, built from templates/output-template.md:

  1. Environment: package version, Node version, key source, working folder.
  2. Commands: one row per command with what it maps to and its billable units.
  3. Cost Estimate: line items, total, approval line.
  4. Script: the full bash script, ready to save.
  5. Schedule: cron line or CI schedule, time zone, allowance reset.
  6. Failure Handling: each failure, how the script detects it, what it does.
  7. Verification: dry-run results.

A one-command question ("what does --after do?", "the command to validate this file") gets the command and two or three lines on what it bills and prints, not a spec. The spec is for scripts, schedules and multi-step jobs.

  • Each fact once; every call and script written out in full (no "..." values, no loop described in a comment); no counts or results marked assumed. If nothing has run, say so once at the top.
  • What the reader receives is the deliverable only: no internal file paths, reference section numbers or runbook IDs; another skill is named only in a handoff line that tells the user what to run next; no tables of checks that were not run (one "Not checked:" line instead); and no repeated identical rows where one template plus a list will do.

Quality Check

  • Every command exists in 1.0.17 and every flag is one that command reads.
  • No API key appears in the script; it comes from SCRAPERCITY_API_KEY or ~/.scrapercityrc.
  • The script starts with set -euo pipefail and checks wallet before paid steps.
  • --exclude-delivered is paired with --after, never with --page above 1.
  • Every start command captures the runId; every download names its file with -o.
  • No apollo run is polled with poll; a webhook is named.
  • Cost lines use catalog prices, CLI defaults are counted, and any paid total (per run or per month) has an approval line.
  • Version is pinned in scheduled jobs.

Common Pitfalls

MistakeWhy it failsFix
scrapercity property-lookup ...No such command in 1.0.17 (Unknown command)MCP scrape_property_lookup or POST /api/v1/scrape/property-lookup
Parsing db-leads output as the full resultIt prints 3 rows and a count of the restREST loop with jq for files
scrapercity builtwith Shopify --name shopify-usPositional words and the --name value are joined: technology becomes "Shopify shopify-us"scrapercity builtwith Shopify alone; set a file name through MCP or REST
website-finder --file d.txt --title CEOThe file name and the title are sent as domains tooMCP scrape_website_finder or REST
Paying Website Finder for a role at named companies on GrowthThe Lead Database may already hold that person, freedb-leads --domain acme.example --title "VP Sales" --has-email --limit 3 per domain first; Website Finder (MCP or REST) only for domains with no match
bizbuysell URL --limit 5050 is sent as a second start URLOmit --limit (default 100) or use MCP/REST for another cap
yelp -l "Denver, CO"Split on commas into "Denver" and "CO", doubling the location combinations-l "Denver CO"; commas only between places
airbnb --city "Lisbon, Portugal"Split into two cities; the tool needs "City, Country"MCP scrape_airbnb or REST
--limit=100The parser only reads --flag valueUse a space
Cron with no envCron does not load your shell profileSource a key file and set PATH in the script
--exclude-delivered --page 2Taking page 1 removes rows from the next query, so page 2 skips records--after 0, then each printed cursor
Copying a run id from runsruns shows only the first 12 charactersKeep the full id from the start output
poll on ApolloHits the 1-hour timeout and exits 1 when a run takes longer than the usual 15 to 30 minutesWebhook, or status every few minutes
Validating email-find output again, or leaving the sender's import verification onEmail Finder results are validated when found; a second pass pays twice for the same answerSkip validation on fresh email-find results; validate addresses from outside ScraperCity and any whose last check is older than the re-check window you set; verify_leads_on_import: false on the sender
Scripting a push command that does not existThe CLI has no sender or CRM push in 1.0.17Filter valid rows, then curl the sender API in batches (references/scripting-patterns.md section 7b)

Execution Artifacts

FileUse it when
references/framework-notes.mdYou need the source behind a rule or which file to open.
references/command-reference.mdYou need a command's syntax, flags, defaults, API mapping, price or printed output.
references/scripting-patterns.mdWriting a loop, a poll-and-download, a cron job, a CSV pipe, a sender handoff or a CI workflow.
references/gaps-and-quirks.mdA command or flag is missing, or a flag combination behaves oddly in 1.0.17.
templates/output-template.mdStart every CLI run spec from it.
examples/worked-example.mdA finished spec (weekday VP Sales and Texas dentist feed with validation) to copy.
scripts/check-output.pyBefore handing over a spec: python3 scripts/check-output.py spec.md.
references/scrapercity-catalog.mdPrices, endpoints and input schemas.
references/scrapercity-platform.mdPlans and database allowances.
references/scrapercity-agent-patterns.mdWallet, count, approval, polling and retry rules.

Related Skills

  • using-scrapercity-skills: router for every ScraperCity job.
  • scrapercity-mcp: the same package as an MCP server inside AI clients.
  • scrapercity-api and scrapercity-integrations: REST and no-code paths, including endpoints the CLI lacks.
  • scrapercity-lead-database and scrapercity-local-business-database: filter design for db-leads and db-local.
  • email-list-cleaner and cold-email-list: what happens to the files next.

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what scrapercity-cli does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.

Build my GTM engine

Tell us what you want to improve. Fedor reviews the workflow and replies by email when there is a useful fit.

Fedor reviews every request personally. If there is a useful fit, he will reply by email.