{
  "openapi": "3.0.1",
  "info": {
    "title": "Thumbtack Pro Scraper",
    "description": "Scrape service providers from Thumbtack across categories like plumbers, cleaners, electricians, photographers, and more. Extract ratings, reviews, pricing, hires, response times, business details, categories, and profile data with city, state, and ZIP-based scraping modes.",
    "version": "0.0",
    "x-build-id": "UPUTLnjop4dkv8VrH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/moving_beacon-owner1~thumbtack-pro-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-moving_beacon-owner1-thumbtack-pro-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/moving_beacon-owner1~thumbtack-pro-scraper/runs": {
      "post": {
        "operationId": "runs-sync-moving_beacon-owner1-thumbtack-pro-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/moving_beacon-owner1~thumbtack-pro-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-moving_beacon-owner1-thumbtack-pro-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",
        "required": [
          "categorySlug",
          "mode"
        ],
        "properties": {
          "categorySlug": {
            "title": "Primary category slug",
            "type": "string",
            "description": "Thumbtack category slug (e.g. 'handyman', 'house-cleaning', 'plumbers', 'local-electricians'). Lower-case, hyphens."
          },
          "mode": {
            "title": "Iteration mode",
            "enum": [
              "single",
              "related",
              "zips",
              "wide"
            ],
            "type": "string",
            "description": "How aggressively to expand the search. 'single' = one request. 'related' = loop over related categories. 'zips' = loop over ZIPs. 'wide' = grid of (categories × ZIPs).",
            "default": "related"
          },
          "state": {
            "title": "State (2-letter code)",
            "type": "string",
            "description": "Lowercase US state code. Combine with 'city' for canonical city URL (most reliable). Leave empty if using ZIP-based scopes."
          },
          "city": {
            "title": "City slug",
            "type": "string",
            "description": "Lowercase, hyphens (e.g. 'austin', 'san-francisco', 'las-vegas'). Used with 'state'."
          },
          "zipCode": {
            "title": "Single ZIP code",
            "pattern": "^\\d{5}$",
            "type": "string",
            "description": "5-digit US ZIP. Overrides state+city. Used by mode='single' or 'related' when no state+city given."
          },
          "zips": {
            "title": "Multiple ZIP codes",
            "uniqueItems": true,
            "type": "array",
            "description": "List of 5-digit US ZIPs. Required for mode='zips' or 'wide'. Each ZIP returns a different 10-pro slice.",
            "items": {
              "type": "string"
            }
          },
          "relatedCategories": {
            "title": "Related categories (override)",
            "uniqueItems": true,
            "type": "array",
            "description": "Override the built-in RELATED_CATEGORIES list. If empty, uses the built-in mapping for categorySlug. Only used by mode='related' or 'wide'.",
            "items": {
              "type": "string"
            }
          },
          "maxCategories": {
            "title": "Max categories",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Cap on how many category slugs to iterate. Lower = faster but fewer pros. Leave empty for all."
          },
          "maxZips": {
            "title": "Max ZIPs",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Cap on how many ZIPs to iterate. Lower = faster but less coverage. Leave empty for all."
          },
          "sleepBetween": {
            "title": "Seconds between requests",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Politeness delay. Recommended >= 4 without proxy, >= 2 with residential proxy. Akamai will challenge faster scrapers.",
            "default": 4
          },
          "impersonate": {
            "title": "Browser TLS fingerprint",
            "enum": [
              "chrome124",
              "chrome131",
              "chrome120",
              "edge101",
              "safari17_0",
              "firefox133"
            ],
            "type": "string",
            "description": "Which browser's TLS handshake to mimic. chrome124 is the most stable default.",
            "default": "chrome124"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Recommended: Apify Proxy with residential group ('RESIDENTIAL'). Thumbtack runs Akamai Bot Manager — datacenter IPs get challenged fast."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}