Networx Contractor Scraper — Home Service Pro Leads avatar

Networx Contractor Scraper — Home Service Pro Leads

Pricing

$3.50 / 1,000 per contractor returneds

Go to Apify Store
Networx Contractor Scraper — Home Service Pro Leads

Networx Contractor Scraper — Home Service Pro Leads

One row per US home-service contractor from networx.com: business name, trade, street address where published, city/state/ZIP, lat/lon, website, star rating, reviews, years in business, BBB accreditation and business highlights. 41 trades x 51 states, or sweep all 103,876 profiles.

Pricing

$3.50 / 1,000 per contractor returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Share

Home-service contractors from networx.com, one row per contractor: businessName, trade, street, city, state, zip, latitude, longitude, website, rating, reviewCount, yearsInBusiness, isClaimed, isBbbAccredited, bbbProfileUrl, businessHighlights, awards, socialLinks and the Networx companyId you can join on. Filter by trade, state and city — or paste your own profile URLs.

103,876 US contractor profiles, 41 trades × 51 states, enumerated live from Networx's own sitemaps — not quoted from a marketing page. Rows come back geocoded: city, ZIP and latitude/longitude on 100% of the 350 rows measured through trade + location mode (96.5% on the whole-directory route).

No login. No cookies. No CAPTCHA solving. No browser — it reads server-rendered HTML.

Quick start

This is the input the Actor ships with. Click Try for free, hit Start, get rows without typing anything:

{
"discovery": "trade",
"trades": ["roofers"],
"states": ["TX"],
"cities": ["austin", "san-antonio", "houston", "dallas", "fort-worth", "el-paso"],
"maxItems": 50
}

That exact input, run on 2026-08-12: 6 listing pages → 97 listing rows → 77 unique contractors → 50 records in 29 seconds, 54 profile pages fetched, 0 failures. Cost: $0.175.

Or from the API:

curl -X POST "https://api.apify.com/v2/acts/ScrapersDelight~networx-contractor-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"trades":["plumbers"],"states":["TX"],"cities":["austin"],"maxItems":100}'

The wedge: trade + street address + lat/lon, on a directory nobody else scrapes

As of 2026-08-12, an Apify Store search for networx and networx.com returns no other Actor targeting networx.com. That is the first half of the wedge. The second half is what the site uniquely holds and how this Actor gets at it:

  • A normalised trade. A Networx profile URL is just /c.{business-slug} — it carries no trade and no location, and the profile page never prints a normalised trade either ("Main Services" is free text the contractor typed). The trade exists in exactly one place: the listing-page URL. So trade + location mode walks /{trade}/{state}/{city} and hands you trade and tradeSlug as real, filterable values instead of a keyword guess.
  • A street address. street is published only on the listing page, never on the profile. Fill is low and honest — 7.3% on the 300-row sample, 16.0% on the 50-row default run — but where it exists, nothing else on this site gives it to you.
  • Coordinates on every row. latitude/longitude came back on 100% of the 300-row trade sample and 96.5% of the 200-profile directory sample, which is what makes territory mapping and radius assignment possible without a geocoding bill.
  • The whole directory, exactly once. The company sitemap enumerates 103,876 profiles with 0.0% duplicates — a complete-census option, not a search-results skim.

Who this is for, stated plainly: this is an enrichment base, not a call sheet. Name + trade + geo + website, cheap and complete, that you point an e-mail finder or a licence lookup at. If you need a phone number in the row you buy, read the next section before you spend anything.

Read this before you buy rows

  1. Networx publishes no phone numbers and no licence records. At all. Networx is a lead broker: the contractor's number lives behind its own quote form, and it holds no licence data. A scan of 200 random live profiles found zero tel: links, zero phone microdata and zero licence markup. There is no phone field and no license field, because nothing on this source can produce one.
  2. The one thing recovered anyway is labelled so you can never mistake it. phoneFromDescription parses a NANP number out of the contractor's own free-text description when they typed one there. Fill: 9.5% of all directory profiles, 5.3% of the 300-row trade sample, 6.0% of the 50-row default run. emailFromDescription works the same way (~1% directory, 2.0% on the default run). These are the contractor's own published words, not a Networx field.
  3. Only 13.0% of the directory is a claimed listing, and the other 87% are thin stubs Networx built itself. Website fill is 42.3% on claimed listings and 0.0% on unclaimed ones. That single fact explains why the two fill tables below disagree so violently, and it is what claimedOnly is for.
  4. The address is the contractor's HQ, not the city you searched. Networx lists multi-state firms on local pages: 4 of the 50 rows in the default Texas run were headquartered in CA, WA and OR (8%). Filter on city/state after the fact if you need strictly local firms.
  5. Listing pages repeat the same firms across neighbouring towns. Measured 77.5% duplicate rows on a 40-page contiguous Texas walk. The Actor drops them before it fetches anything, so you are never billed twice — but it means a 6-city run yields far fewer than 6 × 19 firms.

