# USA HVAC Leads Scraper — Verified Emails (AC, Heating) (`muhammadafzal/hvac-lead-scraper`) Actor

Scrape HVAC, AC repair, heating & air conditioning contractor contacts from Google Maps with verified emails, phones, services & 24/7 emergency flag. Real-time data from HVAC websites. Export to HubSpot, Salesforce, or CSV. Built for home services SaaS sales & marketing.

- **URL**: https://apify.com/muhammadafzal/hvac-lead-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 enriched hvac leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## USA HVAC Leads Scraper — Verified Emails (Heating, Cooling, AC Repair)

Scrape HVAC, AC repair, heating & air conditioning contractor leads from Google Maps with verified emails, phones, detected services, and 24/7 emergency service flag. Real-time data from HVAC contractor websites. Export scraped data, run the scraper via API, schedule and monitor runs, or integrate with other tools.

### Use Cases

- **Home services SaaS sales** — Build targeted prospect lists of HVAC contractors using your CRM software (dispatch, invoicing, field service management tools).
- **HVAC equipment suppliers** — Find local HVAC companies to sell furnaces, condensers, mini-splits, refrigerants, and parts to.
- **Marketing agencies** — Build Facebook Custom Audiences and email lists for HVAC clients' lead-gen campaigns.
- **Insurance & warranty companies** — Identify certified HVAC contractors for repair networks and home warranty programs.
- **Recruiting & staffing** — Source HVAC technicians and companies hiring in specific markets.
- **Market research** — Analyze HVAC market density, service offerings, and emergency coverage by city.
- **Lead generation** — Build fresh, verified HVAC contractor lead lists for cold email and outbound calling.

### Features

- **9 HVAC sub-niches** — HVAC Company, AC Repair Service, Heating Contractor, Air Conditioning Contractor, Furnace Repair Service, Duct Cleaning Service, Commercial HVAC Contractor, Refrigeration Service, Indoor Air Quality Company, plus Custom search.
- **Google Maps search** — Real-time data directly from Google Maps listings (business name, phone, address, website, rating, hours, coordinates).
- **Email extraction** — Crawls each HVAC contractor's website (home, contact, about, service pages) to find real email addresses.
- **Email verification** — DNS MX lookup + SMTP handshake confirms the mailbox exists and can receive mail — without sending any message.
- **HVAC services detection** — Automatically detects services from website content: AC Installation, AC Repair, Heating Repair, Furnace Installation/Repair, Boiler Repair, Heat Pump Service, Duct Cleaning, Ductwork, Indoor Air Quality, Refrigeration, Commercial HVAC, Residential HVAC, Preventive Maintenance, 24/7 Emergency Service, Thermostat Installation, Ventilation.
- **24/7 emergency service flag** — Identifies contractors offering 24/7 emergency HVAC service.
- **Social media links** — Finds Facebook, Instagram, LinkedIn, and Twitter/X profiles from the contractor's website.
- **CRM-ready export** — One-click export to HubSpot, Salesforce, or full JSON/CSV.
- **Real-time data** — Every run scrapes live Google Maps results — no stale database.
- **Deduplication** — No duplicate businesses within a single run.
- **No coding required** — Just enter a business type and location, click Start.

### How It Works

1. **Search Google Maps** — The actor searches Google Maps for your selected HVAC business type in your target location.
2. **Extract listing data** — Business name, phone, address, website, rating, hours, and coordinates are extracted from each listing.
3. **Enrich from website** — The actor visits each HVAC contractor's website and scans contact, about, and service pages to extract emails, social links, detected HVAC services, and 24/7 emergency service availability.
4. **Verify email deliverability** — Each extracted email is checked via DNS MX lookup and SMTP handshake to confirm the mailbox exists and can receive mail.
5. **Format and export** — Leads are formatted for your chosen output (Full, HubSpot, or Salesforce) and saved to the Apify dataset, downloadable as CSV, JSON, or Excel.

### Input Parameters

| Parameter | Type | Default | Required | Description |
|-----------|------|---------|----------|-------------|
| `businessType` | select | `HVAC Company` | No* | HVAC sub-niche to search (9 options + Custom) |
| `location` | string | `Dallas, TX` | No* | City, state, or ZIP code to search in |
| `searchQuery` | string | — | No | Custom Google Maps query (only when businessType = Custom) |
| `maxResults` | integer | `50` (prefill `3`) | No | Max HVAC leads to return (1–500) |
| `enrichEmails` | boolean | `true` | No | Crawl contractor websites to find email addresses |
| `verifyEmails` | boolean | `true` | No | Verify emails via DNS MX + SMTP handshake |
| `enrichSocials` | boolean | `true` | No | Find Facebook, Instagram, LinkedIn, Twitter/X links |
| `outputFormat` | select | `full` | No | `full`, `hubspot`, or `salesforce` |
| `proxyUrl` | string | — | No | Custom HTTP proxy URL (optional) |

