πŸ” SEO & Search Marketing

SERP APIs: The Complete Guide to Search Engine Data Collection

Search results are among the most valuable data on the internet and among the hardest to collect. Search engines have spent two decades building defences against automated querying, they change their…

Search results are among the most valuable data on the internet and among the hardest to collect. Search engines have spent two decades building defences against automated querying, they change their result layouts constantly, and the results themselves are personalised, localised, and increasingly rendered rather than served as static HTML.

You have two ways to get that data. You can build and maintain a scraper β€” proxies, rotation, CAPTCHA handling, parsers that break every few weeks β€” or you can pay someone else to have already solved it and call an API that returns structured results.

This guide covers what SERP APIs actually do, how to decide between building and buying, what the data looks like, how to structure requests properly, where the pricing traps are, and how to build a rank tracking or keyword research pipeline that doesn't silently produce wrong numbers.

What a SERP API Actually Is

A SERP API is a managed service that accepts a search query and returns structured search engine results. You send a keyword, a location, a device type, and a language; you get back JSON containing organic results, ads, and whatever result features appeared.

Everything between those two points is the vendor's problem:

  • Proxy infrastructure and rotation across a large pool of addresses
  • CAPTCHA and challenge handling, which is the single most expensive part of doing this yourself
  • Rendering where the results require JavaScript execution
  • Parsing the HTML into structured fields
  • Layout change tracking, which is continuous and unglamorous work
  • Geographic and device targeting at the granularity search engines actually use
  • Retry and error handling for the substantial fraction of requests that fail on first attempt

What you get back is a stable contract. The search engine changes its markup, the vendor updates their parsers, and your code keeps working. That contract is the entire product, and it's worth considerably more than it looks until you've maintained a search scraper through a few layout changes.

Why Search Engines Are Uniquely Hard to Scrape

Understanding the difficulty explains the price.

Aggressive, sophisticated bot detection. Search engines have more data about what human traffic looks like than anyone. They see billions of real queries daily, so their model of normal behaviour is exceptionally well calibrated, and deviations are obvious.

Rapid IP burn. An address that queries repeatedly gets challenged quickly. Rates that would be unremarkable on an ordinary website trigger interstitials here within a handful of requests.

Constant layout changes. Result pages change frequently β€” new features, restructured markup, altered class names. A parser written today has a limited shelf life, and the failure mode is usually silent: you keep getting data, it's just wrong.

Deep personalisation and localisation. Results vary by location down to city or finer, by device, by language, by search history, and by time. There is no single canonical result page, which means "the ranking" is a fiction unless you specify exactly what you measured.

Rendered content. Increasing portions of the result page are populated by JavaScript, which means a plain HTTP fetch doesn't see everything.

Feature proliferation. Modern result pages contain far more than ten blue links: featured snippets, knowledge panels, local packs, image and video carousels, People Also Ask, shopping results, AI-generated summaries, and more. Each has its own structure and each needs separate parsing.

Silent degradation. The most dangerous failure mode. Your scraper doesn't error; it returns a result page that's been quietly altered, or a generic page instead of a localised one. You get numbers, they look plausible, and they're wrong. This is why so many home-built rank trackers report figures that don't match reality.

Build or Buy

The honest framework.

Buy an API when

  • Search results are the product, not the project. You need rank data to do your actual job, and maintaining a scraper isn't your business.
  • You need results across many locations. Geographic targeting at city granularity is one of the hardest parts to build and one of the easiest to buy.
  • Volume is moderate. At low to mid volumes, per-request pricing is cheaper than the proxies plus engineering time a DIY solution requires.
  • Reliability matters more than unit cost. If a week of missing rank data would be a problem, buy the thing with an availability commitment.
  • Your team is small. Search scraper maintenance is a recurring tax that doesn't scale down.
  • You need result features parsed. Snippets, local packs, People Also Ask, shopping results β€” building parsers for each and keeping them current is substantial ongoing work.

Build it yourself when

  • Volume is very large and sustained. Per-request pricing eventually loses to raw infrastructure. Where that crossover sits depends on your rates, but it exists.
  • You need something the APIs don't offer. Unusual engines, specific parameters, custom result handling.
  • You already have the infrastructure and expertise. If you're running a large proxy operation with parser maintenance capacity, adding search is incremental.
  • The data is strategically core. Some businesses can't outsource their primary data pipeline for competitive or continuity reasons.
  • You need full control over the raw response. APIs return parsed structures; if you need the original HTML for analysis, check whether the vendor provides it.