What you get — one row per contractor

Every row carries every key. A field Networx did not publish is null, never a missing key.

GroupFields
IdentityprofileUrl, profileSlug, companyId, businessName
Tradetrade (e.g. Roofing), tradeSlug (e.g. roofers), mainServices (free text), description
Locationstreet, city, state, zip, latitude, longitude
Contactwebsite, additionalWebsites[], socialLinks (object: facebook, instagram, twitter, linkedin, youtube, pinterest), phoneFromDescription, emailFromDescription
Reputationrating (0–5), reviewCount, reviewsOnPage, awards, businessHighlights[]
CredentialsisClaimed, isBbbAccredited, bbbProfileUrl, yearsInBusiness, startYear
MedialogoUrl, categoryImage
ProvenancelistingUrl (the page it was discovered on), sourceUrl, scrapedAt (ISO-8601 UTC)

companyId is Networx's own internal client id. It is stable across business-name and slug changes, so use it — not the URL — as your join key when you re-scrape.

Sample row

A real row from the default run above, captured 2026-08-12 (scrapedAt is UTC, so it reads 08-13). Every value is exactly as returned; the only edits are the truncated description and the keys grouped into blocks for readability:

{
"profileUrl": "https://www.networx.com/c.kas-contracting-company-inc",
"profileSlug": "kas-contracting-company-inc",
"companyId": 138423,
"businessName": "Kas Contracting Company, Inc.",
"trade": "Roofing",
"tradeSlug": "roofers",
"mainServices": "Roofing, Insurance Reconstruction",
"description": "Kas Contracting is a local roofing general contractor with emphasis in residential and commercial insurance recovery and restoration…",
"street": "7901 Cameron Rd Suite 2-238",
"city": "Austin",
"state": "TX",
"zip": "78754",
"latitude": 30.366077,
"longitude": -97.644142,
"website": "http://www.kascontracting.com",
"additionalWebsites": ["http://www.homeadvisor.com/rated.KasContractingCo.46216699.html"],
"socialLinks": {
"twitter": "https://www.x.com/kascontracting",
"facebook": "https://www.facebook.com/kascontracting"
},
"phoneFromDescription": "(512) 428-6364", // parsed out of the contractor's own blurb
"emailFromDescription": null,
"rating": 5,
"reviewCount": 5,
"reviewsOnPage": 5,
"awards": "\"People Love Us On Yelp\" 2016, 2017, 2018 Thumbtack Best Of Roofing 2016",
"businessHighlights": [
"Family-owned & Operated", "Financing Options", "Free Consultation",
"Free In-home Estimate", "Full Warranty", "Guaranteed Repairs",
"Lifetime Guarantee", "Maintaining Distance", "Minority-owned & Operated",
"No-contact Payments", "On-time Guarantee", "Parts & Labor Guarantee",
"Protective Gear Used", "Video Appointments", "Workmanship Guarantee"
],
"isClaimed": true,
"isBbbAccredited": true,
"bbbProfileUrl": "https://www.bbb.org/us/tx/austin/profile/roofing-contractors/kas-contracting-0825-1000104478",
"yearsInBusiness": 14,
"startYear": 2012,
"logoUrl": "https://cdn50.networx.com/media/max/140x140/clp_5db05e59c5db4.png",
"categoryImage": null,
"listingUrl": "https://www.networx.com/roofers/tx/austin",
"sourceUrl": "https://www.networx.com/c.kas-contracting-company-inc",
"scrapedAt": "2026-08-13T01:39:33.502Z"
}

