{
  "openapi": "3.0.1",
  "info": {
    "title": "Naver Map Scraper $1💰 Places, Menus, Reviews",
    "description": "From $1/1K. Scrape Naver Map places by keyword or URL: names, categories, ratings, phones, addresses, GPS, menus, opening hours, facilities, subway and bus transit, photos, plus visitor and blog reviews. 70+ fields, full pagination, three sort orders, fast and low cost.",
    "version": "1.0",
    "x-build-id": "uho3rQESrfZFEiAud"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~naver-map-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-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/abotapi~naver-map-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-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/abotapi~naver-map-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Search mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "How to choose what to scrape. 'search' runs the keywords you enter; 'url' scrapes specific Naver Map place or search URLs you paste.",
            "default": "search"
          },
          "keywords": {
            "title": "Search keywords",
            "type": "array",
            "description": "One or more Naver Map search terms, for example 만두집, 강남 카페, or 서울 호텔. Each keyword is paginated to its full result count (capped by Max records). Only applies in 'search' mode.",
            "default": [
              "만두집"
            ],
            "items": {
              "type": "string"
            }
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "distance",
              "popular",
              "reviews",
              "saved"
            ],
            "type": "string",
            "description": "Order applied to the ~50 places Naver's results page returns per keyword (re-ordered by this actor; Naver's own deeper pages are not reachable). 'distance' needs Search centre; 'popular' and 'reviews' rank by visitor-review count; 'saved' by save count when Naver exposes it. Only applies in 'search' mode.",
            "default": "relevance"
          },
          "searchCoordinates": {
            "title": "Search centre (lat,lng)",
            "type": "string",
            "description": "Optional 'latitude,longitude' (for example 37.4979,127.0276 for Gangnam). Used as the reference point for the 'distance' sort and the radius filter; it does not move Naver's own search area, which follows the keyword. Only applies in 'search' mode."
          },
          "newlyOpened": {
            "title": "Newly opened only",
            "type": "boolean",
            "description": "Keep only places Naver flags as newly opened. Applied to the ~50 places per keyword.",
            "default": false
          },
          "naverPay": {
            "title": "Naver Pay only",
            "type": "boolean",
            "description": "Keep only places that accept Naver Pay. Applied to the ~50 places per keyword.",
            "default": false
          },
          "hasCoupon": {
            "title": "With coupons only",
            "type": "boolean",
            "description": "Keep only places with at least one coupon, when Naver reports coupons for the place.",
            "default": false
          },
          "wheelchairAccessible": {
            "title": "Wheelchair accessible only",
            "type": "boolean",
            "description": "Keep only places flagged with a wheelchair-accessible entrance.",
            "default": false
          },
          "searchRadiusKm": {
            "title": "Radius around search centre (km)",
            "minimum": 0,
            "type": "number",
            "description": "Keep only places within this distance of Search centre. Filters the ~50 places per keyword; it is not an area sweep. 0 or empty disables it.",
            "default": 0
          },
          "reviewCutoffDate": {
            "title": "Reviews on or after (YYYY-MM-DD)",
            "type": "string",
            "description": "When collecting visitor reviews, drop reviews dated before this day. Empty keeps all."
          },
          "startUrls": {
            "title": "URLs",
            "type": "array",
            "description": "Naver Map URLs to scrape: a place page (map.naver.com/p/entry/place/1234567, m.place.naver.com/restaurant/1234567/home), a short naver.me link, or a search page (map.naver.com/p/search/만두집). Multiple URLs supported. Only applies in 'url' mode.",
            "default": [
              "https://map.naver.com/p/search/강남 카페",
              "https://pcmap.place.naver.com/place/list?query=만두집",
              "https://map.naver.com/v5/search/만두집",
              "https://pcmap.place.naver.com/place/1085956231/home",
              "https://map.naver.com/p/entry/place/1085956231",
              "https://m.place.naver.com/restaurant/1085956231/home"
            ],
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "Include place details",
            "type": "boolean",
            "description": "Fetch the full place page for each result: menus, opening hours, facilities, payment options, exact coordinates, nearby subway and bus stops, photos, and blog reviews. This makes one extra request per place, so it is slower and billed separately. Turn off for a fast, cheap list-only run.",
            "default": true
          },
          "includeReviews": {
            "title": "Include visitor reviews",
            "type": "boolean",
            "description": "Collect star-rated visitor reviews for each place (rating, text, author, visit date, photos, keyword tags), paginated up to Max reviews per place. Adds extra requests per place.",
            "default": false
          },
          "maxReviews": {
            "title": "Max reviews per place",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Upper bound on visitor reviews collected per place when Include visitor reviews is on. 0 disables review collection. Capped at 1000 per place.",
            "default": 20
          },
          "maxItems": {
            "title": "Max records",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many places across the whole run. The default (20) keeps a trial run small and cheap; set 0 for no limit. Naver's results page carries about 50 places per keyword, so use several keywords for more coverage.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Connection settings. The default connection works on every Apify plan, including the free tier. A residential connection is optional and only needed if the default is ever blocked.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxResidentialMB": {
            "title": "Residential traffic budget (MB)",
            "minimum": 0,
            "type": "integer",
            "description": "Only applies when the proxy group is RESIDENTIAL. After this many MB of residential traffic, the run auto-downgrades to the cheaper datacenter tier. 0 means no budget cap.",
            "default": 0
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large keyword pull without returning or charging for places already collected there. Use this after an interrupted run. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching places as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED places, tagged with changeType/changedFields/firstSeenAt/lastSeenAt. A place is UPDATED when any returned field changes (name, category, address, coordinates, phone, hours, menu, photos, ratings, review counts and review texts, and so on); fields you list under \"Ignore fields when detecting changes\" are compared as unchanged, and integral numbers such as 4.0 and 4 count as equal. Everything stays in the output either way. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those places returned (and billed). EXPIRED is only produced after a search that was fully walked, never when Max records, the per-search result cap or Resume cut it short. State is kept separately per search + sort + coordinates + detail settings; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/sort/coordinates and detail settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged places (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return places that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired places (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return places that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max records capped it, Resume was used, or a search could not be reached. This returns — and bills — extra synthetic 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": "Optional. Field names that must not trigger UPDATED or appear in changedFields in incremental mode. Use a top-level name such as visitorReviewCount, or a dotted path for a nested field such as visitorReviews.created (lists are searched element by element). The fields stay in the output; they are only left out of the comparison. Editing this list never re-flags places that did not otherwise change.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}