The calculation

API monthly cost = requests x per-request price

The term people systematically underestimate is engineering hours. It isn't the initial build β€” that's a few weeks. It's the ongoing maintenance: parsers breaking, block rates rising, new result features appearing, geographic targeting drifting. Budget several hours a week indefinitely, and be honest about whether those hours are better spent elsewhere.

> Tip: Whatever you decide, build the consumer side against a stable internal interface. If you start with an API and later move to your own infrastructure, or vice versa, only one adapter should change.

What SERP Data Actually Contains

Modern search results are structurally rich, and knowing what's available shapes what you can build.

Organic results. Position, title, URL, displayed URL, description snippet, and often sitelinks or extended attributes. The core of any rank tracking system.

Paid results. Ads at the top and bottom, with position, advertiser, display URL, copy, and extensions. Valuable for competitive advertising intelligence and for understanding how much organic real estate is actually visible.

Featured snippets. The extracted answer above organic results, with the source and the extracted content. Frequently the single most valuable position on the page, and structurally distinct from position one.

Local packs. Map results with business names, ratings, review counts, addresses, and categories. Entirely dependent on the location you specified, which is why geographic precision matters so much.

People Also Ask. Expandable question boxes, a rich source for content research and for understanding query intent.

Knowledge panels. Entity information, attributes, and related entities. Useful for brand monitoring and entity SEO.

Shopping results. Products, prices, merchants, and ratings, when the query has commercial intent.

Image, video, and news carousels. Each with its own structure and its own competitive dynamics.

Related searches. The suggestions at the page bottom, useful for keyword expansion.

AI-generated summaries. Increasingly present on informational queries, and increasingly consequential because they change how much attention organic results receive.

Metadata. Result count estimates, whether spelling correction was applied, and what the engine believed you asked.

The practical implication: "what position do I rank" is an incomplete question. A page can rank first organically while sitting below four ads, a featured snippet, a local pack, and an AI summary β€” meaning it's the sixth thing a user sees, not the first. Any serious rank tracking system should capture the full page composition, not just organic position.

Request Parameters That Actually Matter

Getting these wrong is how people produce confidently incorrect data.

Query. The keyword itself. Encode it properly and be careful with quotes, operators, and special characters, which change engine behaviour.

Location. The most important parameter and the most frequently mishandled. Search results vary dramatically by location, especially for anything with local intent. Specify the actual location you care about, at the granularity your data requires. A national-level location returns results that match no individual user.

Device. Mobile and desktop results differ in ordering, feature composition, and ad load. Track the device your audience actually uses; for most consumer queries that's mobile, and desktop-only tracking has been misleading for years.

Language. Interface language, distinct from the query language and from the location. All three interact.

Country or domain. Which regional version of the engine to query.

Result count. How many results per page. Requesting more per page is cheaper but changes result composition in ways that make positions non-comparable with default settings.

Pagination. Whether to fetch beyond the first page. Most value is on page one, and beyond page two the data is rarely worth its cost.

Personalisation controls. Where available, disabling personalisation gives you something closer to a neutral baseline. There's no truly neutral result, but reducing variance helps.

Time range. For news and recency-sensitive queries.

The discipline that matters: keep parameters identical across time. Rank tracking is a longitudinal measurement, and changing the location granularity or device halfway through a series produces a discontinuity that looks like a ranking change. Store the full parameter set alongside every result so you can always tell what you actually measured.

Building a Rank Tracking Pipeline

The architecture that works, whether you buy an API or build the collection yourself.

Define your tracked set explicitly. Every tracked item is a tuple: keyword, location, device, language, and engine. Not just a keyword. Two tracking entries for the same keyword in different cities are different measurements and should be stored as such.

Schedule consistently. Query the same set at roughly the same time each day. Results fluctuate through the day, so inconsistent timing introduces noise you'll mistake for movement.

Store the full result page composition, not just your own position. You want to know what else was on the page: how many ads, whether a featured snippet appeared, whether a local pack pushed organic results down. Position without context is misleading.

Store the raw response where the API provides it. When you later discover a parsing assumption was wrong, being able to reprocess historical data is worth a great deal.

Record the parameters with every result. Location, device, language, timestamp, and API version. Without these you can't distinguish a real ranking change from a change in how you measured.

