# HomeStars Scraper: Canadian Contractor Leads (`getascraper/homestars-scraper`) Actor

Find and download Canadian contractor profiles from HomeStars.com by city and trade. Get company name, HomeStars score, star rating, review count, verification status, city, province, and profile link. $3.49 per 1,000 records.

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

## Pricing

from $3.49 / 1,000 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

## HomeStars Scraper: Canadian Contractor Leads

**Get verified contractor profiles from Canada's largest home services directory, ready to download as a spreadsheet.** Search by city and trade category to instantly build a targeted list of plumbers, roofers, electricians, and 200+ other trades across Toronto, Vancouver, Calgary, and every Canadian city. The first 50 results of every run are free, with pricing set at $3.49 per 1,000 results.

---

### Why use HomeStars Scraper

*   **Build outbound lead lists**: Get company names, ratings, review counts, and profile links for every contractor in any city and trade. Feed directly into your CRM or cold outreach tool.
*   **Reputation research**: See the HomeStars score and star rating side by side. Spot contractors with hundreds of reviews to benchmark against, or those with thin reputation who need your services.
*   **Sales prospecting by trade**: Need every plumber in Calgary or every roofer in Vancouver? Enter the city and category and your list is ready in seconds.
*   **Market sizing**: Count how many verified contractors operate in any trade and region before launching a new service.
*   **Competitive analysis**: Pull every contractor in your category and city, then compare ratings, verification status, and review volume in a spreadsheet.

---

### How to use HomeStars Scraper

1.  **Set your location**: Enter the city name you want to target, for example: `toronto`, `vancouver`, or `calgary`.
2.  **Set your category**: Enter the trade or service type, for example: `plumbing`, `roofing`, or `handymen`.
3.  **Click Start**: The scraper finds every matching contractor and collects their profile details.
4.  **Download your results**: Export as Excel, CSV, JSON, or Google Sheets from the Output tab.

---

### Input

| Field | Type | Required | Description |
| --- | --- | :---: | --- |
| `location` | string | Yes | City or region to search, for example: `toronto`, `calgary`, `vancouver`. |
| `category` | string | Yes | Trade or service category, for example: `plumbing`, `roofing`, `handymen`. |
| `maxItems` | integer | No | Maximum number of contractor records to collect. Default: 100. |
| `proxyConfiguration` | object | No | Connection settings to ensure unblocked data collection. |

---

### Output

Each row in your dataset is one contractor profile. All fields are flat with no nested data, so the file opens cleanly in any spreadsheet program.

Here is a realistic example of an output row:

