{
  "openapi": "3.0.1",
  "info": {
    "title": "Thumbtack Scraper — Pro Listings, Reviews & Ratings",
    "description": "Export Thumbtack service professionals: ratings, review counts and full review text, jobs booked, response time, Top Pro badge, licence signals, credentials, specialties and the pro's real ZIP. Sees 3x more pros than the visible page. No login. Thumbtack has no public API; this is the closest.",
    "version": "0.1",
    "x-build-id": "zgfUiBWbcIooTx6bw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/oswaldocarabano~thumbtack-pros-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-oswaldocarabano-thumbtack-pros-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/oswaldocarabano~thumbtack-pros-scraper/runs": {
      "post": {
        "operationId": "runs-sync-oswaldocarabano-thumbtack-pros-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/oswaldocarabano~thumbtack-pros-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-oswaldocarabano-thumbtack-pros-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": {
          "maxResults": {
            "title": "Maximum professionals",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "How many professionals to return. You are charged per professional delivered, never for an error row, and duplicates are removed before you are charged. Hard cap: 50,000 per run.",
            "default": 100
          },
          "categories": {
            "title": "Service categories",
            "type": "array",
            "description": "Thumbtack category slugs, e.g. `plumbers`, `house-cleaning`, `electricians`, `handyman`, `movers`, `roofing`. Thumbtack publishes 3,264 categories. Leave empty to sweep whatever the sitemap offers.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "As `state/city` slugs, e.g. `tx/austin`, `ca/los-angeles`, `ny/brooklyn`. Thumbtack publishes 3,656 cities.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "states": {
            "title": "States",
            "type": "array",
            "description": "Two-letter codes, e.g. `tx`, `ca`. Narrows sitemap discovery without naming every city.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "discoverFromSitemap": {
            "title": "Discover pages from Thumbtack's sitemap",
            "type": "boolean",
            "description": "On by default, and it is how this actor gets coverage. Thumbtack publishes 489,781 city-by-category landing pages and 406,500 professional pages in its sitemaps. Paging does not work on Thumbtack: `?page=2` returns the same professionals as page 1, so any actor claiming deep pagination is charging you for repeats.",
            "default": true
          },
          "profilesFromSitemap": {
            "title": "Go straight to professional pages",
            "type": "boolean",
            "description": "Reads professionals directly from the 406,500 profile URLs in the sitemap: one request equals one professional, with no overlap between cities and with every profile field filled. Slower per row, and the richest output this actor produces.",
            "default": false
          },
          "scrapeProfiles": {
            "title": "Also open each professional's profile page",
            "type": "boolean",
            "description": "Adds the introduction, the professional's real ZIP code, credentials, specialties, business hours, the 1-to-5 star histogram, photo count and their own Q&A. Costs one extra request per professional and is billed as its own event.",
            "default": false
          },
          "maxReviewsPerPro": {
            "title": "Reviews per professional",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "The profile page carries five reviews; above that this actor pages through the rest, five at a time. Only applies when profiles are fetched.",
            "default": 5
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "1 to 5. Professionals without a rating are excluded when you set this."
          },
          "minReviews": {
            "title": "Minimum number of reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of reviews. Professionals without a review count are excluded when you set this."
          },
          "topProOnly": {
            "title": "Only Top Pro professionals",
            "type": "boolean",
            "description": "Thumbtack's Top Pro badge.",
            "default": false
          },
          "licensedOnly": {
            "title": "Only professionals showing a licence signal",
            "type": "boolean",
            "description": "Thumbtack surfaces a LICENSED signal on some professionals. Absence means Thumbtack did not show the signal, not that the professional is unlicensed.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Maximum concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Leave at 4. Thumbtack's listing pages weigh about 490 KB each, so more concurrency mostly buys memory pressure.",
            "default": 4
          },
          "useCache": {
            "title": "Serve unchanged professionals from a shared cache",
            "type": "boolean",
            "description": "Worth more here than on most actors: the HTML route discards 93.7% of every page downloaded, so avoiding a repeat download saves disproportionately. Cached rows always declare their age with `from_cache`, `fetched_at` and `data_age_hours`.",
            "default": true
          },
          "maxCacheAgeDays": {
            "title": "Maximum age of cached data, in days",
            "minimum": 0,
            "maximum": 7,
            "type": "integer",
            "description": "Set to 0 to force a fresh fetch of everything. Leave empty for the default of 7 days."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "The actor brings its own residential proxy. Set this only if you want to route through your own.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}