Fields people misread:

  • rating is a 0–5 star value, not a percentage. rating: null and reviewCount: null arrive together and mean Networx published no rating — 17 of the 50 default rows.
  • reviewsOnPage is a count of review cards rendered on the profile (0–34 in the default run) and is 0, not null, when there are none. reviewCount is the site's own headline total.
  • isBbbAccredited is always true/false; false means "no BBB accreditation badge on the page", not "checked with the BBB". Where it is true there is also a bbbProfileUrl (12 of 12 in the default run).
  • awards is a single free-text string the contractor wrote, not an array.
  • street is the listing page's address line. When Networx prints "Serving Austin, TX" instead of an address, street is null.

Field fill — measured on three real samples

Sample A — the default run. 50 contractors, roofers across 6 Texas metros, 2026-08-12. This is the exact prefilled input, so you can reproduce the run yourself for $0.175. Expect the percentages to move a few points: 77 contractors are discovered and the first 50 to come back win the slots, so which 50 you get depends on the order the fetches finish. A re-run of this same input returned website 56.0%, rating 68.0%, street 18.0%.

FieldFill
businessName, companyId, trade, tradeSlug, city, state, zip, latitude/longitude, isClaimed, isBbbAccredited100%
logoUrl82.0%
description80.0%
businessHighlights70.0%
mainServices66.0%
rating / reviewCount66.0%
yearsInBusiness / startYear64.0%
website54.0%
socialLinks32.0%
bbbProfileUrl24.0%
awards22.0%
street16.0%
additionalWebsites12.0%
phoneFromDescription6.0%
emailFromDescription2.0%
phone (as a Networx field)0.0%
license0.0%

Sample B — trade + location, at scale. 300 contractors, 6 trades requested across 18 metros in 5 states, resolving to 163 HQ cities in 9 states:

FieldFillNote
businessName, trade, tradeSlug, city, state, zip, latitude/longitude100%
isClaimed99.3% claimedlisting pages surface active listings almost exclusively
description85.0%
logoUrl84.7%
businessHighlights77.0%"Family-owned", "24/7 Emergency Service", "Se Habla Español" …
mainServices72.0%free text the contractor wrote
yearsInBusiness / startYear70.3%up to 124 years
rating / reviewCount64.7%
website62.3%
socialLinks37.0%Facebook, Instagram, X, LinkedIn, YouTube, Pinterest
awards21.7%
bbbProfileUrl20.0%direct link to the BBB profile
additionalWebsites13.7%
street7.3%only ever published on the listing page
phoneFromDescription5.3%recovered from free text

Sample C — whole directory. 200 random profiles drawn across the full sitemap, 36 states:

FieldFill
businessName, companyId, isClaimed100%
city, state, zip, latitude/longitude96.5%
description90.5%
yearsInBusiness76.0%
mainServices69.5%
rating / reviewCount62.5%
businessHighlights45.0%
socialLinks17.0%
phoneFromDescription9.5%
bbbProfileUrl6.5%
website5.5%
street0.0%

The headline that could mislead you: this is not a phone-number product, and whole-directory mode is not a website product. Plan against Sample A or B if you want contactable rows, and against Sample C if you want a census.

Why B and C disagree so much

websitehighlightssocialrating
Claimed (n=26 of 200)42.3%80.8%38.5%80.8%
Unclaimed stub (n=174 of 200)0.0%39.7%13.8%59.8%

Website fill is 0% on unclaimed stubs, and only 13.0% of the directory is claimed — that is the entire explanation for 5.5% vs 62.3%. Trade + location mode lands on active listings; whole-directory mode gives you everything including the stubs. Use claimedOnly: true if you sweep the directory and want leads rather than a census.

Ratings skew hard to 5.0. 81% of the rated contractors in the 300-row sample sit at exactly 5.0, and 30 of the 33 rated rows (90.9%) in the 50-row default run did too. A minRating of 4.0+ removes far less than you would expect; what it does remove is every unrated contractor, which is 35% of the 300-row sample (34% of the 50-row default run).

Every run prints its own measured fill in the log, so you never have to trust this page for the slice you actually bought.

How to run it

Trade + location (default) — a trade in named cities

Fastest and cheapest. Naming cities skips 65 MB of sitemap downloads and builds the listing URLs directly.

{
"discovery": "trade",
"trades": ["plumbers", "heating-ac"],
"states": ["TX"],
"cities": ["austin", "san-antonio", "houston"],
"maxItems": 1000
}

2 trades × 1 state × 3 cities = 6 listing pages, deduped, then one profile fetch per unique firm.

Trade + location — a whole state

Leave cities empty and the Actor reads Networx's city sitemaps to discover every valid city page for your trades. Slower to start (it downloads and filters the sitemaps) but complete.

