{
  "openapi": "3.0.1",
  "info": {
    "title": "AI Brand Visibility Tracker — ChatGPT, Perplexity, Gemini",
    "description": "Ask the AI assistants the questions your customers ask, and see per answer whether your brand is mentioned, how it ranks against competitors, and which sources get cited. Bring your own API keys — no token markup.",
    "version": "0.1",
    "x-build-id": "KG9ab8T1rR8DEAQ0K"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alaudinburki~ai-brand-visibility-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alaudinburki-ai-brand-visibility-tracker",
        "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/alaudinburki~ai-brand-visibility-tracker/runs": {
      "post": {
        "operationId": "runs-sync-alaudinburki-ai-brand-visibility-tracker",
        "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/alaudinburki~ai-brand-visibility-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-alaudinburki-ai-brand-visibility-tracker",
        "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 to track",
            "type": "string",
            "description": "The brand or product name to look for in AI answers, e.g. Notion."
          },
          "brandAliases": {
            "title": "Brand aliases",
            "type": "array",
            "description": "Other names the AI might use for the same brand (old names, abbreviations, product lines). Counted as brand mentions.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "brandDomain": {
            "title": "Brand website domain (optional)",
            "type": "string",
            "description": "For citation analysis only, e.g. notion.so. Perplexity rows can then show whether an official brand domain was cited. Leave blank if you only want name mentions."
          },
          "competitors": {
            "title": "Competitors to compare against",
            "type": "array",
            "description": "Competitor names to track in the same answers. Rank is the order of first mention among your brand and these names.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "competitorDomains": {
            "title": "Competitor domains (optional)",
            "type": "object",
            "description": "Map each tracked competitor name to its official domain, e.g. {\"Evernote\": \"evernote.com\"}. Used only for provider-citation analysis.",
            "default": {}
          },
          "topic": {
            "title": "Topic (auto-generates questions)",
            "type": "string",
            "description": "What your customers would ask about, e.g. 'note-taking apps'. Generates a 5-question panel (best/recommend/compare/choose/list). Ignored if you supply custom prompts below."
          },
          "prompts": {
            "title": "Custom questions",
            "type": "array",
            "description": "Your own questions, one per line. If set, these replace the auto-generated panel.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "openaiApiKey": {
            "title": "OpenAI API key",
            "type": "string",
            "description": "Enables an OpenAI model answer (default gpt-4o-mini). This current mode does not enable web search; URLs are captured only when present in the answer. Your key is used only for your own queries."
          },
          "openaiWebSearch": {
            "title": "Use OpenAI live web search",
            "type": "boolean",
            "description": "Optional and off by default. Uses OpenAI's Responses API web_search tool, forces a live search for each question, and records provider-returned sources. This can cost more than a normal model answer.",
            "default": false
          },
          "anthropicApiKey": {
            "title": "Anthropic API key",
            "type": "string",
            "description": "Enables a Claude model answer (default model claude-sonnet-5). This current mode does not enable web search."
          },
          "perplexityApiKey": {
            "title": "Perplexity API key",
            "type": "string",
            "description": "Enables Perplexity answers (default model sonar). Perplexity searches the live web and returns citations — the strongest signal for who AI search recommends today."
          },
          "geminiApiKey": {
            "title": "Google Gemini API key",
            "type": "string",
            "description": "Enables a Gemini model answer (default model gemini-2.0-flash). This current mode does not enable web search."
          },
          "models": {
            "title": "Model overrides",
            "type": "object",
            "description": "Optional model per provider, e.g. {\"openai\": \"gpt-4o\", \"anthropic\": \"claude-opus-5\"}. Leave empty for the cost-efficient defaults.",
            "default": {}
          },
          "runsPerPrompt": {
            "title": "Samples per provider and question",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Repeat each provider-question pair to measure answer variation. Start with 1; use 5 or more before treating the displayed confidence range as a useful directional signal. Each sample uses your provider API and counts toward max answers.",
            "default": 1
          },
          "promptSetVersion": {
            "title": "Prompt-set version",
            "type": "string",
            "description": "Label this exact question panel, for example 2026-Q3. Change it when you intentionally change prompts, competitors, or measurement design; history comparisons will then safely start a new baseline.",
            "default": "1"
          },
          "historyStoreId": {
            "title": "History store ID or name (optional)",
            "type": "string",
            "description": "For recurring measurement, enter a reusable named Apify key-value store. The next compatible run then reports visibility and rank deltas. Leave blank for a one-off scan."
          },
          "historyKey": {
            "title": "History key",
            "type": "string",
            "description": "Use a different key for each brand or market panel that shares the same history store.",
            "default": "VISIBILITY_HISTORY"
          },
          "maxItems": {
            "title": "Maximum answers",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard limit on analyzed answers (providers × questions). Strictly enforced — you will never be charged for more than this.",
            "default": 100
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}