Home  ·  Resources  ·  API Documentation
API reference

The Livescraper API,
made for humans.

A clean REST interface for every scraper. Send a query, get clean JSON back. Same auth, same shape, same friendly pricing — across Google Maps, Reviews, Search and Email enrichment.

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-KEY header 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 queries array
  • 3 · Send a GET request with the X-API-KEY header. Done.
curl "https://apiv1.livescraper.com/task/map?queries=[%22Coffee+shops+in+Brooklyn%22]&language=en&region=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.

Tip · Don't ship your API key in client-side code. Always proxy through your own backend.
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

GET /task/map 2 credits / row

Search Google Maps and return clean place records — name, address, phone, website, email, social handles, ratings, hours, photos. Up to 15 queries per request.

NameInTypeDescription
queriesrequiredquerystring[]JSON array of strings. A search query, place ID, CID, or Google ID. Max 15.
languagerequiredquerystring2-letter language code (en, es, fr, …).
regionrequiredquerystring2-letter region code (US, GB, IN, …).
fieldsoptionalquerystring[]Whitelist of fields to return. Defaults to the full schema.
dropduplicatesoptionalquery"True" | "False"De-duplicate rows by place ID. Defaults to "True".
enrichmentoptionalquery"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&region=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

GET /task/review 3 credits / row

Pull all reviews for any business — yours or a competitor's. Returns authors, ratings, timestamps, full text, and the owner's reply.

NameInTypeDescription
queriesrequiredquerystring[]JSON array. Place query, place ID, CID or Google ID. Max 15.
languagerequiredquerystring2-letter language code.
regionrequiredquerystring2-letter region code.
fieldsoptionalquerystring[]Whitelist. Defaults to the full review schema.
dropduplicatesoptionalquery"True" | "False"De-duplicate by review ID.
curl "https://apiv1.livescraper.com/task/review?\
queries=[%22Saint+Frank+Coffee+Brooklyn%22]&\
language=en&region=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

GET /task/email 2 credits / row

Hand over a list of domains or business URLs; get back deliverable emails, phone numbers, social handles and meta data, validated and deduplicated.

NameInTypeDescription
queriesrequiredquerystring[]JSON array of URLs or domains. Max 15.
fieldsoptionalquerystring[]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.

Errors & rate limits

The API uses standard HTTP status codes. Every error response includes a stable code string you can match on programmatically.

HTTPCodeMeaning
200Success. Rows returned in data.
401E00100012API key missing, invalid, or revoked.
402E00100014Account credit too low. Top up to continue.
422Validation failed (e.g. more than 15 queries).
429Rate-limited. Back off and retry with exponential delay.
500Unexpected server error. Safe to retry.
Throughput · The default cap is roughly 15 requests per second. If you need more, email us and we'll lift it for your account — usually within a business day.
Limits per request · The 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.

Build with public data.

500 free credits every month. No card, no contract. Try the API on us.

Activates instantly · 38 seconds to your first download