API Documentation

Manage API Keys

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

US - United States UK - United Kingdom AU - Australia IN-EN - India (English) CN - China TW - Taiwan HK-ZH - Hong Kong FR - France DE - Germany ES - Spain IT - Italy PT - Portugal BR - Brazil NL - Netherlands RU - Russia MX - Mexico JP - Japan KR - South Korea TH - Thailand VN - Vietnam ID - Indonesia MY - Malaysia PH - Philippines IN - India (Hindi) AE - UAE IL - Israel SE - Sweden NO - Norway DK - Denmark FI - Finland PL - Poland TR - Turkey

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 Maps
address - Full address, usually includes up to country level
business_type - Category/type of business as classified by Google Maps

Contact Details

number - Phone number displayed on Google Maps
email - 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 filtering

Reviews & Ratings

rating - Google Maps rating (1-5 stars)
reviews_count - Number of reviews on Google Maps
review_1 - First review text as displayed on Google Maps

Location

latitude - GPS latitude coordinates from Google Maps
longitude - GPS longitude coordinates from Google Maps

Business 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 Maps
Tuesday - Working hours on Tuesday as shown on Google Maps
Wednesday - Working hours on Wednesday as shown on Google Maps
Thursday - Working hours on Thursday as shown on Google Maps
Friday - Working hours on Friday as shown on Google Maps
Saturday - Working hours on Saturday as shown on Google Maps
Sunday - Working hours on Sunday as shown on Google Maps

Filtering 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.