Scrape Google search results at scale — every ranked listing on the real SERP as structured JSON: position, title, link, snippet, sitelinks, and page number. Sample desktop and mobile separately, target any country or city, and paginate up to 10 pages in a single call.
4.8 · 33 reviewsThe result.organicResults array preserves true SERP order — including page number when you paginate — so you can compute rank deltas without any DOM parsing.
import requests
response = requests.post(
"https://api.cloro.dev/v1/monitor/google",
headers={
"Authorization": "Bearer sk_live_your_api_key_here",
"Content-Type": "application/json"
},
json={
"query": "best crm for startups",
"country": "US",
"device": "desktop",
"pages": 2
}
)
print(response.json()) {
"success": true,
"result": {
"organicResults": [
{
"position": 1,
"title": "The 10 Best CRMs for Startups in 2026",
"link": "https://example.com/best-crm-startups",
"displayedLink": "https://example.com › blog › best-crm-startups",
"snippet": "We tested 24 CRMs on pricing, onboarding speed, and integrations. Here are the ten that actually fit early-stage teams...",
"page": 1,
"sitelinks": {
"inline": [
{
"title": "Pricing comparison",
"link": "https://example.com/best-crm-startups#pricing"
}
]
}
},
{
"position": 11,
"title": "CRM Buying Guide for Seed-Stage Companies",
"link": "https://example.org/crm-buying-guide",
"displayedLink": "https://example.org › guides",
"snippet": "A practical framework for picking a CRM before you have a sales team...",
"page": 2
}
]
}
} Field names match the OpenAPI spec exactly — what you see here is what deserializes.
| Field | Type | Description |
|---|---|---|
| position | number | Position in search results (1-indexed), preserving true SERP order. |
| title | string | Title of the search result. |
| link | string | URL of the search result. |
| displayedLink | string | Formatted URL as displayed in search results. |
| snippet | string | Text snippet describing the page content. |
| date | string | Publication date, when Google renders one next to the snippet. |
| page | number | SERP page this result appeared on (1-indexed) — set when you request multiple pages. |
| sitelinks.inline | object[] | Inline sitelinks under the main result, each with title and link. |
Pick a plan that fits your volume. Price per credit drops as you scale.
Increased concurrency, overages on credits and credit discounts for annual contracts.
Know moreCredit cost per request varies by provider. The figures below are for async/batch requests; sync requests add a +2 credit surcharge.
ChatGPT full response includes query fan-out, ads, and shopping data. Google News uses the same pricing as Google Search.
Positions are 1-indexed and continue across pages — result 11 is the first listing of page 2 with `page: 2` set. Pass `pages: N` (1–10) to fetch several SERP pages in one call; each additional page adds +2 credits.
Frequently, yes. Google ranks and lays out mobile SERPs differently, and ads/PAA placement pushes organic results around. Pass `device: "mobile"` or `"desktop"` to sample each separately — rank trackers typically run both.
Yes. Use `country` for ISO country targeting, or `location` with Google's canonical location name (e.g. "Austin,Texas,United States") / a pre-encoded `uule` for city-level sampling. Local intent queries re-rank heavily by city.
Yes. The response carries sponsored ads, People Also Ask, related searches, knowledge graph, and shopping results alongside organic — one call, one credit price.
Custom Search queries a curated index that diverges from the live SERP, caps at 100 free queries/day, and strips position context (no ads, no SERP features around your listings). For rank tracking you need the rendered google.com order, which is what this endpoint returns.
A base Google SERP request is 3 credits — from $0.40 per 1,000 calls at volume — and organic results are always included, no add-on flags. See pricing for the full credit table.