Introduction
The Livescraper API exposes every scraper in our toolkit as a single REST endpoint family. You send a JSON-encoded list of queries plus a few flags; we return clean, deduplicated rows of public data.
- Base URL:
https://apiv1.livescraper.com - Auth:
X-API-KEYheader on every request - Format: JSON in / JSON out — no XML, no SOAP, no SDKs required
- Throughput: ~15 requests / second (scalable on request)
Quick start
Three steps to your first API call:
- 1 · Sign in and grab your API key from the dashboard
- 2 · Choose an endpoint — Maps, Reviews, or Email — and craft a
queriesarray - 3 · Send a
GETrequest with theX-API-KEYheader. Done.
curl "https://apiv1.livescraper.com/task/map?queries=[%22Coffee+shops+in+Brooklyn%22]&language=en®ion=US" \ -H "X-API-KEY: YOUR_API_KEY"
from livescraper import ApiClient api = ApiClient(api_key="YOUR_API_KEY") results = api.google_maps_search( queries=["Coffee shops in Brooklyn"], language="en", region="US", ) print(results)
import Livescraper from "livescraper"; const api = new Livescraper({ apiKey: "YOUR_API_KEY" }); const results = await api.googleMapsSearch({ queries: ["Coffee shops in Brooklyn"], language: "en", region: "US", }); console.log(results);
Authentication
Every request requires an X-API-KEY header. Your API key lives in the dashboard under Settings → API. Keep it secret; if it leaks, rotate it from the same screen.
X-API-KEY: YOUR_API_KEY Content-Type: application/json
Endpoints
Every endpoint follows the same GET /task/<name> shape. The queries array can hold up to 15 items per request.
Google Maps Data
Search Google Maps and return clean place records — name, address, phone, website, email, social handles, ratings, hours, photos. Up to 15 queries per request.
| Name | In | Type | Description |
|---|---|---|---|
| queriesrequired | query | string[] | JSON array of strings. A search query, place ID, CID, or Google ID. Max 15. |
| languagerequired | query | string | 2-letter language code (en, es, fr, …). |
| regionrequired | query | string | 2-letter region code (US, GB, IN, …). |
| fieldsoptional | query | string[] | Whitelist of fields to return. Defaults to the full schema. |
| dropduplicatesoptional | query | "True" | "False" | De-duplicate rows by place ID. Defaults to "True". |
| enrichmentoptional | query | "True" | "False" | Run a second pass to fill website + email fields. +1 credit / row. |
curl "https://apiv1.livescraper.com/task/map?\ queries=[%22Restaurants+in+Brooklyn,+NY%22]&\ language=en®ion=US&dropduplicates=True" \ -H "X-API-KEY: YOUR_API_KEY"
from livescraper import ApiClient api = ApiClient(api_key="YOUR_API_KEY") places = api.google_maps_search( queries=["Restaurants in Brooklyn, NY"], language="en", region="US", fields=["business_name", "business_phone", "business_website"], ) for p in places["data"]: print(p["business_name"], p["business_phone"])
const places = await api.googleMapsSearch({ queries: ["Restaurants in Brooklyn, NY"], language: "en", region: "US", fields: ["business_name", "business_phone", "business_website"], });
Response shape
{
"code": 200,
"message": "OK",
"data": [
{
"business_name": "Saint Frank Coffee",
"business_phone": "+1 415-549-7950",
"business_website": "https://saintfrankcoffee.com",
"full_address": "…",
"average_rating": 4.7,
"total_reviews": 1284,
"working_hours": { /* per-day schedule */ },
"latitude": 40.71,
"longitude": -73.96,
"place_id": "ChIJ…"
}
]
}
Google Maps Reviews
Pull all reviews for any business — yours or a competitor's. Returns authors, ratings, timestamps, full text, and the owner's reply.
| Name | In | Type | Description |
|---|---|---|---|
| queriesrequired | query | string[] | JSON array. Place query, place ID, CID or Google ID. Max 15. |
| languagerequired | query | string | 2-letter language code. |
| regionrequired | query | string | 2-letter region code. |
| fieldsoptional | query | string[] | Whitelist. Defaults to the full review schema. |
| dropduplicatesoptional | query | "True" | "False" | De-duplicate by review ID. |
curl "https://apiv1.livescraper.com/task/review?\ queries=[%22Saint+Frank+Coffee+Brooklyn%22]&\ language=en®ion=US" \ -H "X-API-KEY: YOUR_API_KEY"
reviews = api.google_review_search(
queries=["Saint Frank Coffee Brooklyn"],
language="en",
region="US",
)const reviews = await api.googleReviewSearch({ queries: ["Saint Frank Coffee Brooklyn"], language: "en", region: "US", });
Response shape
{
"code": 200,
"message": "OK",
"data": [
{
"business_name": "Saint Frank Coffee",
"author_title": "Maria L.",
"review_rating": 5,
"review_text": "Loved the cortado. The pastry case is dangerous.",
"review_datetime_utc": "2025-04-22T14:08:11Z",
"owner_answer": "Thanks Maria — see you again soon!",
"review_id": "ChdDSU…"
}
]
}
Email & Contact
Hand over a list of domains or business URLs; get back deliverable emails, phone numbers, social handles and meta data, validated and deduplicated.
| Name | In | Type | Description |
|---|---|---|---|
| queriesrequired | query | string[] | JSON array of URLs or domains. Max 15. |
| fieldsoptional | query | string[] | Whitelist of fields to return. |
curl "https://apiv1.livescraper.com/task/email?\ queries=[%22acme-tools.com%22,%22orbit-design.io%22]" \ -H "X-API-KEY: YOUR_API_KEY"
contacts = api.google_email_search(
queries=["acme-tools.com", "orbit-design.io"],
)const contacts = await api.googleEmailSearch({ queries: ["acme-tools.com", "orbit-design.io"], });
Response shape
{
"code": 200,
"message": "OK",
"data": [
{
"host": "acme-tools.com",
"email_1": "hello@acme-tools.com",
"phone_1": "+1 415-555-0143",
"linkedin": "https://linkedin.com/company/acme-tools",
"website_title": "Acme — Industrial tools, modern store"
}
]
}
Official SDKs
Wrappers for the languages our customers ship in. They handle pagination, retries and rate-limit backoff so you don't have to.
livescraper-python
Idiomatic Python with type hints, async support and a 1-line install.
pip install livescraper NODE@livescraper/sdk
Promise-based API for Node 18+. Full TypeScript types included.
npm i livescraper PHPlivescraper-php
Composer package for PHP 8.1+. PSR-18 HTTP client compatible.
composer require livescraper/sdkErrors & rate limits
The API uses standard HTTP status codes. Every error response includes a stable code string you can match on programmatically.
| HTTP | Code | Meaning |
|---|---|---|
| 200 | — | Success. Rows returned in data. |
| 401 | E00100012 | API key missing, invalid, or revoked. |
| 402 | E00100014 | Account credit too low. Top up to continue. |
| 422 | — | Validation failed (e.g. more than 15 queries). |
| 429 | — | Rate-limited. Back off and retry with exponential delay. |
| 500 | — | Unexpected server error. Safe to retry. |
queries array is capped at 15 items. Need to scrape thousands? Spread them across multiple parallel requests.Need help?
If something's unclear, broken, or just feels weird, drop us a line. We're real engineers and we read every email.