{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Reviews Analysis AI - complaints, praise & contacts",
    "description": "First 25 businesses free. Google reviews analysis per business: recurring complaints, praise, owner reply rate, a reputation-risk score, verified contacts and an AI opener. Pay only for businesses that qualify.",
    "version": "0.1",
    "x-build-id": "iyhSWFSShfl4L2tUM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~google-reviews-insights/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-google-reviews-insights",
        "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/rich_minds~google-reviews-insights/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-google-reviews-insights",
        "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/rich_minds~google-reviews-insights/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-google-reviews-insights",
        "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": [
          "sourceMode"
        ],
        "properties": {
          "campaignPreset": {
            "title": "Campaign preset (optional)",
            "enum": [
              "custom",
              "reputation-agency",
              "local-seo-agency",
              "owner-self-audit",
              "customer-experience-saas"
            ],
            "type": "string",
            "description": "Start from a ready-made campaign: fills the goal, offer, filters and target opportunities below - anything you type yourself always wins. <b>Custom</b> = use only what you enter.",
            "default": "custom"
          },
          "sourceMode": {
            "title": "Where do the reviews come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> - run a Google Maps reviews source on your account (its usage is billed separately) and analyse its output. <b>dataset</b> - analyse an existing dataset from the Google Maps Reviews Scraper or the Google Maps Scraper (with reviews). <b>list</b> - paste rows yourself. The form starts on the <b>free demo</b> (sample rows below, nothing charged); switch to <b>actor</b> to analyse your own places.",
            "default": "actor"
          },
          "discoveryActorId": {
            "title": "Source Actor",
            "type": "string",
            "description": "<b>actor</b> mode. Default <code>compass/Google-Maps-Reviews-Scraper</code> (reviews for places you name). Use <code>compass/crawler-google-places</code> to search by category + city and get websites and phones too - that is what the contact enrichment needs.",
            "default": "compass/Google-Maps-Reviews-Scraper"
          },
          "discoveryInput": {
            "title": "Source Actor input",
            "type": "object",
            "description": "<b>actor</b> mode. Reviews scraper: <code>startUrls</code> (Google Maps place URLs) or <code>placeIds</code>. Google Maps scraper: <code>searchStringsArray</code> + <code>locationQuery</code> (+ <code>maxCrawledPlacesPerSearch</code>). <code>maxReviews</code>, <code>reviewsSort: newest</code> and no reviewer personal data are set for you."
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the source Actor run may charge your account (≈ $0.02 per business with 30 reviews on the Google Maps Reviews Scraper). Default $2 — also for API and MCP calls that omit it.",
            "default": 2
          },
          "maxReviewsPerBusiness": {
            "title": "Reviews analysed per business",
            "minimum": 3,
            "maximum": 200,
            "type": "integer",
            "description": "How many of the newest reviews per business are kept and shown to the AI. More = better themes, more tokens.",
            "default": 30
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "<b>dataset</b> mode. Output of the Google Maps Reviews Scraper (one row per review) or the Google Maps Scraper with reviews (one row per place)."
          },
          "itemsList": {
            "title": "Rows to analyse",
            "type": "array",
            "description": "<b>list</b> mode. Either review rows (<code>placeId</code>, <code>title</code>, <code>stars</code>, <code>text</code>, <code>publishedAtDate</code>, <code>responseFromOwnerText</code>…) or place rows with a <code>reviews</code> array (<code>title</code>, <code>website</code>, <code>phone</code>, <code>totalScore</code>, <code>reviewsCount</code>, <code>reviews: [{stars, text}]</code>)."
          },
          "defaultCountryCode": {
            "title": "Default country code",
            "type": "string",
            "description": "Two-letter country used to normalise phone numbers when a row has no country.",
            "default": "US"
          },
          "goalDescription": {
            "title": "What are you looking for?",
            "type": "string",
            "description": "Describe the businesses you want. The AI scores every business against this. Example: <i>Restaurants and clinics rated 3.5-4.3 whose reviews show recurring service complaints the owner ignores.</i>"
          },
          "offerDescription": {
            "title": "What do you offer / do with them?",
            "type": "string",
            "description": "One or two sentences on your offer. Used to judge fit, write the talking points and the outreach opener."
          },
          "minReviewsPerBusiness": {
            "title": "Minimum reviews to analyse",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Skip businesses with fewer reviews than this in the sample (nothing to analyse).",
            "default": 3
          },
          "minRating": {
            "title": "Minimum Google rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Drop businesses rated below this (0 = no filter).",
            "default": 0
          },
          "maxRating": {
            "title": "Maximum Google rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Drop businesses rated above this - e.g. 4.3 to keep only those with a reputation problem (0 = no filter).",
            "default": 0
          },
          "targetFlags": {
            "title": "Target opportunities (any of)",
            "type": "array",
            "description": "Only deliver businesses that have at least one of these findings, and rank those with more of them higher. Leave empty to keep every business. Available: <code>low_rating</code>, <code>mediocre_rating</code>, <code>few_reviews</code>, <code>recent_negative_reviews</code>, <code>negative_share_high</code>, <code>unanswered_negative_reviews</code>, <code>low_owner_response_rate</code>, <code>rating_trend_down</code>, <code>no_reviews_analysed</code>, <code>no_website</code>, <code>website_unreachable</code>, <code>no_email_found</code>, <code>no_online_booking</code>, <code>no_chat_widget</code>, <code>no_analytics</code>, <code>no_ads_pixel</code>, <code>slow_website</code>, <code>site_builder_template</code>, <code>closed</code>.",
            "items": {
              "type": "string"
            }
          },
          "requireEmail": {
            "title": "Require an email address",
            "type": "boolean",
            "description": "Only deliver (and charge) businesses where an email was found on their website. Needs a source that provides websites.",
            "default": false
          },
          "minScore": {
            "title": "Minimum score (0-100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Businesses scoring below this are discarded and <b>not charged</b>.",
            "default": 50
          },
          "skipClosedPlaces": {
            "title": "Skip closed businesses",
            "type": "boolean",
            "description": "Drop places marked temporarily or permanently closed.",
            "default": true
          },
          "enrichWebsite": {
            "title": "Crawl each website for contacts & signals",
            "type": "boolean",
            "description": "Visit the business website (home + contact/about pages) for emails, phones, WhatsApp, social profiles, owner names, tech stack, booking, chat, tracking pixels and a speed grade. Only for rows that carry a website.",
            "default": true
          },
          "maxPagesPerSite": {
            "title": "Max pages per website",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Homepage plus up to this many contact/about pages.",
            "default": 3
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Skip pages the site's robots.txt disallows.",
            "default": true
          },
          "verifyEmails": {
            "title": "Verify email domains (MX check)",
            "type": "boolean",
            "description": "Check that each email's domain can receive mail. Free; removes dead addresses.",
            "default": true
          },
          "emailVerifier": {
            "title": "Mailbox verification service (optional)",
            "enum": [
              "none",
              "millionverifier",
              "neverbounce"
            ],
            "type": "string",
            "description": "Mailbox-level verification with <b>your own</b> MillionVerifier or NeverBounce account, on top of the MX check. At most 2 addresses per business are checked.",
            "default": "none"
          },
          "emailVerifierApiKey": {
            "title": "Mailbox verifier API key",
            "type": "string",
            "description": "Required when a verification service is selected. Stored encrypted by Apify, never logged."
          },
          "excludeFreeEmailProviders": {
            "title": "Ignore free-provider emails",
            "type": "boolean",
            "description": "Drop gmail / yahoo / hotmail style addresses.",
            "default": false
          },
          "enableAi": {
            "title": "AI reputation analysis & outreach",
            "type": "boolean",
            "description": "Recurring complaints, praise themes, three talking points, a reputation-risk score, the fit score with reasons, the decision-maker and a personalised opener. Off = rule-based metrics only (cheaper).",
            "default": true
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "<b>Apify (no keys)</b> - the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> - use your OpenAI / Anthropic / Gemini / Groq key instead.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (Claude Haiku 4.5). Apify mode takes an OpenRouter slug such as <code>anthropic/claude-haiku-4.5</code> or <code>openai/gpt-4.1-mini</code>. Own-key mode takes <code>provider:model</code>."
          },
          "llmApiKey": {
            "title": "Your API key (own-key mode only)",
            "type": "string",
            "description": "Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged."
          },
          "outreachChannel": {
            "title": "Outreach channel",
            "enum": [
              "email",
              "sms",
              "whatsapp",
              "dm",
              "call"
            ],
            "type": "string",
            "description": "The opener is written for this channel. Email also gets a subject line.",
            "default": "email"
          },
          "outreachTone": {
            "title": "Outreach tone",
            "enum": [
              "friendly",
              "professional",
              "direct"
            ],
            "type": "string",
            "description": "Voice of the generated opener.",
            "default": "friendly"
          },
          "aiCandidateMultiplier": {
            "title": "AI candidate pool (x max qualified)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many of the highest rule-scored businesses get the AI pass, as a multiple of <b>Max qualified</b>.",
            "default": 2
          },
          "deepResearch": {
            "title": "Deep research (agentic mode)",
            "type": "boolean",
            "description": "Let the AI open the business's web page and run a web search before scoring, to verify claims and fill gaps. More tokens and a small web-search charge per call. Off = the AI sees only the record.",
            "default": false
          },
          "maxToolCallsPerItem": {
            "title": "Max research calls per business",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Hard cap on page fetches + web searches the AI may make for one business in deep-research mode.",
            "default": 3
          },
          "maxQualified": {
            "title": "Max qualified businesses to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on results (and therefore on what you pay for). The best-scoring businesses are output first.",
            "default": 100
          },
          "maxToProcess": {
            "title": "Max businesses to process",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Upper bound on how many businesses are enriched/scored in one run. Default = 3 x max qualified."
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same business twice",
            "type": "boolean",
            "description": "Remembers every business you received (in a named key-value store on your account) and skips it in future runs.",
            "default": true
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for cross-run memory. Use different names for different campaigns.",
            "default": "google-reviews-insights-seen"
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Every qualified business is POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets / Slack use Apify's Integrations tab."
          },
          "webhookHeaders": {
            "title": "Webhook headers (optional)",
            "type": "object",
            "description": "Extra HTTP headers for the webhook, e.g. an Authorization header."
          },
          "proxyConfiguration": {
            "title": "Proxy for website crawling",
            "type": "object",
            "description": "Apify Proxy is recommended so website crawling is not blocked."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}