```json
{
  "query_location": "toronto",
  "query_category": "plumbing",
  "company_name": "New Canadian Drain & Plumbing Ltd",
  "profile_url": "https://www.homestars.com/profile/217845-new-canadian-drain-plumbing-ltd",
  "logo_url": "https://www.homestars.com/images/sp/thumbnail_medium/f0b65181.jpg",
  "verification_status": "Verified",
  "homestars_score": 9.4,
  "overall_rating": 4.7,
  "reviews_count": 1259,
  "city": "Toronto",
  "province": "ON",
  "business_description": "We specialize in drain installation, repairs, clearing clogs, and basement waterproofing.",
  "scraped_at": "2026-06-21T10:00:00.000Z"
}
````

***

### Data table

| Field | Type | Description |
| --- | :---: | --- |
| `query_location` | string | The city or region you searched. |
| `query_category` | string | The trade or service category you searched. |
| `company_name` | string | Official business name of the contractor. |
| `profile_url` | string | Direct link to the contractor's HomeStars profile page. |
| `logo_url` | string | Profile logo image URL. |
| `verification_status` | string | HomeStars verification tier: Verified or Standard. |
| `homestars_score` | number | HomeStars reputation score out of 10. |
| `overall_rating` | number | Average star rating out of 5. |
| `reviews_count` | number | Total number of published customer reviews. |
| `city` | string | City where the contractor is based. |
| `province` | string | Canadian province code, for example: ON, BC, AB. |
| `business_description` | string | Short description of the business and its services. |
| `scraped_at` | string | Timestamp of when this record was collected. |

***

### Pricing

**$3.49 per 1,000 contractors. The first 50 results of every run are completely free.** No monthly subscriptions and no minimum commits.

The scraper collects data without launching a browser, keeping compute costs near zero. A typical run of 100 contractors completes in under 5 seconds. You only pay for the results you collect.

***

### Tips and optimization

- **Use lowercase city names**: Enter city names in lowercase exactly as HomeStars uses them, for example: `toronto` not `Toronto, ON`.
- **Run one category at a time**: If you need plumbers and roofers, run two separate jobs and merge the files afterwards.
- **Schedule weekly runs**: Set up a schedule in the Apify Console to refresh your contractor list automatically. New businesses join HomeStars regularly.
- **Filter by verification after download**: Filter the `verification_status` column to keep only Verified contractors for higher-quality outreach.

***

### FAQ

**Is it legal to collect this data?**
This scraper collects publicly visible business information that anyone can see on HomeStars.com without logging in. You are responsible for ensuring your use complies with HomeStars' terms of service and applicable laws.

**Why are some fields empty?**
Not every contractor fills in all details on their HomeStars profile. Fields such as `business_description` and `logo_url` may be empty if the contractor has not added them.

**Can I scrape multiple cities at once?**
Run one job per city and combine the exports in your spreadsheet. This gives you a clear record of which city each batch came from.

**How current is the data?**
The scraper pulls live data directly from HomeStars.com at the time you run it. Schedule regular runs to keep your list fresh.

***

### Disclaimers and support

- **Disclaimer**: This scraper retrieves publicly available business listings from HomeStars.com. It is not affiliated with, endorsed by, or sponsored by HomeStars. Ensure your use complies with applicable laws and the site's terms of service.
- **Support**: For bug reports, missing fields, or feature requests, open a ticket under the **Issues** tab.

# Actor input Schema

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

The city or region to scrape contractors from (for example: toronto, vancouver, calgary).

## `category` (type: `string`):

The trade or service category to search (for example: plumbing, roofing, handymen).

## `maxItems` (type: `integer`):

The maximum number of contractors to retrieve.

## `proxyConfiguration` (type: `object`):

Enable proxies to avoid being blocked by regional security firewalls.

## Actor input object example

```json
{
  "location": "toronto",
  "category": "plumbing",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "location": "toronto",
    "category": "plumbing",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/homestars-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 = {
    "location": "toronto",
    "category": "plumbing",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/homestars-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 '{
  "location": "toronto",
  "category": "plumbing",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/homestars-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "HomeStars Scraper: Canadian Contractor Leads",
        "description": "Find and download Canadian contractor profiles from HomeStars.com by city and trade. Get company name, HomeStars score, star rating, review count, verification status, city, province, and profile link. $3.49 per 1,000 records.",
        "version": "0.1",
        "x-build-id": "KyyPGRubyBaVukbMg"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/getascraper~homestars-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-getascraper-homestars-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/getascraper~homestars-scraper/runs": {
            "post": {
                "operationId": "runs-sync-getascraper-homestars-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/getascraper~homestars-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-getascraper-homestars-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",
                "required": [
                    "location",
                    "category",
                    "maxItems"
                ],
                "properties": {
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "The city or region to scrape contractors from (for example: toronto, vancouver, calgary).",
                        "default": "toronto"
                    },
                    "category": {
                        "title": "Category",
                        "type": "string",
                        "description": "The trade or service category to search (for example: plumbing, roofing, handymen).",
                        "default": "plumbing"
                    },
                    "maxItems": {
                        "title": "Maximum Results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "The maximum number of contractors to retrieve.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Enable proxies to avoid being blocked by regional security firewalls.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
