# Electrician Scraper — Verified Emails & License Numbers (`muhammadafzal/electrician-lead-scraper`) Actor

Scrape electrician & electrical contractor contacts from Google Maps with verified emails, phones, license numbers & service areas. Export to HubSpot, Salesforce, or CSV. Built for solar SaaS sales, EV charging & electrical supply.

- **URL**: https://apify.com/muhammadafzal/electrician-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 $25.00 / 1,000 enriched electrician 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

## Electrician Lead Scraper — Verified Emails, License Numbers & Service Areas

Scrape electrician and electrical contractor contacts from Google Maps with **verified emails**, phone numbers, license numbers, service areas, and social media links. Built for solar companies, EV charging installers, electrical supply distributors, home warranty providers, and trade SaaS sales teams who need CRM-ready electrician lead lists.

The actor searches Google Maps by specialty and location, then crawls each electrician's website to extract contact emails, contractor license numbers, service area coverage, and social profiles. Emails are verified via DNS MX record lookup to flag deliverable inboxes. Export to **HubSpot**, **Salesforce**, or CSV in a single run.

Export scraped data, run the scraper via API, schedule and monitor runs, or integrate with other tools.

### Use Cases

- **Solar & EV sales** — Build targeted lead lists of residential electricians and solar installers for solar panel and EV charging station sales outreach
- **Electrical supply distributors** — Prospect commercial and industrial electricians by territory for product distribution partnerships
- **Home warranty providers** — Find licensed electricians by service area for contractor network building
- **Trade SaaS sales** — Generate electrician lead lists by specialty (residential, commercial, industrial, low voltage) for dispatch software, invoicing, and CRM tools
- **Contractor compliance** — Extract license numbers to verify contractor licensing status and skip-trace unlicensed operators
- **Multi-channel outreach** — Use email + phone + social links for combined email, cold-call, and Facebook ad campaigns

### Features

- **Google Maps search** — Find electricians by specialty (9 preset categories) or custom search query
- **Verified emails** — Crawls electrician websites and verifies email deliverability via DNS MX record lookup
- **License number extraction** — Extracts contractor license numbers (TECL, EC, state formats) from websites
- **Service area extraction** — Parses electrician websites for cities and regions they serve
- **Specialty detection** — Detects residential, commercial, industrial, solar, EV, low voltage, and emergency specializations
- **Social media links** — Finds Facebook, Instagram, LinkedIn, Twitter/X, YouTube, and TikTok profiles
- **Multi-location batch mode** — Search multiple cities in a single run and combine results
- **Deduplication** — Removes duplicate electricians by phone or business name across multi-location runs
- **CRM export formats** — Output in Full, HubSpot CSV import, or Salesforce import format
- **No login required** — No Google account or cookies needed
- **Residential proxies** — Uses Apify's residential proxy pool by default for reliable access

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `businessType` | string | `Residential Electrician` | Select from 9 specialty presets, or `Custom` |
| `location` | string | `Dallas, TX` | City, state, or region to search (e.g., `Phoenix, AZ`) |
| `locations` | array | — | Multiple locations for batch mode (e.g., `["Dallas, TX", "Houston, TX"]`) |
| `searchQuery` | string | — | Custom Google Maps query (used when businessType = `Custom`) |
| `startUrls` | array | — | Direct Google Maps place URLs to scrape |
| `maxResults` | integer | `50` | Maximum number of leads to collect (1–2000) |
| `enrichEmails` | boolean | `true` | Crawl electrician websites to find email addresses |
| `verifyEmails` | boolean | `true` | Verify email deliverability via DNS MX lookup |
| `enrichSocials` | boolean | `true` | Extract social media profile links |
| `extractLicenseNumber` | boolean | `true` | Extract contractor license numbers from websites |
| `extractServiceAreas` | boolean | `true` | Parse service area coverage from websites |
| `outputFormat` | string | `full` | `full`, `hubspot`, or `salesforce` |
| `deduplicateResults` | boolean | `true` | Remove duplicates across multi-location runs |
| `maxWebsitePages` | integer | `5` | Max pages to crawl per electrician website (1–20) |
| `proxyUrl` | string | — | Custom HTTP proxy URL (format: `http://user:pass@host:port`) |

#### Quick Start Example

