{
  "openapi": "3.0.1",
  "info": {
    "title": "Booksy Scraper - Beauty Salons, Services, Prices & Reviews",
    "description": "Scrape Booksy beauty businesses across the US, UK and Poland by category, location or URL. Extract business profiles, service menus, prices, durations, photos, opening hours, ratings and client reviews. Supports resume, incremental updates and MCP export.",
    "version": "0.1",
    "x-build-id": "B7bpzfatOYnkDOVYp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~booksy-beauty-business-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-booksy-beauty-business-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/abotapi~booksy-beauty-business-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-booksy-beauty-business-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/abotapi~booksy-beauty-business-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-booksy-beauty-business-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": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "urls"
            ],
            "type": "string",
            "description": "Search by category and location names, or paste your own links: category-and-location results pages walk forward, a business link (or a bare business id) is always read in full.",
            "default": "search"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Plain city or area names, for example Orlando, London, Warszawa. Each location runs on the selected market. Supported markets: United States, United Kingdom, Poland.",
            "items": {
              "type": "string"
            }
          },
          "market": {
            "title": "Market",
            "enum": [
              "us",
              "gb",
              "pl"
            ],
            "type": "string",
            "description": "The marketplace to search (each market has its own businesses, locations and categories). Search mode uses this market; pasted links pick their own market from their locale prefix.",
            "default": "us"
          },
          "category": {
            "title": "Category",
            "type": "string",
            "description": "Plain category name, for example barber, hair salon, nails, massage, skin care, brows and lashes, makeup, tattoo, braids and locs. Leave empty to search every category."
          },
          "searchQuery": {
            "title": "Keyword (optional)",
            "type": "string",
            "description": "Optional keyword filter, for example 'fade', 'balayage', 'gel'. Narrow the results feed server-side."
          },
          "sortOrder": {
            "title": "Sort results by",
            "enum": [
              "score",
              "price",
              "distance"
            ],
            "type": "string",
            "description": "Order of the results feed.",
            "default": "score"
          },
          "minRating": {
            "title": "Min rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep only businesses rated at least this many stars (applied to the collected rows)."
          },
          "onlineOnly": {
            "title": "Online booking only",
            "type": "boolean",
            "description": "Keep only businesses that take online bookings.",
            "default": false
          },
          "travelingOnly": {
            "title": "Mobile / traveling businesses only",
            "type": "boolean",
            "description": "Keep only businesses that travel to the client.",
            "default": false
          },
          "urls": {
            "title": "Links",
            "type": "array",
            "description": "Category-and-location results links (they walk forward), business links (always read in full; the link's locale also picks the market) or bare business ids. A link's numeric identifiers decide what it points at - its readable slug never does.",
            "default": [
              "https://booksy.com/en-us/s/barber-shop/134763_orlando",
              "https://booksy.com/en-us/147413_sam-at-the-barber-spot_barber-shop_134763_orlando",
              "https://booksy.com/en-gb/s/barber/311817_london",
              "https://booksy.com/en-gb/59331_bobby-khokhar-celebrity-barber_barber_311817_london",
              "147413"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch business profiles",
            "type": "boolean",
            "description": "Read each collected business's own page for the written description, opening hours, contacts (website, social), booking and deposit policies, amenities, staff, categories and the full photo gallery. Turning this off returns the faster results-card shape (service menus with prices are on the card either way).",
            "default": true
          },
          "fetchReviews": {
            "title": "Fetch client reviews",
            "type": "boolean",
            "description": "Read each collected business's client reviews (rating, text, appointment date, business reply) and attach them to the business record as a nested list. Applies to both modes; a business with no published reviews ships without them.",
            "default": true
          },
          "maxReviews": {
            "title": "Max reviews per business",
            "minimum": 0,
            "type": "integer",
            "description": "Upper bound on client reviews collected per business (reviews serve 10 per page). 0 skips review collection entirely.",
            "default": 20
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on business records for the whole run. The walk stops once it is reached.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per location",
            "minimum": 0,
            "type": "integer",
            "description": "Does NOT cap the run on its own: 0 or empty walks every results page and defers to Max items. A positive value bounds how many results pages each location walk covers.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "The marketplace is served worldwide from every connection type; the default datacenter connection keeps runs cheap. For the most reliable long scheduled runs pick Residential instead - the run falls back to a backup connection automatically and tells you in the log.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "A previous run's ID whose records are treated as already collected: they are seeded as seen and skipped this run."
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "Compare each business against the saved baseline and classify NEW / UPDATED / UNCHANGED / EXPIRED. Unchanged businesses are suppressed unless Emit unchanged is on. Fields that move without the business changing (the feed's relevance score and promoted flags, review counters, availability flags) are excluded from change detection; the locations, category, market, links and toggles you run with are part of the scope, so changing them starts a fresh baseline.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Optional name for the incremental baseline. Leave empty to derive it from the run's scope (locations, category, market, links, toggles); set the same key on every scheduled run to share one baseline."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records",
            "type": "boolean",
            "description": "Also push businesses whose tracked fields did not change (changeType UNCHANGED) instead of suppressing them.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records",
            "type": "boolean",
            "description": "After a complete scan, push baseline businesses this run did not see (changeType EXPIRED, for example businesses that closed). Never fires on a capped, resumed or partially failed walk.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Extra record fields excluded from change detection beyond the built-in volatile set (relevance score, distance, promoted flag, review counters, availability flags).",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "MCP connectors",
            "type": "array",
            "description": "Connector IDs to export the collected records to after the run (Apify MCP). Leave empty to skip the export.",
            "items": {
              "type": "string"
            }
          },
          "notionParentPageUrl": {
            "title": "Notion parent page URL",
            "type": "string",
            "description": "Parent page URL when one of the connectors is Notion."
          },
          "maxNotifyListings": {
            "title": "Max records per export",
            "minimum": 1,
            "type": "integer",
            "description": "Upper bound on records handed to each connector.",
            "default": 50
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}