{
  "openapi": "3.0.1",
  "info": {
    "title": "Thumbtack Scraper - Home Service Pros, Reviews & Leads",
    "description": "Scrape Thumbtack home-service pros by category and city. Get business names, ratings, reviews, hire counts, years in business, services, business hours, credentials, websites & socials — plus lead scoring, reviews and monitoring. No login, no browser.",
    "version": "0.1",
    "x-build-id": "FRuglLyBwUGuTR4Ju"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~thumbtack-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-thumbtack-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/scrapesage~thumbtack-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-thumbtack-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/scrapesage~thumbtack-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-thumbtack-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": {
          "categories": {
            "title": "Service categories",
            "type": "array",
            "description": "Thumbtack service categories to scrape, combined with every location below. Use friendly names (`House Cleaning`, `Plumbing`, `Electrician`, `HVAC`, `Landscaping`, `Roofing`, `Handyman`, `Movers`, `Pest Control`, `General Contractor`, `Interior Painting`, `Photography`, `Personal Training`, `Catering`, `Interior Design`, `Tree Services`, `Pressure Washing`, `Carpet Cleaning`, `Window Cleaning`, `Appliance Repair`, `Junk Removal`, `Gutter Cleaning`, `Home Inspection`) or a raw Thumbtack slug from the URL (e.g. `house-cleaning`, `hvac-contractors`).",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations (City, ST)",
            "type": "array",
            "description": "Cities to search, as `City, ST` (e.g. `Austin, TX`, `Miami, FL`, `Seattle, WA`). Thumbtack lists pros by city, so a state is required. Each category is scraped in each city.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (pro profiles or category listings)",
            "type": "array",
            "description": "Paste Thumbtack URLs: a pro profile (`/tx/austin/house-cleaning/<slug>/service/<id>`) or a category listing (`/tx/austin/house-cleaning/`). Processed in addition to the categories × locations above.",
            "items": {
              "type": "string"
            }
          },
          "maxPros": {
            "title": "Max pros (whole run)",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Global cap on the number of pro records emitted this run. Thumbtack's public listing shows the top ~10 pros per category + city (it does not deep-paginate), so to collect more pros add more categories and/or cities.",
            "default": 200
          },
          "minRating": {
            "title": "Minimum star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep only pros with an overall star rating at or above this value (0 = no filter). Rated 1-5.",
            "default": 0
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only pros with at least this many reviews (0 = no filter).",
            "default": 0
          },
          "minHires": {
            "title": "Minimum hires on Thumbtack",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only pros hired at least this many times on Thumbtack (0 = no filter). Great for targeting established, in-demand pros.",
            "default": 0
          },
          "topProOnly": {
            "title": "Only Top Pros",
            "type": "boolean",
            "description": "Keep only pros with Thumbtack's 'Top Pro' badge (highest-rated, most-hired professionals).",
            "default": false
          },
          "backgroundCheckedOnly": {
            "title": "Only background-checked pros",
            "type": "boolean",
            "description": "Keep only pros that passed Thumbtack's background check. Requires opening profiles (background-check status only appears on the profile).",
            "default": false
          },
          "withSocialsOnly": {
            "title": "Only pros with social links",
            "type": "boolean",
            "description": "Keep only pros who published a Facebook / Instagram / X profile — the contact wedge on Thumbtack today (about 45% of pros). Requires opening profiles.",
            "default": false
          },
          "withWebsiteOnly": {
            "title": "Only pros with a website (rarely matches)",
            "type": "boolean",
            "description": "Keep only pros that list their own website. NOTE: Thumbtack no longer publishes pro websites on the profile — measured 0 of 20 pros across 10 categories — so this filter will usually return 0 rows. Use 'Only pros with social links' instead. Kept for the rare pro who still lists one.",
            "default": false
          },
          "includeProfileDetails": {
            "title": "Open each profile for full details",
            "type": "boolean",
            "description": "Visit each pro's profile to add the deep fields: introduction/bio, years in business, employee count, background-check status, weekly business hours, payment methods, the full services-offered list, credentials, project photos, ZIP code, the full review list, the pro's published price (about 85% of pros) and their social links (about 45%). One extra request per pro. Turn OFF for fast, low-cost bulk records — the listing already includes name, rating, # reviews, # hires, response time, Top Pro badge, services and a highlighted review.",
            "default": true
          },
          "includeNearbyPros": {
            "title": "Also collect nearby pros from the same page",
            "type": "boolean",
            "description": "Thumbtack's city page ranks only ~10 pros, but the review strip on that SAME page names more pros in the surrounding metro. Turning this on collects them too — typically +13 to +21 extra pros per city/category — with NO extra listing request. They are tagged `source: \"nearby\"` so you can tell them apart from the city's ranked top 10. Requires 'Open each profile for full details' (a nearby pro is only a name + link until the profile is opened).",
            "default": false
          },
          "resolveSocialLinks": {
            "title": "Resolve social links to real URLs",
            "type": "boolean",
            "description": "Thumbtack publishes a pro's socials as redirect links on its own domain. With this on, each one is followed once to return the pro's REAL profile URL (e.g. `https://www.instagram.com/theprofile/`) instead of a Thumbtack redirect. Costs one tiny request per link (~200 bytes) and only runs for pros who actually published socials.",
            "default": true
          },
          "includeReviews": {
            "title": "Include pro reviews",
            "type": "boolean",
            "description": "Also output review records (type `review`) for each pro — star rating, review text, author, date and service. Requires opening profiles.",
            "default": false
          },
          "maxReviewsPerPro": {
            "title": "Max reviews per pro",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many reviews to emit per pro when 'Include pro reviews' is on.",
            "default": 20
          },
          "deduplicatePros": {
            "title": "Deduplicate pros",
            "type": "boolean",
            "description": "Emit each pro only once per run (keyed by Thumbtack pro id / profile URL), even if they appear under multiple categories or cities.",
            "default": true
          },
          "monitorMode": {
            "title": "Monitoring mode — only new pros",
            "type": "boolean",
            "description": "Remember pros already returned and emit ONLY pros not seen in previous runs. Pairs with Apify Schedules to track newly-listed pros in a city or category over time. Independent of the scheduler — it dedupes records, the schedule decides when to run.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor store name",
            "type": "string",
            "description": "Named key-value store that holds the 'already seen' pro ids for monitoring mode. Use a different name per tracked search to keep their histories separate.",
            "default": "thumbtack-monitor"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum parallel requests. Lower it if you hit rate limits on very large runs.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Thumbtack's bot wall challenges datacenter IPs but serves clean pages to RESIDENTIAL IPs, so this actor defaults to the Apify Residential proxy (US). Keep this default for reliable results.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          },
          "urlsFromFile": {
            "title": "Import URLs from a file",
            "type": "string",
            "description": "Paste a list of URLs (one per line), OR one link to a .txt/.csv file, Google Sheet or Google Drive file containing them. Lets you import many Start URLs at once instead of typing each. Google Sheet/Drive share links are handled automatically."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}