\* `location` is required unless `businessType` is `Custom`. When `businessType` is `Custom`, `searchQuery` is required.

### Output Data

| Field | Type | Description |
|-------|------|-------------|
| `business_name` | string | HVAC business name from Google Maps |
| `business_type` | string\|null | The HVAC sub-niche used for the search |
| `category` | string\|null | Google Maps business category |
| `services` | array\|null | Detected HVAC services (AC Repair, Furnace Installation, Duct Cleaning, etc.) |
| `phone` | string\|null | Primary phone number |
| `emergency_service` | boolean\|null | true if 24/7 emergency service is advertised |
| `email` | string\|null | Primary verified email address |
| `email_verified` | boolean\|null | true if email passed DNS MX + SMTP verification |
| `email_verification_status` | string\|null | `smtp_verified`, `dns_only`, `unverified`, or `unknown` |
| `email_verification_note` | string\|null | Human-readable verification result |
| `all_emails` | array\|null | All emails found, each with verification status |
| `website` | string\|null | HVAC contractor website URL |
| `address` | string\|null | Full street address |
| `rating` | number\|null | Google Maps star rating (0–5) |
| `review_count` | integer\|null | Total Google Maps reviews |
| `hours` | string\|null | Operating hours summary |
| `facebook` | string\|null | Facebook page URL |
| `instagram` | string\|null | Instagram profile URL |
| `linkedin` | string\|null | LinkedIn company page URL |
| `twitter` | string\|null | Twitter/X profile URL |
| `google_maps_url` | string\|null | Direct link to Google Maps listing |
| `place_id` | string\|null | Google Places API unique identifier |
| `latitude` | number\|null | Geographic latitude |
| `longitude` | number\|null | Geographic longitude |
| `scraped_at` | string | ISO 8601 timestamp of collection |
| `source_url` | string | Google Maps search URL this lead came from |

### Sample Output

```json
{
    "business_name": "Comfort Air Solutions",
    "business_type": "HVAC Company",
    "category": "HVAC contractor",
    "services": ["AC Repair", "Furnace Installation", "Duct Cleaning", "24/7 Emergency Service"],
    "phone": "(214) 555-0192",
    "emergency_service": true,
    "email": "service@comfortairsolutions.com",
    "email_verified": true,
    "email_verification_status": "smtp_verified",
    "email_verification_note": "Verified via SMTP",
    "all_emails": [
        {
            "address": "service@comfortairsolutions.com",
            "verified": true,
            "status": "smtp_verified",
            "verificationNote": "Verified via SMTP"
        }
    ],
    "website": "https://comfortairsolutions.com",
    "address": "4521 Maple Ave, Dallas, TX 75219",
    "rating": 4.7,
    "review_count": 312,
    "hours": "Open 24 hours",
    "facebook": "https://facebook.com/comfortairsolutions",
    "instagram": null,
    "linkedin": "https://linkedin.com/company/comfort-air-solutions",
    "twitter": null,
    "google_maps_url": "https://www.google.com/maps/place/Comfort+Air+Solutions/@32.8032,-96.8067,17z",
    "place_id": "ChIJb5xK7wLQIYURxjM",
    "latitude": 32.8032,
    "longitude": -96.8067,
    "scraped_at": "2026-07-01T12:00:00.000Z",
    "source_url": "https://www.google.com/maps/search/HVAC+company+in+Dallas"
}
````

### Pricing

This actor uses **pay-per-event pricing** — you only pay for the enriched HVAC leads it delivers.

| # Leads | Cost |
|---------|------|
| 10 | $0.50 |
| 50 | $2.50 |
| 100 | $5.00 |
| 200 | $10.00 |

Plus a small actor-start fee of $0.00005 per run (billed once per GB of memory used).

### Code Examples

#### JavaScript (Apify SDK)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('muhammadafzal/hvac-lead-scraper').call({
    businessType: 'HVAC Company',
    location: 'Dallas, TX',
    maxResults: 50,
    enrichEmails: true,
    verifyEmails: true,
    enrichSocials: true,
    outputFormat: 'full',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} HVAC leads`);
```

#### Apify CLI

```bash
## Run with defaults (HVAC Company in Dallas, TX)
apify run muhammadafzal/hvac-lead-scraper