{ "discovery": "trade", "trades": ["roofers"], "states": ["TX", "OK"], "maxItems": 5000 }

Listing-only mode — a fast roster

fetchProfileDetails: false returns just what the listing page shows: name, trade, city/state, street address, star rating and blurb — at roughly 6× fewer requests. You lose ZIP, lat/lon, website, review count, years in business, BBB, claimed status, highlights and social links. The price per contractor is identical, so this buys speed, not money. The quality filters below all read profile-page fields, so the Actor stops with an explanation rather than silently ignoring them if you combine the two.

{ "discovery": "trade", "trades": ["landscapers"], "states": ["FL"], "fetchProfileDetails": false, "maxItems": 2000 }

Whole directory — the census

{ "discovery": "directory", "claimedOnly": true, "maxItems": 5000 }

103,876 profiles, 0.0% duplicates, no trade attribution. Filters here run after each page is fetched, because a /c.{slug} URL carries neither state nor trade: a live run with claimedOnly plus two states fetched 520 profile pages to keep 10 rows. You are billed only for the rows kept, but the runtime is real — the Actor logs an estimate before it starts.

Paste your own URLs

{ "profileUrls": ["https://www.networx.com/c.kas-contracting-company-inc"] }

Overrides discovery entirely. Use it to refresh a list you already own.

Paging across runs

Discovery order is deterministic. After a maxItems: 1000 run, set skip: 1000 to continue where it stopped instead of re-buying the same firms.

Input

Fields appear here in the same order as the Console form.

FieldTypeDefaultWhat it does
discoveryselecttradetrade = walk /{trade}/{state}/{city} listing pages (real trade + street address). directory = walk the company sitemap (all 103,876 profiles, no trade)
tradesmulti-select (41)["roofers"] prefilledWhich trades to walk. Leave it empty in trade mode and you get the built-in SAMPLE (25 roofers in Austin + Houston, TX) instead of an error; ignored in directory mode. Crossed with states and cities
statesmulti-select (51)["TX"] prefilled50 states + DC. Empty = nationwide, which is slow in trade mode (418,027 listing pages)
citiesstringList6 TX metros prefilledCity names or slugs. Requires states in trade mode. Naming cities skips 65 MB of sitemaps
profileUrlsstringListPaste https://www.networx.com/c.{slug} URLs; overrides everything above
claimedOnlybooleanfalseKeep only claimed listings — 13.0% of the directory, but where the data is. ~8 fetches per kept row in directory mode
withWebsiteOnlybooleanfalseKeep only rows with a website — 5.5% of the directory, 42.3% of claimed, 62.3% on the trade route
minRatingselect0 (any)Any floor also drops every unrated contractor — 35% of the 300-row sample
minReviewCountnumber0Counts run 1–49; anything above ~5 cuts hard
minYearsInBusinessnumber0Present on 76.0% of profiles; the rest are dropped when a floor is set
fetchProfileDetailsbooleantrueOff = listing fields only, ~6× fewer requests, same price per row
maxItemsnumber100 (50 prefilled)Your hard cost cap. Duplicates never count against it. Raise it and the run timeout together — throughput is ~3–10 rows/second
skipnumber0Cross-run paging over a deterministic discovery order
maxConcurrencynumber5Tested optimum; clamped 1–10
proxyConfigurationproxyApify Proxy onLeave it on — see the transport ladder below

The 41 trade slugs

air-duct-cleaning · alarm-companies · appliance-repair-service · asphalt-contractors · bathroom-remodelers · carpenters · carpet-cleaners · carpet-services · cleaning-services · concrete-contractors · countertop-installation · deck-builders · drywall-contractors · electricians · fence-companies · flooring-contractors · foundation-contractors · garage-doors · gutter-contractors · handyman · heating-ac · home-insulation · home-restoration · junk-removal · kitchen-remodelers · landscapers · lawn-services · mold-remediation · painters · pest-control · plumbers · power-washing · remodeling-contractors · roofers · siding-contractors · snow-removal · solar-contractors · tile-contractors · tree-service · wildlife-removal · window-contractors

You pick these from a labelled dropdown in the Console ("HVAC / Heating & Cooling" → heating-ac) — the slugs are here for API callers. Coverage is very uneven: roofers has 20,907 city pages, solar-contractors 728. Thin trades in small states genuinely run out — Vermont gutter contractors returned 4 firms from 160 listing pages — and the Actor tells you it ran out rather than quietly returning a short file.

