{
  "openapi": "3.0.1",
  "info": {
    "title": "Angi Scraper",
    "description": "[💰 $0.8 / 1K] Extract contractor and home-service pro listings from Angi.com - business names, phone numbers, addresses, ratings, reviews, hours, and photos. Search by keyword and location, browse by category, paste Angi URLs directly. Optional per-pro reviews extraction.",
    "version": "1.1",
    "x-build-id": "JTU2Mcm0AiErzS1T5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/solidcode~angi-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-solidcode-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/solidcode~angi-scraper/runs": {
      "post": {
        "operationId": "runs-sync-solidcode-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/solidcode~angi-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-solidcode-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": {
          "searchTerms": {
            "title": "Search Terms",
            "type": "array",
            "description": "Keywords or service names to search for on Angi (e.g. \"plumber\", \"roof repair\", \"HVAC contractor\"). Each term runs as its own search and is combined with the Location below. Terms are auto-mapped to Angi's nearest matching trade category (close-but-not-exact terms like \"plumber repair\" may be skipped if no category matches well — pick the Service Category dropdown for exact control). Leave empty if you only want to use a category browse or Start URLs.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City and state (e.g. \"Austin, TX\") or 5-digit US ZIP code (e.g. \"78701\"). Combined with each search term and with the category below. Leave empty if you only want to use Start URLs."
          },
          "category": {
            "title": "Service Category",
            "enum": [
              "",
              "plumbing",
              "electrical",
              "hvac",
              "roofing",
              "painting",
              "landscaping",
              "lawn_care",
              "tree_service",
              "handyman",
              "cleaning",
              "pest_control",
              "remodeling",
              "kitchen_remodeling",
              "bathroom_remodeling",
              "flooring",
              "carpet_cleaning",
              "appliance_repair",
              "garage_door",
              "fencing",
              "deck_patio",
              "pool_spa",
              "moving",
              "junk_removal",
              "windows",
              "siding",
              "gutter",
              "concrete",
              "masonry",
              "drywall",
              "general_contracting"
            ],
            "type": "string",
            "description": "Optional Angi service category to browse. Use this when you want every pro in a single trade for your location, instead of a specific keyword. Combine with Location for a city-wide trade sweep."
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Paste any Angi URLs directly: pro profile pages, category hubs, city or state hubs, or ZIP search pages (e.g. https://www.angi.com/companylist/us/tx/austin/plumbing.htm). When provided, these are scraped in addition to the keyword and category search above.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Maximum Results per Search",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of pros to return per search term, category, or start URL. Set to 0 for unlimited (every result Angi returns). The actor stops requesting new pages once this cap is reached, but keeps the full last page (10 pros per page) even if it slightly overshoots. Note: small-to-medium markets may have fewer unique pros than the cap (Angi often serves only 30-60 unique pros for a single trade in a single city).",
            "default": 100
          },
          "detailLevel": {
            "title": "Detail Level",
            "enum": [
              "listing",
              "full"
            ],
            "type": "string",
            "description": "\"Listing only\" returns just what's shown on each search result card (cheap, fast). \"Full profile\" also visits each pro's profile page to get hours, photo gallery, full address, description, and the most complete contact info.",
            "default": "full"
          },
          "includeReviews": {
            "title": "Include Reviews",
            "type": "boolean",
            "description": "When on, fetches each pro's reviews and emits them as separate rows in the dataset (one row per review). This adds to your billed result count - a pro with 50 reviews counts as 51 results when reviews are on.",
            "default": false
          },
          "maxReviewsPerPro": {
            "title": "Max Reviews per Pro",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on how many reviews to collect per pro. Set to 0 to fetch every review available. Reviews paginate 25 at a time, so the actor may slightly overshoot to keep the full last page. Ignored when \"Include Reviews\" is off.",
            "default": 20
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}