HomeStars Scraper | Canadian Contractor Phones
Pricing
from $2.20 / 1,000 results
HomeStars Scraper | Canadian Contractor Phones
Collect Canadian HomeStars contractors by city, trade, or public profile. Export names, available phones, websites, ratings, and optional reviews. Pay per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Features
Share
HomeStars Scraper
Extract Canadian HomeStars contractor names, public contact details, ratings, and optional reviews as rows you can export.
- Find contractors by city or trade, or supply public profile URLs.
- Get available phones, websites, locality, ratings, and review counts.
- Discover city and trade directories before choosing an input.
- Add reviews as separate, individually billed rows.
- Pay $3.00 per 1,000 delivered rows on the Free plan, plus a start fee.
What does HomeStars Scraper do?
HomeStars Scraper collects public information from www.homestars.com in Canada. Use it to build contractor lists, compare local services, or review customer feedback. It does not submit contact forms or quote requests.
- Contractors:
city-list,trade-city,national-trade, andprofilereturn business rows. - Directory discovery:
all-citiesandall-tradesreturn directory entries, not contractors. - Company pages:
privacy,about, andhomereturn HomeStars company information, not merchant contacts. - Reviews:
includeReviewsis off by default. When enabled, each review is a separaterowType=reviewrow, billed at the same rate and sharing the contractor's row allowance.
What data can you extract from HomeStars?
Fields depend on the page and what HomeStars publishes. The tables show illustrative values, not guaranteed results.
Contractor directory rows: rowType=list
| Field | Description | Example |
|---|---|---|
rowType | Row category | list |
id | Exact profile slug | deo-tech |
entityId | Typed identity across contractor row types | servicePro:deo-tech |
serviceProId | Separate numeric contractor identifier, when available | null |
name | Business name | Example Contracting |
url | HomeStars profile address | https://www.homestars.com/profile/deo-tech |
rating | Published rating | 4.8 |
reviewCount | Published review count | 42 |
phones | Available public phone objects | [{"value":"+1 555 0100"}] |
web.website | Public business website | https://example.com |
address.locality | City or locality | Calgary |
listingTier | Listing category, when available | null |
Contractor profile rows: rowType=profile
Profiles also carry the contractor identity and rating fields above.
| Field | Description | Example |
|---|---|---|
rowType | Row category | profile |
id | Exact profile slug | deo-tech |
name | Business name | Example Contracting |
phones | Available public phones | [{"value":"+1 555 0100"}] |
emails | Public emails; commonly empty | [] |
address.locality | Business locality | Calgary |
web.website | Public business website | https://example.com |
professions | Published trade information | [] |
workArea.localities | Listed service areas | ["Calgary"] |
leadAbsences | Reasons contact fields are absent | {} |
Review rows: rowType=review
| Field | Description | Example |
|---|---|---|
rowType | Row category | review |
reviewId | Published review identifier | example-review |
parentId | Contractor's profile slug | deo-tech |
parentName | Contractor's name | Example Contracting |
parentUrl | Contractor's profile | https://www.homestars.com/profile/deo-tech |
rating | Review rating | 5 |
text | Review body | Example review text. |
reviewer | Published reviewer; absent for anonymous reviews | Jane Doe |
reply | Contractor reply, when present | null |
createdAt | Published review timestamp | 2026-10-01T12:00:00Z |
City rows: rowType=city
| Field | Description | Example |
|---|---|---|
rowType | Row category | city |
name | City name | Calgary |
slug | Directory city slug | calgary-alberta |
url | City directory | https://www.homestars.com/find-professionals/calgary-alberta |
Trade rows: rowType=trade
| Field | Description | Example |
|---|---|---|
rowType | Row category | trade |
name | Trade name | Electrician |
cluster | Directory category | electricity |
trade | Trade slug | electrician |
url | Trade directory | https://www.homestars.com/electricity/electrician-pros |
Privacy-page rows: rowType=privacy
| Field | Description | Example |
|---|---|---|
rowType | Row category | privacy |
name | Platform company | HomeStars Inc. |
emails | Published company contact | [{"value":"name@example.com"}] |
address.street | Published company street | 123 Example Street |
About-page rows: rowType=about
| Field | Description | Example |
|---|---|---|
rowType | Row category | about |
name | Platform name | HomeStars |
phones | No merchant phone from this page | [] |
Homepage rows: rowType=home
| Field | Description | Example |
|---|---|---|
rowType | Row category | home |
name | Platform company | HomeStars Inc. |
phones | Platform support phone, not a contractor | [{"value":"+1 555 0100","type":"support"}] |
How to scrape HomeStars
- Open HomeStars Scraper in Apify Console.
- Enter a city such as
edmonton, or choose another search type below. - Set
maxResultsto3for a small first run. - Click Start and wait for completion.
- Download the dataset or read its rows through the API.
Empty input {} starts the form's example: up to 3 contractors from calgary-alberta. Normal event prices apply. A city alone uses city-list. Supported addresses in detailUrls identify their page type automatically; a profileSlug alone does not select profile mode, so also set searchType to profile.
City directory
Use city-list and city. Copy the slug from a directory URL; calgary-alberta is not interchangeable with the bare calgary hub.
Trade in a city
Use trade-city, city, cluster, and trade. For electricians, the pair is electricity and electrician.
National trade
Use national-trade with cluster and trade. No city is required; row and page limits still apply.
Contractor profile
Use profile with profileSlug, or put profile URLs in detailUrls. Preserve the site's exact slug, including any numeric prefix.
All cities
Use all-cities to get city directory entries. This does not collect every contractor in those cities.
All trades
Use all-trades to get trade entries with directory links. Use their cluster and trade values in a later contractor run.
Privacy page
Use privacy for HomeStars company contact information, not contractor email addresses.
About page
Use about for a HomeStars company row. This page does not supply merchant contacts.
Homepage
Use home for available platform contact information. A support phone belongs to HomeStars, not a contractor.
What to fill in
| Field | What to enter | Default |
|---|---|---|
searchType | A supported mode listed above | city-list |
city | City directory slug | calgary-alberta when omitted |
detailUrls | Array of supported HomeStars page URLs | Empty |
profileSlug | Exact slug with searchType=profile | Empty |
cluster | First segment of a trade directory URL | electricity |
trade | Trade slug without -pros | electrician |
market | ca, the only supported market | ca |
maxResults | Row allowance per input, from 1 to 200 | 70; example uses 3 |
maxPages | Directory page limit, from 1 to 50 | 1 |
enrichDetails | Include available profile contact details | true |
includeReviews | Add separately billed review rows | false |
cursor | Returned nextCursor for the same single input and mode | Empty |
City directory input
{"searchType":"city-list","city":"edmonton","maxResults":3}
Trade-city input
{"searchType":"trade-city","city":"calgary-alberta","cluster":"electricity","trade":"electrician","maxResults":3}
National-trade input
{"searchType":"national-trade","cluster":"electricity","trade":"electrician","maxResults":3}
Profile input
{"searchType":"profile","detailUrls":["https://www.homestars.com/profile/deo-tech"],"maxResults":3}
City-discovery input
{"searchType":"all-cities","maxResults":3}
Trade-discovery input
{"searchType":"all-trades","maxResults":3}
Privacy input
{"searchType":"privacy","maxResults":1}
About input
{"searchType":"about","maxResults":1}
Homepage input
{"searchType":"home","maxResults":1}
maxItems and limit are aliases for maxResults. urls, startUrls, and profileUrls mean detailUrls; slug means profileSlug. Close field-name misspellings can be corrected; other unknown fields are ignored with a note. Check INPUT_REPORT in the default key-value store for filled, corrected, or ignored fields and example-run status. INPUT_ECHO records the applied settings.
Invalid input fails before rows are charged, with a field-specific explanation such as INVALID_INPUT: market must be ca. Numeric limits can be adjusted into range and reported. Do not invent a cursor or combine one with several detailUrls entries.
Output example
Illustrative profile row; business and contact values below are placeholders.
{"rowType": "profile","id": "example-contractor","slug": "example-contractor","entityId": "servicePro:example-contractor","serviceProId": null,"name": "Example Contracting","url": "https://www.homestars.com/profile/example-contractor","phones": [{"value": "+1 555 0100", "type": "landline", "e164": null}],"emails": [],"address": {"street": null, "locality": "Calgary", "region": "Alberta", "country": "CA"},"web": {"website": "https://example.com", "socials": []},"rating": 4.8,"reviewCount": 42,"workArea": {"localities": ["Calgary"]}}
Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. Filter by rowType when combining contractors and reviews.
Why use this HomeStars scraper?
- Pay per delivered row. Attempts that produce no dataset rows incur no row charge; the start fee still applies.
- Keep partial results. Rows returned before a collection stop or deadline are delivered when available; rows already in the dataset remain there.
- Inspect failures. Input errors identify the field;
ERROR_SUMMARYandRUN_SUMMARYprovide run details. - Keep missing information visible. Unavailable contact fields stay empty rather than becoming guessed contacts.
- Use several inputs. Supply several supported URLs in
detailUrlsinstead of starting a separate run for each. - Avoid setup. You do not need to set up proxies or supply a HomeStars account.
How much does it cost to scrape HomeStars?
The Actor uses pay-per-event pricing. Platform usage is included in these prices.
| Apify plan | Start event | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
Start billing is one event per GB of allocated memory, with a minimum of one. The default 512 MB allocation incurs one $0.005 start event. Every delivered row type costs the same, including reviews and directory entries.
maxResults applies to each input, defaults to 70, and supports up to 200. Several URLs can therefore produce more than 70 rows in one run. Reviews consume the same allowance, leaving fewer contractor rows. Actual output may be lower because of availability or maxPages.
Free-plan runs are capped at 200 rows across all inputs, with a 10-run allowance for this Actor. The whole run also stops at your Maximum cost per run (maxTotalChargeUsd in the API).
Example: one city input delivering 3 rows on the Free plan at 512 MB costs 3 × $0.003 + $0.005 = $0.014. A run delivering zero rows has no row charge, but the start fee remains.
What happens when the run timeout is too short
When automatic resumption is accepted and collection needs more time, the run pauses with a message such as "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." It temporarily shows ABORTED; that pause is not itself a failed collection.
When results are ready, the same run resumes, writes to the same dataset, and finishes as SUCCEEDED if delivery succeeds. A resumed delivery can show "Resumed: delivering N rows." Previously delivered rows are skipped, so they are not delivered or charged twice. No manual restart is needed for this automatic pause.
Automatic resumption is capped at 3 attempts. Keep the default timeout of 3600 seconds to reduce interruptions. Other failures or manual aborts do not guarantee recovery.
Synchronous endpoints (run-sync, run-sync-get-dataset-items) wait at most 300 seconds and can return an empty dataset while the run is paused. Start larger runs asynchronously, then read the dataset after SUCCEEDED, or use a webhook for the succeeded event.
Use with AI agents and the API
Apify MCP server
Add this remote tool to Claude, ChatGPT, Cursor, VS Code, or another compatible MCP client:
https://mcp.apify.com?tools=lentic_clockss/homestars-scraper
Sign in with Apify using OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; read the rows with get-dataset-items.
Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/homestars-scraper with APIFY_TOKEN configured.
Example prompt: "Run HomeStars Scraper for Edmonton with a limit of 3 rows. Return company names, public phones, and profile URLs."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/homestars-scraper").call(run_input={"city": "edmonton", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/homestars-scraper').call({ city: 'edmonton', maxResults: 3 });const { items: rows } = await client.dataset(run.defaultDatasetId).listItems();console.log(rows);
For asynchronous HTTP access, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~homestars-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. After completion, fetch GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Integrations
Use the Integrations tab to connect Google Sheets, Make, Zapier, n8n, Slack, Airtable, or your own webhook. Use Apify Schedules for recurring runs.
FAQ
Is it legal to scrape HomeStars?
The Actor collects public data. You are responsible for complying with HomeStars' terms and applicable data-protection law. Processing personal data needs a lawful basis. This third-party tool is not affiliated with HomeStars.
Why did my run end as ABORTED?
Check the status message. An automatic-resumption message means the same run will restart when results are ready. A manual abort or another failure is different; inspect the run details before restarting.
How many results can I get?
Request 1–200 rows per input; the default is 70. Free-plan runs stop at 200 total rows. Availability, page limits, optional reviews, and your maximum charge can reduce delivery.
Why are some fields empty?
Public profiles may omit phones, emails, websites, or street addresses. leadAbsences explains missing contact fields; some explanations are returned in Chinese. Disabling enrichDetails leaves directory contact fields empty.
Do I need a HomeStars account?
No. The Actor reads public information without a HomeStars login or developer key. You need an Apify account to run it.
Which city and trade names should I enter?
Copy slugs from supported directory URLs, or use all-cities and all-trades to discover them. City slugs can include a province suffix. Trade values omit -pros.
Can I collect merchant emails through Get in touch?
No. The Actor does not submit contact forms or quote requests. Privacy-page emails belong to HomeStars, not contractors. Keyword search, map search, login, quote, and contact modes do not return contractor rows.
What should I check when no rows arrive?
Check the mode, exact slug, INPUT_REPORT, and run summaries. An unsupported page or an unavailable profile may produce no rows. If RUN_SUMMARY.status is QUEUE_FULL, try later; no rows were collected or billed, although the start fee applies.
Limitations
- Only Canadian
www.homestars.compages are supported; other country sites are outside scope. - A high row limit does not guarantee full city or national coverage.
maxPagesdefaults to one. - Reviews are optional and limited, not a promise to retrieve every review.
- Use the exact profile slug for
idand URLs. Its numeric prefix is not necessarilyserviceProId; useserviceProIdwhen reconciling older exports with differently formatted IDs. - Resume a cursor only with its original mode and single input. Do not manufacture a
nextCursoror reuse it across cities. - Contact availability and source-page changes can cause empty fields, partial results, or failed runs.
Related scrapers
More local services and lead generation scrapers from the same publisher:
- Nextdoor Business Scraper
- Google Maps Scraper for Leads, CRM, and Reviews
- AlloVoisins Scraper
- Angi Scraper
- Jiffy On Demand Scraper
- Care.com Scraper
- TaskRabbit Scraper
- Yelp Business Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.