{
  "openapi": "3.0.1",
  "info": {
    "title": "Naver Place Review Classifier — complaints & sponsors · $0.5/1k",
    "description": "Naver Place review analysis (네이버 플레이스 리뷰): complaint types, sentiment, unanswered reviews; blog posts sponsored or not. Not for Google Maps (use leoworks/google-maps-review-classifier). Input placeUrls or datasetId. Cost: $0.5/1k judged + ~$1/1k collected by a separate scraper, billed to you.",
    "version": "0.1",
    "x-build-id": "bcFTGoQT01ceCbr4N"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/leoworks~naver-place-review-classifier/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-leoworks-naver-place-review-classifier",
        "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/leoworks~naver-place-review-classifier/runs": {
      "post": {
        "operationId": "runs-sync-leoworks-naver-place-review-classifier",
        "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/leoworks~naver-place-review-classifier/run-sync": {
      "post": {
        "operationId": "run-sync-leoworks-naver-place-review-classifier",
        "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": {
          "placeUrls": {
            "title": "Places (collect the reviews for me) — Naver place URL or ID",
            "type": "array",
            "description": "One place per line, up to 20 (see “Max places”). Paste a place's own link (map.naver.com/p/entry/place/…, m.place.naver.com/…, naver.me/…) or its numeric place ID. The reviews are collected for you by a separate scraper (huggable_quote/naver-place-reviews-scraper, about $0.001 per review) that Apify bills to your account; this Actor then judges them ($0.0005 per review). Use this and/or “Search terms”, OR “Reviews dataset” OR “Review texts”.",
            "items": {
              "type": "string"
            }
          },
          "queries": {
            "title": "Search terms (find places and collect their reviews)",
            "type": "array",
            "description": "Look places up in Naver's directory, for example “강남 맛집” or “성수 카페” (a place type with an area, or a business name). Each term takes the first places it finds; the total is capped by “Max places”. A topic or a question matches nothing — to name one place use “Places” instead.",
            "items": {
              "type": "string"
            }
          },
          "maxPlaces": {
            "title": "Max places",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "At most this many places per run when the reviews are collected for you (place links plus search results). The cost of the collection step is about $0.001 per review plus the judging price.",
            "default": 5
          },
          "reviewsPerPlace": {
            "title": "Reviews per place",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many of the newest visitor reviews to collect for each place when the reviews are collected for you. The maximum cost per run lowers this if needed.",
            "default": 50
          },
          "includeBlogReviews": {
            "title": "Also judge blog posts about each place (sponsorship)",
            "type": "boolean",
            "description": "Collect the blog and cafe posts written about each place and label each one: states a sponsorship or fee (disclosed), reads like promotion (suspected) or neither. Posts are billed like reviews by the scraper and by this Actor. Off by default.",
            "default": false
          },
          "blogPerPlace": {
            "title": "Blog posts per place",
            "minimum": 10,
            "maximum": 30,
            "type": "integer",
            "description": "Blog posts to collect per place when blog posts are on (10, 20 or 30; other values are rounded down to 10).",
            "default": 10
          },
          "datasetId": {
            "title": "Reviews dataset (instead of Places)",
            "type": "string",
            "description": "An Apify dataset containing Naver Place reviews — for example the output of a Naver Place reviews scraper (huggable_quote, oxygenated_quagmire, zen-studio). Visitor reviews and blog posts can be mixed. Use this OR “Places”/“Search terms” (not both); it takes priority over “Review texts”."
          },
          "texts": {
            "title": "Review texts (paste instead of Places or a dataset)",
            "type": "array",
            "description": "Paste visitor review texts directly (one per line) when you already have them. Ignored when “Places”, “Search terms” or “Reviews dataset” is set.",
            "items": {
              "type": "string"
            }
          },
          "customLabels": {
            "title": "Custom labels",
            "type": "array",
            "description": "Up to 10 extra yes/no labels (each up to 200 characters) in plain language, e.g. “mentions parking”, “complains about a specific employee”. Each gets a probability.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "reviewsNewerThan": {
            "title": "Only reviews newer than",
            "type": "string",
            "description": "Classify only reviews published after this date — a date like `2026-01-01` or a period like `90 days`, `6 months`, `1 year`. Needs a review date in the dataset (e.g. `publishedAtDate`). Leave empty for all."
          },
          "maxStars": {
            "title": "Only reviews with at most N stars",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "For example 3 = classify only 1–3 star reviews (the ones that usually need attention). 0 = all ratings. Reviews without a star rating are kept.",
            "default": 0
          },
          "maxReviewsPerPlace": {
            "title": "Max reviews per place",
            "minimum": 0,
            "type": "integer",
            "description": "Classify at most this many reviews per place (counted in dataset order — Naver Place scrapers list the newest first when sorted by newest). With “Places”, this is how many of the newest reviews to collect per place (0 = 50). 0 = no limit for a dataset.",
            "default": 0
          },
          "maxItems": {
            "title": "Max reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Classify at most this many reviews (0 = all).",
            "default": 0
          },
          "textField": {
            "title": "Text field",
            "type": "string",
            "description": "Field holding the review text. Leave empty to auto-detect (text, reviewText, review, …)."
          },
          "extraTextFields": {
            "title": "Extra text fields",
            "type": "array",
            "description": "Fields to prepend to the text (up to 5). Leave empty if unsure.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "idFields": {
            "title": "ID fields to keep",
            "type": "array",
            "description": "Fields copied unchanged from each input item to the output so you can join results back (e.g. reviewId, placeId). Leave empty to auto-pick reviewId and placeId.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "ratingField": {
            "title": "Star rating field",
            "type": "string",
            "description": "Leave empty to auto-detect (stars, rating, …)."
          },
          "dateField": {
            "title": "Review date field",
            "type": "string",
            "description": "Leave empty to auto-detect (publishedAtDate, date, …). Used for the monthly trend, the last-90-days comparison and the date filter."
          },
          "ownerReplyField": {
            "title": "Owner reply field",
            "type": "string",
            "description": "Leave empty to auto-detect (responseFromOwnerText, ownerResponse, …). Used for “unanswered” and the reply queue."
          },
          "placeNameField": {
            "title": "Place name field",
            "type": "string",
            "description": "Leave empty to auto-detect (title, placeName). Not `name` — in review datasets that is usually the reviewer."
          },
          "complaintThreshold": {
            "title": "Complaint threshold",
            "minimum": 0.05,
            "maximum": 0.95,
            "type": "number",
            "description": "Minimum probability (0–1) for a complaint type, the owner-reply flag or a custom label to be reported. Raise it for fewer, surer labels.",
            "default": 0.5
          },
          "suspectedThreshold": {
            "title": "Sponsored-post threshold",
            "minimum": 0.5,
            "maximum": 0.9,
            "type": "number",
            "description": "Minimum promotion score (0–1) for a blog post that does not state a sponsorship to be labelled `suspected`. 0.8 flags only posts that read like brochures and rarely points at an honest author; 0.7 finds more but also flags ordinary enthusiastic reviews. The score is always in `sponsorPromotionalScore`.",
            "default": 0.8
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "full",
              "minimal"
            ],
            "type": "string",
            "description": "Minimal mode returns only label keys — smaller and easier to aggregate.",
            "default": "full"
          },
          "summaryGroupField": {
            "title": "Summary: group by field",
            "type": "string",
            "description": "Field in your dataset that identifies the business (e.g. `placeId`, `title`). The run then saves a REPORT record with, per place: complaint rate and complaint mix, sentiment shares, average rating, reviews needing an owner reply (and how many are still unanswered) and 3 example complaints. Leave empty to detect it automatically. No extra charge."
          },
          "monitorKey": {
            "title": "Monitor key (compare with the last run)",
            "maxLength": 64,
            "type": "string",
            "description": "Any name for this watch list, e.g. `my-stores`. Run again with the same key and each place row gets `previousRunAt`, `ratingDelta`, `newReviews`, `newCriticalIssues` and `unrepliedDelta` (change since the last run with that key; the first run only saves the baseline). Leave empty to switch comparison off. Only summary figures are stored (average rating, review count, newest review date, unanswered count), never review text, names or IDs, in a key-value store named `monitor-naver-place-reviews` in your account. No extra charge."
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 40,
            "type": "integer",
            "description": "Reviews classified in parallel.",
            "default": 10
          },
          "healthCheck": {
            "title": "Health check mode (internal)",
            "type": "boolean",
            "description": "Internal: fail the run when results look degraded (used by the developer's scheduled checks).",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}