Handle absence explicitly. Not ranking in the top hundred is different from a failed request, which is different from the keyword no longer returning results. Collapsing these into a null produces charts that lie.

Detect and flag anomalies. A site dropping thirty positions overnight across every keyword is more likely a collection problem than a ranking event. Build sanity checks that flag implausible movements for review rather than publishing them.

Version your parsing. When result structures change, you want to know which records were collected under which interpretation.

Deduplicate carefully. Search engines sometimes return the same domain multiple times, and how you count that affects your position numbers. Pick a convention, document it, and keep it stable.

Integration

The mechanics are simple; the discipline is in the surrounding structure.

Basic request

params = {

"q": "best running shoes",

"location": "Austin, Texas, United States",

"device": "mobile",

"language": "en",

"country": "us",

}

r = requests.get("https://api.example.com/search", params=params, timeout=60)

data = r.json()

Note the timeout. SERP APIs are slower than ordinary endpoints because the vendor is doing real work behind the scenes β€” rotating, rendering, retrying. Sixty seconds is reasonable; ten is not.

Extracting what matters

organic = data.get("organic_results", [])

position = next(

(r["position"] for r in organic if target_domain in r.get("url", "")),

None

)

return {

"position": position,

"ads_above": len(data.get("ads", [])),

"hasfeaturedsnippet": "featured_snippet" in data,

"haslocalpack": "local_results" in data,

"hasaisummary": "ai_overview" in data,

"organic_count": len(organic),

}

The composition fields matter as much as the position. A rank of three under a featured snippet and four ads is a materially different outcome from a rank of three on a clean page.

Concurrency and rate limits

SEM = asyncio.Semaphore(10)

async def fetch(session, params):

async with SEM:

for attempt in range(3):

try:

async with session.get(URL, params=params, timeout=aiohttp.ClientTimeout(total=90)) as r:

if r.status == 429:

await asyncio.sleep(2 ** attempt + 1)

continue

return await r.json()

except asyncio.TimeoutError:

continue

return None

Respect the vendor's documented rate limits. Unlike scraping your own targets, exceeding these gets you throttled or billed rather than blocked, and neither is useful.

Storing results

Store three things per measurement: the parameters you sent, the structured result, and the raw response if available. Storage is cheap; recollecting historical search data is impossible, because you cannot query the past.

Pricing Models and Traps

SERP APIs are almost always priced per request, with volume tiers. The traps are in what counts as a request.

  • Does a failed request count? Policies vary. Some vendors only bill successful responses; others bill every attempt. At scale this is a meaningful difference.
  • Does pagination count separately? Usually yes. Fetching three pages is three requests.
  • Do premium features cost more? Some vendors charge more for rendered results, specific engines, or certain result types.
  • Is geographic targeting priced differently? City-level targeting sometimes costs more than country-level.
  • Do credits expire? Monthly allowances frequently don't roll over.
  • What's the concurrency limit on your tier, and does exceeding it cost extra or simply queue?
  • Is there a minimum commitment, and how does overage price?

Estimating your volume

The multiplication is what surprises people. Five hundred keywords across ten cities on two device types, checked daily:

Three hundred thousand, from what felt like five hundred keywords. Ways to reduce it honestly:

  • Check important keywords daily, the long tail weekly. Most keywords don't move enough to justify daily measurement.
  • Reduce location granularity where local intent is weak. Informational queries rarely need city-level tracking.
  • Track one device where your audience is overwhelmingly on one. Verify with your analytics rather than assuming.
  • Prune the tracked set. Most tracking lists accumulate keywords nobody looks at.

> Tip: Before buying a tier, run the multiplication with your real tracked set. The gap between "we track five hundred keywords" and the actual request count is usually a factor of ten or more.

When You Still Need Raw Proxies

SERP APIs cover search engines. They don't cover everything adjacent, and most operations end up needing both.

  • Scraping the ranked pages themselves. Once you know what ranks, analysing those pages β€” content, structure, backlinks, technical setup β€” is ordinary web scraping and needs ordinary proxies.
  • Engines or regions the API doesn't support. Coverage varies, particularly outside the largest engines and markets.
  • Site-specific search. Marketplace search, app store search, and internal site search are not what SERP APIs cover.
  • Volumes where per-request pricing stops making sense. At very large scale, raw infrastructure eventually wins.
  • Custom parameters or raw HTML the vendor doesn't expose.
  • Competitor site monitoring, content tracking, and everything else in an SEO workflow that isn't a search query.

