{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Reviews Analysis AI - complaints, praise & contacts",
    "description": "First 25 businesses free. Google reviews analysis: recurring complaints, praise, reply rate, risk score, verified contacts and an AI opener per business. We charge only for businesses that qualify. Free demo on any plan; live search runs on your Apify account, any plan that runs Store Actors.",
    "version": "0.2",
    "x-build-id": "bveeBhXbU5yEm0GY9"
  },
  "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",
        "properties": {
          "placeUrls": {
            "title": "Google Maps places to analyse",
            "type": "array",
            "description": "Paste Google Maps place links (Share → Copy link) or place ids, one per line. Your places replace the sample and start the live analysis — the Google Maps Reviews Scraper runs on your Apify plan (a plan that runs Store Actors), capped by <b>Max source spend</b>. Empty: a goal naming a category and a city (<i>dentists in Austin, TX</i>) searches Google Maps for you.",
            "items": {
              "type": "string"
            }
          },
          "goalDescription": {
            "title": "What are you looking for?",
            "type": "string",
            "description": "Describe the businesses you want in plain words. The AI scores every business against this and explains why. Example: <i>Clinics rated 3.5–4.3 whose reviews complain about waits the owner ignores.</i>"
          },
          "preset": {
            "title": "Start from a ready campaign (one click)",
            "enum": [
              "custom",
              "reputation-agency",
              "local-seo-agency",
              "owner-self-audit",
              "customer-experience-saas"
            ],
            "type": "string",
            "description": "Pick a campaign: it fills the goal, offer, rating filter and target opportunities you left empty. Your own values always win. <b>Custom</b> = fill the fields yourself. The 0.1 name <code>campaignPreset</code> still works over the API.",
            "default": "custom"
          },
          "minScore": {
            "title": "Minimum score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The field that decides what you pay: businesses scoring below this are discarded and <b>not charged</b>. Raise it to pay only for the strongest matches, lower it to see more.",
            "default": 50
          },
          "maxQualified": {
            "title": "Max qualified businesses to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on results — and the ceiling of what <b>this Actor</b> charges: at most this many × $0.009 with AI on (× $0.001 with AI off), e.g. 100 × $0.009 = $0.90; the source's own spend has its cap right below. The best-scoring businesses are output first.",
            "default": 100
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Affects what you pay: hard cap on what the Google Maps Reviews Scraper run may charge your account (≈ $0.02 per business with 30 reviews) — $0.50 in the form and for an API or agent call that leaves it out. Raise it for more places.",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI reputation analysis & outreach",
            "type": "boolean",
            "description": "Recurring complaints, praise themes, three talking points, an AI risk score, the fit score with reasons and a personalised opener. <b>On = $0.009 per qualified business + AI tokens; off = $0.001</b> (rule-based metrics only). Your first 5 businesses get live AI verdicts on any plan; every one with Apify model access or a paid own key.",
            "default": true
          },
          "notifyEmail": {
            "title": "E-mail me the new businesses (optional)",
            "type": "string",
            "description": "After every run with at least one new business, the digest (how many are new, the top 10 with links) is e-mailed here through Apify's send-mail Actor. Schedule the run weekly and only the new businesses reach your inbox. Never sent for the free demo."
          },
          "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."
          },
          "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 everything. An API call passes the names from the README's flag table, e.g. <code>unanswered_negative_reviews</code> (<code>unansweredNegativeReviews</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "items": {
              "type": "string",
              "enum": [
                "low_rating",
                "mediocre_rating",
                "few_reviews",
                "recent_negative_reviews",
                "negative_share_high",
                "unanswered_negative_reviews",
                "low_owner_response_rate",
                "rating_trend_down",
                "no_reviews_analysed",
                "no_website",
                "website_unreachable",
                "no_email_found",
                "no_online_booking",
                "no_chat_widget",
                "no_analytics",
                "no_ads_pixel",
                "slow_website",
                "site_builder_template",
                "closed"
              ],
              "enumTitles": [
                "Google rating below 4.0",
                "Google rating 4.0–4.3",
                "Fewer than 10 Google reviews",
                "2+ negative (≤3★) reviews in the sample",
                "A third or more of the reviews are negative",
                "Negative reviews the owner never answered",
                "Owner replies to under a third of reviews",
                "Recent reviews well below the overall rating",
                "No review text to analyse",
                "No website listed",
                "Website listed but did not load",
                "No e-mail found on the website",
                "No online booking / ordering",
                "No live chat / WhatsApp widget",
                "No analytics tracking",
                "No ad pixel (not running paid ads)",
                "Slow or heavy homepage (grade D/F)",
                "Built on a basic site builder",
                "Temporarily or permanently closed"
              ]
            }
          },
          "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
          },
          "minRating": {
            "title": "Minimum Google rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Drop businesses rated below this (0 = no filter).",
            "default": 0
          },
          "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
          },
          "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
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Business names, Google Maps URLs, place ids or website domains to never output — your clients, say. Skipped before any processing and never charged.",
            "items": {
              "type": "string"
            }
          },
          "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
          },
          "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; a free-tier key assesses only a few businesses per run — expect 1–3 AI checks (2 calls at a time, one after a rate limit, then the 3 borderline businesses retried one by one) — and the rest keep their rule score; a paid Groq / Gemini key (billing on) assesses every business.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>anthropic/claude-haiku-4.5</code>). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</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"
          },
          "deepResearch": {
            "title": "Deep research (agentic mode)",
            "type": "boolean",
            "description": "Affects what you pay: lets 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 on your account. Off = the AI sees only the record.",
            "default": false
          },
          "sendAlertsTo": {
            "title": "Send alerts to (Slack, Discord, Teams, Google Chat, Telegram or webhook)",
            "type": "string",
            "description": "Paste one or more URLs, one per line — the service is detected from the address: a Slack or Discord channel webhook, a Teams Workflows or Google Chat space webhook, your Telegram bot's send link (<code>https://api.telegram.org/bot&lt;token&gt;/sendMessage?chat_id=@yourchannel</code>) or any other https URL (Zapier, Make, n8n, your CRM), which gets the businesses as JSON. After every run with at least one new business, the digest (how many are new, the top 10 with links) is posted there. Never sent for the free demo. Headers, batching and signing: <i>Delivery details (advanced)</i>."
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same business twice",
            "type": "boolean",
            "description": "Remembers every business you were charged for (in a named key-value store on your account) and skips it in future runs.",
            "default": true
          },
          "dedupeTtlDays": {
            "title": "Deliver a business again after (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "How long a delivered business stays remembered. 0 = never deliver or charge it again. A number of days (e.g. 90) brings a business back with its newest reviews after that many days — charged again as a new business.",
            "default": 0
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>google-reviews-insights-log</code>) and every run appends its new businesses with the date to that named dataset on your account — one list across months to connect to Google Sheets or your BI tool once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "sourceMode": {
            "title": "Where do the reviews come from?",
            "enum": [
              "actor",
              "placesApi",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> — run <code>compass/Google-Maps-Reviews-Scraper</code> on your account (up to 30 newest reviews per place, owner replies included), billed separately. <b>placesApi</b> — the official Google Places API with your own free Google Maps key (any plan; up to 5 reviews per place, no owner replies). <b>dataset</b> — an existing Apify dataset. <b>list</b> — review rows you paste in. <b>Bring your own data:</b> rows or a dataset ID, and you pay only for the analysis — the source Actor is never run. The mode you choose always runs as chosen; only the untouched sample rows next to places you typed switch to the live analysis (spend-capped). <code>{}</code> over the API runs the free demo — nothing charged.",
            "default": "actor"
          },
          "autoSwitchToLive": {
            "title": "Typed places next to the sample start the live analysis",
            "type": "boolean",
            "description": "On (default): place URLs typed next to the untouched sample rows start the live analysis (spend-capped; <code>OUTPUT.switchedToLive</code> names them). Off: the mode you send is the mode that runs — the sample stays the free demo and the status names the places it did not search. API pipelines that must never start a paid read on their own: send <code>false</code>.",
            "default": true
          },
          "googleMapsApiKey": {
            "title": "Google Maps API key (only for the Google Places API source)",
            "type": "string",
            "description": "For <i>Google Places API with your free Google key</i>, and the automatic fallback when your Apify plan cannot run the scraper. Google Cloud → APIs &amp; Services → enable <b>Places API (New)</b> → Credentials → Create API key (Google asks for a billing account, even inside the free quota). Free: 1,000 places with reviews a month, then $25 per 1,000; the place search itself is free. Stored encrypted, used only for this run's calls to Google."
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <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). Pick it so the Actor is granted read access."
          },
          "itemsList": {
            "title": "Rows to analyse",
            "type": "array",
            "description": "Only for <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>). The prefilled rows are the free demo."
          },
          "discoveryActorId": {
            "title": "Source Actor (advanced)",
            "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": "Only for <b>actor</b> and <b>placesApi</b> mode — the raw input passed to the source Actor, merged with <b>Google Maps places to analyse</b>. Google Maps Scraper (<code>compass/crawler-google-places</code>): <code>searchStringsArray</code> + <code>locationQuery</code> to search a category in a city. <code>maxReviews</code>, <code>reviewsSort: newest</code> and no reviewer personal data are set for you. The live search runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, paste your own rows in <b>list</b> mode (any plan)."
          },
          "maxReviewsPerBusiness": {
            "title": "Reviews analysed per business",
            "minimum": 3,
            "maximum": 200,
            "type": "integer",
            "description": "Affects what you pay: how many of the newest reviews per business are scraped (≈ $0.0006 each on the source), kept and shown to the AI. More = better themes, more tokens.",
            "default": 30
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified businesses are POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets / Slack you can also use Apify's built-in Integrations tab. Stored encrypted — Zapier / Make hook URLs carry their secret in the path."
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for cross-run memory. Left at the default, the memory is kept per search (source and filters): rewording <code>goalDescription</code> or adding a place keeps it, so a scheduled run never re-delivers what you already have. Running it for several clients on one account, type one name per client.",
            "default": "google-reviews-insights-seen"
          },
          "discoveryTimeoutSecs": {
            "title": "Source run timeout, seconds (API only)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "API only — hidden on the form. How long the source Store Actor may run before its partial results are used. Raise it when the status says the source stopped early.",
            "default": 3600
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Slack incoming-webhook URL for the digest."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Discord channel webhook URL for the digest."
          },
          "teamsWebhookUrl": {
            "title": "Microsoft Teams webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Teams Workflows webhook URL for the digest."
          },
          "googleChatWebhookUrl": {
            "title": "Google Chat webhook URL (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. Google Chat space webhook URL for the digest."
          },
          "telegramUrl": {
            "title": "Telegram sendMessage link (API only)",
            "type": "string",
            "description": "API only — hidden on the form, where <code>sendAlertsTo</code> takes it. The bot's sendMessage link with its chat_id for the digest."
          },
          "maxToolCallsPerItem": {
            "title": "Max research calls per business (API only)",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "API only — hidden on the form. Hard cap on page fetches + web searches the AI may make for one business in deep-research mode.",
            "default": 3
          },
          "defaultCountryCode": {
            "title": "Default country code (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Two-letter country used to normalise phone numbers when a row has no country.",
            "default": "US"
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. Skip pages the site's robots.txt disallows.",
            "default": true
          },
          "maxPagesPerSite": {
            "title": "Max pages per website (API only)",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "API only — hidden on the form. Homepage plus up to this many contact/about pages.",
            "default": 3
          },
          "excludeFreeEmailProviders": {
            "title": "Ignore free-provider emails (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. Drop gmail / yahoo / hotmail style addresses.",
            "default": false
          },
          "aiCandidateMultiplier": {
            "title": "AI candidate pool (x max qualified) (API only)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "API only — hidden on the form. Affects what you pay (AI tokens): how many of the highest rule-scored businesses get the AI pass, as a multiple of <b>Max qualified</b>. Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "maxToProcess": {
            "title": "Max businesses to process (API only)",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "API only — hidden on the form. Upper bound on how many businesses are enriched/scored in one run. Default = 3 x max qualified."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size (API only)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "API only — hidden on the form. 1 = one POST per business the moment it is ready. Higher = one POST per N businesses.",
            "default": 1
          },
          "webhookHeaders": {
            "title": "Webhook headers (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code>. Stored encrypted by Apify, never logged."
          },
          "proxyConfiguration": {
            "title": "Proxy for website crawling (API only)",
            "type": "object",
            "description": "API only — hidden on the form. Proxy for the website crawl. Apify Proxy is recommended so sites do not block the crawl."
          },
          "skipClosedPlaces": {
            "title": "Skip closed businesses (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. Drop places marked temporarily or permanently closed.",
            "default": true
          },
          "verifyEmails": {
            "title": "Verify email domains (MX check) (API only)",
            "type": "boolean",
            "description": "API only — hidden on the form. Check that each email's domain can receive mail. Free; removes dead addresses.",
            "default": true
          },
          "outreachTone": {
            "title": "Outreach tone (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Voice of the generated opener. One of <code>friendly</code>, <code>professional</code>, <code>direct</code>.",
            "default": "friendly"
          },
          "emailVerifier": {
            "title": "Mailbox verification service (API only)",
            "type": "string",
            "description": "API only — hidden on the form. 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. One of <code>none</code>, <code>millionverifier</code>, <code>neverbounce</code>.",
            "default": "none"
          },
          "emailVerifierApiKey": {
            "title": "Mailbox verifier API key (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Required when a verification service is selected. Stored encrypted by Apify, never logged."
          },
          "webhookSecret": {
            "title": "Webhook signing secret (API only)",
            "type": "string",
            "description": "API only — hidden on the form. Any random string. Every webhook POST then carries <code>X-Signature: sha256=&lt;HMAC-SHA256 of the raw body with this secret&gt;</code>, so your endpoint can verify it came from this Actor. Stored encrypted by Apify, never logged."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}