{
  "openapi": "3.0.1",
  "info": {
    "title": "Treatwell Scraper: UK Salons, Service Prices & Reviews",
    "description": "Find UK Treatwell salons by city or search URL. Extract full service menus with price and duration options, phone numbers, ratings and opening hours. Collect paginated reviews filtered by date and rating. Export JSON/CSV with source links; no login.",
    "version": "1.0",
    "x-build-id": "YQoD7Y4p40MjwKZNA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/softprodlabs~treatwell-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-softprodlabs-treatwell-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/softprodlabs~treatwell-scraper/runs": {
      "post": {
        "operationId": "runs-sync-softprodlabs-treatwell-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/softprodlabs~treatwell-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-softprodlabs-treatwell-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": "Result type",
            "enum": [
              "venues",
              "reviews"
            ],
            "type": "string",
            "description": "Venues returns one row per salon with nested service options. Reviews returns one row per public review; venue URLs or discovery inputs work in either mode.",
            "default": "venues"
          },
          "city": {
            "title": "UK city",
            "type": "string",
            "description": "For example London, Manchester, Bristol or Edinburgh. Supply city/category OR URLs. For smaller areas and individual treatments, copy a Treatwell search URL."
          },
          "treatmentGroup": {
            "title": "Treatment category",
            "enum": [
              "hair",
              "hair-removal",
              "massage",
              "nails",
              "face",
              "body",
              "counselling-and-holistic"
            ],
            "type": "string",
            "description": "Optional category for city discovery. Omit to search all treatments."
          },
          "urls": {
            "title": "Treatwell UK URLs",
            "maxItems": 50,
            "type": "array",
            "description": "Public /place/salon/, /places/... search URLs, or /place/salon/reviews/ URLs in reviews mode. Review page URLs resume from that page. Tracking query parameters are removed.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum results",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Global cap on unique output rows across every input. In reviews mode this counts reviews, not salons.",
            "default": 20
          },
          "fetchDetails": {
            "title": "Fetch full salon details",
            "type": "boolean",
            "description": "For venue discovery, fetch each salon page for its full menu, options, phone and staff. Disable for listing-only rows (services and phone can be absent). Direct venue URLs and reviews always fetch the venue page.",
            "default": true
          },
          "minRating": {
            "title": "Minimum salon rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Filter salons by their published average rating. Also filters which salons contribute reviews."
          },
          "keyword": {
            "title": "Salon or service phrase",
            "type": "string",
            "description": "Case-insensitive phrase in salon name, description or extracted service names. This is a local filter, not a global site search. Service matching requires full details."
          },
          "reviewDateFrom": {
            "title": "Review date from",
            "type": "string",
            "description": "Reviews mode only. Inclusive YYYY-MM-DD, based on review publication date in UTC."
          },
          "reviewDateTo": {
            "title": "Review date through",
            "type": "string",
            "description": "Reviews mode only. Inclusive YYYY-MM-DD, based on review publication date in UTC."
          },
          "maxReviewRating": {
            "title": "Maximum review stars",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Reviews mode only. E.g. 2 returns one- and two-star reviews for complaint analysis."
          },
          "maxReviewsPerVenue": {
            "title": "Maximum reviews per salon",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Reviews mode: cap matching reviews saved per salon; maxItems still applies globally.",
            "default": 100
          },
          "maxPages": {
            "title": "Maximum pages per listing",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Per search input and per salon review listing. Treatwell currently serves 20 venues or 5 reviews per page. Date filters may need a larger page cap.",
            "default": 5
          },
          "maxRequests": {
            "title": "Maximum page requests",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Global page request budget; robots.txt and transient retries are additional. SUMMARY reports limits and incomplete coverage. Public crawl delay is respected.",
            "default": 100
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Direct access is the default. Optional proxy costs are borne by the developer under pay-per-event pricing. Proxies do not enable private data.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}