Why a SERP API instead of a rank tracking SaaS
A rank tracking service sells you its schedule, its keyword limits and its reports. A SERP API sells you the raw material: the live top 10, or up to the top 100, for each keyword, with the schedule, the storage and the reporting in your hands.
That makes Serper.live the backend for a tracker you own: an agency dashboard, a module in your SEO product, a nightly job that writes positions into your database. No seats, no keyword quotas, no per-project plans; the bill is the number of searches multiplied by the market price.
The trade-off is plain: you write the scheduler and the storage, and each check is a real Google search that takes a few seconds. In return every stored position was fetched at a known time, for a known country and device, never from a cache.
How to get a keyword position
One request per keyword, country and device. The documentation has the full reference; the logic in your code is four steps, and the example below is the same request in curl, JavaScript and Python:
- Send
POST /v1/searchwithquery,countryanddevice, optionallylanguageandlimit. A live search usually returns in 2–3 seconds, the first one to a market after a pause takes longer: keep the client timeout at least 100 seconds and run checks from a queue. - Read
organic[]. Each entry hasposition,title,url,domainandsnippet, in the order Google shows them. - Find the entry whose
domainmatches the site you track and store itspositionwithfetchedAtandrequestId. Decide in advance whether a subdomain counts for the root domain, and ignore a leadingwww.. - No match means outside the requested range for that check, the top 10 by default. Store that too: a keyword dropping out of the top 10 is exactly what a tracker exists to catch.
curl -s -X POST https://api.serper.live/v1/search \
-H "Authorization: Bearer sl_live_YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"best coffee shops","country":"DE","device":"desktop"}' \
| jq '.organic[] | select(.domain == "example.com") | .position'
const response = await fetch('https://api.serper.live/v1/search', {
method: 'POST',
headers: {
Authorization: 'Bearer sl_live_YOUR_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({ query: 'best coffee shops', country: 'DE', device: 'desktop' }),
signal: AbortSignal.timeout(100000),
});
const { organic } = await response.json();
const hit = organic.find(row => row.domain === 'example.com');
console.log(hit ? hit.position : 'outside the top 10');
import requests
response = requests.post(
"https://api.serper.live/v1/search",
headers={"Authorization": "Bearer sl_live_YOUR_TOKEN"},
json={"query": "best coffee shops", "country": "DE", "device": "desktop"},
timeout=100,
)
organic = response.json()["organic"]
position = next((row["position"] for row in organic if row["domain"] == "example.com"), None)
print(position or "outside the top 10")
Markets and devices
Open markets right now: Germany, France, United Kingdom, Türkiye, Ukraine, and United States. Every market has a two-letter code you pass as country, a default Google interface language you can override with language, and both desktop and mobile at the same price.
New markets appear in GET /v1/countries and on the pricing page as they launch; your integration does not change.
What it costs
A check is one request: from $0.01 per keyword, per country, per device, which is $10.00 per 1,000 checks. There is no subscription, and credit is prepaid in USDT or USDC from $5 and never expires.
Example: 500 keywords checked once a day on one device come to about 15,000 requests a month. Multiply by the price of your market, or type the number into the calculator on the pricing page. Desktop and mobile double the count; two checks a day double it again.
Limits you should know
- A live search usually takes 2–3 seconds, the first one for a market after a pause longer. Plan for throughput: run checks concurrently from a queue with a client timeout of at least 100 seconds.
- Positions go as deep as you ask:
limit1–100, 10 by default. Every started block of 10 costs one market price, so a check of the top 30 reserves three prices and keeps only the blocks that received results; a site outside the requested range is reported as absent, not as a position. - Nothing is cached. Two identical requests are two live searches and two charges; keep the results on your side.
- Results are specific to the country, device and language you send. Compare a position only with earlier checks made with the same three values.
- Google varies results between checks and over time. One live check is a sample; the trend over days is the signal to report.
Start with one keyword
Try it before you write code: the playground runs three live searches per IP address per day without an account, and its domain field shows the position straight away. Then create an account, add credit from $5 and send the first request from the quick start.