scrapercity 1.0.29 → 1.0.31
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 +5 -1
- package/README.md +1 -1
- package/SKILL.md +2 -2
- package/bin/cli.mjs +2 -1
- package/lib/catalog.generated.mjs +3 -3
- package/lib/utilityTools.mjs +2 -1
- package/package.json +1 -1
package/AGENT_DOCS.txt
CHANGED
|
@@ -23,7 +23,7 @@ PRICING (auto-generated from the live catalog - do not edit)
|
|
|
23
23
|
| `search_criminal_records` | /api/v1/scrape/criminal-records | $1.00 per search (only charged if records found) |
|
|
24
24
|
| `scrape_store_leads` | /api/v1/scrape/store-leads | $0.0039 per lead |
|
|
25
25
|
| `scrape_builtwith` | /api/v1/scrape/techstack | $4.99 per technology |
|
|
26
|
-
| `scrape_signals` | /api/v1/scrape/signals | $0.10 per company running ads, $0.
|
|
26
|
+
| `scrape_signals` | /api/v1/scrape/signals | $0.10 per company running ads, $0.0009 per website per platform checked, $0.05 per company hiring; minimum charge per search |
|
|
27
27
|
| `find_emails` | /api/v1/scrape/email-finder | $0.05 per email found (FREE if not found) |
|
|
28
28
|
| `find_mobiles` | /api/v1/scrape/mobile-finder | $0.25 per number found (FREE if not found) |
|
|
29
29
|
<!-- GENERATED:pricing:end -->
|
|
@@ -247,6 +247,10 @@ GET /api/v1/database/local-businesses?category=Dentist&country=US&hasContact=tru
|
|
|
247
247
|
query (business name and description), title (business name, comma separated for several),
|
|
248
248
|
minRating, maxRating, minReviews, maxReviews,
|
|
249
249
|
hasEmail, hasPhone, hasWebsite, hasContact (only businesses with a named contact person).
|
|
250
|
+
maxLocations=3: skip businesses with over 3 locations (the businesses in the database with the
|
|
251
|
+
same website, so chains are left out; a business with no website is never skipped). A whole
|
|
252
|
+
number, 1 or more; anything else returns 400. 503 while the locations data is not ready yet:
|
|
253
|
+
retry later or search without it (it is never ignored).
|
|
250
254
|
box=minLat,minLng,maxLat,maxLng: only businesses inside that map area (a box that can't be
|
|
251
255
|
read returns 400).
|
|
252
256
|
Exclusions: notCategory (repeat for several)
|
package/README.md
CHANGED
|
@@ -122,7 +122,7 @@ Both SDKs carry the same tool list as the MCP server, regenerated from the live
|
|
|
122
122
|
| `search_criminal_records` | /api/v1/scrape/criminal-records | $1.00 per search (only charged if records found) |
|
|
123
123
|
| `scrape_store_leads` | /api/v1/scrape/store-leads | $0.0039 per lead |
|
|
124
124
|
| `scrape_builtwith` | /api/v1/scrape/techstack | $4.99 per technology |
|
|
125
|
-
| `scrape_signals` | /api/v1/scrape/signals | $0.10 per company running ads, $0.
|
|
125
|
+
| `scrape_signals` | /api/v1/scrape/signals | $0.10 per company running ads, $0.0009 per website per platform checked, $0.05 per company hiring; minimum charge per search |
|
|
126
126
|
| `find_emails` | /api/v1/scrape/email-finder | $0.05 per email found (FREE if not found) |
|
|
127
127
|
| `find_mobiles` | /api/v1/scrape/mobile-finder | $0.25 per number found (FREE if not found) |
|
|
128
128
|
<!-- GENERATED:pricing:end -->
|
package/SKILL.md
CHANGED
|
@@ -37,7 +37,7 @@ Auth: `Authorization: Bearer $SCRAPERCITY_API_KEY` on all requests.
|
|
|
37
37
|
| `search_criminal_records` | /api/v1/scrape/criminal-records | $1.00 per search (only charged if records found) |
|
|
38
38
|
| `scrape_store_leads` | /api/v1/scrape/store-leads | $0.0039 per lead |
|
|
39
39
|
| `scrape_builtwith` | /api/v1/scrape/techstack | $4.99 per technology |
|
|
40
|
-
| `scrape_signals` | /api/v1/scrape/signals | $0.10 per company running ads, $0.
|
|
40
|
+
| `scrape_signals` | /api/v1/scrape/signals | $0.10 per company running ads, $0.0009 per website per platform checked, $0.05 per company hiring; minimum charge per search |
|
|
41
41
|
| `find_emails` | /api/v1/scrape/email-finder | $0.05 per email found (FREE if not found) |
|
|
42
42
|
| `find_mobiles` | /api/v1/scrape/mobile-finder | $0.25 per number found (FREE if not found) |
|
|
43
43
|
<!-- GENERATED:pricing:end -->
|
|
@@ -81,7 +81,7 @@ Apollo scrapes usually take **15-30 minutes** to deliver; some lists take longer
|
|
|
81
81
|
| GET | `/api/v1/scrape/logs/{runId}` | Run logs |
|
|
82
82
|
| GET | `/api/v1/apollo-status` | Apollo service health: `{status: "url-based" or "legacy", message, timestamp}` |
|
|
83
83
|
| GET | `/api/v1/database/leads?title=CTO&country=United%20States&hasEmail=true&limit=100` | Lead DB ($149/mo plan and up, 100k new leads/day). Optional: `excludeDelivered=true` (only leads you don't have yet), `after=0` then `pagination.next_after` (cursor paging). Company filters: `keywords`, `revenueMin`/`revenueMax`, `companyCountry`/`companyState`/`companyCity`. Exclusions: `notTitle`, `notKeywords`, `notIndustry`. Website technologies: `technologies` (any of), `technologiesAll` (all of), `notTechnologies` (none of). `url=<people-search URL>` searches with that URL's filters. POST with a JSON body takes the same parameters (use it for a long `url`) |
|
|
84
|
-
| GET | `/api/v1/database/local-businesses?category=Dentist&country=US&hasContact=true&limit=100` | Local biz DB ($149/mo plan and up, 100k new businesses/day). Search like Google Maps: `keyword` (repeat; names and categories, any keyword) and `location` (repeat; cities, states, countries, postal codes), with `searched_as` in the response and `lead_database` when nothing is found but the Lead Database has 100+ people. Filters: `category`, `country`, `state`, `city`, `postalCode`, `query`, `minRating`/`maxRating`, `minReviews`/`maxReviews`, `hasEmail`, `hasPhone`, `hasWebsite`, `hasContact` (only businesses with a named contact person), `title` (business name), `box=minLat,minLng,maxLat,maxLng` (a map area). Exclusions: `notCategory`. `url=<Google Maps search URL>` searches with that URL's keyword and place. POST with a JSON body takes the same parameters (use it for a long `url`). Same optional `excludeDelivered` / `after` |
|
|
84
|
+
| GET | `/api/v1/database/local-businesses?category=Dentist&country=US&hasContact=true&limit=100` | Local biz DB ($149/mo plan and up, 100k new businesses/day). Search like Google Maps: `keyword` (repeat; names and categories, any keyword) and `location` (repeat; cities, states, countries, postal codes), with `searched_as` in the response and `lead_database` when nothing is found but the Lead Database has 100+ people. Filters: `category`, `country`, `state`, `city`, `postalCode`, `query`, `minRating`/`maxRating`, `minReviews`/`maxReviews`, `hasEmail`, `hasPhone`, `hasWebsite`, `hasContact` (only businesses with a named contact person), `maxLocations` (skip businesses with over that many locations: businesses with the same website; skips chains), `title` (business name), `box=minLat,minLng,maxLat,maxLng` (a map area). Exclusions: `notCategory`. `url=<Google Maps search URL>` searches with that URL's keyword and place. POST with a JSON body takes the same parameters (use it for a long `url`). Same optional `excludeDelivered` / `after` |
|
|
85
85
|
| GET | `/api/v1/database/ecommerce?...` | Ecommerce DB ($149/mo plan and up). Same optional `excludeDelivered` / `after`. Technologies: `technologies` (any of), `technologiesAll` (all of), `notTechnologies` (none of) |
|
|
86
86
|
| POST | `/api/v1/database/plan` | $149/mo plan and up (GET with `?query=` also works). `{ "query": "dentists in Austin", "database"?: "leads" or "local" or "ecommerce" }` -> ready-to-run searches: `{ targeting, searches: [{ database, name, filters, count, apiEndpoint, apiParams, link }] }`. Send `apiParams` as they are to `/api/v1/<apiEndpoint>` |
|
|
87
87
|
| POST | `/api/v1/autoleads/lookalike` | $149/mo plan and up, $0.01 per site read. `{ "domains": ["acme.com", "mike@globex.com", ...] }` (websites or work emails, at least 3 company sites) -> 202 `{ job }`. Then GET `/api/v1/autoleads/lookalike?id=<job id>` until `job.status` is `done`: `job.groups` = `[{ name, description, sites, database, filters, count, tool }]`. Send a group's `filters` to that database's endpoint. 402 = balance under $0.01 x every site; 409 = a job is already running. Add `&format=csv` to the GET for every site as a CSV (no extra charge) |
|
package/bin/cli.mjs
CHANGED
|
@@ -412,7 +412,7 @@ async function main() {
|
|
|
412
412
|
'--postal-code': 'postalCode', '--query': 'query', '--min-rating': 'minRating', '--max-rating': 'maxRating',
|
|
413
413
|
'--min-reviews': 'minReviews', '--max-reviews': 'maxReviews', '--page': 'page', '--limit': 'limit',
|
|
414
414
|
'--after': 'after', '--url': 'url', '--title': 'title', '--not-category': 'notCategory',
|
|
415
|
-
'--box': 'box', '--keyword': 'keyword', '--location': 'location' }
|
|
415
|
+
'--box': 'box', '--keyword': 'keyword', '--location': 'location', '--max-locations': 'maxLocations' }
|
|
416
416
|
// List filters take commas: --category "Dentist,Orthodontist" sends both. Locations take semicolons, since a
|
|
417
417
|
// place has commas of its own: --location "Houston, TX; Austin, TX"
|
|
418
418
|
// (--keyword goes as typed: the server splits a list on commas and keeps "plumbers in Austin, TX" whole)
|
|
@@ -576,6 +576,7 @@ ScraperCity CLI - B2B lead generation from your terminal
|
|
|
576
576
|
--category --country --state --city --postal-code --query --title
|
|
577
577
|
--min-rating --max-rating --min-reviews --max-reviews
|
|
578
578
|
--has-email --has-phone --has-website --has-contact (only businesses with a named contact person)
|
|
579
|
+
--max-locations 3 Skip businesses with over 3 locations (businesses with the same website)
|
|
579
580
|
--not-category
|
|
580
581
|
--box "minLat,minLng,maxLat,maxLng" Only businesses inside this map area
|
|
581
582
|
--url "<Google Maps search URL>" Search with that URL's keyword and place
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// AUTO-GENERATED by scripts/generate.mjs — DO NOT EDIT BY HAND.
|
|
2
2
|
// Source of truth: scraperConfigs.ts (+ src/config/scrapers.ts). Regenerate: npm run generate
|
|
3
|
-
// Generated: 2026-
|
|
3
|
+
// Generated: 2026-11-04T02:49:27.142Z
|
|
4
4
|
export const TOOLS = [
|
|
5
5
|
{
|
|
6
6
|
"name": "scrape_apollo",
|
|
@@ -556,7 +556,7 @@ export const TOOLS = [
|
|
|
556
556
|
},
|
|
557
557
|
{
|
|
558
558
|
"name": "scrape_signals",
|
|
559
|
-
"description": "Find companies showing a buying signal right now. type \"ads\": companies running ads on Meta (Facebook and Instagram), Google, LinkedIn and TikTok, found by keyword and location or checked from your own list of websites. type \"hiring\": companies hiring for a role on LinkedIn Jobs and Indeed. One row per company with its website, the signal (platforms and ad links, or the job and its link) and a decision maker contact from the Lead Database where one matches. Set replaceContacts to swap contacts who have left for the person in that role now before the file is delivered. Cost: $0.10 per company running ads, $0.
|
|
559
|
+
"description": "Find companies showing a buying signal right now. type \"ads\": companies running ads on Meta (Facebook and Instagram), Google, LinkedIn and TikTok, found by keyword and location or checked from your own list of websites. type \"hiring\": companies hiring for a role on LinkedIn Jobs and Indeed. One row per company with its website, the signal (platforms and ad links, or the job and its link) and a decision maker contact from the Lead Database where one matches. Set replaceContacts to swap contacts who have left for the person in that role now before the file is delivered. Cost: $0.10 per company running ads, $0.0009 per website per platform checked, $0.05 per company hiring; minimum charge per search.",
|
|
560
560
|
"inputSchema": {
|
|
561
561
|
"type": "object",
|
|
562
562
|
"properties": {
|
|
@@ -573,7 +573,7 @@ export const TOOLS = [
|
|
|
573
573
|
"items": {
|
|
574
574
|
"type": "string"
|
|
575
575
|
},
|
|
576
|
-
"description": "type ads: check these websites instead (send keyword OR domains). Every website gets a row, with running_ads_on empty when no ads were found."
|
|
576
|
+
"description": "type ads: check these websites instead (send keyword OR domains). Every website gets a row, with running_ads_on empty when no ads were found. Charged for each platform that answers for each website; a website no platform answered for shows as not checked and costs nothing."
|
|
577
577
|
},
|
|
578
578
|
"platforms": {
|
|
579
579
|
"type": "array",
|
package/lib/utilityTools.mjs
CHANGED
|
@@ -104,7 +104,7 @@ export const UTILITY_TOOLS = [
|
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
name: 'query_local_business_database',
|
|
107
|
-
description: 'Query the local business database directly. Returns businesses with phone numbers, emails, websites, addresses and ratings, many with a named contact person. Up to 100 per request. Included with the $149/mo plan (100,000 new businesses a day; businesses you already have do not count again). Set hasContact=true for only businesses with a named contact person. For a daily pull of only new businesses set excludeDelivered=true. For big pulls page with after: send after="0" first, then the pagination.next_after from each response until it is null. Search the way you would on Google Maps: keyword (what the businesses do or are called, e.g. ["thai restaurant"]) and location (cities, states, countries or postal codes, e.g. ["Houston TX", "Austin TX"]); searched_as in the response says how each was read. A search that finds nothing also returns lead_database: the same search in the Lead Database when it has 100+ people. Have a Google Maps search URL? Pass it as url to search with its keyword and place right away (search_translation in the response says what was applied).',
|
|
107
|
+
description: 'Query the local business database directly. Returns businesses with phone numbers, emails, websites, addresses and ratings, many with a named contact person. Up to 100 per request. Included with the $149/mo plan (100,000 new businesses a day; businesses you already have do not count again). Set hasContact=true for only businesses with a named contact person. Set maxLocations to skip chains: maxLocations=3 leaves out businesses whose website more than 3 businesses share. For a daily pull of only new businesses set excludeDelivered=true. For big pulls page with after: send after="0" first, then the pagination.next_after from each response until it is null. Search the way you would on Google Maps: keyword (what the businesses do or are called, e.g. ["thai restaurant"]) and location (cities, states, countries or postal codes, e.g. ["Houston TX", "Austin TX"]); searched_as in the response says how each was read. A search that finds nothing also returns lead_database: the same search in the Lead Database when it has 100+ people. Have a Google Maps search URL? Pass it as url to search with its keyword and place right away (search_translation in the response says what was applied).',
|
|
108
108
|
inputSchema: { type: 'object', properties: {
|
|
109
109
|
keyword: { type: 'array', items: { type: 'string' }, description: 'What the businesses do or are called, as typed on Google Maps, e.g. ["thai restaurant", "sushi"]. Matches business names and categories; any keyword. A place inside a keyword ("plumbers in Austin TX") is used as the location when no location is given.' },
|
|
110
110
|
location: { type: 'array', items: { type: 'string' }, description: 'Cities, states, countries or postal codes, as typed, e.g. ["Houston TX", "78701", "Ontario", "Germany"] (up to 2,000; any of them).' },
|
|
@@ -126,6 +126,7 @@ export const UTILITY_TOOLS = [
|
|
|
126
126
|
hasPhone: { type: 'boolean', description: 'Only businesses with a phone number' },
|
|
127
127
|
hasWebsite: { type: 'boolean', description: 'Only businesses with a website' },
|
|
128
128
|
hasContact: { type: 'boolean', description: 'Only businesses with a named contact person' },
|
|
129
|
+
maxLocations: { type: 'integer', minimum: 1, description: 'Skip businesses with over this many locations: the businesses in the database with the same website. 3 leaves out chains with 4 or more; 1 keeps only businesses whose website no other business has. A business with no website is never skipped.' },
|
|
129
130
|
page: { type: 'number', description: 'Page number (default 1)', default: 1 },
|
|
130
131
|
limit: { type: 'number', description: 'Results per page (max 100)', default: 50 },
|
|
131
132
|
excludeDelivered: { type: 'boolean', description: 'Skip businesses this account already has (from the API or unlocked in the dashboard). With this on, keep page at 1 or use after.' },
|