{
  "openapi": "3.0.1",
  "info": {
    "title": "Networx Contractor Scraper — Home Service Pro Leads",
    "description": "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.",
    "version": "0.1",
    "x-build-id": "Xke2fIo6rsRV4xfSC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~networx-contractor-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-networx-contractor-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/scrapersdelight~networx-contractor-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-networx-contractor-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/scrapersdelight~networx-contractor-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-networx-contractor-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": {
          "discovery": {
            "title": "Discovery mode",
            "enum": [
              "trade",
              "directory"
            ],
            "type": "string",
            "description": "How contractors are found. \"Trade + location\" walks Networx's /{trade}/{state}/{city} listing pages — the only place a normalised trade and a street address exist — and dedupes the heavy overlap between neighbouring towns (77.5% repeats on a 40-page contiguous Texas walk, all dropped before you are billed). \"Whole directory\" walks the company sitemap instead: all 103,876 profiles, 0.0% duplicates, one fetch each, but with no trade attribution and with state/city filters applied only AFTER each page is fetched. Ignored when you paste profile URLs below.",
            "default": "trade"
          },
          "trades": {
            "title": "Trades",
            "type": "array",
            "description": "Which of Networx's 41 trades to walk. Pick as many as you like — each trade is crossed with each state and city, so 2 trades × 1 state × 3 cities = 6 listing pages. Required in \"Trade + location\" mode; ignored in \"Whole directory\" mode, which carries no trade at all. If you leave it empty in \"Trade + location\" mode the run falls back to a small built-in SAMPLE (roofers in Austin and Houston, TX, capped at 25 contractors) so an API or agent caller never gets an empty dataset. Coverage is very uneven: roofers has 20,907 city pages, solar-contractors 728, so a thin trade in a small state genuinely runs out (Vermont gutter contractors: 4 firms from 160 listing pages) and the Actor tells you it ran out rather than returning a short file quietly.",
            "items": {
              "type": "string",
              "enum": [
                "air-duct-cleaning",
                "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",
                "alarm-companies",
                "heating-ac",
                "home-insulation",
                "junk-removal",
                "kitchen-remodelers",
                "landscapers",
                "lawn-services",
                "mold-remediation",
                "painters",
                "pest-control",
                "plumbers",
                "power-washing",
                "remodeling-contractors",
                "home-restoration",
                "roofers",
                "siding-contractors",
                "snow-removal",
                "solar-contractors",
                "tile-contractors",
                "tree-service",
                "wildlife-removal",
                "window-contractors"
              ],
              "enumTitles": [
                "Air Duct Cleaning",
                "Appliance Repair",
                "Asphalt Paving",
                "Bathroom Remodeling",
                "Carpentry",
                "Carpet Cleaning",
                "Carpet Installation",
                "Cleaning Services",
                "Concrete",
                "Countertop Installation",
                "Deck Building",
                "Drywall",
                "Electrical",
                "Fencing",
                "Flooring",
                "Foundation Repair",
                "Garage Doors",
                "Gutters",
                "Handyman",
                "Home Security / Alarms",
                "HVAC / Heating & Cooling",
                "Insulation",
                "Junk Removal",
                "Kitchen Remodeling",
                "Landscaping",
                "Lawn Care",
                "Mold Remediation",
                "Painting",
                "Pest Control",
                "Plumbing",
                "Power Washing",
                "Remodeling",
                "Restoration (Water / Fire)",
                "Roofing",
                "Siding",
                "Snow Removal",
                "Solar",
                "Tile & Stone",
                "Tree Service",
                "Wildlife Removal",
                "Windows"
              ]
            }
          },
          "states": {
            "title": "States",
            "type": "array",
            "description": "US states to search. All 50 plus DC are covered. Leave empty to sweep nationwide — slow in \"Trade + location\" mode, because there are 418,027 trade × city listing pages to walk. In \"Whole directory\" mode a state filter costs one profile fetch per contractor tested, because a /c.{slug} profile URL carries no location; you are only billed for the rows kept, but the runtime is real.",
            "items": {
              "type": "string",
              "enum": [
                "AL",
                "AK",
                "AZ",
                "AR",
                "CA",
                "CO",
                "CT",
                "DE",
                "DC",
                "FL",
                "GA",
                "HI",
                "ID",
                "IL",
                "IN",
                "IA",
                "KS",
                "KY",
                "LA",
                "ME",
                "MD",
                "MA",
                "MI",
                "MN",
                "MS",
                "MO",
                "MT",
                "NE",
                "NV",
                "NH",
                "NJ",
                "NM",
                "NY",
                "NC",
                "ND",
                "OH",
                "OK",
                "OR",
                "PA",
                "RI",
                "SC",
                "SD",
                "TN",
                "TX",
                "UT",
                "VT",
                "VA",
                "WA",
                "WV",
                "WI",
                "WY"
              ],
              "enumTitles": [
                "Alabama (AL)",
                "Alaska (AK)",
                "Arizona (AZ)",
                "Arkansas (AR)",
                "California (CA)",
                "Colorado (CO)",
                "Connecticut (CT)",
                "Delaware (DE)",
                "District of Columbia (DC)",
                "Florida (FL)",
                "Georgia (GA)",
                "Hawaii (HI)",
                "Idaho (ID)",
                "Illinois (IL)",
                "Indiana (IN)",
                "Iowa (IA)",
                "Kansas (KS)",
                "Kentucky (KY)",
                "Louisiana (LA)",
                "Maine (ME)",
                "Maryland (MD)",
                "Massachusetts (MA)",
                "Michigan (MI)",
                "Minnesota (MN)",
                "Mississippi (MS)",
                "Missouri (MO)",
                "Montana (MT)",
                "Nebraska (NE)",
                "Nevada (NV)",
                "New Hampshire (NH)",
                "New Jersey (NJ)",
                "New Mexico (NM)",
                "New York (NY)",
                "North Carolina (NC)",
                "North Dakota (ND)",
                "Ohio (OH)",
                "Oklahoma (OK)",
                "Oregon (OR)",
                "Pennsylvania (PA)",
                "Rhode Island (RI)",
                "South Carolina (SC)",
                "South Dakota (SD)",
                "Tennessee (TN)",
                "Texas (TX)",
                "Utah (UT)",
                "Vermont (VT)",
                "Virginia (VA)",
                "Washington (WA)",
                "West Virginia (WV)",
                "Wisconsin (WI)",
                "Wyoming (WY)"
              ]
            }
          },
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "City names or Networx city slugs, e.g. austin, san-antonio, corpus-christi — spaces are converted for you, so \"San Antonio\" works. Naming cities makes the run much faster: the Actor builds the listing URLs directly instead of downloading 65 MB of sitemaps to discover them. In \"Trade + location\" mode cities REQUIRE their states, because \"springfield\" exists in 30+ of them; a city that does not exist in a given state is skipped with a warning naming the URL. Leave empty to sweep whole states.",
            "items": {
              "type": "string"
            }
          },
          "profileUrls": {
            "title": "Profile URLs (paste your own list)",
            "type": "array",
            "description": "Optional. Paste exact Networx company profile URLs (https://www.networx.com/c.{business-slug}) and discovery is skipped entirely — this overrides the discovery mode, trades, states and cities. Use it to re-scrape a list you already own, or to refresh yesterday's rows. A URL that is not a /c.{slug} profile stops the run with an error naming the first bad one, rather than silently returning nothing.",
            "items": {
              "type": "string"
            }
          },
          "claimedOnly": {
            "title": "Only claimed listings",
            "type": "boolean",
            "description": "Keep only contractors who have claimed their Networx listing rather than unclaimed directory stubs. Measured 13.0% of the directory — but that 13% is where the data is: website 42.3% vs 0.0%, business highlights 80.8% vs 39.7%, social links 38.5% vs 13.8%, rating 80.8% vs 59.8% (n=200 random profiles). Turning this on in \"Whole directory\" mode means roughly 8 profile pages fetched per row kept.",
            "default": false
          },
          "withWebsiteOnly": {
            "title": "Only contractors with a website",
            "type": "boolean",
            "description": "Keep only contractors whose profile lists a company website. This is the harsh one: 5.5% of all directory profiles carry a website (42.3% of claimed ones, 62.3% on the trade + location route). It is also the field you need if you plan to enrich for e-mail, because Networx publishes no phone numbers and no e-mail addresses at all.",
            "default": false
          },
          "minRating": {
            "title": "Minimum star rating",
            "enum": [
              "0",
              "3",
              "3.5",
              "4",
              "4.5",
              "5"
            ],
            "type": "string",
            "description": "Drop contractors rated below this. Setting any floor also drops every UNRATED contractor, and only 62.5% of directory profiles (64.7% on the trade + location route) carry a rating at all. Ratings also skew hard to the top — 88% of rated contractors sit at exactly 5.0 (81% in the 300-row trade + location sample) — so a 4.0+ floor removes far less than you would expect. \"Any rating\" keeps everyone.",
            "default": "0"
          },
          "minReviewCount": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Drop contractors with fewer verified Networx reviews than this. Review counts are small — the 200-profile sample ran 1 to 49 — so anything above ~5 cuts hard. 0 = keep everyone, including the 37.5% with no reviews.",
            "default": 0
          },
          "minYearsInBusiness": {
            "title": "Minimum years in business",
            "minimum": 0,
            "type": "integer",
            "description": "Drop contractors in business fewer years than this. Present on 76.0% of directory profiles (70.3% on the trade + location route), running up to 124 years; the ones with no founding year are dropped whenever a floor is set. 0 = keep everyone.",
            "default": 0
          },
          "fetchProfileDetails": {
            "title": "Fetch full profile details",
            "type": "boolean",
            "description": "ON (recommended): fetch each contractor's profile page for ZIP, lat/lon, rating, review count, description, website, years in business, BBB accreditation, claimed status, business highlights and social links. OFF: return only what the listing page shows — name, trade, city/state, street address, star rating and blurb — at roughly 6× fewer requests. The price per contractor is the same either way, so this only buys speed; leave it on unless you specifically want a fast roster. Only applies to \"Trade + location\" mode, and the quality filters above stop working when it is off (the Actor tells you instead of silently ignoring them).",
            "default": true
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 1,
            "type": "integer",
            "description": "How many contractor records to return, and therefore your hard cost cap: 50 rows = $0.175, 100 rows = $0.35, 1,000 rows = $3.50. Duplicates are dropped before they are fetched and never count against it. Throughput is roughly 3 contractors/second through the Apify proxy, so raise the run timeout as well as this number when you want thousands.",
            "default": 100
          },
          "skip": {
            "title": "Skip (paging across runs)",
            "minimum": 0,
            "type": "integer",
            "description": "Skip this many contractors before collecting. Discovery order is deterministic, so after a maxItems=1000 run set skip=1000 to continue where it stopped instead of re-buying the same firms. In \"Whole directory\" mode a skip past the end of the 103,876-profile directory stops the run with an error rather than returning nothing.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel page fetches, one pinned proxy session each. 5 is the tested default — a 200-page sustained-load run at that setting returned 200 of 200 pages at 3.0 req/s. Networx does not rate-limit and does not throttle; it blocklists bad exit IPs instead, which the Actor handles by rotating that worker's session. Values are clamped to 1–10.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave on Apify Proxy (automatic) — that is the measured rung. Networx refuses roughly 40% of datacentre exit IPs with an instant HTTP 403 (no Cloudflare, no CAPTCHA, no cookie), so the Actor pins ONE proxy session per worker and rotates it only when that IP is refused: measured 200/200 pages once pinned, versus 23/40 on a rotating exit IP. Residential is not needed and is slower (38/40 at 1.4 req/s). Turning the proxy off inherits whichever platform IP the run lands on, which is a coin flip; the Actor allows it and warns you.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}