Pricing

$0.0035 per contractor returned — $3.50 per 1,000. Pay-per-event, charged on the contractor-scraped event. No monthly platform fee from this Actor.

RunRowsCost
The default prefilled run50$0.175
One metro, one trade1,000$3.50
A state-wide trade sweep10,000$35.00
The entire Networx directory103,876$363.57

What you are not charged for:

  • Listing pages and sitemaps — they are discovery, not rows.
  • Duplicates. The same firm appearing on five neighbouring towns' pages is deduplicated before anything is fetched, so your dataset and your bill never hold it twice.
  • Profiles your filters throw away. claimedOnly on the whole directory fetched 520 pages for 10 kept rows in a live run — you paid for 10.
  • Retries and proxy budget. Networx 403s about 40% of datacentre exit IPs; the re-fetching that costs is ours, not yours.

Rows are charged as they are pushed (Actor.pushData(items, 'contractor-scraped')), so if you hit a budget cap you get whole rows and a stop, not a half-billed dataset. maxItems is your hard cost dial.

Honest limits

  • No phone numbers. No licence records. Not scraped, not scrapeable, not hidden behind an option — Networx does not publish them. 200 random live profiles, zero tel: links, zero licence markup. If you need a dialler list today, our BBB Scraper or Houzz Pro Scraper publish phone numbers and this Actor does not. If you need licence status, use CSLB Contractor Scraper for California.
  • No e-mail addresses either, beyond the ~1–2% of contractors who typed one into their own description (emailFromDescription). The intended path is websiteDecision-Maker Email Finder.
  • street is 7.3–16.0%. Networx prints "Serving Austin, TX" far more often than an address, and never prints one on the profile page at all. This is a site-side publishing gap, not a parsing bug — the same page shows the same thing in a browser.
  • website collapses to 5.5% in whole-directory mode because 87% of the directory is unclaimed stubs with no website at all. Use claimedOnly: true, or use trade + location mode where fill is 54–62.3%.
  • Ratings are near-useless as a discriminator. 81% of rated firms in the 300-row sample sit at exactly 5.0. Treat reviewCount (1–49 in the 200-profile sample) as the real signal.
  • HQ ≠ service area. 8% of the default Texas run were national firms headquartered in CA, WA and OR. Networx does not publish a service-area polygon, so this Actor does not invent one.
  • Duplicates are a property of the source. A 40-page contiguous Texas walk produced 77.5% repeat rows. They are dropped before billing, but they mean a city list yields fewer unique firms than page count × 19.
  • US only. Networx is a US directory: 50 states plus DC, nothing else.
  • No login, no CAPTCHA solving, no browser automation. It reads public server-rendered HTML. There is no mode that changes that.

How it works

  1. Reads https://www.networx.com/robots.txt and takes the Sitemap: line it declares — the sitemap index is read, never hardcoded, so a move is survivable.
  2. From the index: company0..2.xml = 103,876 profile URLs (the complete directory), city0..8.xml = 418,027 /{trade}/{state}/{city} listing pages, state0.xml = 1,704 /{trade}/{state} pages.
  3. Trade mode harvests contractor links from listing pages in deterministic order, deduping by profile URL as it goes; directory mode takes the profile URLs straight from the sitemap.
  4. Each profile is parsed from schema.org microdata plus a comment-delimited sidebar. There is no JSON API, no state blob and no JSON-LD on this site, so the parser is markup-anchored and the run aborts if too much of it stops matching.
  5. Rows are pushed in batches, charged on push.

Transport ladder — measured through Apify, retries off

RungResult
Direct, no proxy, concurrency 10, 200 URLs200/200 (100%) @ 37.2 req/s — not a shippable rung; no Apify container has this IP
Apify Proxy, rotating exit IP, concurrency 523/40 (57.5%) — 17× HTTP 403
Apify Proxy, one pinned session, concurrency 540/40 (100%)
Apify Proxy, pinned, 200 contiguous URLs200/200 (100%) @ 3.0 req/s ← sustained load
Apify Residential, fresh session per request38/40 (95%) @ 1.4 req/s

