{
  "openapi": "3.0.1",
  "info": {
    "title": "AI Visibility Checker: Brand Mentions in AI Answers",
    "description": "Does AI recommend your brand? Ask your buyer questions through the OpenAI, Gemini and Claude APIs with your own keys (free mode: a free Gemini key, built-in knowledge only) and get mentions, citations, rank vs competitors, changes since last run and a plain-English report.",
    "version": "1.0",
    "x-build-id": "y0lDvECzqSVjV9OaG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/bottyprojects~ai-visibility-checker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-bottyprojects-ai-visibility-checker",
        "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/bottyprojects~ai-visibility-checker/runs": {
      "post": {
        "operationId": "runs-sync-bottyprojects-ai-visibility-checker",
        "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/bottyprojects~ai-visibility-checker/run-sync": {
      "post": {
        "operationId": "run-sync-bottyprojects-ai-visibility-checker",
        "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",
          "queries"
        ],
        "properties": {
          "brandName": {
            "title": "Brand or business name",
            "type": "string",
            "description": "The name buyers would see in an AI answer. Variants are matched automatically: \"Example Paper Co.\" also matches \"ExamplePaperCo\" and \"example-paper-co\"."
          },
          "brandUrls": {
            "title": "Your URLs (website, Etsy shop, Amazon store …)",
            "type": "array",
            "description": "Used to detect when an AI answer cites you. Own domains match all their pages and subdomains. Marketplace URLs match only your shop: https://www.etsy.com/shop/YourShop (also matches yourshop.etsy.com and localized Etsy URLs), an Etsy listing URL (matches that listing), or an Amazon /stores/ page. A bare etsy.com or amazon.com is ignored because it would match every seller.",
            "items": {
              "type": "string"
            }
          },
          "brandAliases": {
            "title": "Other names (aliases)",
            "type": "array",
            "description": "Other names that count as a mention of you, e.g. an old shop name or a product line. Etsy shop names from your URLs are added automatically.",
            "items": {
              "type": "string"
            }
          },
          "competitors": {
            "title": "Competitors (optional)",
            "type": "array",
            "description": "One per line: \"Name | url | url | alias\". Parts that look like URLs/domains are used for citation matching; other parts are extra names. Example: \"Brand A | brand-a.example | alias:Brand A Planner\" or just an Etsy shop URL.",
            "items": {
              "type": "string"
            }
          },
          "queries": {
            "title": "Buyer queries",
            "type": "array",
            "description": "The questions your buyers ask AI assistants. Write them as a buyer would, without your brand name, e.g. \"What's the best printable gratitude journal?\". Each query is asked to each engine.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "free",
              "live"
            ],
            "type": "string",
            "description": "<b>Free mode</b> needs only a free Gemini API key (Google AI Studio, no card). It asks Gemini without web search, so results show the AI's <b>built-in knowledge, not live search</b>. It runs one request at a time, spaces requests out and switches to a second free model if the first hits its daily limit. Not for users in the EEA, Switzerland or the UK, where Google allows only paid Gemini API use. On the free tier Google may use your questions and answers to improve its products, so don't include personal or confidential information. The engine and model settings below are ignored in free mode.<br><b>Live web search</b> uses the engines and API keys you choose below (paid keys usually needed).",
            "default": "free"
          },
          "engines": {
            "title": "AI engines",
            "type": "array",
            "description": "Live web search mode only (free mode always uses Gemini). Engines to ask. An engine is skipped (and logged) if you don't give its API key below.",
            "items": {
              "type": "string",
              "enum": [
                "chatgpt",
                "gemini",
                "claude"
              ],
              "enumTitles": [
                "OpenAI API (models behind ChatGPT) + web search",
                "Gemini (built-in knowledge, no web search)",
                "Claude (Anthropic API + web search)"
              ]
            },
            "default": [
              "chatgpt",
              "gemini",
              "claude"
            ]
          },
          "geminiApiKey": {
            "title": "Gemini API key",
            "type": "string",
            "description": "From Google AI Studio (aistudio.google.com/apikey). Free-tier keys work in free mode (not for users in the EEA, Switzerland or the UK, where a billing-enabled key is required). Gemini is always asked without Google Search. Stored encrypted; never logged or output."
          },
          "openaiApiKey": {
            "title": "OpenAI API key",
            "type": "string",
            "description": "From platform.openai.com. Billed by OpenAI to you (web search tool calls + tokens). Stored encrypted; never logged or output."
          },
          "anthropicApiKey": {
            "title": "Anthropic (Claude) API key",
            "type": "string",
            "description": "From platform.claude.com. Web search must be enabled for your organization. Billed by Anthropic to you. Stored encrypted; never logged or output."
          },
          "openaiModel": {
            "title": "OpenAI model",
            "type": "string",
            "description": "Any Responses-API model that supports the web_search tool. gpt-5-mini is cheap; use a flagship model to mirror ChatGPT more closely.",
            "default": "gpt-5-mini"
          },
          "geminiModel": {
            "title": "Gemini model",
            "type": "string",
            "description": "Default gemini-3.8-flash. Gemini answers from its built-in knowledge (no Google Search grounding) in every mode.",
            "default": "gemini-3.8-flash"
          },
          "claudeModel": {
            "title": "Claude model",
            "type": "string",
            "description": "Any Claude model that supports the web search tool.",
            "default": "claude-haiku-5-5"
          },
          "promptTemplate": {
            "title": "Prompt template",
            "type": "string",
            "description": "How each query is sent. {query} is replaced by the query. Keep \"{query}\" to ask exactly what a buyer would type.",
            "default": "{query}"
          },
          "samplesPerQuery": {
            "title": "Samples per query",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "AI answers vary. Ask each query this many times per engine (1–5) for a steadier picture. Each sample is one charged check and one API call on your key.",
            "default": 1
          },
          "country": {
            "title": "Searcher country",
            "type": "string",
            "description": "2-letter country code (e.g. US, GB) passed as approximate user location to OpenAI and Claude web search. Leave empty for none."
          },
          "freeModels": {
            "title": "Free mode: Gemini models to try, in order",
            "type": "array",
            "description": "Free mode starts with the first model and moves to the next when one hits its free daily limit or is not available to your key.",
            "default": [
              "gemini-3.8-flash",
              "gemini-3.6-flash",
              "gemini-3.5-flash-lite"
            ],
            "items": {
              "type": "string"
            }
          },
          "freeModeDelaySecs": {
            "title": "Free mode: seconds between requests",
            "minimum": 0,
            "maximum": 120,
            "type": "integer",
            "description": "Spacing between Gemini requests in free mode, to stay under the free per-minute limit.",
            "default": 6
          },
          "forceWebSearch": {
            "title": "Always search the web",
            "type": "boolean",
            "description": "Force a web search on OpenAI so every answer has sources. Turn off to let the model decide, as the consumer apps do. (Claude decides for itself; Gemini never searches the web.)",
            "default": true
          },
          "trackerId": {
            "title": "Tracker ID",
            "type": "string",
            "description": "Runs with the same tracker ID are compared to find changes (newly mentioned, dropped, rank changes). Letters, digits, - and _ only.",
            "default": "default"
          },
          "onlyChanges": {
            "title": "Only output changes",
            "type": "boolean",
            "description": "Output only answers whose result changed since the last run with this tracker ID (plus first-time baselines). Every check is still charged because the AI call was made; the summary record is always output.",
            "default": false
          },
          "includeFullAnswer": {
            "title": "Include full answer text",
            "type": "boolean",
            "description": "Store the whole AI answer in each row (answerText) as evidence. Off (default): only a short snippet.",
            "default": false
          },
          "snippetLength": {
            "title": "Snippet length",
            "minimum": 50,
            "maximum": 2000,
            "type": "integer",
            "description": "Characters of answer text around your first mention (or the answer start).",
            "default": 300
          },
          "maxConcurrencyPerEngine": {
            "title": "Parallel requests per engine",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Lower this if you hit your API rate limits (e.g. free Gemini or new API accounts).",
            "default": 2
          },
          "outputErrors": {
            "title": "Output error rows",
            "type": "boolean",
            "description": "Add a free row for each failed check (e.g. invalid key, rate limit) instead of only logging it.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}