{
  "openapi": "3.0.1",
  "info": {
    "title": "Brand Reviews Monitor",
    "description": "Monitor Google Maps reviews for any place and pipe new ones into Notion plus Slack notifications. AI agent dedupes by Review ID and posts per-review Slack messages. Export data, run via API, schedule and monitor runs, or integrate with other tools.",
    "version": "0.1",
    "x-build-id": "DDMpTuHRQdiBNUPc9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/luis.pinto~brand-reviews-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-luis.pinto-brand-reviews-monitor",
        "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/luis.pinto~brand-reviews-monitor/runs": {
      "post": {
        "operationId": "runs-sync-luis.pinto-brand-reviews-monitor",
        "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/luis.pinto~brand-reviews-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-luis.pinto-brand-reviews-monitor",
        "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": {
          "placeUrl": {
            "title": "Google Maps place URL (simple mode)",
            "type": "string",
            "description": "URL of the Google Maps place to monitor. The Actor scrapes the latest reviews via Apify's Google Maps Reviews Scraper. Must contain /maps/place, /maps/search, or /maps/reviews in the path. Any cafe, restaurant, store, or hotel works. To get one: search the place on Google Maps, click it, copy the browser URL. Either this OR sourceDatasetId is required (sourceDatasetId wins if both are set)."
          },
          "sourceDatasetId": {
            "title": "Reviews dataset ID (advanced mode)",
            "type": "string",
            "description": "Apify dataset ID of an EXISTING reviews scrape (e.g. from a scheduled run of Google Maps Reviews Scraper). When provided, the Actor skips scraping and reads the reviews directly from this dataset. Use this for composability: scrape once, sync to multiple destinations, or chain Actors via webhooks. Either this OR placeUrl is required. Overrides placeUrl when both are set."
          },
          "notionConnector": {
            "title": "Notion MCP Connector",
            "type": "string",
            "description": "Notion MCP Connector used to maintain the review-tracking database. The Actor creates the 'Brand Reviews Tracker' database on the first run, dedups by Review ID, and inserts new reviews only. Authorize a Notion Connector under Apify Console > Settings > API & Integrations > MCP Connectors, then add it to the page where the database should live."
          },
          "slackConnector": {
            "title": "Slack MCP Connector",
            "type": "string",
            "description": "Slack MCP Connector for notifications. When provided, the Actor posts a Slack message for every new review found this run (up to 5 individual messages plus a summary line for any extras). Leave blank to skip Slack notifications and only update the Notion database."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page URL (recommended)",
            "type": "string",
            "description": "URL of the Notion page where the review database should live. Strongly recommended. Without this, the search has to scan the workspace and may pick the wrong location. Create a Notion page (for example 'Brand Reviews'), add the Apify integration via the page menu > Connections, then paste the URL here."
          },
          "slackChannel": {
            "title": "Slack channel (optional)",
            "type": "string",
            "description": "Channel to post notifications to (for example '#brand-reviews', '#general'). Channel name with or without '#'."
          },
          "maxReviews": {
            "title": "Max reviews per run",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum reviews to scrape this run, sorted newest first. Only applies when scraping via placeUrl. When reading from sourceDatasetId, all items in the dataset are processed (Notion dedup ensures only new ones are inserted). Recommended: 50 for daily monitoring of small businesses; 200+ for backfill on busy places.",
            "default": 50
          },
          "reviewsStartDate": {
            "title": "Only scrape reviews newer than (optional)",
            "type": "string",
            "description": "Absolute date ('2024-05-03') or relative ('7 days', '1 month'). Restricts the scraper to reviews newer than this point. Only applies when scraping via placeUrl (ignored when reading from sourceDatasetId)."
          },
          "language": {
            "title": "Review language",
            "type": "string",
            "description": "Two-letter language code (for example 'en', 'pt', 'fr'). Affects review translation behavior. Only applies when scraping via placeUrl.",
            "default": "en"
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}