{
  "openapi": "3.0.1",
  "info": {
    "title": "Angi Scraper — Contractor Leads by Trade & City",
    "description": "Scrape home-services contractors from Angi (formerly Angie's List) across all 313 published trades and any US city: business name, phone, website, full address, rating, review count, star breakdown, years in business, licence numbers and the jobs they take. No login.",
    "version": "0.1",
    "x-build-id": "BLcvcp5uVEn0yUPCY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~angi-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-angi-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~angi-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-angi-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~angi-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-angi-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": {
          "mode": {
            "title": "Scrape mode",
            "enum": [
              "search",
              "startUrls"
            ],
            "type": "string",
            "description": "SEARCH: pick a trade from the 313-entry list below plus one or more locations; Angi's category × city pages are found and paginated for you. START URLS: paste Angi listing pages and/or pro-profile pages and nothing else is needed.",
            "default": "search"
          },
          "category": {
            "title": "Trade / category",
            "enum": [
              "install-above-ground-pools",
              "affordable-plumbers",
              "air-conditioning",
              "air-duct-cleaning",
              "pet-fencing",
              "animal-removal",
              "appraisals",
              "appliance-repair",
              "appliance-sales",
              "aquarium-services",
              "arborists",
              "architects",
              "asbestos-removal",
              "driveways",
              "awnings",
              "backsplash-installation",
              "barndominium-builders",
              "basement-leak-repair",
              "remodeling-basements",
              "basement-waterproofing",
              "basketball-goals",
              "bathroom-fan-installation",
              "repair-bathroom-tile",
              "bathtub-replacement",
              "bathtub-refinishing",
              "biohazard-remediation",
              "bird-control",
              "blind-cleaning",
              "install-boiler",
              "boiler-repair",
              "brush-chipping",
              "buffing-and-polishing",
              "cabinet-contractors",
              "cabinet-makers",
              "cabinet-refinishing",
              "carpentry",
              "carpet-cleaning",
              "carpet",
              "carpet-stretching",
              "repair-carport",
              "caulking-services",
              "ceiling-fans",
              "central-vacuum-cleaners",
              "install-central-vacuum",
              "central-vacuum-systems",
              "ceramic-tile",
              "repair-chain-link-fence",
              "chandelier-installation",
              "childproofing",
              "chimney-caps",
              "chimney-inspection",
              "chimney-liner-installation",
              "chimney-repair",
              "chimney-sweep",
              "cleaning",
              "closets",
              "computer-repair",
              "concrete-cutting",
              "concrete-disposal",
              "concrete-driveways",
              "concrete-finishing",
              "concrete-leveling",
              "concrete-mudjacking",
              "concrete-patio-companies",
              "concrete-repair",
              "concrete-resurfacing",
              "concrete-walls",
              "contractor",
              "couch-cleaning-services",
              "countertops",
              "repair-countertops",
              "custom-home-builders",
              "decks-and-porches",
              "deck-cleaning",
              "deck-maintenance",
              "deck-repair",
              "deck-staining",
              "concrete-stamped-decorative",
              "dirt-hauling",
              "dishwasher-installation",
              "dock-building-repair",
              "door-repair",
              "doors",
              "doorbell-installation",
              "drain-cleaning",
              "drain-pipe-installation",
              "drapery-cleaning",
              "driveway-gates",
              "driveway-sealcoating",
              "dryer-vent-cleaning",
              "drywall-insulation",
              "drywall",
              "dumpster-rental",
              "earthquake-retrofit",
              "egress",
              "eifs-installers",
              "electrical",
              "energy-audit",
              "epoxy-flooring",
              "ev-charger-installer",
              "excavating",
              "exhaust-fan-installation",
              "landscaping-lighting",
              "exterior-painting",
              "fence-painting",
              "fencing",
              "fire-pit-installation",
              "fire-sprinkler-companies",
              "fireplace-cleaners",
              "fireplaces",
              "floor-cleaning",
              "floor-polishers",
              "floor-repair-companies",
              "floor-sanding",
              "flooring",
              "foundation-drain-installation",
              "foundation-repair",
              "fountains",
              "french-drains",
              "upholstery-cleaning",
              "furniture-refinishing",
              "furniture-reupholstery",
              "garage-cleaning-services",
              "garage-doors",
              "garage-floor-coatings",
              "garage-builders",
              "garbage-disposal-repair",
              "garbage-collection",
              "install-garbage-disposal",
              "garbage-removal",
              "gas-fireplace-repair",
              "gas-fireplace-service",
              "gas-grill-installation",
              "gas-leak-repair",
              "gas-logs",
              "gate-repair",
              "gazebos",
              "ge-appliance-repair",
              "generator-installers",
              "glass-and-mirrors",
              "glass-block",
              "glass-block-windows",
              "glaziers",
              "grab-bar-installation",
              "repair-granite-countertops",
              "granite-countertop-companies",
              "granite-restoration",
              "gravel-driveway-repair",
              "plant-nurseries",
              "greenhouses",
              "grill-assembly",
              "gas-grill-repair",
              "grout-tile-cleaners",
              "gutter-cleaning",
              "gutter-repair-replacement",
              "handyman-service",
              "hardwood-flooring",
              "hauling",
              "hvac",
              "heating-oil-companies",
              "holiday-decorating",
              "home-and-garage-organization",
              "home-automation",
              "home-builders",
              "home-inspection",
              "home-security-systems",
              "home-staging",
              "home-warranty-companies",
              "house-cleaning",
              "house-leveling",
              "humidifier-repair",
              "hurricane-film",
              "hurricane-shutters",
              "insulation",
              "interior-design",
              "interior-painting",
              "kenmore-vacuum-repair",
              "kitchen-and-bath-remodeling",
              "kitchen-cabinet-refacing",
              "land-clearing-services",
              "land-surveying",
              "home-phone-service",
              "landscaping",
              "lawn-care",
              "lawn-fertilization-and-treatment",
              "lawn-irrigation",
              "lawn-and-yard-work",
              "lawn-mower-repair",
              "lead-testing-and-removal",
              "leaf-removal",
              "leather-and-vinyl-repair",
              "lighting",
              "locksmiths",
              "mailbox-repair",
              "marble-and-granite",
              "marble-restoration",
              "masonry",
              "mattress-cleaning",
              "metal-fabrication-and-restoration",
              "remodeling-modular-and-mobile-home",
              "mold-testing-and-remediation",
              "moving",
              "mulch-and-topsoil",
              "nest-installation",
              "oriental-rug-cleaning",
              "outdoor-kitchens",
              "outdoor-light-repair",
              "painting",
              "patio-covers",
              "repair-patio",
              "patios",
              "landscaping-hardscaping-and-pavers",
              "paving-services",
              "percolation-tests",
              "pest-control",
              "phone-repair",
              "plant-watering",
              "plaster-plaster-repair",
              "playground-equipment",
              "plumbing",
              "plumbing-heating-companies",
              "plumbing-handymen",
              "pole-barn-builders",
              "pool-and-spa-service",
              "swimming-pools",
              "pool-table-assembly",
              "popcorn-ceilings",
              "porcelain-refinish-repair",
              "pre-made-cabinets",
              "pressure-washing",
              "piano-moving",
              "property-appraiser",
              "install-putting-green",
              "radon-testing",
              "range-hoods",
              "real-estate-agents",
              "remodel-design",
              "residential-design",
              "retaining-wall-installers",
              "ring-installers",
              "roof-cleaning",
              "roof-ice-and-snow-removal",
              "roofing",
              "roto-tilling",
              "sand-rock-delivery",
              "sandblasting-services",
              "satellite-tv-service",
              "sauna-installation",
              "screen-repair",
              "security-doors",
              "septic-tank",
              "sewer-cleaning",
              "repair-sewer-line",
              "shower-glass-companies",
              "siding",
              "sink-installation",
              "sink-reglazing",
              "sink-repair",
              "skylights",
              "small-appliance-repair",
              "smoke-detector-installers",
              "snow-removal",
              "solar-panels",
              "sonic-cleaning",
              "install-stair-railings",
              "stair-companies",
              "home-theater-systems",
              "stone-and-gravel",
              "stone-countertops",
              "storm-drain-installation",
              "storm-shelters",
              "structural-engineering",
              "stucco",
              "subcontractors",
              "sump-pump-installation",
              "sunroom-and-patio-remodeling",
              "tennis-court-contractors",
              "toilets",
              "trampoline-assembly",
              "tree-service",
              "treehouse-builders",
              "tub-shower-conversion",
              "tv-antenna",
              "tv-antenna-installation",
              "tv-mount-install",
              "upholstering",
              "vinyl-siding-cleaning",
              "repair-vinyl-siding",
              "wall-repair",
              "wallpaper-removal",
              "wallpapering",
              "waste-removal-services",
              "water-and-smoke-damage",
              "water-heaters",
              "water-softeners",
              "weed-services",
              "welding",
              "wells-and-pumps",
              "window-door-contractors",
              "window-cleaning",
              "window-screen-repair",
              "windows",
              "window-shutter-repair",
              "window-shutters",
              "window-tinting",
              "window-treatments",
              "wood-stove-inspection",
              "wood-stove-repair",
              "wood-stove-companies",
              "wood-stripping-companies",
              "woodworking",
              "wrought-iron-fencing-repair",
              "wrought-iron"
            ],
            "type": "string",
            "description": "The trade to search, named the way Angi names it. All 313 entries are Angi's own published categories, read live from its geo sitemap index on 2026-08-12, and each label is Angi's own wording for that service. Used only when Scrape mode is SEARCH. One trade in one big city is usually more rows than you mean to buy: Angi lists 880 plumbers in Austin, TX alone.",
            "default": "plumbing"
          },
          "categoryOther": {
            "title": "Custom category slug (optional)",
            "type": "string",
            "description": "Escape hatch: an Angi category slug typed by hand, e.g. `water-heaters`. When it is set it OVERRIDES the picker above. You should only need it if Angi publishes a new category after this Actor's last update — all 313 in the picker resolved to live listing pages on 2026-08-12. An unrecognised slug does not fail silently: the run logs the closest published matches and then tries it anyway. Used only when Scrape mode is SEARCH."
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "One entry per place. `\"Austin, TX\"` crawls that one city. A bare state — `\"TX\"` or `\"Texas\"` — sweeps every city Angi publishes for the chosen trade in that state, which for plumbing is a slice of the 20,115 city pages Angi publishes across 51 states; always set Max pros when you do that. Each location is crawled with the same trade, so 3 locations = 3 city crawls. ZIP codes are NOT accepted — Angi's directory URLs are city-based, and this Actor does not pretend otherwise. Note the row's address is the pro's own HQ, not the city you searched: on a 200-pro Austin search only 31.0% were headquartered in Austin, with the rest spread across 42 other HQ towns. Used only when Scrape mode is SEARCH.",
            "default": [
              "Austin, TX"
            ],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Paste Angi URLs directly — a first-class path that needs no trade and no location. Category listing pages (`https://www.angi.com/companylist/us/tx/austin/plumbing.htm`, paginated for you) and/or single pro profiles (`…-reviews-123456.htm`). The Actor classifies each URL itself, and the same URL pasted twice is fetched once. Used only when Scrape mode is START URLS.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "includeContactInfo": {
            "title": "Fetch phone + website from each pro profile",
            "type": "boolean",
            "description": "ON (recommended): opens each pro's own profile to add phone, website, the full trade list, licence numbers, bonded/insured and the 1–5 star breakdown. Measured on a 200-pro contiguous walk of Austin plumbing (2026-08-12): phone 52.5% and website 32.5% overall — but 99.1% and 61.3% on the 106 advertisers, and 0.0% and 0.0% on the 94 non-advertisers. OFF: listing data only, which on the same 200 pros took 23 requests instead of 273 (12× fewer) and 1m40s instead of 6m36s (measured 2026-08-15, runs kFDg8nMgWTqFFpzPu / Kcy7Ovs8Ka2mT5Wzh) — but phone, website, trades, licences and the star breakdown are null on every row. You are billed per pro returned either way, so this saves time, not money.",
            "default": true
          },
          "includeReviews": {
            "title": "Include recent reviews",
            "type": "boolean",
            "description": "Attaches the pro's most recent reviews (author, star rating, text, date, job cost, verified flag, would-hire-again) as a `reviews[]` array. Costs no extra requests — the reviews are already inside the profile page the Actor fetched — but rows get much larger. On the 200-pro sample 90.0% of pros carried at least one review, mean 7.54 reviews per pro at the default cap of 10. Needs the profile fetch above to be ON. Reviewer display names and review text are personal data; see the README's Legal section.",
            "default": false
          },
          "maxReviewsPerPro": {
            "title": "Max reviews per pro",
            "minimum": 0,
            "maximum": 25,
            "type": "integer",
            "description": "Caps how many reviews are attached per record when reviews are included. Angi's profile payload carries the 25 most recent reviews, so 25 is the real ceiling — the default of 10 just keeps rows small; raise it to 25 to keep every review Angi ships. Values above 25 change nothing.",
            "default": 10
          },
          "onlyWithPhone": {
            "title": "Only pros with a phone number",
            "type": "boolean",
            "description": "Drops any record with no phone number before it is written or billed, and keeps crawling to try to fill your Max pros quota with contactable rows. This matters more on Angi than on most directories: only the pros who pay Angi publish a phone number. On the 200-pro Austin plumbing walk this would have kept 105 rows of 200 and cut the bill from $0.70 to $0.37. Needs the profile fetch to be ON, because the listing page carries no phone at all.",
            "default": false
          },
          "maxItems": {
            "title": "Max pros",
            "minimum": 0,
            "type": "integer",
            "description": "Your hard cost ceiling: the run stops once this many pros have been delivered. You are billed $0.0035 per pro returned, so 25 = $0.09, 500 = $1.75 and 1,000 = $3.50. Duplicates are dropped before billing and never count against it. Prefilled at 25 so a first run finishes in about a minute and costs about nine cents — raise it for production. 0 = no cap (Austin plumbing alone would then run to 880 pros).",
            "default": 100
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave this alone. Angi is Cloudflare-walled, and the ladder was measured through Apify on 2026-08-12: no proxy at all 0/3, Apify datacenter with a rotating exit 1/10, Apify datacenter with a fresh session per request 3/10, Apify RESIDENTIAL + country US 18/20. RESIDENTIAL + US is therefore the default and is effectively required; when a request is blocked the Actor backs off and retries on a fresh residential IP.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}