Networx does not rate-limit and does not challenge — no Cloudflare, no CAPTCHA, no cookie, no login. It blocklists exit IPs: roughly 40% of datacentre exits get an instant 403, and a good one never degrades. So the Actor pins one proxy session per worker and rotates that session only when it is refused — the opposite of the fresh-session-per-request pattern rate-limited sites need. Across validation it fetched 304/304 and 520/520 profile pages with zero failures, and the default run above fetched 54/54. Residential is not needed and is slower, so the default is the cheap datacentre rung.

Running with the proxy off inherits whichever platform IP the run lands on, which is a coin flip. It is allowed, and the Actor warns you.

Uniqueness and dedupe

Measured on contiguous page walks, not sparse samples:

  • 40 consecutive Texas roofer city pages: 244 listing rows → 55 unique firms = 77.5% duplicates.
  • 18 large metros across 5 states: 19.2%.
  • The 6-metro default run: 20.6% of 97 listing rows were repeats.

The mechanism is real, not a bug: listing pages hold ~19 contractors, do not paginate, and a small town's page is mostly the same regional firms as the next town over. The dedupe key is the profile URL, and it is applied before any profile is fetched, so the dataset — and your bill — never holds the same contractor twice. The duplicate rate is printed in every run's log. Across runs, use skip (discovery order is deterministic). Whole-directory mode has 0.0% duplicates by construction.

When a run stops early, and when it fails

A silent empty run is the canonical broken scraper, so this Actor refuses to produce one — but it also refuses to turn a transient block or your own filter choice into a red FAILED run. It ends Succeeded with an explanatory run status message, and bills nothing, when:

  • the sitemap index or a child sitemap cannot be read (Networx 403s ~40% of datacentre exit IPs — re-run and the Actor pins a different exit);
  • the company sitemaps list fewer than 50,000 profiles, or the listing sitemaps fewer than 100,000 URLs (a shrunken sitemap is still never passed off as the directory — the run stops instead);
  • every listing page parses to nothing, or nothing matched your trades/states;
  • skip is past the end of the directory;
  • it emits zero rows — the message tells you whether your filters, the proxy, the time limit or Networx is the cause.

