DEV Community

Cover image for HVAC Leads from Google Local Services Ads: Pull Google Guaranteed Pros as JSON in 2026
Truffle Pig Data
Truffle Pig Data

Posted on

HVAC Leads from Google Local Services Ads: Pull Google Guaranteed Pros as JSON in 2026

If you sell to home-service businesses or run lead gen for the trades, the list you want sits in the Google Local Services Ads unit at the top of the results page: vetted pros with badges, ratings, and phone numbers, right there and completely unexportable. I'll show the manual way to harvest it, why that collapses at any scale, and the shortcut: the Google Local Services API on Apify, which takes a service and a US city and returns one JSON row per provider.

Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.

Does Google Local Services have an API?

Sort of, and it is not for this. Google's official Local Services Ads API exists so advertisers can manage their own campaigns and retrieve their own leads. There is no public API that returns the listing itself: the ranked set of Google Guaranteed and Google Screened pros shown for "hvac in Austin". If you want that list as data, you run a scraper that behaves like an API: service plus city in, provider rows out.

What the Google Local Services API returns

The Google Local Services API returns one JSON row per provider: business name, Google Guaranteed or Google Screened badge, star rating and review count, phone number, service area, years in business, hours, and a one-line summary.

Data point Example Notes
Business name Lone Star Air Repair with profile link and thumbnail
Badge Google Guaranteed or Google Screened for professional services
Rating and reviews 4.8 (312 reviews) average rating plus review count
Phone number (512) 555-0134 the direct contact line
Service area and tenure Austin metro, 12 years in business as shown on the listing
Hours open now, weekly schedule current open status included

Every row also carries stable place identifiers, which make repeat lookups and week-over-week joins painless.

Who this is for

Lead-gen shops selling to HVAC, roofing, and plumbing companies, local SEO agencies monitoring who holds the Local Services slots, and researchers comparing provider density and ratings across metros.

The manual way, and where it breaks

Search "hvac repair austin", click into the ad unit, hit More businesses, and start copying cards into a sheet. The listing is a JavaScript widget with no export and no stable URL, and results reshuffle by location and time of day. Scripted scraping hits the same wall plus consent screens and markup that was never meant to be parsed. One city, once, is survivable. Thirty cities weekly is a job you did not sign up for.

The faster way: run the Google Local Services API

Apify Console

  1. Open the Google Local Services API and click Try for free.
  2. Set query to a service like hvac and location to a US city like Austin, TX.
  3. Run it and export the rows as JSON, CSV, or Excel.

REST

curl -X POST "https://api.apify.com/v2/acts/johnvc~google-local-services-api/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "query": "hvac", "location": "Austin, TX" }'
Enter fullscreen mode Exit fullscreen mode

Run mechanics are covered in the Apify API docs. About 109 service types are supported, and common phrasings and plurals get normalized automatically.

Get HVAC leads in Python

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("johnvc/google-local-services-api").call(
    run_input={
        "queries": ["hvac", "plumber"],
        "location": "Austin, TX",
        "maxResultsPerQuery": 20,
    }
)

for business in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(business)
Enter fullscreen mode Exit fullscreen mode

Each row is one provider; read the badge, rating, and phone number first, since those three fields are the lead record.

HVAC leads, the worked example

HVAC leads is the ready-made task: the Google Guaranteed HVAC pros for a metro, one row each.

Roofer, contractor, and plumber leads

The same pattern runs per trade: Roofing leads, Contractor leads, and Plumber leads. Ad clicks in these trades run roughly $24 to $57, which is exactly why scraped lead lists are in demand.

The rest of the trades ladder

One run per service covers the whole home-services spread: Electrician leads, Landscaping leads, Locksmith leads, Junk removal leads, Moving leads, Painter leads, Pest control leads, Solar leads, and Tree service leads.

Google Screened professionals

Local Services also lists screened professional services: Personal injury lawyer leads, where a single ad click costs north of $100, and Real estate agent leads.

Use it from Claude via MCP

Connected through the Apify MCP server, the Actor becomes a tool that Claude, Claude Code, or Cursor can call mid-conversation: ask for the top-rated plumbers in Denver and the agent runs the search and reads back real rows. If you have not tried Claude yet, start at claude.ai.

FAQ about scraping Google Local Services

How much does the Google Local Services scraper cost?

0.4 cents per business returned on the free tier, plus a one-time 1.5 cent fee to resolve each unique location string to its Google place; pass a dataCid instead and that fee is skipped. A full 20-business listing costs about a dime, and Apify's free credit covers early runs.

Can a scraper tell me how to get more HVAC or roofing leads?

Not directly; appearing in the unit means enrolling in Local Services Ads. What the scraper gives you is the competitive map, who holds the slots, their badges, ratings, and review counts, plus a prospect list of pros who buy marketing services. I find the second use pays for the first.

What is Google Guaranteed, and does the scraper capture it?

It is the badge Google gives home-service pros who pass its screening and background checks; Google Screened is the equivalent for professional services like lawyers and agents. The badge arrives as a field on every row, so you can filter to one or the other.

Does the scraper run from Claude via MCP?

Yes. Once the Apify MCP server is connected, the Actor is callable from Claude, Claude Code, or Cursor like any other tool, with the same inputs.

Can I schedule the scraper to track Local Services rankings?

Yes: save a task per service and city, attach a weekly Apify schedule, and you get a time series of who holds the top slots and how ratings move. Start from the Google Local Services API.

Where does this scraper not work?

The Actor covers US locations only, since that is where Google runs this ad surface, and queries outside the roughly 109 supported service types return the closest supported matches instead of failing.

More from Truffle Pig Data

Related Actors on the local-data shelf: the Google Local API for the organic local pack, the Google Maps Places API for place details, and the Yelp Search API for the review-site view of the same businesses.

Wrapping up

The trades lead list you wanted already exists; it is just trapped in an ad unit with no export button. The Google Local Services API turns it into rows.

Top comments (0)