{
  "openapi": "3.0.1",
  "info": {
    "title": "Naver Map Scraper",
    "description": "Scrape places, menus, business hours, reviews and more from Naver Map (map.naver.com). Supports keyword search and direct URL input.",
    "version": "1.9",
    "x-build-id": "fqVTkETcmrEK6Ecd2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/huggable_quote~naver-map-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-huggable_quote-naver-map-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/huggable_quote~naver-map-scraper/runs": {
      "post": {
        "operationId": "runs-sync-huggable_quote-naver-map-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/huggable_quote~naver-map-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-huggable_quote-naver-map-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": {
          "searchKeywords": {
            "title": "Search Keywords",
            "type": "array",
            "description": "List of search keywords (e.g. '강남 맛집', '홍대 카페'). The Actor will search Naver Map for each keyword and scrape place details from the results.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Place URLs",
            "type": "array",
            "description": "Naver Map URLs. A place URL (e.g. https://map.naver.com/p/entry/place/1234567890) scrapes that place. A search-results URL (e.g. https://map.naver.com/p/search/강남맛집 or https://pcmap.place.naver.com/place/list?query=강남맛집) runs that search like a keyword. Short naver.me links are resolved automatically.",
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerKeyword": {
            "title": "Max Results per Keyword",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum number of places to collect per search keyword. Each place costs $0.003.\n\nNaver returns at most **300 places per keyword**. To collect more, use **area search** (set Search Coordinates + Search Radius) or split the keyword by district.",
            "default": 5
          },
          "maxItems": {
            "title": "Max Places in Total",
            "minimum": 1,
            "type": "integer",
            "description": "Optional cap on the number of places for the whole run, across all keywords and URLs. The run stops searching once it is reached. Leave empty for no overall cap (Max Results per Keyword still applies)."
          },
          "includeDetails": {
            "title": "Include Full Details (slower)",
            "type": "boolean",
            "description": "When enabled (default), each place's detail page is fetched to collect full data: menus, business hours, facilities, description, images, etc.\n\nWhen **disabled (fast mode)**, the detail page fetch is skipped and only the data already available from search results is returned: name, category, phone, virtual phone, address, road address, coordinates, and review counts. This roughly halves the run time and lowers cost — ideal when you only need contact/address info. (Has no effect on direct URL inputs, which always fetch the detail page.)",
            "default": true
          },
          "includeEnglish": {
            "title": "Add English Name, Category & Address",
            "type": "boolean",
            "description": "Adds `nameEn`, `categoryEn` and `addressEn` — Naver's own English versions — next to the original Korean fields (which are kept unchanged). Works for keyword and area searches; places given only by URL do not get English fields. Menus, hours and other detail fields stay in Korean.",
            "default": false
          },
          "includeReviews": {
            "title": "Include Reviews",
            "type": "boolean",
            "description": "When enabled, visitor reviews and blog reviews are collected for each place (additional $0.001 per review page). When disabled, only place details are scraped.\n\n**Visitor reviews**: No server-side limit. Controlled entirely by maxReviewPages (50 reviews/page). Set maxReviewPages high enough to collect all reviews.\n\n**Blog reviews**: Naver imposes a server-side cap of ~100 per place (maxItemCount). The actor collects up to ~90% of this limit regardless of maxReviewPages.",
            "default": false
          },
          "maxReviewPages": {
            "title": "Max Review Pages",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum number of review pages to fetch per place. Visitor reviews use cursor-based pagination (50 reviews/page, no server limit). Blog reviews use offset pagination (10 reviews/page, server-side cap of ~100 per place). Example: maxReviewPages=3 → up to 150 visitor reviews + up to ~90 blog reviews.",
            "default": 50
          },
          "reviewCutoffDate": {
            "title": "Review Cutoff Date",
            "type": "string",
            "description": "Only collect reviews on or after this date (YYYY-MM-DD format).",
            "default": "2024-01-01"
          },
          "sortBy": {
            "title": "Sort Order",
            "enum": [
              "relevance",
              "distance",
              "reviews",
              "saved"
            ],
            "type": "string",
            "description": "Order of search results.\n\n- **relevance** — Naver's default ranking\n- **distance** — nearest first (requires Search Coordinates)\n- **reviews** — most reviewed first\n- **saved** — most saved/bookmarked first",
            "default": "relevance"
          },
          "searchCoordinates": {
            "title": "Search Coordinates",
            "type": "string",
            "description": "Map center as `latitude,longitude` (e.g. `37.4979,127.0276` for Gangnam Station — copy it from Google Maps). Used as the reference point for distance sorting and the `distance` field, and as the center of area search."
          },
          "searchRadiusKm": {
            "title": "Search Radius (km) — Area Search",
            "minimum": 0,
            "maximum": 20,
            "type": "number",
            "description": "When set together with Search Coordinates, the Actor sweeps the whole circle around that point, automatically splitting dense areas into smaller cells. This collects **every matching place in the area**, beyond Naver's 300-per-keyword limit (e.g. ~1,270 cafés within 1 km of Hongdae). Max Results per Keyword still caps the total. Max 20 km."
          },
          "newlyOpened": {
            "title": "Only Newly Opened",
            "type": "boolean",
            "description": "Only places Naver marks as newly opened.",
            "default": false
          },
          "takeout": {
            "title": "Only Takeout Available",
            "type": "boolean",
            "description": "Only places that offer takeout (포장).",
            "default": false
          },
          "naverPay": {
            "title": "Only Naver Pay Accepted",
            "type": "boolean",
            "description": "Only places that accept Naver Pay.",
            "default": false
          },
          "hasCoupon": {
            "title": "Only Places With Coupons",
            "type": "boolean",
            "description": "Only places currently offering a Naver coupon.",
            "default": false
          },
          "wheelchairAccessible": {
            "title": "Only Wheelchair Accessible",
            "type": "boolean",
            "description": "Only places with a wheelchair-accessible entrance.",
            "default": false
          },
          "openNow": {
            "title": "Only Open Now (restaurants)",
            "type": "boolean",
            "description": "Only places open at the moment the run executes (Korea time). Restaurants and cafés only — other categories ignore it.",
            "default": false
          },
          "open24h": {
            "title": "Only Open 24 Hours (restaurants)",
            "type": "boolean",
            "description": "Only places open around the clock. Restaurants and cafés only.",
            "default": false
          },
          "delivery": {
            "title": "Only Delivery Available (restaurants)",
            "type": "boolean",
            "description": "Only places that offer delivery. Restaurants and cafés only.",
            "default": false
          },
          "acceptsReservations": {
            "title": "Only Accepts Reservations (restaurants)",
            "type": "boolean",
            "description": "Only places that take reservations. Restaurants and cafés only.",
            "default": false
          },
          "menuKeyword": {
            "title": "Menu Keyword",
            "type": "string",
            "description": "Only places whose menu matches this word, e.g. `피자` (pizza) or `파스타`. Most useful for restaurants and cafés."
          },
          "monitoringMode": {
            "title": "Monitoring Mode (only new & changed places)",
            "type": "boolean",
            "description": "For scheduled/recurring runs. The first run returns all places marked `NEW`. Later runs with the same input return only places that are **NEW** or **UPDATED** since the last run (with `changedFields`), so you pay only for changes.\n\nChanges are detected on name, category, address, phone, homepage, weekly opening hours and menu names/prices. Review counts and \"open now\" status are ignored. State is kept in your account's key-value store `naver-map-monitoring`.",
            "default": false
          },
          "monitoringStateKey": {
            "title": "Monitoring State Name",
            "type": "string",
            "description": "Optional name for this monitoring campaign. Leave empty to derive it from the search input automatically. Set it to keep state stable when you tweak other options."
          },
          "emitUnchanged": {
            "title": "Also Return Unchanged Places",
            "type": "boolean",
            "description": "In monitoring mode, also return places that did not change (marked `UNCHANGED`). These are billed like any other result.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Apify proxy settings. Proxy is enabled by default to avoid HTTP 429 rate limiting from Naver.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}