Malformed input is coerced, not fatal: an unknown trade slug, a non-2-letter state, a non-/c. profile URL or cities without their states are dropped with a warning naming the valid values, and the run continues with what is left. Sending a completely empty input ({} — what an API, MCP or agent caller sends when it doesn't fill the Console form) runs the documented sample instead of erroring.

Run time budget. The Actor reads ACTOR_TIMEOUT_AT and stops taking new work about 15% of the run span before the platform would kill it, flushes everything already fetched, and ends Succeeded with "Stopped early to stay inside the run time limit; emitted N contractors." Enumeration (sitemaps and listing pages) stops even earlier, at ~55% of the span, so there is always time left to fetch profiles and emit rows. Measured: discovery: "directory", maxItems: 100000 at a 120-second run timeout → SUCCEEDED in 101–115 s with 437 / 498 / 911 rows across three runs, never TIMED-OUT.

There is exactly one condition that still ends the run FAILED, because it is the one thing you must not silently receive: more than 20% of fetched profile pages return HTTP 200 with no parseable business name — a Networx markup change, not a degraded delivery.

Running out of candidates is a loud warning naming what to change, not a silent short file.

Who buys this

  • Field-service software vendors (ServiceTitan, Jobber, Housecall Pro, Workiz) — 41 trades × 51 states, geocoded, so territory-based rep assignment falls out of latitude/longitude with no geocoding bill.
  • Roofing and exteriors suppliers and manufacturer rep firmsroofers alone spans 20,907 city pages; awards names the manufacturer certifications ("GAF Certified Contractor").
  • Agencies selling websites and SEO to trades — the 46% of the default run with no website is a ready-made target list, and the 32% with social profiles tells you who is already marketing.
  • B2B e-mail prospectorswebsite on 54–62.3% of trade-route rows is the domain you feed to a pattern-inference e-mail finder; businessName + city + state is the dedupe key against your CRM.
  • Insurance, bonding and lending to contractorsyearsInBusiness (up to 124), startYear and isBbbAccredited segment established firms from one-year-old operations.
  • M&A and PE roll-up analysts in home services — the whole-directory mode is a 103,876-row census with a stable companyId, so you can diff two sweeps and see who appeared and who left.

How this differs from our other trades Actors

ActorWhat it isWhy you would use it instead
Houzz Pro ScraperHouzz professionals by trade and city, $0.0009/proIt publishes a phone number; Networx does not
Thumbtack ScraperThumbtack top pros by city, $0.0027/proHires count, Top Pro badges and response time — buying-intent signals Networx has no equivalent for
BBB Scraperbbb.org businesses by keyword + location, $0.0018/businessPhone, full street address and the A+→F letter grade. Networx gives you the bbbProfileUrl to join on
CSLB Contractor ScraperAll 243,555 licensed California contractors, $0.004/licenceLicence status, bond and workers' comp — the qualification layer Networx has none of
Decision-Maker Email FinderDomain → named decision-makers + e-mail, $0.0008/leadThe chain partner. Feed it the website column from this Actor

The honest one-liner: Networx is where you go for a trade-tagged, geocoded census of US home-service firms; it is not where you go for a phone number.

Automating it

  • Save as a Task — set your trades, states and cities in the Console, click Save as task, and re-run the same territory with one click or one API call.
  • Schedule it — Apify Schedules, e.g. 0 6 * * 1 for a Monday-morning refresh. Pair with skip to page deeper each week instead of re-buying the same firms.
  • Integrations — the dataset is JSON/CSV/Excel out of the box, and Apify's Zapier, Make, n8n, webhook and REST integrations all read it. companyId is the stable upsert key for your CRM.

FAQ

Does this need an account, a login or a cookie? No. Networx serves the whole directory as public HTML. No login, no cookie, no CAPTCHA solving, no browser automation.

Does it return phone numbers? No. Networx publishes none — 200 random profiles, zero tel: links. The only numbers you will see are in phoneFromDescription (6.0–9.5%), which contractors typed into their own blurb.

Can I get e-mail addresses? Only emailFromDescription (~1–2%). The intended path is to take website (54–62.3% on the trade route) and run Decision-Maker Email Finder at $0.0008/lead.

Is the address the contractor's office or the city I searched? The office. 4 of the 50 rows in the default Texas run were headquartered in CA, WA and OR because Networx lists national firms on local pages. Filter on state afterwards if that matters.

Can I get the whole directory in one run? Yes — discovery: "directory", maxItems: 0 is not supported but maxItems: 103876 is. That is $363.57 and several hours at ~3 rows/second. Most buyers want a trade and a metro instead.

Two runs — will I get duplicates? Not within a run (deduped on profile URL before fetching). Across runs, discovery order is deterministic, so set skip to where the last run stopped. companyId is a stable upsert key either way.

Do I get charged for rows my filters remove? No. You are charged per row delivered. A live claimedOnly directory run fetched 520 profile pages and billed 10 rows.

Why did my run return fewer rows than I asked for? Because the trade × state you picked ran out of listings — Vermont gutter contractors is 4 firms from 160 pages. The run logs a warning naming what to change; it never pads the file.

Do I need a proxy? Do I need residential? Keep Apify Proxy on; you do not need residential. Networx 403s ~40% of datacentre exits, so the Actor pins one session per worker and rotates only on refusal: 200/200 pages once pinned, versus 23/40 on a rotating IP. Residential measured 38/40 and is slower.

Which trades and states work? All 41 trades and all 50 states plus DC, picked from labelled dropdowns. An unknown slug stops the run with the full list of valid values rather than returning nothing.

Is minRating worth setting? Rarely. 81% of rated firms sit at exactly 5.0, and any floor also removes the 35% of the file with no rating at all.

Will a run ever succeed with zero rows? No. Zero rows throws with the scope, the HTTP counts and a diagnosis. There is no "successful empty run" on this Actor.

Something looks wrong — how do I debug it? Every run logs the listing-page count, the duplicate rate, the profile-fetch count, the failure counts, the proxy-session rotations and its own measured field fill. Compare that log against the tables above; if they diverge, open an issue.

Public directory data published by networx.com, read from the site's own robots.txt sitemaps. robots.txt declares no crawl-delay and disallows only /quote.php, /review/write/, /article/search.php, /login, /privacy, /terms-use and /do-not-sell — none of which this Actor requests. It does not log in and collects nothing behind any authentication. Default concurrency is 5.

Rows describe businesses, but many US home-service firms are sole traders, so a row can constitute personal data. You are responsible for complying with networx.com's terms and with how you use the data, including GDPR/CCPA where the records identify individuals and CAN-SPAM/TCPA for outreach.

Networx is a trademark of its owner; this Actor is not affiliated with or endorsed by them.

Feedback

Found a missing field, or want a filter that is not here? Open an issue on the Issues tab.