The common architecture is a hybrid: an API for search result data, where reliability and geographic precision justify the price, and a proxy pool for crawling the pages and sites that the search data points at. Those two workloads have genuinely different requirements, and trying to serve both with one tool usually means doing one of them badly.

Use Cases in Depth

Rank tracking. The obvious one, and the one most often done badly. Done properly it means tracking a defined tuple of keyword, location, device, and language over time, with consistent parameters and full page composition recorded alongside position. Done badly it means a single national-level number that doesn't correspond to what any real user sees.

Local SEO auditing. Businesses with physical locations need results measured from those locations. Local packs, map results, and localised organic ordering are entirely dependent on the location parameter, and country-level tracking simply doesn't produce this data. Multi-location businesses multiply their tracked set by their location count, which is where volume estimates go wrong.

Keyword research at scale. Related searches, People Also Ask questions, and autocomplete suggestions are all structured data on the result page. Harvesting them across a seed set produces keyword expansion grounded in what the engine actually associates with a topic, rather than in a third-party tool's model of it.

Competitive visibility analysis. Measuring which domains appear across a keyword set, how often, and in what positions. This produces a share-of-visibility picture that's far more useful than tracking your own rankings in isolation, because it tells you who you're actually competing against on the page.

SERP feature monitoring. Tracking whether featured snippets, local packs, shopping results, and AI summaries appear for your keywords, and who owns them. Feature ownership frequently matters more than organic position, and features appear and disappear far more volatilely than rankings do.

Ad intelligence. Paid results are returned alongside organic ones. Tracking which competitors advertise on which terms, with what copy and what extensions, is a straightforward by-product of data you're already collecting.

Content gap and brief research. Pulling the top results for a query, then crawling those pages to analyse what they cover, is a two-stage workflow: the API supplies the ranked set, ordinary proxies supply the page content. This is the most common hybrid pattern.

Brand and reputation monitoring. Watching what surfaces for brand-name queries, including in knowledge panels and news results, across the markets you operate in.

Market entry research. Querying from locations you don't operate in yet, to see the competitive landscape, the dominant players, and the result features that matter in that market before committing resources.

Architecture Patterns That Work

A stable internal interface over the data source. Whether you're calling an API or running your own scraper, your application should talk to one internal contract. Vendors change, pricing changes, and you may end up running both β€” only an adapter should have to change.

The measurement tuple as your primary key. Store results keyed by (keyword, location, device, language, engine, timestamp). Treating the keyword alone as the key is the root cause of most rank tracking data quality problems.

Immutable raw storage. Keep the original response, versioned by collection date. Search data cannot be recollected retrospectively, so any parsing decision you make today is permanent unless you kept the source.

Separation of collection and analysis. Collect on a schedule into raw storage; analyse from storage, not from live requests. This makes reprocessing possible, keeps analysis reproducible, and stops an analytical bug from generating billable requests.

Explicit absence modelling. Distinguish "not in the top hundred," "request failed," "keyword returns no results," and "not yet collected." Collapsing these into null is how tracking charts end up lying to clients.

Anomaly gating before publication. Sanity checks that flag implausible movements β€” everything dropping at once, a location suddenly returning generic results β€” and hold them for review rather than pushing them into a client dashboard.

Tiered collection frequency. A priority set checked daily, a secondary set weekly, an archive set monthly. This is the single most effective cost control available, and it usually improves signal quality too by removing noise from keywords nobody acts on.

A companion crawling pipeline. Search data tells you what ranks; you almost always want to know why. Budget for the proxy infrastructure to crawl those pages, and treat it as part of the same system rather than an afterthought.

Troubleshooting