```json
{
    "businessType": "Residential Electrician",
    "location": "Dallas, TX",
    "maxResults": 50,
    "enrichEmails": true,
    "verifyEmails": true,
    "extractLicenseNumber": true,
    "outputFormat": "hubspot"
}
````

#### Multi-City Batch Example

```json
{
    "businessType": "Solar Installer",
    "locations": ["Phoenix, AZ", "Los Angeles, CA", "Houston, TX", "Miami, FL"],
    "maxResults": 200,
    "outputFormat": "salesforce"
}
```

#### EV Charging Installer Example

```json
{
    "businessType": "EV Charging Station Installer",
    "location": "Seattle, WA",
    "maxResults": 100,
    "extractServiceAreas": true
}
```

### Output Data

Each lead record contains:

| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Business name |
| `business_type` | string | Specialty used for the search |
| `specialty` | string|null | Detected specialty (Residential, Commercial, Solar, etc.) |
| `category` | string|null | Google Maps business category |
| `license_number` | string|null | Contractor license number (if found on website) |
| `service_areas` | array | Cities/regions the electrician serves |
| `address` | string|null | Full postal address |
| `phone` | string|null | Primary phone number |
| `website` | string|null | Electrician website URL |
| `email` | string|null | Primary contact email |
| `all_emails` | array | All emails found with verification status |
| `email_verified` | boolean|null | Whether email passed DNS verification |
| `email_verification_status` | string | `deliverable`, `undeliverable`, `risky`, `unknown`, `not_verified` |
| `social_links` | object | Facebook, Instagram, LinkedIn, Twitter, YouTube, TikTok URLs |
| `rating` | number|null | Google Maps rating (1–5) |
| `review_count` | integer|null | Number of Google Maps reviews |
| `hours` | string|null | Operating hours |
| `maps_url` | string|null | Direct Google Maps listing URL |
| `place_id` | string|null | Google Places API identifier |
| `latitude` | number|null | Geographic latitude |
| `longitude` | number|null | Geographic longitude |
| `scraped_at` | string | ISO 8601 timestamp |
| `source_url` | string | Source Google Maps URL |

#### Sample Output

```json
{
    "name": "Bright Electrical Services",
    "business_type": "Residential Electrician",
    "specialty": "Solar installation",
    "category": "Electrician",
    "license_number": "TECL-12345",
    "service_areas": ["Dallas", "Fort Worth", "Plano", "Frisco"],
    "address": "4521 Maple Ave, Dallas, TX 75219",
    "phone": "(214) 555-0192",
    "website": "https://brightelectrical.com",
    "email": "info@brightelectrical.com",
    "all_emails": [
        {
            "address": "info@brightelectrical.com",
            "verified": true,
            "status": "deliverable",
            "verificationNote": "MX record found: mail.brightelectrical.com"
        }
    ],
    "email_verified": true,
    "email_verification_status": "deliverable",
    "social_links": {
        "facebook": "https://facebook.com/brightelectrical",
        "linkedin": "https://linkedin.com/company/bright-electrical"
    },
    "rating": 4.7,
    "review_count": 312,
    "hours": "Mon-Fri 7:00 AM - 6:00 PM",
    "maps_url": "https://www.google.com/maps/place/Bright+Electrical+Services/@32.8032,-96.8067,17z",
    "place_id": "ChIJb5xK7wLQIYURxjM",
    "latitude": 32.8032,
    "longitude": -96.8067,
    "scraped_at": "2026-06-24T12:00:00.000Z",
    "source_url": "https://www.google.com/maps/search/residential+electrician+in+Dallas"
}
```

### Pricing

This actor uses **pay-per-event pricing**: **$0.025 per enriched electrician lead**.

| Leads | Cost |
|-------|------|
| 10 leads | $0.25 |
| 50 leads | $1.25 |
| 100 leads | $2.50 |
| 500 leads | $12.50 |
| 1,000 leads | $25.00 |

You only pay for successfully enriched leads with contact data — no charge for empty results.

### Code Examples

#### Run via Apify SDK (JavaScript)

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

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

const run = await client.actor('muhammadafzal/electrician-lead-scraper').call({
    businessType: 'Residential Electrician',
    location: 'Dallas, TX',
    maxResults: 50,
    enrichEmails: true,
    verifyEmails: true,
    extractLicenseNumber: true,
    outputFormat: 'hubspot'
});

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

#### Run via REST API

```bash
curl -X POST "https://api.apify.com/v2/acts/muhammadafzal~electrician-lead-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"businessType":"Solar Installer","location":"Phoenix, AZ","maxResults":20}'
```

#### Schedule a Daily Run

```bash
apify schedule create --actor muhammadafzal/electrician-lead-scraper \
  --cron "0 9 * * 1" \
  --input '{"businessType":"Commercial Electrician","location":"Houston, TX","maxResults":100}'
