Why It Matters
Rank Numbers Lie. Pixels Don't.
Google's first organic result no longer sits at the top of the page. AI Overviews, featured snippets, ads, and 4-question PAA boxes routinely push position #1 below 1,000 pixels. Two queries with identical "rank #1" results can have wildly different real visibility.
Honest Rank Tracking
A "rank #2" result sitting at y=1,800 px (below an AI Overview, featured snippet, and ad block) gets a fraction of the clicks of a "rank #2" result at y=320 px. Track real visibility, not just ordinal position.
Above-the-Fold Detection
Use a viewport threshold (e.g. y < 768) to identify which elements are visible without scrolling. Build dashboards that flag every page where your client lost the fold.
SERP Feature Impact
Compare pixel position over time as Google rolls out new SERP features. Catch the day your top-of-page snippet got pushed below an AIO — long before the rank metric notices anything has changed.
Ad Position Auditing
Each ad in the response carries a pixel_position too. Validate that paid placements are landing where the bid auction promised, not buried under organic SERP features.
Featured Snippet Dominance
Knowing your snippet exists isn't enough — knowing it sits at y=180 means it's the first thing users see. Track snippet pixel position across keywords and competitors.
Honest Reporting
Show clients the screenshot that matches their search. A pixel y-coordinate next to every result is the proof that builds trust without you having to ship screenshots.
Quick Start
One Flag. Pixels Everywhere.
Add pixel_position=true to any /api/search or /api/search/quick call. The request shape is otherwise unchanged. The response gains a single pixel_position integer on every item.
# Quick search with pixel positions curl "https://apiserpent.com/api/search/quick?q=mesothelioma+lawyer&engine=google&country=us&pixel_position=true" \ -H "X-API-Key: YOUR_API_KEY"
import requests resp = requests.get( "https://apiserpent.com/api/search", headers={"X-API-Key": "YOUR_API_KEY"}, params={ "q": "how to bake bread", "engine": "google", "country": "us", "pixel_position": "true", }, ) data = resp.json() # Every organic item has an integer pixel_position for item in data["results"]["organic"]: print(item["position"], item["pixel_position"], item["url"]) # SERP feature blocks too if data["results"]["aiOverview"]: print("AIO at y =", data["results"]["aiOverview"]["pixel_position"])
const resp = await fetch( "https://apiserpent.com/api/search?q=tesla+stock+price&engine=google&country=us&pixel_position=true", { headers: { "X-API-Key": "YOUR_API_KEY" } } ); const data = await resp.json(); // Filter to "above the fold" results (y < viewport height) const aboveFold = data.results.organic.filter(r => r.pixel_position < 768); console.log(`${aboveFold.length} organic results visible without scroll`);
{
"success": true,
"engine": "google",
"results": {
"organic": [
{
"position": 1,
"title": "…",
"url": "https://example.com",
"pixel_position": 750, // y-coordinate from top of SERP
"pixel_box": { "x": 126, "y": 750, "w": 652, "h": 118 } // full geometry (NEW)
}
],
"aiOverview": {
"text": "…",
"pixel_position": 210,
"pixel_box": { "x": 125, "y": 210, "w": 1100, "h": 428 }
},
"featuredSnippet": {
"text": "…",
"pixel_position": 252,
"pixel_box": { "x": 126, "y": 252, "w": 652, "h": 374 }
},
"knowledgePanel": {
"title": "…",
"pixel_position": 789,
"pixel_box": { "x": 832, "y": 789, "w": 372, "h": 512 }
},
"peopleAlsoAsk": [
{ "question": "…", "pixel_position": 1337, "pixel_box": { "x": 126, "y": 1337, "w": 652, "h": 52 } }
],
"ads": {
"top": [
{ "title": "…", "pixel_position": 120, "pixel_box": { "x": 126, "y": 120, "w": 652, "h": 82 } }
]
}
}
}
Spec
What You Get
An integer pixel_position and a full pixel_box: {x, y, w, h} on every item across the entire response shape. No source-of-pixel flags, no separate per-block fields — one consistent shape for every result type, every engine.
pixel_position=true on /api/search or /api/search/quick. Defaults to false; default-off responses are byte-identical to today.organic[] item, plus aiOverview, featuredSnippet, knowledgePanel, peopleAlsoAsk[], ads.top[], shopping[], videos[], localPack[], and relatedSearches[] when present.pixel_positionpixel_position < 768 are above the fold.pixel_box NEW{ x, y, w, h } — left offset, top offset, width, and height of the element's bounding box, all in pixels at the 1366×768 viewport. Use this to compute element area, centerpoint, viewport intersection, or build pixel-accurate SERP heatmaps. Returned alongside pixel_position at no extra cost; pixel_box.y is identical to pixel_position by construction.metadata.pixelPositionUnavailable: 'free_tier' and no pixel fields.pixel_position=true costs the same as one without — and you get full pixel_box geometry in the same call.pixel_position / pixel_box; integrate with a fallback to ordinal rank in those cases.Compare
Pixel Position vs. SerpAPI & DataForSEO
Pixel-style metrics are a small subset of what most SERP APIs ship. Here is what the field looks like across the three providers offering anything in this space.
| Capability | Serpent API | SerpApi.com | DataForSEO Live Advanced |
|---|---|---|---|
| Pixel position on every organic result | Yes | Partial (block-level only) | Yes |
| Engines supported | Google · Yahoo · Bing · DuckDuckGo | Google only | Google only |
| Pixel position on AI Overview / featured snippet / knowledge panel / PAA / ads | Yes (every block) | Some blocks | Yes |
| Full element geometry (x, y, width, height) | Yes — pixel_box on every item | No (top-offset only) | Yes (rectangle on Live Advanced) |
| Both single-integer and full-geometry returned in one call | Yes — pixel_position + pixel_box sibling fields | No | No (rectangle only, must compute y separately) |
| Opt-in flag (no charge when disabled) | Yes (pixel_position=true) | Always returned | Separate paid product |
| Price increase when enabled | None | Bundled into base plan | ~5–10× the base SERP cost |
| Free tier | 10 free searches | 100/mo | Trial credits only |
Comparison reflects the Pixel Position scope only. See our full SERP API price comparison for the complete picture.
FAQ
Pixel Position Questions
pixel_position=true to any /api/search or /api/search/quick call. Every item in the response — organic results, AI Overview, People Also Ask, featured snippet, knowledge panel, ads, shopping, videos, and local pack — gets a pixel_position integer field plus a sibling pixel_box object containing { x, y, w, h } with full element geometry. The base request behavior is unchanged when the flag is omitted.
pixel_position is a single integer — the y-coordinate (top offset) of an element. pixel_box is a sibling object containing the full bounding rectangle: { x, y, w, h } where x and y are the top-left offset in pixels from the page origin, and w / h are the element's width and height. pixel_box.y is identical to pixel_position by construction. Use pixel_box when you need element area (w × h), centerpoint (x + w/2, y + h/2), viewport intersection, or pixel-accurate SERP heatmaps. Both fields ship in the same response at no extra cost when pixel_position=true.
pixel_position=true costs the same as a search without it. The feature is included for paid tiers; free-tier responses include metadata.pixelPositionUnavailable: 'free_tier' instead of pixel data.
pixel_offset_top on a few SERP feature blocks but not on every organic item, and only for Google. DataForSEO offers rectangle coordinates on its Live Advanced product (significantly more expensive), again Google-only. Serpent API returns pixel_position on every item across the entire response shape — organic, AIO, PAA, FS, KP, ads, shopping, videos, local pack — across all four supported engines (Google, Yahoo, Bing, DuckDuckGo), at the same flat per-call price as base search, with no upgrade required.
pixel_position as best-effort during BETA and integrate with a fallback path that uses ordinal rank when the field is missing.
Try Pixel Position Free
Add pixel_position=true to any Google search and every item comes back with a pixel y-coordinate. No price increase, opt-in flag, BETA. Get started with 10 free searches.