Symptoms and their usual causes:

  • Results don't match what you see in your own browser β€” expected, and usually correct. Your browser is personalised, logged in, and located where you are. The API result is closer to a neutral baseline. Compare against a private browsing session with location spoofed to the same target.
  • Positions differ from another rank tracking tool β€” different tools use different locations, devices, deduplication conventions, and definitions of position. Neither is wrong; they're measuring different things. Pick one and stay consistent.
  • Rankings appear to change dramatically overnight across everything β€” almost always a collection or parsing issue, not a ranking event. Investigate before reporting.
  • Local pack missing when you expect it β€” check your location parameter granularity. Country-level locations frequently don't trigger local results.
  • Requests timing out β€” raise your timeout. SERP APIs do substantial work per request and are legitimately slow.
  • 429 rate limited β€” you're exceeding your tier's concurrency. Add a semaphore and backoff.
  • Results look stale β€” check whether the vendor caches, and whether you're being served a cached response. Some offer a freshness parameter.
  • Mobile and desktop results identical β€” verify the device parameter is actually being applied; a silently ignored parameter is a common integration bug.
  • Costs far higher than expected β€” you're probably paginating, retrying billably, or multiplying your tracked set across more locations and devices than you realised.
  • Featured snippet appears in data but not in your browser β€” features are volatile and vary by user. Snapshot data reflects one measurement at one moment.

Common Mistakes That Produce Wrong Data

Worth calling out separately, because these account for most of the bad rank data circulating in the industry.

Tracking a keyword instead of a measurement. "We rank fourth for running shoes" is meaningless without a location, a device, and a date. The moment you accept a keyword as a tracking unit, your data has already lost the context that makes it interpretable.

Using national location settings for local intent queries. A country-level location produces results that correspond to no actual user. For anything with local intent, this doesn't just add noise β€” it returns a fundamentally different page.

Changing parameters mid-series. Switching from desktop to mobile, or from country to city granularity, creates a discontinuity that looks exactly like a ranking event. If you must change, start a new series rather than continuing the old one.

Ignoring page composition. Position three on a clean page and position three below four ads, a featured snippet, and a local pack are wildly different outcomes for actual traffic. Reporting position alone overstates good news and understates bad.

Treating missing data as not ranking. A failed request recorded as "not in top 100" produces a phantom drop, and phantom drops trigger real panic.

Comparing across tools. Different rank trackers use different locations, devices, deduplication rules, and position definitions. Cross-tool disagreement is expected, not evidence that one is broken. Pick one methodology and stay with it.

Over-collecting the long tail. Daily checks on thousands of keywords nobody acts on generates cost, noise, and false alarms in equal measure.

Not storing raw responses. Every parsing assumption you make today becomes permanent unless you kept the source. Search data cannot be recollected from the past.

Reporting without stating methodology. When a client sees a different result on their own screen β€” and they will, because their browser is personalised and located where they are β€” being able to explain exactly what you measured is the difference between a conversation and a credibility problem.

Evaluating a SERP API Provider

Criteria that predict real-world usefulness:

  • Engine and regional coverage matched against what you actually need
  • Geographic targeting granularity β€” country, region, city, or finer β€” and how it's specified
  • Device targeting support and whether it's genuinely applied
  • Result feature coverage: which features are parsed, and how quickly new ones get support
  • Response structure stability, and how the vendor handles breaking changes
  • Whether raw HTML is available alongside parsed results
  • Latency, measured yourself under real load rather than taken from marketing
  • Success rate and reliability during a trial with your actual keyword set
  • Billing policy on failures, which is one of the more consequential fine-print items
  • Rate limits and concurrency on your tier
  • Documentation quality, particularly around location specification
  • Historical data availability, if you need backfill

Test with your real tracked set, not a generic keyword. Query a handful of your actual keywords in your actual target locations and compare against what you can verify manually. Any provider can return plausible-looking JSON; the question is whether the numbers are right for the places you care about.

The First Thirty Days

Week one β€” verification.

  • Run your real keyword set, not sample keywords, in your real target locations
  • Manually verify a sample of results against a private browsing session with location set to match. Discrepancies you can't explain are a problem to solve now, not later
  • Confirm the device parameter actually changes results; silently ignored parameters are a common integration bug
  • Measure latency under realistic concurrency
  • Check what the vendor bills for on a failed request

Week two β€” pipeline.

  • Build collection into raw storage with the full parameter set recorded per measurement
  • Implement explicit absence handling before you have any data to misinterpret
  • Set the collection schedule and hold it consistent
  • Establish the tracked-set tuples deliberately rather than accumulating them

Week three β€” instrumentation.

  • Log request count, success rate, latency, and cost per collection run
  • Build anomaly detection on aggregate movement before anyone sees a dashboard
  • Alert on collection failures, since silent gaps are worse than visible errors
  • Verify your request volume against your tier allowance

