● Live now Plain JSON, no dashboard Pay as you go 200+ countries

SERP API from $0.002
Same data as SERP Checker, straight to JSON

SERP API is the raw-data side of SERP Checker: same crawler, same pricing, the only difference is JSON output instead of a dashboard. Call POST /serp-api/trigger, then get the result via webhook or GET by snapshot_id.

SERPUPDATE SERP API dashboard showing request logs, per-snapshot cost and the API key playground
Quick start

3 calls to get SERP data

Auth header: X-API-KEY. Generate and rotate keys right in the dashboard.

1. Create a snapshot (billable)

Call POST /serp-api/trigger, with an Idempotency-Key header so a retry after a network error is safe.

curl -X POST https://app.serpupdate.com/api/v1/serp-api/trigger \
  -H "X-API-KEY: 3f9a1c7e4b2d48a6915e0c83d7f6b214" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-8841" \
  -d '{
    "input": [{
      "keyword": "best protein powder for muscle gain",
      "language": "en",
      "country": "US",
      "device": "desktop",
      "start_page": 1,
      "end_page": 10,
      "include_aio": true
    }]
  }'

Response:

{ "snapshot_id": "sd_abc123xyz" }

2. Get the result

Call GET /serp-api/{snapshot_id}: 200 when ready, 202 while running, 404 when not found, 410 when expired, 422 when the crawl failed.

curl https://app.serpupdate.com/api/v1/serp-api/sd_abc123xyz \
  -H "X-API-KEY: 3f9a1c7e4b2d48a6915e0c83d7f6b214"

3. Response shape

aio_text and aio_reference only appear when include_aio is on and Google actually showed an AI Overview for that query.

[{
  "keyword": "best protein powder for muscle gain",
  "organic": [
    { "rank": 1, "title": "...", "url": "...", "domain": "gnc.com", "description": "..." }
  ],
  "aio_text": "markdown, only when include_aio is true",
  "aio_reference": [
    { "rank": 1, "url": "...", "domain": "...", "title": "...", "description": "..." }
  ]
}]
Parameters

POST /serp-api/trigger body

Sent inside {"input": [{ ... }]}, one object per call.

Parameters Type Required Description
keyword string Required The keyword to crawl, 1 to 500 characters.
language string Optional Language code for the results.
country string Optional ISO-2 country code.
device string Optional desktop or mobile.
start_page / end_page number Optional Defaults to 1 through 10, the full Top 100. The price is flat per call, so taking all 10 pages costs no extra.
location string Optional A specific location, for example a city name.
uule string Optional Google's standardized location code, used instead of location when you need exact precision.
include_aio boolean Optional true also returns AI Overview. This is the only option that changes the unit price.
custom_id string Optional Your own identifier, kept in the request logs for reconciliation. It does not appear in the returned JSON.
Pricing

One call returns the full Top 100, from $0.002

One keyword is one call. It pulls 10 pages by default, the full Top 100, billed once.

1keyword 1API call 10SERP pages 100organic results
Raw data
$0.002
/ call

Top 100 organic, 10 pages, without AI Overview

Recommended Raw data + AI Overview
$0.0022
/ call

Top 100 organic, 10 pages, with aio_text and aio_reference

With AI Overview on, a call costs $0.0022 instead of $0.002. That is the replacement price for the call itself, not a second charge added on top.

Charged straight from the same top-up wallet as the rest of SERPUPDATE. Pay as you go, and the balance never expires. See full pricing.

Endpoint

4 endpoints, nothing more

Method Path Description
GET /serp-api/locations Look up locations: name (partial match), country (ISO-2), page, size.
GET /serp-api/languages List of supported languages, no parameters.
POST /serp-api/trigger Creates a snapshot, this is the billable call. Returns a snapshot_id.
GET /serp-api/{snapshot_id} Fetch the result: 200 when ready, 202 while running, 404 when not found, 410 when expired, 422 when the crawl failed.

Pingback webhook (recommended over polling)

SERPUPDATE POSTs to the URL you set in the dashboard when a snapshot finishes. Retried up to 3 times if not received: after 30 seconds, 5 minutes, 30 minutes. Includes the X-SerpUpdate-Delivery and X-SerpUpdate-Token headers.

{
  "snapshot_id": "sd_abc123xyz",
  "status": "ready",
  "keyword": "best protein powder for muscle gain",
  "collect_time_ms": 4821
}
Error code Meaning
HTTP 429 You called too often. There is no error code with it, read the Retry-After header then try again.
TOO_MANY_INPUTS More than one keyword was sent in a single call.
INSUFFICIENT_BALANCE Wallet balance is not enough to run the snapshot.
SNAPSHOT_EXPIRED The snapshot is past its 30 day retention.
SNAPSHOT_FAILED The crawl failed, this call is not charged.
COLLECTION_TIMEOUT The crawling infrastructure took too long to respond, try calling trigger again.
SERP API technology

Inside the SERP API crawling infrastructure

Scrapes real data like a genuine user, stable, location-accurate, never blocked.

Your application

POST /serp-api/trigger Keyword + Country + Device

Browser Fingerprint

Emulates a real browser, faithfully matching the SERP as displayed.

Worldwide IP Rotation

Rotates IPs by country/city across more than 200,000 localities.

Geo Targeting

Standardizes location by ISO 3166 country codes.

Human Like Behavior

Simulates real user actions to avoid being blocked.

CAPTCHA Solving

Automatically handles CAPTCHAs for stable, continuous tracking.

Data Preprocessing

Cleans SERP HTML into structured JSON you can use straight away.

What you get back

Pingback when ready JSON: organic + aio_text
Why choose

A crawler and an API admin dashboard, ready to go

Same engine as SERP Checker

Not a separate engine, same crawler, same reliability, only the way you receive results differs.

Raw JSON, process it your way

No dashboard, data flows straight into your own pipeline or data store.

Idempotency Key prevents double billing

Retrying after a network error is safe, your wallet is never charged twice for the same call.

Pingback webhook, no polling needed

SERPUPDATE notifies you when a snapshot is done, retrying up to 3 times if delivery fails.

Covers 200+ countries

Over 200,000 detailed locations, the same coverage as SERP Checker.

Comes with an admin dashboard

A playground to try before you code, request logs, per-snapshot cost, JSON/CSV export.

Not ready to code? Try SERP Checker first

Same data, same price, but viewed in a dashboard instead of an API call. Good when you want to try it before integrating.

See SERP Checker

Get a key, make your first call today

Pay as you go from $0.002, no contract, no hidden fees.

Get API key
FAQ

Frequently asked questions

How is SERP API different from SERP Checker?
Same crawler, same unit price. SERP Checker is the version with an interface, so it ships an analysis layer on top, such as Brand Mention and charts over time. SERP API is always raw data; your only choice is whether to include AI Overview.
Does turning on AI Overview cost extra?
That call is priced at $0.0022 instead of $0.002. It is a replacement price for the call itself, not a second charge added on top.
What is the Idempotency-Key for?
Send an Idempotency-Key header (up to 64 characters) with your trigger call. If you have to retry after a network error, the system recognizes it and does not charge you twice.
Should I poll or use a webhook?
Use the pingback webhook. SERPUPDATE calls the URL you set once a snapshot is done, retrying up to 3 times on failure, so you skip constant polling.
How long is a snapshot's result kept?
30 days. Calling the snapshot_id again after that returns the SNAPSHOT_EXPIRED (410) error.
Which search engine does SERP API support?
Google, at this stage. Coverage is over 200 countries and 200,000+ locations, the same as SERP Checker.