{
  "openapi": "3.0.1",
  "info": {
    "title": "LLM Visibility Monitor: AI Search Brand Audit",
    "description": "See whether AI models recommend your brand. Asks real buyer questions (without naming you) to the API models behind ChatGPT, Claude, Gemini, Perplexity and Grok, with or without live web search, and reports mentions, cited sources, competitor share and changes since your last run.",
    "version": "0.10",
    "x-build-id": "OIkYeGELQCdUoKCUY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/constructive_calm~llm-visibility-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-constructive_calm-llm-visibility-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/constructive_calm~llm-visibility-monitor/runs": {
      "post": {
        "operationId": "runs-sync-constructive_calm-llm-visibility-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/constructive_calm~llm-visibility-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-constructive_calm-llm-visibility-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",
        "required": [
          "brandName"
        ],
        "properties": {
          "brandName": {
            "title": "Brand name",
            "type": "string",
            "description": "The brand, product, or company to audit. It is never added to the questions sent to AI models; it is only used to find the brand in their answers."
          },
          "websiteUrl": {
            "title": "Website URL",
            "type": "string",
            "description": "Your own site, used to detect when AI answers cite it (subdomains count). Example: https://www.hubspot.com"
          },
          "marketCategory": {
            "title": "Market category",
            "type": "string",
            "description": "What buyers call your category. The Actor uses it to write buyer questions (best-for, alternatives, comparisons, pricing, how-to, local) in your language, once, and reuses the same set on later runs.\n\nExamples:\n• CRM software\n• project management tools\n• dentists in Austin\n\nWithout a category (and without custom prompts) only built-in questions that name the brand are available."
          },
          "brandAliases": {
            "title": "Brand aliases",
            "type": "array",
            "description": "Other names that count as your brand: product names, abbreviations, old names. Example: HubSpot CRM, Hubspot Sales Hub",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "caseSensitiveBrand": {
            "title": "Brand is an ordinary word?",
            "enum": [
              "auto",
              "yes",
              "no"
            ],
            "type": "string",
            "description": "Brands like Notion, Linear, or Monday are also ordinary words. With \"Auto\" the Actor detects common-word brands and then only counts the capitalised name used as a brand (\"Notion is...\"), not \"the notion of\".",
            "default": "auto"
          },
          "competitors": {
            "title": "Competitors",
            "type": "array",
            "description": "Competitor names, domains, or URLs. They are never added to your unbranded questions; they are only detected in answers so you get a like-for-like mention rate.\n\nExamples:\n• Salesforce\n• pipedrive.com\n• https://www.rightmove.co.uk/",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "prompts": {
            "title": "Custom questions",
            "type": "array",
            "description": "Questions to ask, exactly as a buyer would type them. Leave empty and the Actor generates a buyer-question set for your category with AI (about 4 in 5 never name your brand), saves it, and asks the same questions on every later run so trends stay comparable. Custom questions replace the generated set. Questions that name your brand are tagged \"branded\" and kept out of the headline numbers.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "addGeneratedQuestions": {
            "title": "Add generated questions after my custom ones",
            "type": "boolean",
            "description": "Only matters when you give custom questions: fill the remaining question slots (up to the question count) with the saved AI-generated set. Your questions always come first.",
            "default": false
          },
          "regeneratePrompts": {
            "title": "Write a new question set",
            "type": "boolean",
            "description": "Replace the saved AI-generated question set for this brand, category, country, and language with a new one. A new set means earlier runs asked different questions, so \"won / lost since last run\" restarts for them. One-shot: if you leave it on in a saved task or schedule, it regenerates once for the current inputs and later runs reuse that set.",
            "default": false
          },
          "audience": {
            "title": "Who buys (optional, for generated questions)",
            "type": "string",
            "description": "Optional hint for the question generator, used when a new set is written. It is never sent to the AI surfaces being audited. Example: small marketing agencies and freelancers"
          },
          "useCases": {
            "title": "Buyer use cases (optional, for generated questions)",
            "type": "array",
            "description": "Optional hints for the question generator, used when a new set is written.\n\nExamples:\n• tracking deals for a 5-person sales team\n• managing leads for a real estate agency",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "maxPrompts": {
            "title": "Number of questions (cost multiplier)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Optional override. Leave empty to use the preset: Quick 5, Agency 10, Deep 25."
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language of the questions and answers. Generated question sets are written in this language (built-in fallback questions exist for English, Spanish, German, French, Portuguese, and Arabic). Sentiment and \"the AI does not know the brand\" detection are analysed in English, Spanish, German, French, Portuguese, Italian, and Arabic. You can type another language code: mentions, positions, and citations are still measured, but sentiment and absence detection only recognise the languages above.",
            "default": "en"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Where the buyer is. Every surface is told \"The user is located in <country>\", and web-search surfaces bias results to it. Two-letter code.",
            "default": "US"
          },
          "runPreset": {
            "title": "Preset (major cost driver)",
            "enum": [
              "quick",
              "agency",
              "deep",
              "custom"
            ],
            "type": "string",
            "description": "Sets the question count, AI surfaces, and samples per question. Anything you set below overrides the preset. Prices include the report; the question set is free.",
            "default": "quick"
          },
          "platforms": {
            "title": "AI surfaces",
            "type": "array",
            "description": "Leave empty to use the preset's surfaces. \"Web search\" surfaces search the live web and cite sources; \"model knowledge\" surfaces answer from training data only. Older keys (openai-gpt, claude-sonnet, gemini-flash, perplexity-sonar) still work and map to the new surfaces.",
            "items": {
              "type": "string",
              "enum": [
                "chatgpt-free",
                "chatgpt",
                "perplexity",
                "gemini",
                "claude",
                "grok",
                "openai-mini",
                "claude-haiku",
                "gemini-pro",
                "perplexity-sonar-pro",
                "openai-gpt",
                "claude-sonnet",
                "gemini-flash",
                "perplexity-sonar"
              ],
              "enumTitles": [
                "ChatGPT Free model (GPT Luna, web search) - standard",
                "ChatGPT paid model (GPT Sol, web search) - premium",
                "Perplexity (Sonar, native search) - standard",
                "Gemini (3.5 Flash, model knowledge) - standard",
                "Claude (Sonnet, web search) - premium",
                "Grok (latest, model knowledge) - standard",
                "OpenAI GPT Mini (web search) - standard",
                "Claude Haiku (web search) - standard",
                "Gemini Pro (model knowledge) - premium",
                "Perplexity Sonar Pro (native search) - premium",
                "Legacy key: openai-gpt (= ChatGPT paid model)",
                "Legacy key: claude-sonnet (= Claude)",
                "Legacy key: gemini-flash (= Gemini)",
                "Legacy key: perplexity-sonar (= Perplexity)"
              ]
            },
            "default": []
          },
          "samplesPerPrompt": {
            "title": "Samples per question (cost multiplier)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Optional override. Leave empty for the preset: Quick 1, Agency 2, Deep 2. With 2 or more samples, answers vary naturally and the report measures consistency across them."
          },
          "maxChargeUsd": {
            "title": "Maximum Actor charge (USD)",
            "minimum": 0,
            "type": "number",
            "description": "Optional hard ceiling for this run's audit charges. Leave empty to auto-scale to 1.5x the estimate. If the estimate is above your ceiling, no AI questions are sent. During the run, the Actor stops starting new samples before it would pass the ceiling."
          },
          "openRouterApiKey": {
            "title": "OpenRouter API key (optional, bring your own)",
            "type": "string",
            "description": "Optional. With your own key, AI provider costs go to your OpenRouter account and each sample is billed at the lower BYOK price. Leave empty to use the Actor's bundled access."
          },
          "includeRawAnswers": {
            "title": "Include full answers",
            "type": "boolean",
            "description": "Add the complete AI answer text to each row. Off by default to keep exports compact (every row already has a 900-character snippet).",
            "default": false
          },
          "dryRun": {
            "title": "Demo mode (fake sample answers, no AI calls, no charge)",
            "type": "boolean",
            "description": "Generates clearly labelled fake answers so you can see the output format for free. Every demo row has demo: true and the report carries a DEMO banner. Leave off for a real audit.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}