API Documentation
Generate and manage your public and secret API keys here
API Key Types
Our API supports two types of keys for different use cases. Both keys provide the same functionality but offer different security levels.
Public Key
Format: 64-character alphanumeric string
Goes in the Authorization header. While called "public", it should still be kept secure but is safer to use in frontend applications.
✓ Authorization header
✓ Less sensitive of the pair
Secret Key
Format: 64-character string
Goes in the X-Secret-Key header. Must be kept highly secure and only used in server-side applications. Never expose in client-side code.
⚠ X-Secret-Key header
⚠ Keep highly confidential
Security Model
Both keys are required for every API call and must belong to the same key pair. This two-factor authentication approach significantly enhances security compared to single-key systems.
Quick Start
Use our API to extract leads from Google Maps programmatically. Submit multiple search queries and retrieve comprehensive business data. APIs start scraping jobs. Results will arrive in your email inbox and Jobs Dashboard page.
curl -X POST https://hv2p8xbj8l.execute-api.us-east-1.amazonaws.com/prod/scrape \ -H "Authorization: Bearer your_public_key_here" \ -H "X-Secret-Key: your_secret_key_here" \ -H "Content-Type: application/json" \ -d '{ "queries": ["cafes:Brooklyn"], "language": "US", "scrape_emails": false, "columns_to_filter": ["name", "address", "number", "rating"], "use_tokens": false, "crm_nicknames":["name_of_your_crm_1", "name_of_your_crm_2"...] }'
Authentication
For enhanced security, you must include BOTH your public and secret keys in every request:
Authorization: Bearer your_public_key_here X-Secret-Key: your_secret_key_here
Two-Key Authentication Required
Both keys must be provided and must belong to the same API key pair. This dual-key system provides enhanced security - even if someone obtains one of your keys, they cannot access your account without the matching pair.
Header Requirements
- • Authorization: Bearer {your_public_key}
- • X-Secret-Key: {your_secret_key}
- • Both keys must be from the same API key pair
Create Scraping Job
Submit search queries to extract business leads from Google Maps across different regions and languages.
Endpoint
POST https://hv2p8xbj8l.execute-api.us-east-1.amazonaws.com/prod/scrape
Request Parameters
Parameter | Type | Required | Description |
---|---|---|---|
queries | array | Yes | Array of search queries (e.g., ["restaurants:NYC", "dentists:London"]) |
language | string | Optional | Country/language code (default: "US"). See supported codes below |
scrape_emails | boolean | Optional | Whether to extract email addresses (default: false). Costs +6¢ per query |
columns_to_filter | array | Optional | Specific data fields to extract. See available columns below |
use_tokens | boolean | Optional | Use free trial tokens (gated results) vs paid balance (real leads) |
crm_nicknames | list | Optional | List of crm nicknames to feed |
Pricing Structure
Standard Scraping
6¢ per query for basic business data
With Email Extraction
12¢ per query (6¢ base + 6¢ email fee)
Supported Language Codes
Available Data Columns
Use these column names in the columns_to_filter
array. Add "No" prefix to filter for empty values (e.g., "Nolatitude" to find businesses without coordinates):
Basic Information
name
- Business name as shown on Google Mapsaddress
- Full address, usually includes up to country levelbusiness_type
- Category/type of business as classified by Google MapsContact Details
number
- Phone number displayed on Google Mapsemail
- Email address (extracted only if scrape_emails is true)Website Data
website_link
- Direct link to landing page (could be booking pages, domain, or any URL the owner added)website_domain
- Extracted domain from website_link. If website_link is an Instagram page, this shows "instagram". Can be facebook, instagram, etc. - whatever website is linked on Google Maps. Useful for programmatic filteringReviews & Ratings
rating
- Google Maps rating (1-5 stars)reviews_count
- Number of reviews on Google Mapsreview_1
- First review text as displayed on Google MapsLocation
latitude
- GPS latitude coordinates from Google Mapslongitude
- GPS longitude coordinates from Google MapsBusiness Details
price_level
- Pricing indicator (shown as $, $$, $$$, or price ranges like $5-$10 in local currency)amenities
- Available amenities from Google Maps (e.g., "disabled parking", "wheelchair accessible")Operating Hours
Monday
- Working hours on Monday as shown on Google MapsTuesday
- Working hours on Tuesday as shown on Google MapsWednesday
- Working hours on Wednesday as shown on Google MapsThursday
- Working hours on Thursday as shown on Google MapsFriday
- Working hours on Friday as shown on Google MapsSaturday
- Working hours on Saturday as shown on Google MapsSunday
- Working hours on Sunday as shown on Google MapsFiltering Tips
Use column names directly to get businesses with non-empty values for those fields. Prefix with "No" (e.g., "Nowebsite_link") to find businesses missing specific information. This is useful for targeted lead generation based on available data.
Example Requests
Basic Request with Public Key
{ "queries": ["restaurants:Manhattan", "coffee shops:Brooklyn"], "language": "US", "scrape_emails": false, "columns_to_filter": ["name", "address", "number", "rating"], "use_tokens": false, "crm_nicknames":["name_of_your_crm_1", "name_of_your_crm_2"...] }
Advanced Request with Secret Key
{ "queries": ["dental clinics:Toronto"], "language": "US", "scrape_emails": true, "columns_to_filter": ["name", "address", "number", "website_link", "email", "rating"], "use_tokens": false, "crm_nicknames":["name_of_your_crm_1", "name_of_your_crm_2"...] }
Filter for Businesses with Websites Only
{ "queries": ["gyms:Los Angeles"], "language": "US", "scrape_emails": false, "columns_to_filter": ["website_link", "name", "address", "number"], "use_tokens": false, "crm_nicknames":["name_of_your_crm_1", "name_of_your_crm_2"...] }
Find Businesses Without Websites
{ "queries": ["local bakeries:Austin"], "language": "US", "scrape_emails": false, "columns_to_filter": ["Nowebsite_link", "name", "address", "number", "rating"], "use_tokens": false, "crm_nicknames":["name_of_your_crm_1", "name_of_your_crm_2"...] }
Code Examples
Python
import requests # API configuration - both keys required api_url = "https://hv2p8xbj8l.execute-api.us-east-1.amazonaws.com/prod/scrape" headers = { "Authorization": "Bearer your_public_key_here", "X-Secret-Key": "your_secret_key_here", "Content-Type": "application/json" } # Request payload payload = { "queries": ["dentists:Miami", "orthodontists:Miami Beach"], "language": "US", "scrape_emails": True, "columns_to_filter": ["name", "address", "number", "website_link", "email", "rating"], "use_tokens": False, "crm_nicknames":["name_of_your_crm_1", "name_of_your_crm_2"...] } # Submit scraping request response = requests.post(api_url, json=payload, headers=headers) result = response.json() print(f"Request submitted successfully: {result}")
JavaScript/Node.js
const axios = require('axios'); const apiUrl = 'https://hv2p8xbj8l.execute-api.us-east-1.amazonaws.com/prod/scrape'; const scrapeBusinesses = async () => { try { const response = await axios.post(apiUrl, { queries: ['car dealerships:Seattle', 'bars:Berlin'], language: 'US', scrape_emails: false, columns_to_filter: ['name', 'address', 'number', 'rating', 'website_link'], use_tokens: false, "crm_nicknames":["name_of_your_crm_1", "name_of_your_crm_2"...] }, { headers: { 'Authorization': 'Bearer your_public_key_here', 'X-Secret-Key': 'your_secret_key_here', 'Content-Type': 'application/json' } }); console.log('Scraping results:', response.data); } catch (error) { console.error('Error:', error.response?.data || error.message); } }; scrapeBusinesses();
cURL
curl -X POST https://hv2p8xbj8l.execute-api.us-east-1.amazonaws.com/prod/scrape \ -H "Authorization: Bearer your_public_key_here" \ -H "X-Secret-Key: your_secret_key_here" \ -H "Content-Type: application/json" \ -d '{ "queries": ["spas:Beverly Hills", "massage therapy:West Hollywood"], "language": "US", "scrape_emails": true, "columns_to_filter": ["name", "address", "number", "website_link", "email", "amenities"], "use_tokens": false, "crm_nicknames":["name_of_your_crm_1", "name_of_your_crm_2"...] }'
Usage Guidelines
Multiple Queries
Submit multiple search queries in a single request to efficiently extract leads from different locations or business types. Each query in the array is processed independently.
Email Extraction Pricing
Set scrape_emails: true
to extract email addresses. This adds 6¢ to the base cost per query (total: 12¢ per query).
Credit Types
Use use_tokens: true
to spend free trial credits (gated results). Set to false
to use your paid balance for real, ungated leads.
Smart Filtering
Use columns_to_filter
strategically. Include "website_link" to get only businesses with websites, or "Nowebsite_link" to find businesses without websites for targeted outreach.
Regional Targeting
Use the language
parameter to target specific countries and get results in local languages. This ensures more accurate regional business data and pricing information in local currencies.
Two-Key Security
Always include both your public key (Authorization header) and secret key (X-Secret-Key header). Both keys must belong to the same API key pair. Never share your secret key or commit it to version control.