{
  "openapi": "3.0.1",
  "info": {
    "title": "Fresha.com Scraper - Salon & Spa Data Extractor",
    "description": "Extract salon, spa & beauty business data from Fresha.com. Scrape services with prices, reviews, team members, ratings, and operating hours. Search by city or neighborhood worldwide (Dubai,   London, NYC, etc.). Perfect for market research, lead generation, price comparison, and chatbot integration.",
    "version": "0.1",
    "x-build-id": "lb06Z8ePWiCS9VBSA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/malikgen~fresha-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-malikgen-fresha-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/malikgen~fresha-scraper/runs": {
      "post": {
        "operationId": "runs-sync-malikgen-fresha-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/malikgen~fresha-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-malikgen-fresha-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": "Scraping Mode",
            "enum": [
              "venue",
              "search"
            ],
            "type": "string",
            "description": "Choose 'venue' to scrape specific salon pages with full details, or 'search' to discover salons by location. In search mode, select a category or 'All Categories' for maximum discovery (30-60+ venues).",
            "default": "venue"
          },
          "venueUrls": {
            "title": "Venue URLs (venue mode only)",
            "type": "array",
            "description": "⚠️ VENUE MODE ONLY - List of Fresha venue URLs to scrape. Leave empty/ignore when using search mode.",
            "items": {
              "type": "string"
            }
          },
          "venueSlug": {
            "title": "Venue Slug (venue mode only)",
            "type": "string",
            "description": "⚠️ VENUE MODE ONLY - Single venue slug as alternative to full URL. Leave empty when using search mode."
          },
          "searchLocation": {
            "title": "Search Location (search mode only)",
            "type": "string",
            "description": "🔍 SEARCH MODE ONLY - City or area to search (e.g., 'Dubai, UAE', 'Riyadh, Saudi Arabia'). GCC cities have optimized coordinates."
          },
          "serviceCategory": {
            "title": "Service Category (search mode only)",
            "enum": [
              "",
              "hair-salon",
              "barbershop",
              "nail-salon",
              "spa",
              "beauty-salon",
              "massage",
              "skin-care",
              "brows-lashes",
              "makeup",
              "waxing"
            ],
            "type": "string",
            "description": "🔍 SEARCH MODE ONLY - Select a specific category or 'All Categories' to search all 10 categories and maximize venue discovery with automatic deduplication.",
            "default": ""
          },
          "maxSearchResults": {
            "title": "Max Search Results (search mode only)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "🔍 SEARCH MODE ONLY - Maximum venues to return (uses infinite scroll to load more). Values above 500 may take 10–20 minutes and require the actor's default 4 GB memory.",
            "default": 50
          },
          "includeReviews": {
            "title": "Include Reviews",
            "type": "boolean",
            "description": "Whether to include customer reviews in the output (venue mode only).",
            "default": true
          },
          "includeTeam": {
            "title": "Include Team Members",
            "type": "boolean",
            "description": "Whether to include team/staff members in the output (venue mode only).",
            "default": true
          },
          "maxReviews": {
            "title": "Max Reviews",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Maximum number of reviews to include (0 = all available). Venue mode only.",
            "default": 10
          },
          "reviewsSince": {
            "title": "Reviews Since Date",
            "type": "string",
            "description": "Only include reviews published after this date (ISO 8601 format, e.g. '2026-04-01'). Ideal for incremental scraping pipelines — set to your last run date to fetch only new reviews. Venue mode only."
          },
          "outputFormat": {
            "title": "Output Format",
            "enum": [
              "full",
              "services_only",
              "chatbot_optimized"
            ],
            "type": "string",
            "description": "Output format for venue scraping. Search mode always uses a compact listing format.",
            "default": "full"
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "Optional n8n webhook URL to POST results after scraping. Works with both modes."
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "⚡ PROXY NOT REQUIRED - Fresha.com works perfectly without proxy. Tests show: No Proxy ($0.004) vs Datacenter ($0.012) vs Residential ($0.042). Only enable if you experience blocks."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}