## Run with custom input
echo '{"businessType":"AC Repair Service","location":"Phoenix, AZ","maxResults":100}' | apify run muhammadafzal/hvac-lead-scraper

## Schedule a daily run
apify schedule create --actor muhammadafzal/hvac-lead-scraper --cron "0 9 * * *" --run-input '{"businessType":"HVAC Company","location":"Dallas, TX","maxResults":50}'
```

#### HubSpot Import

1. Run the actor with `outputFormat: "hubspot"`.
2. Download the dataset as CSV from Apify.
3. In HubSpot: Contacts → Import → CSV → map columns (the output already uses HubSpot property names).

#### Salesforce Import

1. Run the actor with `outputFormat: "salesforce"`.
2. Download the dataset as CSV from Apify.
3. In Salesforce: Setup → Data Import Wizard → Leads → upload CSV (fields use `__c` custom field naming).

### FAQ

**Why are some email fields null?**
Not every HVAC contractor publishes an email on their website — many rely on phone contact or contact forms. The `email` field is null when no email was found. The `enrichEmails` option must be enabled (it's on by default).

**How does email verification work?**
The actor performs a DNS MX lookup on the email's domain to find the mail server, then opens an SMTP connection and issues a `RCPT TO` command to check if the mailbox exists — without sending any message. Status `smtp_verified` means the mailbox accepted the recipient; `dns_only` means the domain has mail records but SMTP was not probed; `unverified` means the mailbox was rejected.

**Can I search multiple cities at once?**
This actor searches one location per run. For multi-city coverage, run the actor once per location and merge the datasets. You can schedule multiple runs via the Apify Scheduler.

**What HVAC business types are supported?**
HVAC Company, AC Repair Service, Heating Contractor, Air Conditioning Contractor, Furnace Repair Service, Duct Cleaning Service, Commercial HVAC Contractor, Refrigeration Service, Indoor Air Quality Company, and Custom (any Google Maps query).

**Does it work outside the USA?**
Yes — the actor searches Google Maps globally. Enter any city worldwide in the location field. However, it's optimized for US-based HVAC contractor websites (English content, US phone formats).

**How does the 24/7 emergency service detection work?**
The actor scans each contractor's website for phrases like "24/7 emergency service", "emergency HVAC repair", "emergency service available". The `emergency_service` field is `true` when detected, `null` when not found.

### Technical Details

- **Crawler**: PlaywrightCrawler (headless Chromium) for Google Maps + contractor websites
- **Proxy**: Apify residential proxies by default; custom HTTP proxy supported via `proxyUrl`
- **Email verification**: DNS MX lookup + SMTP RCPT TO handshake (port 25, 8s timeout)
- **Deduplication**: By business name within each run
- **Resource blocking**: Images, media, fonts, and analytics scripts are blocked for faster crawling
- **Session pool**: 5 concurrent sessions with automatic rotation
- **Anti-bot**: Randomized viewport, consent cookie injection, stealth browser args
- **HVAC service detection**: Pattern matching against 17 known HVAC service categories
- **Emergency service detection**: Regex-based detection of 24/7 emergency service language

### Limitations

- Google Maps caps at ~120 results per search — use multiple locations for larger datasets.
- Email extraction depends on the contractor having a website with contact information.
- SMTP verification may be blocked by some mail servers (returns `unknown` status).
- Google Maps CSS selectors can change — the actor uses multiple fallback selectors.
- HVAC service detection is based on website content and may miss services not listed online.
- The `review_count` field is `null` in the search results list view (only available on the detail page).

### Changelog

#### v1.0 — Initial release

- 9 HVAC business types + Custom search
- Google Maps scraping with Playwright
- Website email extraction + DNS/SMTP verification
- HVAC services detection (17 service categories)
- 24/7 emergency service flag
- Social media link extraction
- HubSpot, Salesforce, and Full output formats

# Actor input Schema

## `businessType` (type: `string`):

Select the HVAC sub-niche to search on Google Maps. The actor builds the query automatically — e.g., 'HVAC Company' finds full-service heating, cooling, and air conditioning contractors; 'AC Repair Service' targets air conditioning repair specialists; 'Heating Contractor' finds heating/furnace experts; 'Furnace Repair Service' targets furnace repair shops; 'Duct Cleaning Service' finds air duct cleaning companies; 'Commercial HVAC Contractor' targets commercial-grade HVAC installers; 'Refrigeration Service' finds commercial refrigeration repair; 'Indoor Air Quality Company' targets IAQ specialists. Choose 'Custom' to write your own search query.

## `location` (type: `string`):

The city, state, or ZIP code to search for HVAC contractors in. Use 'City, ST' format for best results (e.g., 'Dallas, TX', 'Phoenix, AZ', 'Chicago, IL'). ZIP codes and neighborhoods also work. For multi-city coverage, run the actor once per location and merge datasets — each run fully covers one market.

## `searchQuery` (type: `string`):

A raw Google Maps search query — only used when Business Type is set to 'Custom'. Use this to target HVAC niches not in the dropdown, such as 'commercial HVAC contractors in Denver, CO', 'mini-split installers near Orlando, FL', or 'boiler repair companies in Seattle, WA'. Write the query exactly as you would type it into Google Maps.

## `maxResults` (type: `integer`):

Maximum number of HVAC leads to return. The prefill is 3 for a quick quality test — increase to 50–200 for production prospecting. Google Maps caps at ~120 results per search; run multiple locations to build larger datasets. Start small to verify results match your target trade and geography before scaling.

## `enrichEmails` (type: `boolean`):

When enabled, the actor visits each HVAC contractor's website and scans contact pages, footers, and service pages to extract email addresses. Disable if you only need phone numbers and addresses, or to run faster without website crawling. Most HVAC company sites publish a contact email in the footer or on a Contact page.

## `verifyEmails` (type: `boolean`):

When enabled, each extracted email is checked via DNS/MX lookup and SMTP handshake to confirm the mailbox exists and can receive mail — without sending any actual message. Adds ~1 minute per batch but significantly reduces bounce rates on outreach campaigns. Only applies when 'Find Email Addresses' is enabled. Verified emails are flagged with email\_verified: true in the output.

## `enrichSocials` (type: `boolean`):

When enabled, the actor scans each HVAC website for social media profile links: Facebook, Instagram, LinkedIn, and Twitter/X. Useful for multi-channel outreach, ad targeting (Facebook Custom Audiences), and account research before contacting. Many HVAC companies are active on Facebook even when they lack a strong website.

## `outputFormat` (type: `string`):

Controls the structure of the output dataset. 'Full' returns all fields for custom pipelines. 'HubSpot Import' maps columns to HubSpot Contact and Company import properties for direct CSV upload with zero remapping. 'Salesforce Import' aligns to the Salesforce Lead object with LeadSource pre-filled. All formats are downloadable from Apify as CSV, JSON, or Excel.

## `proxyUrl` (type: `string`):

Optional HTTP proxy URL for using third-party residential proxies instead of Apify's built-in proxies. Format: http://username:password@host:port. Compatible with IPRoyal, Smartproxy, Bright Data, and other rotating proxy services. Leave empty to use Apify's default residential proxies.

## Actor input object example

```json
{
  "businessType": "HVAC Company",
  "location": "Dallas, TX",
  "searchQuery": "HVAC companies in Dallas, TX",
  "maxResults": 3,
  "enrichEmails": true,
  "verifyEmails": true,
  "enrichSocials": true,
  "outputFormat": "full"
}
```

# Actor output Schema

## `results` (type: `string`):

Link to the dataset containing all extracted HVAC contractor leads.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "businessType": "HVAC Company",
    "location": "Dallas, TX",
    "searchQuery": "HVAC companies in Dallas, TX",
    "maxResults": 3,
    "enrichEmails": true,
    "verifyEmails": true,
    "enrichSocials": true,
    "outputFormat": "full"
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/hvac-lead-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "businessType": "HVAC Company",
    "location": "Dallas, TX",
    "searchQuery": "HVAC companies in Dallas, TX",
    "maxResults": 3,
    "enrichEmails": True,
    "verifyEmails": True,
    "enrichSocials": True,
    "outputFormat": "full",
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/hvac-lead-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "businessType": "HVAC Company",
  "location": "Dallas, TX",
  "searchQuery": "HVAC companies in Dallas, TX",
  "maxResults": 3,
  "enrichEmails": true,
  "verifyEmails": true,
  "enrichSocials": true,
  "outputFormat": "full"
}' |
apify call muhammadafzal/hvac-lead-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=muhammadafzal/hvac-lead-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "USA HVAC Leads Scraper — Verified Emails (AC, Heating)",
        "description": "Scrape HVAC, AC repair, heating & air conditioning contractor contacts from Google Maps with verified emails, phones, services & 24/7 emergency flag. Real-time data from HVAC websites. Export to HubSpot, Salesforce, or CSV. Built for home services SaaS sales & marketing.",
        "version": "1.0",
        "x-build-id": "go24I3ZTKOc3JIJm3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/muhammadafzal~hvac-lead-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-muhammadafzal-hvac-lead-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/muhammadafzal~hvac-lead-scraper/runs": {
            "post": {
                "operationId": "runs-sync-muhammadafzal-hvac-lead-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/muhammadafzal~hvac-lead-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-muhammadafzal-hvac-lead-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "businessType": {
                        "title": "HVAC Business Type",
                        "enum": [
                            "HVAC Company",
                            "AC Repair Service",
                            "Heating Contractor",
                            "Air Conditioning Contractor",
                            "Furnace Repair Service",
                            "Duct Cleaning Service",
                            "Commercial HVAC Contractor",
                            "Refrigeration Service",
                            "Indoor Air Quality Company",
                            "Custom"
                        ],
                        "type": "string",
                        "description": "Select the HVAC sub-niche to search on Google Maps. The actor builds the query automatically — e.g., 'HVAC Company' finds full-service heating, cooling, and air conditioning contractors; 'AC Repair Service' targets air conditioning repair specialists; 'Heating Contractor' finds heating/furnace experts; 'Furnace Repair Service' targets furnace repair shops; 'Duct Cleaning Service' finds air duct cleaning companies; 'Commercial HVAC Contractor' targets commercial-grade HVAC installers; 'Refrigeration Service' finds commercial refrigeration repair; 'Indoor Air Quality Company' targets IAQ specialists. Choose 'Custom' to write your own search query.",
                        "default": "HVAC Company"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "The city, state, or ZIP code to search for HVAC contractors in. Use 'City, ST' format for best results (e.g., 'Dallas, TX', 'Phoenix, AZ', 'Chicago, IL'). ZIP codes and neighborhoods also work. For multi-city coverage, run the actor once per location and merge datasets — each run fully covers one market."
                    },
                    "searchQuery": {
                        "title": "Custom Search Query",
                        "type": "string",
                        "description": "A raw Google Maps search query — only used when Business Type is set to 'Custom'. Use this to target HVAC niches not in the dropdown, such as 'commercial HVAC contractors in Denver, CO', 'mini-split installers near Orlando, FL', or 'boiler repair companies in Seattle, WA'. Write the query exactly as you would type it into Google Maps."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of HVAC leads to return. The prefill is 3 for a quick quality test — increase to 50–200 for production prospecting. Google Maps caps at ~120 results per search; run multiple locations to build larger datasets. Start small to verify results match your target trade and geography before scaling.",
                        "default": 50
                    },
                    "enrichEmails": {
                        "title": "Find Email Addresses",
                        "type": "boolean",
                        "description": "When enabled, the actor visits each HVAC contractor's website and scans contact pages, footers, and service pages to extract email addresses. Disable if you only need phone numbers and addresses, or to run faster without website crawling. Most HVAC company sites publish a contact email in the footer or on a Contact page.",
                        "default": true
                    },
                    "verifyEmails": {
                        "title": "Verify Email Deliverability",
                        "type": "boolean",
                        "description": "When enabled, each extracted email is checked via DNS/MX lookup and SMTP handshake to confirm the mailbox exists and can receive mail — without sending any actual message. Adds ~1 minute per batch but significantly reduces bounce rates on outreach campaigns. Only applies when 'Find Email Addresses' is enabled. Verified emails are flagged with email_verified: true in the output.",
                        "default": true
                    },
                    "enrichSocials": {
                        "title": "Find Social Media Links",
                        "type": "boolean",
                        "description": "When enabled, the actor scans each HVAC website for social media profile links: Facebook, Instagram, LinkedIn, and Twitter/X. Useful for multi-channel outreach, ad targeting (Facebook Custom Audiences), and account research before contacting. Many HVAC companies are active on Facebook even when they lack a strong website.",
                        "default": true
                    },
                    "outputFormat": {
                        "title": "Output Format",
                        "enum": [
                            "full",
                            "hubspot",
                            "salesforce"
                        ],
                        "type": "string",
                        "description": "Controls the structure of the output dataset. 'Full' returns all fields for custom pipelines. 'HubSpot Import' maps columns to HubSpot Contact and Company import properties for direct CSV upload with zero remapping. 'Salesforce Import' aligns to the Salesforce Lead object with LeadSource pre-filled. All formats are downloadable from Apify as CSV, JSON, or Excel.",
                        "default": "full"
                    },
                    "proxyUrl": {
                        "title": "Custom Proxy URL (optional)",
                        "type": "string",
                        "description": "Optional HTTP proxy URL for using third-party residential proxies instead of Apify's built-in proxies. Format: http://username:password@host:port. Compatible with IPRoyal, Smartproxy, Bright Data, and other rotating proxy services. Leave empty to use Apify's default residential proxies."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
