Developer Migration Guide · Zero Container Cold Starts
Migrate from Apify Google Maps Scraper to <1s Synchronous REST JSON — Save 40%–60%+.
Running real-time Google Maps lead workflows inside async scraper containers means paying container boot overhead, residential proxy compute units, and waiting 15–60 seconds per job just to poll a dataset. Switch in 5 minutes to https://api.googlemapsapi.io/v1/*: identical Place ID, phone, website, review, and B2B email fields over a single synchronous GET request at $0.20–$0.50 per 1,000 places.
✓ Instant $1.20 (12,000 Credits) at 0 ms + $2.00 (+20,000 Credits) Sandbox Streak (32,000 total free credits = 6,400 leads) · ✓ Supports Stripe Card / Apple Pay / Google Pay & 0%-fee Crypto (+5% bonus) · ✓ $10.00 PAYG credits never expire
1-to-1 Schema Translation
Apify Google Maps Scraper Input JSON → Synchronous REST Endpoints
Base URL: https://api.googlemapsapi.io · $1.00 = 10,000 Credits
| Scraper Input JSON Field | Direct Sync Endpoint | Query Parameters | Typical Latency | Exact Unit Cost |
|---|---|---|---|---|
| searchStringsArray / queries: ["HVAC contractors in Austin TX"], maxCrawledPlacesPerSearch: 20, language: "en", countryCode: "us" | GET /v1/places/search | ?q=HVAC+contractors+in+Austin+TX&limit=20&hl=en&gl=us | <1s sync JSON (15–50 ms warm cache) | 5 Credits / place ($0.20–$0.50 / 1K; 0 if empty) |
| lat / lng / zoom / customGeolocation polygon viewport grid (bypassing 120-result query cap) | GET /v1/places/nearby | ?lat=30.2672&lng=-97.7431&zoom=14&q=coffee&limit=20 | <1s sync JSON | 5 Credits / place ($0.20–$0.50 / 1K; 0 if empty) |
| placeIds: ["ChIJdeM0zsi1RIYRp6f261L65h0"] / startUrls: [{ url: "https://www.google.com/maps/place/..." }] | GET /v1/places/details | ?place_id=ChIJdeM0zsi1RIYRp6f261L65h0 (or ?cid=...) | <800 ms sync JSON | 20 Credits / profile ($0.80–$2.00 / 1K) |
| maxReviews: 20, reviewsSort: "newest" | "highestRanking" | "lowestRanking" | GET /v1/places/reviews | ?place_id=ChIJdeM0zsi1RIYRp6f261L65h0&sort=newest&limit=20 | <1s sync JSON | 2 Credits / review ($0.08–$0.20 / 1K; 0 if empty) |
| scrapeContacts: true / includeWebResults: true (company emails + LinkedIn, Instagram, Facebook, X) | GET /v1/leads/enrich | ?domain=houndstoothcoffee.com | 0.4–1.8 s live crawl (25 ms cached) | 20 Credits / domain ($0.80–$2.00 / 1K; 0 Credits if 0 contacts found) |
Why High-Frequency Pipelines Switch
40%–60%+ Lower Total Cost & Zero Container Cold Starts
When triggering dozens of daily lookups from Clay, n8n, Make, or backend workers, container boot latency, memory slot caps, and per-event add-ons compound rapidly. All prices below read directly from our live single-source rate card.
| Dimension | Async Container Scrapers | GoogleMapsAPI.io Direct REST Gateway |
|---|---|---|
| Response Model & Cold Start | Async Docker container boot (15–60s queue + spin-up) → poll run status → fetch dataset JSON/CSV | Single synchronous HTTP GET (<1s; 15–50 ms cached) — zero container startup fee |
| Real-Time Single-Query Cost (20 Places) | Container start event + CU memory/proxy overhead (~$0.05–$0.12 effective on micro runs) | 100 Credits = $0.004–$0.010 (save 40%–60%+ on frequent webhook & CRM runs; 0 Credits if 0 results) |
| 100,000 Places Bulk Extraction | $250–$400+ ($2.50–$4.00/1K pay-per-result + $39–$49/mo platform plan; unused monthly prepaid credits expire) | $20.00 on Business ($0.20/1K) or $36.00 on Growth ($0.36/1K) or $10.00+ never-expiring PAYG |
| Website Email & Social Enrichment | +$2.00/1K add-on + prolonged browser crawl CU burn even when websites have no email | GET /v1/leads/enrich (20 Credits = $0.0008–$0.002/domain; 0 Credits charged when no email/social found) |
| Concurrency & Rate Limits | Capped by container RAM quota (8–32 GB on Starter) — parallel webhook spikes queue up | 60 RPM (5 RPS) on Free Trial → 300 to 3,000 RPM (50 RPS) on Paid tiers |
| Billing Flexibility & Payment Rails | Monthly platform subscription required for volume tiers; card billing only | $10.00 PAYG (credits never expire) or monthly plans via Stripe Card / Apple Pay / Google Pay & 0%-fee Crypto (+5% bonus credits) |
5-Minute Drop-In Migration
Replace ApifyClient.actor().call() with One HTTP Request
Delete async dataset polling loops and Docker cold-start retries. Copy-paste the Python, Node.js, or cURL snippet below using your gm_live_... key from /signup.
# BEFORE (Async container job: 15–45s container boot + dataset polling + CU overhead)
# run = ApifyClient(TOKEN).actor("compass/crawler-google-places").call(run_input={
# "searchStringsArray": ["coffee in Austin"],
# "maxCrawledPlacesPerSearch": 20,
# "scrapeContacts": True,
# })
# items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
# AFTER (GoogleMapsAPI.io: <1s synchronous HTTP GET — 0 container boot fees)
import os
import requests
API_KEY = os.environ["GOOGLEMAPS_API_KEY"] # gm_live_... (12,000 free credits on signup)
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
# 1. Search Google Maps places synchronously (/v1/places/search)
places_resp = requests.get(
"https://api.googlemapsapi.io/v1/places/search",
params={"q": "coffee in Austin", "limit": 20, "hl": "en", "gl": "us"},
headers=HEADERS,
timeout=15,
)
places_resp.raise_for_status()
places = places_resp.json()["data"]
# 2. Optional: Full details, customer reviews, or live domain B2B email enrichment
first = places[0]
reviews = requests.get(
"https://api.googlemapsapi.io/v1/places/reviews",
params={"place_id": first["place_id"], "sort": "newest", "limit": 10},
headers=HEADERS,
timeout=15,
).json()["data"]
if first.get("domain"):
contacts = requests.get(
"https://api.googlemapsapi.io/v1/leads/enrich",
params={"domain": first["domain"]},
headers=HEADERS,
timeout=15,
).json()["data"]
print(first["name"], first["phone"], contacts.get("emails", []))// BEFORE: await apifyClient.actor("...").call({ searchStringsArray, maxReviews, scrapeContacts: true })
// AFTER: Native fetch() — zero SDK dependencies, <1s response for Clay / n8n / Next.js / BullMQ workers
const API_KEY = process.env.GOOGLEMAPS_API_KEY!;
const headers = { Authorization: `Bearer ${API_KEY}` };
// 1. Place Search -> /v1/places/search
const searchRes = await fetch(
"https://api.googlemapsapi.io/v1/places/search?q=" +
encodeURIComponent("coffee in Austin") +
"&limit=20&hl=en&gl=us",
{ headers },
);
const { data: places } = await searchRes.json();
// 2. Place Details + Verified Reviews + B2B Domain Contacts in parallel
const lead = places[0];
const [detailsRes, reviewsRes, enrichRes] = await Promise.all([
fetch(`https://api.googlemapsapi.io/v1/places/details?place_id=${encodeURIComponent(lead.place_id)}`, { headers }),
fetch(`https://api.googlemapsapi.io/v1/places/reviews?place_id=${encodeURIComponent(lead.place_id)}&sort=newest&limit=10`, { headers }),
lead.domain
? fetch(`https://api.googlemapsapi.io/v1/leads/enrich?domain=${encodeURIComponent(lead.domain)}`, { headers })
: Promise.resolve(null),
]);
const details = (await detailsRes.json()).data;
const reviews = (await reviewsRes.json()).data;
const contacts = enrichRes ? (await enrichRes.json()).data : null;
console.log({ name: details.name, rating: details.rating, reviews: reviews.length, contacts });# 1. Search local businesses (<1s sync JSON — 5 Credits / place returned)
curl -sS "https://api.googlemapsapi.io/v1/places/search?q=coffee+in+Austin&limit=2&hl=en&gl=us" \
-H "Authorization: Bearer gm_live_YOUR_API_KEY"
# 2. Fetch full Place Profile by place_id (20 Credits)
curl -sS "https://api.googlemapsapi.io/v1/places/details?place_id=ChIJdeM0zsi1RIYRp6f261L65h0" \
-H "Authorization: Bearer gm_live_YOUR_API_KEY"
# 3. Stream verified customer reviews sorted by newest (2 Credits / review)
curl -sS "https://api.googlemapsapi.io/v1/places/reviews?place_id=ChIJdeM0zsi1RIYRp6f261L65h0&sort=newest&limit=10" \
-H "Authorization: Bearer gm_live_YOUR_API_KEY"
# 4. Extract B2B emails & 8 social profiles from business domain (0 Credits if none found!)
curl -sS "https://api.googlemapsapi.io/v1/leads/enrich?domain=houndstoothcoffee.com" \
-H "Authorization: Bearer gm_live_YOUR_API_KEY"{
"ok": true,
"endpoint": "/v1/places/search",
"meta": {
"request_id": "req_gm_sync_mig_91f2a",
"credits_used": 10,
"took_ms": 21,
"cache_hit": true
},
"data": [
{
"place_id": "ChIJdeM0zsi1RIYRp6f261L65h0",
"cid": "2154572145967638439",
"name": "Black Cat Coffee",
"category": "Coffee shop",
"rating": 4.9,
"review_count": 318,
"phone": "+15125550194",
"website": "https://houndstoothcoffee.com",
"domain": "houndstoothcoffee.com",
"address": "401 Congress Ave, Austin, TX 78701",
"city": "Austin",
"state": "TX",
"postal_code": "78701",
"country_code": "US",
"latitude": 30.266624,
"longitude": -97.742951,
"is_open_now": true
}
]
}Claude Web · ChatGPT · Cursor · n8n
1-Click Remote OAuth 2.1 MCP Connector
Building AI SDR or local market research agents? Connect Claude Web or ChatGPT Connectors directly via OAuth 2.1 PKCE — zero local Docker or npx setup required:
https://mcp.googlemapsapi.io/v1/mcpUsing Cursor, Claude Desktop, or Windsurf with an API key? Point https://api.googlemapsapi.io/mcp with header x-api-key: gm_live_.... Full setup guide on /mcp.
Endpoint Reference & Benchmarks
Explore Verified Endpoint Docs
- → GET /v1/places/search — Text query search with phone, website, hours & coordinates
- → GET /v1/places/details — Complete Place ID / CID profile & rating breakdown
- → GET /v1/places/reviews — Newest / lowest_rating verified customer reviews & owner replies
- → GET /v1/leads/enrich — Real-time domain B2B email & 8-network social profile extraction
- → Outscraper Pricing Breakdown & Scrap.io Alternative
REST API Migration FAQ
- Why is calling a synchronous Google Maps REST API 40%–60%+ cheaper than container-based Actor runs?
- Every container scraper run spins up an isolated Docker runtime, initializes headless browser/proxy pools, and bills Compute Units (CUs) or pay-per-event minimums ($2.50–$4.00+ per 1,000 places, plus contact add-ons and monthly platform subscription fees). GoogleMapsAPI.io eliminates container cold starts completely: you call https://api.googlemapsapi.io/v1/places/search directly over HTTP and pay strictly 5 Credits ($0.20–$0.50 per 1,000 places) with $0 container boot fees and 0 Credits charged on empty results.
- How do I replace scrapeContacts: true (company emails & social links) in REST?
- Pass each business's domain field into GET /v1/leads/enrich?domain=<domain>. It crawls the homepage and contact pages in real time to return verified B2B email addresses, phone numbers, and LinkedIn, Instagram, Facebook, X, YouTube, and TikTok links at 20 Credits ($0.002 base, down to $0.0008 on Business) — and automatically charges 0 Credits whenever a website yields zero emails or social profiles.
- Can I test for free and top up Pay-As-You-Go without a monthly commitment?
- Yes. Every new developer receives 12,000 Free Credits ($1.20) instantly upon signup at /signup with no credit card required, plus up to +20,000 Developer Sandbox Streak Credits. When scaling up, choose never-expiring PAYG packs starting at $10.00 (100,000 Credits) or high-bonus monthly plans via Stripe (Card, Apple Pay, Google Pay) or 0%-fee Crypto (+5% bonus credits).
- Does GoogleMapsAPI.io work with n8n, Make, Clay, Claude Web, and ChatGPT Connectors?
- Yes. In n8n, Make, or Clay, replace the async 'Run Actor + Get Dataset Items' 2-step polling workflow with a single synchronous HTTP Request node to https://api.googlemapsapi.io/v1/places/search (<1s response). For Claude Web and ChatGPT Connectors, connect our 1-click OAuth 2.1 Remote MCP URL: https://mcp.googlemapsapi.io/v1/mcp.
Ready to drop container cold starts?
Create your account in 10 seconds and get 12,000 Free Credits ($1.20) instantly — enough for 2,400 Google Maps business leads or 600 enriched B2B domains with zero credit card required.