scrapercity 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENT_DOCS.txt ADDED
@@ -0,0 +1,205 @@
1
+ SCRAPERCITY API REFERENCE - FOR AI AGENTS
2
+ ==========================================
3
+
4
+ BASE: https://app.scrapercity.com
5
+ AUTH: Authorization: Bearer <api_key>
6
+ ALL RESPONSES: JSON
7
+ PATTERN: POST start → GET status → GET download
8
+
9
+ PRICING: Plans $49, $149, $649/mo. Each gives wallet credits. Scrapers deduct per-lead.
10
+
11
+ ────────────────────────────────────────
12
+ SCRAPE ENDPOINTS (POST /api/v1/scrape/{slug})
13
+ ────────────────────────────────────────
14
+
15
+ apollo
16
+ Body: { url: "https://app.apollo.io/#/people?...", count: 1000, fileName: "My Export" }
17
+ Returns: { runId, message }
18
+ Cost: $0.0039/lead | Min 500, max 50000
19
+ DELIVERY: UP TO 4 DAYS. Use webhook, not polling.
20
+
21
+ apollo-filters
22
+ Body: { seniorityLevel, functionDept, companyIndustry, personCountry, personState,
23
+ companyCountry, companyState, companySize, personTitles:[], companyDomains:[],
24
+ companyKeywords:[], personCities:[], companyCities:[], hasPhone, count, fileName }
25
+ At least one filter required.
26
+ Returns: { runId, message }
27
+ Cost: $0.0039/lead | DELIVERY: UP TO 4 DAYS.
28
+
29
+ maps
30
+ Body: { searchStringsArray: ["plumbers"], locationQuery: "Denver, CO", maxCrawledPlacesPerSearch: 500 }
31
+ Returns: { runId, datasetId, priceMicro }
32
+ Cost: $0.01/place | Delivery: 5-30 min
33
+
34
+ email-validator
35
+ Body: { emails: ["user@example.com", "test@company.com"] }
36
+ Returns: { runId, emailCount, estimatedCost }
37
+ Cost: $0.0036/email | Delivery: 1-10 min
38
+
39
+ email-finder
40
+ Body: { contacts: [{ first_name: "John", last_name: "Doe", domain: "acme.com" }],
41
+ autoValidateEmails: false, autoFindMobiles: false }
42
+ Returns: { runId, contactCount, priceMicro }
43
+ Cost: $0.05/contact | Delivery: 1-10 min
44
+
45
+ mobile-finder
46
+ Body: { inputs: ["linkedin.com/in/johndoe", "jane@company.com"] }
47
+ Returns: { runId, inputCount, priceMicro }
48
+ Cost: $0.25/input | Delivery: 1-5 min
49
+
50
+ people-finder
51
+ Body: { name: ["John Doe"], email: [], phone_number: [], street_citystatezip: [], max_results: 1 }
52
+ Returns: { runId, totalSearches, estimatedCost }
53
+ Cost: $0.02/result | Delivery: 2-10 min
54
+
55
+ store-leads
56
+ Body: { platform: "shopify", countryCode: "US", totalLeads: 1000,
57
+ emails: true, phones: true, category: "", city: "" }
58
+ Returns: { runId, totalLeads, estimatedCost }
59
+ Cost: $0.0039/lead | Delivery: INSTANT (cached DB)
60
+
61
+ builtwith
62
+ Body: { technology: "Shopify", fileName: "Shopify sites" }
63
+ Returns: { runId, technology, estimatedCost }
64
+ Cost: $4.99 flat | Delivery: 1-5 min
65
+
66
+ criminal-records
67
+ Body: { name: "John Smith", state: "CA", dob: "02/07/1992" }
68
+ state and dob optional.
69
+ Returns: { runId, name, state }
70
+ Cost: $1.00 only if records found | Delivery: 2-5 min
71
+
72
+ airbnb-email
73
+ Body: { mode: "city", city: ["Miami, FL"], maxResults: 100 }
74
+ Modes: "city" (search cities), "single" (one listing URL), "bulk" (multiple listing URLs)
75
+ For single: { mode: "single", listingUrl: "https://airbnb.com/rooms/..." }
76
+ Optional: checkin, checkout, maxPages, onlyProHosts, onlyUniqueEmails
77
+ Returns: { runId }
78
+ Cost: $0.0001/listing | Delivery: 10-30 min
79
+
80
+ youtube-email
81
+ Body: { channels: ["@MrBeast", "https://youtube.com/@Channel"] }
82
+ Accepts @handles or full YouTube URLs.
83
+ Returns: { runId }
84
+ Cost: per channel | Delivery: 5-15 min
85
+
86
+ website-finder
87
+ Body: { domains: ["acme.com", "example.com"], jobTitle: "CEO" }
88
+ jobTitle is optional. Domains without https prefix.
89
+ Returns: { runId }
90
+ Cost: per domain | Delivery: 5-15 min
91
+
92
+ yelp-scraper
93
+ Body: { searchTerms: ["plumbers"], locations: ["Denver, CO"], searchLimit: 10 }
94
+ OR: { directUrls: ["https://yelp.com/biz/..."] }
95
+ Returns: { runId }
96
+ Cost: $0.01/listing | Delivery: 5-15 min
97
+
98
+ angi-angies-list-scraper
99
+ Body: { keyword: "plumbers", zipCodes: ["80202", "80203"], maxItems: 100 }
100
+ Returns: { runId }
101
+ Cost: $0.01/listing | Delivery: 5-15 min
102
+
103
+ zillow-agents
104
+ Body: { location: "Denver, CO", specialty: "buyer", language: "English", searchLimit: 10 }
105
+ specialty and language optional.
106
+ Returns: { runId }
107
+ Cost: per agent | Delivery: 5-15 min
108
+
109
+ bizbuysell-scraper
110
+ Body: { startUrls: ["https://bizbuysell.com/..."], maxItems: 100 }
111
+ Pass BizBuySell search result URLs.
112
+ Returns: { runId }
113
+ Cost: $0.01/listing | Delivery: 5-15 min
114
+
115
+ crexi-scraper
116
+ Body: { startUrls: ["https://crexi.com/..."] }
117
+ Pass Crexi search result URLs.
118
+ Returns: { runId }
119
+ Cost: $0.029/listing | Delivery: 5-15 min
120
+
121
+ property-lookup
122
+ Body: { addresses: ["123 Main St, Denver, CO 80202"], includeOwnerContact: false }
123
+ Full address with city, state, zip required.
124
+ Returns: { runId }
125
+ Cost: $0.15/address | Delivery: 2-10 min
126
+
127
+ ────────────────────────────────────────
128
+ STATUS & DOWNLOAD
129
+ ────────────────────────────────────────
130
+
131
+ GET /api/v1/scrape/status/{runId}
132
+ Returns: { status, statusMessage, handled, requested, outputUrl }
133
+ Status values: RUNNING | SUCCEEDED | FAILED | CANCELLED
134
+ When SUCCEEDED: outputUrl = "/api/downloads/{runId}"
135
+
136
+ GET /api/downloads/{runId}
137
+ Returns: CSV file (binary stream)
138
+ Only available when status = SUCCEEDED
139
+
140
+ POST /api/v1/scrape/cancel/{runId}
141
+ Cancel a running job.
142
+
143
+ GET /api/v1/scrape/logs/{runId}
144
+ View run logs.
145
+
146
+ ────────────────────────────────────────
147
+ ACCOUNT
148
+ ────────────────────────────────────────
149
+
150
+ GET /api/v1/wallet
151
+ Returns: { email, wallet: { balance_dollars, total_balance_dollars }, plan: { name, usage_percent }, billing: { next_billing_date } }
152
+
153
+ GET /api/v1/runs?hours=24&limit=50
154
+ Returns: { runs: [{ run_id, status, handled, url, file_name, created_at }] }
155
+
156
+ GET /api/v1/apollo-status
157
+ Returns: { useApify, message } - check if Apollo URL endpoint is available
158
+
159
+ ────────────────────────────────────────
160
+ DATABASES (GET, $649 plan only, 100k/day)
161
+ ────────────────────────────────────────
162
+
163
+ GET /api/v1/database/leads?title=CTO&country=United States&hasEmail=true&page=1&limit=100
164
+ Filters: title, industry, country, state, city, companyName, companyDomain,
165
+ companySize, seniority, department, hasEmail, hasPhone, minEmployees, maxEmployees
166
+ Array params use repeated keys: ?seniority=vp&seniority=director
167
+ Returns: { data: [...leads], pagination: { page, limit, total, totalPages } }
168
+
169
+ GET /api/v1/database/local-businesses?...
170
+ GET /api/v1/database/ecommerce?...
171
+ Same pattern, different datasets.
172
+
173
+ ────────────────────────────────────────
174
+ ERROR CODES
175
+ ────────────────────────────────────────
176
+ 401 = Invalid/missing API key
177
+ 402 = Insufficient balance (check wallet first!)
178
+ 403 = Account cancelled or charge processing
179
+ 409 = Duplicate request (same search within 2 min)
180
+ 429 = Rate limited / duplicate within 30s
181
+ 503 = Service temporarily unavailable
182
+
183
+ ────────────────────────────────────────
184
+ WORKFLOW EXAMPLES
185
+ ────────────────────────────────────────
186
+
187
+ 1. MAPS SCRAPE (fast):
188
+ POST /api/v1/scrape/maps → get runId → poll status every 15s → download CSV
189
+
190
+ 2. APOLLO SCRAPE (slow):
191
+ POST /api/v1/scrape/apollo → get runId → configure webhook → wait for callback
192
+ Do NOT poll Apollo in a tight loop. Check once per hour at most.
193
+
194
+ 3. ENRICH PIPELINE:
195
+ Apollo/Maps → download CSV → extract emails → POST email-validator → download validated CSV
196
+
197
+ 4. LEAD DATABASE (instant):
198
+ GET /api/v1/database/leads?title=CTO&industry=computer+software&hasEmail=true&page=1
199
+ Loop pages until page > totalPages
200
+
201
+ 5. LOCAL BUSINESS PIPELINE:
202
+ Yelp/Angi/Maps → download CSV → POST email-finder with names+domains → POST mobile-finder
203
+
204
+ 6. REAL ESTATE PIPELINE:
205
+ Zillow Agents + Property Lookup → download CSVs → enrich with email-finder
package/README.md ADDED
@@ -0,0 +1,128 @@
1
+ # ScraperCity - B2B Lead Generation for AI Agents
2
+
3
+ Pull leads, validate emails, find mobile numbers, and scrape business data - all from your AI agent, CLI, or code.
4
+
5
+ ScraperCity gives AI agents access to 15+ B2B data tools: Apollo scraping, Google Maps extraction, email finding/validation, mobile number lookup, skip tracing, ecommerce store data, criminal records, and more.
6
+
7
+ ## Quick Start
8
+
9
+ ### Option 1: CLI
10
+
11
+ ```bash
12
+ npx scrapercity login # enter your API key
13
+ npx scrapercity wallet # check balance
14
+ npx scrapercity maps -q "plumbers" -l "Denver, CO"
15
+ npx scrapercity poll <runId> # wait for results
16
+ npx scrapercity download <runId> # save CSV
17
+ ```
18
+
19
+ ### Option 2: MCP Server (Claude Code, Cursor, Windsurf, etc.)
20
+
21
+ Add to your MCP config (e.g. `~/.claude/claude_desktop_config.json`):
22
+
23
+ ```json
24
+ {
25
+ "mcpServers": {
26
+ "scrapercity": {
27
+ "command": "npx",
28
+ "args": ["-y", "scrapercity-mcp"],
29
+ "env": {
30
+ "SCRAPERCITY_API_KEY": "your_api_key_here"
31
+ }
32
+ }
33
+ }
34
+ }
35
+ ```
36
+
37
+ Then tell your AI: *"Find 1000 plumbers in Denver with emails using ScraperCity"*
38
+
39
+ ### Option 3: Skill File (Claude Code)
40
+
41
+ Copy the skill file into your project:
42
+
43
+ ```bash
44
+ npx scrapercity-mcp --print-skill > SCRAPERCITY_SKILL.md
45
+ ```
46
+
47
+ Or download from: `https://scrapercity.com/agents/SKILL.md`
48
+
49
+ Then in Claude Code: *"Read SCRAPERCITY_SKILL.md and find me 2000 marketing directors at SaaS companies in California, validate their emails, and save to leads.csv"*
50
+
51
+ ### Option 4: Direct API
52
+
53
+ ```bash
54
+ # Start a Maps scrape
55
+ curl -X POST https://app.scrapercity.com/api/v1/scrape/maps \
56
+ -H "Authorization: Bearer $SCRAPERCITY_API_KEY" \
57
+ -H "Content-Type: application/json" \
58
+ -d '{"searchStringsArray":["plumbers"],"locationQuery":"Denver, CO","maxCrawledPlacesPerSearch":500}'
59
+
60
+ # Check status
61
+ curl https://app.scrapercity.com/api/v1/scrape/status/RUN_ID \
62
+ -H "Authorization: Bearer $SCRAPERCITY_API_KEY"
63
+
64
+ # Download CSV when SUCCEEDED
65
+ curl -O https://app.scrapercity.com/api/downloads/RUN_ID \
66
+ -H "Authorization: Bearer $SCRAPERCITY_API_KEY"
67
+ ```
68
+
69
+ ## Available Tools
70
+
71
+ | Tool | What it does | Cost |
72
+ |------|-------------|------|
73
+ | **Apollo** | B2B contacts by job title, industry, location | $0.0039/lead |
74
+ | **Google Maps** | Local businesses with phones, emails, reviews | $0.01/place |
75
+ | **Email Validator** | Verify deliverability, catch-all, MX records | $0.0036/email |
76
+ | **Email Finder** | Find business email from name + company | $0.05/contact |
77
+ | **Mobile Finder** | Phone numbers from LinkedIn or email | $0.25/input |
78
+ | **People Finder** | Skip trace by name, email, phone, address | $0.02/result |
79
+ | **Store Leads** | Shopify/WooCommerce stores with contacts | $0.0039/lead |
80
+ | **BuiltWith** | All sites using a technology | $4.99/search |
81
+ | **Criminal Records** | Background check by name | $1.00 if found |
82
+ | **Lead Database** | 3M+ B2B contacts, instant query ($649 plan) | Included |
83
+
84
+ ## How It Works
85
+
86
+ 1. **Start a scrape** → get a `runId`
87
+ 2. **Poll status** (or use webhooks) → wait for `SUCCEEDED`
88
+ 3. **Download CSV** → leads with full contact info
89
+
90
+ Apollo scrapes take up to 4 days. All other scrapers: 1-30 minutes. Store leads are instant.
91
+
92
+ ## Authentication
93
+
94
+ Get your API key at [app.scrapercity.com/dashboard/api-docs](https://app.scrapercity.com/dashboard/api-docs)
95
+
96
+ ```bash
97
+ # Environment variable (recommended)
98
+ export SCRAPERCITY_API_KEY="your_key"
99
+
100
+ # Or save to config file
101
+ npx scrapercity login
102
+ ```
103
+
104
+ ## Webhooks
105
+
106
+ For Apollo and long-running scrapes, configure a webhook at [app.scrapercity.com/dashboard/webhooks](https://app.scrapercity.com/dashboard/webhooks) to get notified when results are ready.
107
+
108
+ ## Plans
109
+
110
+ | Plan | Price | Credits |
111
+ |------|-------|---------|
112
+ | Trial | Free | $5 |
113
+ | Starter | $49/mo | $49 |
114
+ | Growth | $149/mo | $149 + 10% bonus |
115
+ | Professional | $649/mo | $649 + 30% bonus + Database API |
116
+
117
+ Buy additional credits anytime. [scrapercity.com/pricing](https://scrapercity.com/pricing)
118
+
119
+ ## Links
120
+
121
+ - [Agent Docs](https://scrapercity.com/agents) - setup guide
122
+ - [API Reference](https://scrapercity.com/api-docs) - full documentation
123
+ - [Skill File](https://scrapercity.com/agents/SKILL.md) - for Claude Code
124
+ - [MCP Server Listing](https://scrapercity.com/agents) - configuration
125
+
126
+ ## License
127
+
128
+ MIT
package/SKILL.md ADDED
@@ -0,0 +1,98 @@
1
+ # ScraperCity - B2B Lead Generation
2
+
3
+ ## Setup
4
+ ```bash
5
+ export SCRAPERCITY_API_KEY="your_key" # get from app.scrapercity.com/dashboard/api-docs
6
+ npx scrapercity wallet # verify balance
7
+ ```
8
+
9
+ ## Core Pattern
10
+ Every scraper follows: **start → poll → download**
11
+ ```
12
+ POST /api/v1/scrape/{slug} → { runId }
13
+ GET /api/v1/scrape/status/{runId} → { status, handled, outputUrl }
14
+ GET /api/downloads/{runId} → CSV file
15
+ ```
16
+ Auth: `Authorization: Bearer $SCRAPERCITY_API_KEY` on all requests.
17
+
18
+ ## All Scrapers (POST to /api/v1/scrape/{slug})
19
+
20
+ | Slug | Input | Cost | Speed |
21
+ |------|-------|------|-------|
22
+ | `apollo` | `{url, count, fileName}` | $0.0039/lead | ~4 DAYS (use webhook) |
23
+ | `apollo-filters` | `{seniorityLevel, functionDept, companyIndustry, personCountry, personState, companySize, personTitles[], companyDomains[], count}` | $0.0039/lead | ~4 DAYS |
24
+ | `maps` | `{searchStringsArray:["query"], locationQuery, maxCrawledPlacesPerSearch}` | $0.01/place | 5-30 min |
25
+ | `email-validator` | `{emails:["a@b.com"]}` | $0.0036/email | 1-10 min |
26
+ | `email-finder` | `{contacts:[{first_name,last_name,domain}], autoValidateEmails, autoFindMobiles}` | $0.05/contact | 1-10 min |
27
+ | `mobile-finder` | `{inputs:["linkedin.com/in/x","email@co.com"]}` | $0.25/input | 1-5 min |
28
+ | `people-finder` | `{name:[], email:[], phone_number:[], street_citystatezip:[], max_results}` | $0.02/result | 2-10 min |
29
+ | `store-leads` | `{platform, countryCode, totalLeads, emails:true, phones:true}` | $0.0039/lead | instant |
30
+ | `builtwith` | `{technology}` | $4.99 flat | 1-5 min |
31
+ | `criminal-records` | `{name, state, dob}` | $1.00 if found | 2-5 min |
32
+ | `airbnb-email` | `{mode:"city", city:["Miami, FL"], maxResults:100}` | $0.0001/listing | 10-30 min |
33
+ | `youtube-email` | `{channels:["@Handle","https://youtube.com/@X"]}` | per channel | 5-15 min |
34
+ | `website-finder` | `{domains:["acme.com"], jobTitle:"CEO"}` | per domain | 5-15 min |
35
+ | `yelp-scraper` | `{searchTerms:["plumbers"], locations:["Denver, CO"], searchLimit:10}` | $0.01/listing | 5-15 min |
36
+ | `angi-angies-list-scraper` | `{keyword, zipCodes:["80202"], maxItems:100}` | $0.01/listing | 5-15 min |
37
+ | `zillow-agents` | `{location:"Denver, CO", specialty, searchLimit:10}` | per agent | 5-15 min |
38
+ | `bizbuysell-scraper` | `{startUrls:["<search-url>"], maxItems:100}` | $0.01/listing | 5-15 min |
39
+ | `crexi-scraper` | `{startUrls:["<search-url>"]}` | $0.029/listing | 5-15 min |
40
+ | `property-lookup` | `{addresses:["123 Main St, City, ST 12345"], includeOwnerContact:false}` | $0.15/address | 2-10 min |
41
+
42
+ ## ⚠ Apollo Delivery
43
+ Apollo scrapes take **up to 4 days** to deliver. Do NOT poll in a loop.
44
+ - Set up a webhook at `app.scrapercity.com/dashboard/webhooks`
45
+ - Webhook fires when results are ready with `{runId, fileName, leadsCount}`
46
+ - If you must poll, check once per hour max
47
+
48
+ ## Other Endpoints
49
+
50
+ | Method | Path | Purpose |
51
+ |--------|------|---------|
52
+ | GET | `/api/v1/wallet` | Balance, plan, billing |
53
+ | GET | `/api/v1/runs?hours=24&limit=50` | Recent runs |
54
+ | POST | `/api/v1/scrape/cancel/{runId}` | Cancel running job |
55
+ | GET | `/api/v1/scrape/logs/{runId}` | Run logs |
56
+ | GET | `/api/v1/apollo-status` | Apollo service health |
57
+ | GET | `/api/v1/database/leads?title=CTO&country=US&hasEmail=true&page=1&limit=100` | Lead DB ($649 plan, 100k/day) |
58
+ | GET | `/api/v1/database/local-businesses?...` | Local biz DB ($649 plan) |
59
+ | GET | `/api/v1/database/ecommerce?...` | Ecommerce DB ($649 plan) |
60
+
61
+ ## Status Values
62
+ `RUNNING` → `SUCCEEDED` or `FAILED` or `CANCELLED`
63
+
64
+ ## Error Codes
65
+ - `401` - bad or missing API key
66
+ - `402` - insufficient balance (check wallet first)
67
+ - `403` - account cancelled or charge processing
68
+ - `409` - duplicate request (same search submitted recently)
69
+ - `429` - rate limited / duplicate within 30s
70
+ - `503` - service temporarily unavailable
71
+
72
+ ## CLI Shorthand
73
+ ```bash
74
+ scrapercity maps -q "plumbers" -l "Denver, CO" --limit 500
75
+ scrapercity yelp -q "dentists" -l "Austin, TX"
76
+ scrapercity airbnb --city "Miami, FL" --limit 200
77
+ scrapercity youtube-email @MrBeast @PewDiePie
78
+ scrapercity website-finder acme.com example.com --title "CEO"
79
+ scrapercity angi -q "electricians" --zips "90210,90211"
80
+ scrapercity zillow-agents -l "Denver, CO"
81
+ scrapercity bizbuysell <bizbuysell-search-url>
82
+ scrapercity crexi <crexi-search-url>
83
+ scrapercity property-lookup "123 Main St, Denver, CO 80202" --owner-contact
84
+ scrapercity poll <runId> # polls until done
85
+ scrapercity download <runId> # saves CSV
86
+ ```
87
+
88
+ ## Tips
89
+ - Always check `wallet` before large scrapes to avoid 402 errors
90
+ - Apollo URL must be from apollo.io People search - other pages rejected
91
+ - Maps: split large metro areas into sub-cities for better coverage
92
+ - Email validator: dedupes automatically, only charges for unique emails
93
+ - Store leads: zero COGS (cached DB), instant results
94
+ - Yelp/Angi: can also pass directUrls instead of search terms
95
+ - YouTube: accepts both @handles and full channel URLs
96
+ - Website finder: domains only, no https:// prefix needed
97
+ - Property lookup: full address with city, state, zip required
98
+ - Downloads return CSV with all available fields