{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Review Classifier — complaints, no login · $0.5/1k",
    "description": "Google Maps reviews toolkit by LeoWorks — review analysis: complaints, praise, sentiment, reply queue. For leads use leoworks/google-maps-lead-qualifier. places = Maps URLs/IDs or names + location; datasetId = reviews. ~25 s/place, ~$1.10/1,000 (compass billed to you).",
    "version": "0.2",
    "x-build-id": "gRJmXlQ2jaQysZZJe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/leoworks~google-maps-review-classifier/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-leoworks-google-maps-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~google-maps-review-classifier/runs": {
      "post": {
        "operationId": "runs-sync-leoworks-google-maps-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~google-maps-review-classifier/run-sync": {
      "post": {
        "operationId": "run-sync-leoworks-google-maps-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": {
          "places": {
            "title": "Places (collect the reviews for me) — Google Maps URL preferred",
            "type": "array",
            "description": "One place per line, up to 20. PREFERRED: the place's Google Maps URL or place ID (starts with ChIJ) — it names the exact branch, and you can leave “Location” below empty. For a URL, open the place on Google Maps and copy the full address-bar URL (the long one with “data=!…”), or the “cid” / “place_id” form; search-result pages and coordinates-only URLs do not work. ALTERNATIVE: a brand or business name (“Joe's Pizza”, “Starbucks Gangnam Station”) — then “Location” (city, country) is REQUIRED, or the run stops before collecting anything. HOW A NAME IS MATCHED: Google Maps is searched for that name inside the Location, and the FIRST result is taken — one place only. A bare chain name (“Starbucks”) therefore gives one arbitrary branch of that city; name the branch, or use its URL. The run log lists the places found with their addresses, and every row has placeAddress. The Actor then collects the newest reviews and classifies them. Collection is done by compass' Google Maps scraper (compass/crawler-google-places), a separate Actor that Apify bills to your account — about $0.006 per place + $0.0005 per review (its price, may change); this Actor adds $0.0005 per classified review. All-in about $1.10 per 1,000 reviews (about $0.06 for one place with 50 reviews); the estimate is shown in the run log before anything is collected. Reviewer names and profiles are never collected. Use this OR “Reviews dataset”. If “Places” is set, any pasted “Review texts” are ignored. The two pre-filled URLs are examples (Joe's Pizza Broadway, Katz's Delicatessen) — replace them with your own places.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location (city, country) — required for names, not needed for URLs",
            "type": "string",
            "description": "Where to search for the brand or business names in “Places”, for example “Seoul, South Korea” or “Chicago, USA” — one location per run; city + country works best. Required when any line in “Places” is a name. Leave empty when all lines are Google Maps URLs or place IDs (they already identify the exact place). Names in different cities: use their URLs or place IDs instead."
          },
          "datasetId": {
            "title": "Reviews dataset (instead of Places)",
            "type": "string",
            "description": "An Apify dataset containing Google Maps reviews — for example the output of a Google Maps reviews scraper. Use this OR “Places” (not both); it takes priority over “Review texts”."
          },
          "texts": {
            "title": "Review texts (paste instead of Places or a dataset)",
            "type": "array",
            "description": "Paste review texts directly (one per line) when you already have them and do not want to use a dataset. Ignored when “Places” 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 — Google Maps 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
          },
          "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."
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}