{
  "openapi": "3.0.1",
  "info": {
    "title": "Hot Pepper Beauty Scraper - Salons, Prices & Reviews",
    "description": "Scrape Japanese hair, nail, relaxation and esthetic salons from Hot Pepper Beauty (beauty.hotpepper.jp). Search by area or keyword, or paste URLs. Returns address, phone, coordinates, rating, reviews count, hours, payment methods, features, coupons with prices and the latest review.",
    "version": "0.1",
    "x-build-id": "ru6mpJsUFsrISnJ05"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~beauty-hotpepper-jp-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-beauty-hotpepper-jp-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~beauty-hotpepper-jp-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-beauty-hotpepper-jp-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~beauty-hotpepper-jp-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-beauty-hotpepper-jp-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": "What do you want to scrape?",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search builds salon lists from areas or keywords. URL mode takes salon pages or area list pages you paste. Fields in the other mode's section are ignored.",
            "default": "search"
          },
          "areas": {
            "title": "Areas",
            "type": "array",
            "description": "Area names in Japanese such as 新宿 or 渋谷, or in romaji such as shinjuku, an area code such as macAA (optionally with its name, macAA|新宿), a sub-area code such as macAA/sacX001, a region name such as 関東 (expands to every area in the region), or an area list link. Ignored in URL mode.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Free-text salon search, for example a station, style or salon name. Each keyword is its own search over hair salons. Ignored in URL mode.",
            "items": {
              "type": "string"
            }
          },
          "serviceType": {
            "title": "Salon category",
            "enum": [
              "hair",
              "nail",
              "relax",
              "esthe"
            ],
            "type": "string",
            "description": "Which salon family to list for the chosen areas.",
            "default": "hair"
          },
          "minReviewCount": {
            "title": "Minimum reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Skip salons with fewer reviews than this (applied to the review count shown on the list page)."
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Skip salons whose average review score is below this value (1 to 5). Setting it turns on salon detail pages because the score comes from there."
          },
          "prefectures": {
            "title": "Prefectures",
            "type": "array",
            "description": "Keep only salons located in these prefectures, for example 東京都, 神奈川県 or Tokyo. Combine with a region name such as 関東 in Areas. Setting it turns on salon pages because the address comes from there. Applies in search and URL mode.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Salon or list URLs",
            "type": "array",
            "description": "Paste any of these links: an area list (including its area top, sub-area and page-2 forms, and the nail, relax and esthe versions), a salon page or one of its coupon, review or style sub-pages, or a keyword search page. Area and search lists are walked page by page; each salon link returns one record. Whole-region pages, the home page, catalog and ranking pages are skipped with a warning. Filter fields are ignored in URL mode.",
            "default": [
              "https://beauty.hotpepper.jp/svcSA/macAA/salon/"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch salon detail pages",
            "type": "boolean",
            "description": "Open every salon page for full data: phone, address, coordinates, rating, hours, payment methods, features, coupons and the latest review. Off returns only the list-page summary.",
            "default": true
          },
          "includeReviews": {
            "title": "Add customer reviews to each salon",
            "type": "boolean",
            "description": "Adds the salon's customer reviews to each row as a list, newest first: date, overall score, the four scores (atmosphere, service, technique, menu and price), the review text, the menu booked and the salon's public reply where there is one. Reviewer names and profiles are never included. Needs 'Fetch salon detail pages' switched on. Each review is a separate paid event.",
            "default": false
          },
          "maxReviewsPerSalon": {
            "title": "Max reviews per salon",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "How many reviews to collect for each salon when reviews are on (30 reviews per page of the site). Reviews are billed per review returned, so this is also the most each salon can add to the bill.",
            "default": 30
          },
          "maxPages": {
            "title": "Max list pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Optional limit on list pages walked per area or keyword. Empty or 0 means unlimited. This does NOT cap the output; Max items is the cap."
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum salons to return in total. 0 means unlimited.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Proxy settings. The default datacenter connection works on every plan. Residential is recommended for the most reliable results, especially on large or frequent runs. If the selected connection is unavailable to your plan or is refused, the run moves on to a backup connection automatically; residential traffic from that automatic step is billed to your Apify plan.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Run ID (or dataset ID) of a previous run of this Actor. Salons already collected there are skipped, so this run returns only new ones. Leave empty for a normal run."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. A salon is UPDATED when any returned detail changes, including rating and review counts; add fields you consider noise to Ignore fields below. The first run returns all matching salons as NEW; later runs return only NEW, UPDATED and REAPPEARED salons, and unchanged ones are neither returned nor billed unless Emit unchanged is on. State is kept separately for each search setup (areas, keywords, links, category, detail pages, minimum reviews and rating); use State key to name or share one monitoring campaign.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Optional name for an incremental monitoring campaign. Leave empty to derive it from the search setup."
          },
          "emitUnchanged": {
            "title": "Emit unchanged salons (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return salons that have not changed since the last run, marked UNCHANGED. This returns, and bills, rows you already have, so leave it off unless you want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired salons (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return salons that were present in an earlier run but are no longer listed, marked EXPIRED. Only produced after a run that walked every tracked area or keyword list to its last page, so never when Max items or Max list pages cut the run short, when Resume was used, or in URL mode with single salon links. This returns, and bills, extra rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Field names that must never make a salon UPDATED, for example rating, reviewCount or coupons. They are still returned in every row. Nothing is ignored by default except run bookkeeping (retrievedAt, position, sourceListUrl) and the nested customer reviews, so a new review alone does not make a salon UPDATED; it still does when the review count or rating changes. Used only in incremental mode.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}