Week four β€” tuning.

  • Prune keywords nobody has looked at
  • Move the long tail to a lower collection frequency
  • Compare actual spend against the DIY alternative with real numbers
  • Decide whether location and device coverage is right, and adjust before renewal

A Note on Verifying Data Honestly

Search data has a specific failure mode that other scraping doesn't: it fails plausibly. A broken product scraper returns nothing and you notice. A broken rank tracker returns numbers, and numbers get put in reports.

Build verification in from the start:

  1. Pick a small sample of keywords with known, easily-checkable results
  2. Verify them manually against a location-matched private session, monthly
  3. Compare a subset against a second independent source, accepting that methodological differences will produce some variance
  4. Track your own aggregate movement and treat sudden uniform shifts as suspect until proven otherwise
  5. Record the collection parameters with every published figure, so any disagreement can be traced to methodology rather than argued about

The goal isn't perfect accuracy, which isn't available in a personalised, localised, constantly-changing system. The goal is knowing exactly what your numbers represent, and being able to say so when someone asks why they differ from what they see on their own screen.

  • Search results are publicly accessible, and collecting them is common industry practice, but search engine terms of service generally prohibit automated querying. That's a contractual question rather than a criminal one in most jurisdictions, and using an API shifts that exposure to the vendor rather than eliminating it
  • Data protection law applies to anything personal that appears in results
  • Don't republish search results wholesale; use them as inputs to analysis rather than as content
  • Rate-limit yourself even through an API. The vendor is querying real infrastructure on your behalf
  • Be accurate about what your data represents. Rank data collected from one location on one device at one moment is exactly that, and presenting it as universal truth to a client is a professional problem, not a legal one

Not legal advice, and jurisdictions differ. Have a lawyer review commercial operations at scale.

Frequently Asked Questions

Why not just scrape search results myself with residential proxies?

You can, and at very large volumes it becomes cheaper. What you're taking on is CAPTCHA handling, parser maintenance through constant layout changes, geographic targeting, and silent-failure detection. Budget ongoing engineering time, not just proxy spend.

Why do API results differ from what I see in my browser?

Your browser is personalised, logged in, located where you are, and carrying search history. The API returns something closer to a neutral baseline for the parameters you specified. Both are real; they're different measurements.

How accurate is the position data?

Accurate for the parameters you specified, at the moment you measured. Since results are personalised and localised, there is no single true position β€” only a position for a defined location, device, and time.

Should I track mobile or desktop?

Whichever your audience uses, which for most consumer queries is mobile. Check your own analytics. Tracking both doubles your request volume, so only do it where the difference matters.

How often should I check rankings?

Daily for your most important terms, weekly for the long tail. Daily tracking of thousands of low-priority keywords generates cost and noise without insight.

Can I get historical search data?

Generally no. You can't query the past β€” you can only start recording now. Some vendors offer limited historical datasets, but the reliable answer is to begin collecting early.

Do SERP APIs work for Bing, and other engines?

Coverage varies by vendor. Verify support for the specific engines and regions you need before committing.

What about tracking AI-generated search summaries?

Increasingly supported, and increasingly important, since these summaries change how much attention organic results receive. Check whether your vendor parses them and whether they cost extra.

Do I still need proxies if I use a SERP API?

Almost certainly. The API handles search queries; crawling the pages that rank, monitoring competitor sites, and everything else in an SEO workflow still needs ordinary proxy infrastructure.


Where to Get SERP Data and Supporting Proxies

If you'd rather buy search result data than maintain a scraper for it, ProxyScrape's SERP API handles rotation, unblocking, and parsing behind a single request, returning structured results without the maintenance burden of keeping your own search scraper alive through layout changes. Because most SEO workflows also need to crawl the pages that rank, their residential proxies cover the site-level scraping side with city-level geo-targeting for localised work, and their datacenter plans handle the high-volume link checking and content monitoring that surrounds it β€” the hybrid setup most serious SEO and SERP tracking operations end up running.

β†’ Compare SERP API pricing against what a DIY search scraper actually costs you

The decision between building and buying here comes down to one honest question: is search result collection your business, or is it a dependency of your business? If it's a dependency, the ongoing maintenance tax on a home-built scraper is almost always worse than it looks from the outside, and the failure mode β€” plausible-looking numbers that are quietly wrong β€” is the kind that damages client relationships before anyone notices it. Whichever way you go, record your parameters, store your raw responses, and never report a position without saying where and on what device you measured it.