```

### FAQ

#### Why are some emails null?

Not all electrician websites list email addresses publicly. The actor crawls contact, about, services, and service-area pages. If no email is found, the field is `null` and you still get the phone, address, license number, and social links.

#### How does email verification work?

The actor performs DNS MX record lookup on each email's domain to confirm a mail server exists. Emails from domains with valid MX records are marked `deliverable`. This reduces bounce rates compared to unverified email lists.

#### How accurate are license numbers?

The actor uses pattern matching to detect common contractor license formats (TECL, EC, state license numbers) from website text. Accuracy depends on how the electrician displays their license on their site. Always verify license numbers against your state's licensing board before relying on them for compliance.

#### What if Google Maps blocks the request?

The actor uses Apify's residential proxy pool by default. If you experience blocks, you can provide a custom proxy URL via the `proxyUrl` parameter using services like IPRoyal, Smartproxy, or Bright Data.

#### Can I search multiple cities at once?

Yes. Use the `locations` array parameter with multiple cities. The actor searches each location and combines results with deduplication enabled by default.

#### What CRM formats are supported?

`full` returns all fields. `hubspot` formats output for HubSpot CSV import. `salesforce` formats for Salesforce data import. All formats are exportable as CSV, JSON, or Excel from Apify's dataset.

### Integration Ideas

- **HubSpot**: Set `outputFormat: "hubspot"`, export dataset as CSV, import directly into HubSpot Contacts
- **Salesforce**: Set `outputFormat: "salesforce"`, export as CSV and use Data Import Wizard
- **Mailchimp**: Filter leads where `email_verified === true`, export emails for outreach campaigns
- **Apollo/Outreach**: Use the `name` and `email` fields for personalized cold email sequences
- **Facebook Ads**: Use the `social_links.facebook` field to build Custom Audiences for retargeting

### Changelog

- **v1.0** — Initial release with Google Maps search, email enrichment, DNS verification, license number extraction, service area extraction, specialty detection, social link extraction, multi-location batch mode, and HubSpot/Salesforce export formats

# Actor input Schema

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

Use this field to select the type of electrical contractor to find on Google Maps. The actor automatically builds the search query — 'Residential Electrician' finds home wiring & repair electricians, 'Commercial Electrician' finds office/retail electrical contractors, 'Industrial Electrician' finds factory & plant electricians, 'Solar Installer' finds solar PV installers, 'EV Charging Station Installer' finds EV charger installers. Choose 'Custom' to write your own search query via the searchQuery field.

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

Use this field to specify the city, state, or region to search for electricians. Use 'City, ST' format for US locations — 'Dallas, TX', 'Phoenix, AZ', 'Los Angeles, CA'. ZIP codes and neighborhoods also work. The more specific your location, the more targeted your electrician lead list.

## `locations` (type: `array`):

Use this field when you want to search multiple cities in a single run. Each location is searched separately and results are combined with deduplication. Example: \['Dallas, TX', 'Houston, TX', 'Austin, TX']. Leave empty to use the single 'location' field instead.

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

A raw Google Maps search query, used ONLY when Electrician Specialty is set to 'Custom'. Write queries the same way you would type them into Google Maps — 'ev charging installers in Seattle WA', 'low voltage contractors near Denver', 'master electrician 90210'. For all other specialties the search is built automatically from Specialty + Location.

## `startUrls` (type: `array`):

Use this field when the user provides specific Google Maps place URLs to scrape directly. Format: \[{"url": "https://www.google.com/maps/place/..."}]. Do NOT use this when the user describes a specialty or location — use businessType + location instead.

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

The maximum number of electrician leads to collect and return. Set to a small number (3-5) first to verify data quality before scaling. Google Maps typically returns up to 120 results per search query; run multiple locations to build larger datasets.

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

When enabled, the actor visits each electrician's website and scans contact pages, footers, and about pages to extract email addresses. Disable if you only need phone numbers and addresses, or to run faster without website crawling.

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

When enabled, each extracted email is checked via DNS MX record lookup to confirm the mailbox exists and can receive mail — without sending a message. Reduces bounce rates. Only applies when 'Find Email Addresses' is enabled.

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

When enabled, the actor scans each electrician's website for links to Facebook, Instagram, LinkedIn, Twitter/X, YouTube, and TikTok. Useful for multi-channel outreach and Facebook ad targeting (Custom Audiences).

## `extractLicenseNumber` (type: `boolean`):

When enabled, the actor scans electrician websites for contractor license numbers (TECL, EC, state license formats). Critical for compliance verification and skip-tracing licensed vs. unlicensed contractors.

## `extractServiceAreas` (type: `boolean`):

When enabled, the actor parses electrician websites for service area coverage (cities/counties they serve). Useful for territory planning and identifying contractors serving specific regions.

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

Controls the structure of the output dataset. 'full' returns all available fields. 'hubspot' reformats for HubSpot CSV import. 'salesforce' reformats for Salesforce data import. All formats exportable as CSV, JSON, or Excel from Apify.

## `deduplicateResults` (type: `boolean`):

When enabled, removes duplicate electricians based on phone number or business name. Recommended for batch mode when searching multiple locations that may overlap.

## `maxWebsitePages` (type: `integer`):

Maximum number of pages to crawl on each electrician's website when enriching emails, socials, license numbers, or service areas. Higher values find more contacts but slow down the run. Default 5 is sufficient for most contractor sites.

## `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": "Residential Electrician",
  "location": "Dallas, TX",
  "searchQuery": "residential electricians in Dallas, TX",
  "maxResults": 3,
  "enrichEmails": true,
  "verifyEmails": true,
  "enrichSocials": true,
  "extractLicenseNumber": true,
  "extractServiceAreas": true,
  "outputFormat": "full",
  "deduplicateResults": true,
  "maxWebsitePages": 5
}
```

# Actor output Schema

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

Link to the dataset containing all extracted electrician lead records.

# 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": "Residential Electrician",
    "location": "Dallas, TX",
    "searchQuery": "residential electricians in Dallas, TX",
    "maxResults": 3,
    "enrichEmails": true,
    "verifyEmails": true,
    "enrichSocials": true,
    "extractLicenseNumber": true,
    "extractServiceAreas": true,
    "outputFormat": "full",
    "deduplicateResults": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/electrician-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": "Residential Electrician",
    "location": "Dallas, TX",
    "searchQuery": "residential electricians in Dallas, TX",
    "maxResults": 3,
    "enrichEmails": True,
    "verifyEmails": True,
    "enrichSocials": True,
    "extractLicenseNumber": True,
    "extractServiceAreas": True,
    "outputFormat": "full",
    "deduplicateResults": True,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/electrician-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": "Residential Electrician",
  "location": "Dallas, TX",
  "searchQuery": "residential electricians in Dallas, TX",
  "maxResults": 3,
  "enrichEmails": true,
  "verifyEmails": true,
  "enrichSocials": true,
  "extractLicenseNumber": true,
  "extractServiceAreas": true,
  "outputFormat": "full",
  "deduplicateResults": true
}' |
apify call muhammadafzal/electrician-lead-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Electrician Scraper — Verified Emails & License Numbers",
        "description": "Scrape electrician & electrical contractor contacts from Google Maps with verified emails, phones, license numbers & service areas. Export to HubSpot, Salesforce, or CSV. Built for solar SaaS sales, EV charging & electrical supply.",
        "version": "1.0",
        "x-build-id": "L0UZzKljVKEQeXMHX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/muhammadafzal~electrician-lead-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-muhammadafzal-electrician-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~electrician-lead-scraper/runs": {
            "post": {
                "operationId": "runs-sync-muhammadafzal-electrician-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~electrician-lead-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-muhammadafzal-electrician-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": "Electrician Specialty",
                        "enum": [
                            "Residential Electrician",
                            "Commercial Electrician",
                            "Industrial Electrician",
                            "Electrical Contractor",
                            "Solar Installer",
                            "EV Charging Station Installer",
                            "Low Voltage Electrician",
                            "Emergency Electrician",
                            "Generator Installer",
                            "Custom"
                        ],
                        "type": "string",
                        "description": "Use this field to select the type of electrical contractor to find on Google Maps. The actor automatically builds the search query — 'Residential Electrician' finds home wiring & repair electricians, 'Commercial Electrician' finds office/retail electrical contractors, 'Industrial Electrician' finds factory & plant electricians, 'Solar Installer' finds solar PV installers, 'EV Charging Station Installer' finds EV charger installers. Choose 'Custom' to write your own search query via the searchQuery field.",
                        "default": "Residential Electrician"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Use this field to specify the city, state, or region to search for electricians. Use 'City, ST' format for US locations — 'Dallas, TX', 'Phoenix, AZ', 'Los Angeles, CA'. ZIP codes and neighborhoods also work. The more specific your location, the more targeted your electrician lead list."
                    },
                    "locations": {
                        "title": "Multiple Locations (Batch Mode)",
                        "type": "array",
                        "description": "Use this field when you want to search multiple cities in a single run. Each location is searched separately and results are combined with deduplication. Example: ['Dallas, TX', 'Houston, TX', 'Austin, TX']. Leave empty to use the single 'location' field instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQuery": {
                        "title": "Custom Search Query",
                        "type": "string",
                        "description": "A raw Google Maps search query, used ONLY when Electrician Specialty is set to 'Custom'. Write queries the same way you would type them into Google Maps — 'ev charging installers in Seattle WA', 'low voltage contractors near Denver', 'master electrician 90210'. For all other specialties the search is built automatically from Specialty + Location."
                    },
                    "startUrls": {
                        "title": "Start URLs (Direct Google Maps Place URLs)",
                        "type": "array",
                        "description": "Use this field when the user provides specific Google Maps place URLs to scrape directly. Format: [{\"url\": \"https://www.google.com/maps/place/...\"}]. Do NOT use this when the user describes a specialty or location — use businessType + location instead.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "The maximum number of electrician leads to collect and return. Set to a small number (3-5) first to verify data quality before scaling. Google Maps typically returns up to 120 results per search query; run multiple locations to build larger datasets.",
                        "default": 50
                    },
                    "enrichEmails": {
                        "title": "Find Email Addresses",
                        "type": "boolean",
                        "description": "When enabled, the actor visits each electrician's website and scans contact pages, footers, and about pages to extract email addresses. Disable if you only need phone numbers and addresses, or to run faster without website crawling.",
                        "default": true
                    },
                    "verifyEmails": {
                        "title": "Verify Email Deliverability",
                        "type": "boolean",
                        "description": "When enabled, each extracted email is checked via DNS MX record lookup to confirm the mailbox exists and can receive mail — without sending a message. Reduces bounce rates. Only applies when 'Find Email Addresses' is enabled.",
                        "default": true
                    },
                    "enrichSocials": {
                        "title": "Find Social Media Links",
                        "type": "boolean",
                        "description": "When enabled, the actor scans each electrician's website for links to Facebook, Instagram, LinkedIn, Twitter/X, YouTube, and TikTok. Useful for multi-channel outreach and Facebook ad targeting (Custom Audiences).",
                        "default": true
                    },
                    "extractLicenseNumber": {
                        "title": "Extract License Numbers",
                        "type": "boolean",
                        "description": "When enabled, the actor scans electrician websites for contractor license numbers (TECL, EC, state license formats). Critical for compliance verification and skip-tracing licensed vs. unlicensed contractors.",
                        "default": true
                    },
                    "extractServiceAreas": {
                        "title": "Extract Service Areas",
                        "type": "boolean",
                        "description": "When enabled, the actor parses electrician websites for service area coverage (cities/counties they serve). Useful for territory planning and identifying contractors serving specific regions.",
                        "default": true
                    },
                    "outputFormat": {
                        "title": "Output Format",
                        "enum": [
                            "full",
                            "hubspot",
                            "salesforce"
                        ],
                        "type": "string",
                        "description": "Controls the structure of the output dataset. 'full' returns all available fields. 'hubspot' reformats for HubSpot CSV import. 'salesforce' reformats for Salesforce data import. All formats exportable as CSV, JSON, or Excel from Apify.",
                        "default": "full"
                    },
                    "deduplicateResults": {
                        "title": "Deduplicate Results",
                        "type": "boolean",
                        "description": "When enabled, removes duplicate electricians based on phone number or business name. Recommended for batch mode when searching multiple locations that may overlap.",
                        "default": true
                    },
                    "maxWebsitePages": {
                        "title": "Max Website Pages to Crawl",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of pages to crawl on each electrician's website when enriching emails, socials, license numbers, or service areas. Higher values find more contacts but slow down the run. Default 5 is sufficient for most contractor sites.",
                        "default": 5
                    },
                    "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
