{
  "openapi": "3.0.1",
  "info": {
    "title": "AI Search Visibility Tracker",
    "description": "Ask ChatGPT, Perplexity, Claude and Gemini the questions your buyers ask and see how often your brand is mentioned, its rank in the answer, competitor share of voice and cited domains. Bring your own API keys. By Steadfeed.",
    "version": "0.2",
    "x-build-id": "xY1c7jilQUbbWSIF8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadfeed~ai-search-visibility-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadfeed-ai-search-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/steadfeed~ai-search-visibility-tracker/runs": {
      "post": {
        "operationId": "runs-sync-steadfeed-ai-search-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/steadfeed~ai-search-visibility-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-steadfeed-ai-search-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": [
          "brand",
          "providers"
        ],
        "properties": {
          "brand": {
            "title": "Brand name",
            "type": "string",
            "description": "The brand to track, e.g. \"Notion\". Matching is case-insensitive and on word boundaries."
          },
          "brandAliases": {
            "title": "Brand aliases",
            "type": "array",
            "description": "Other names that count as a brand mention (product names, old names, misspellings), e.g. \"Notion AI\".",
            "items": {
              "type": "string"
            }
          },
          "brandDomain": {
            "title": "Brand domain",
            "type": "string",
            "description": "Your website domain, e.g. notion.so. Used to check whether the AI cites your site. Subdomains count."
          },
          "competitors": {
            "title": "Competitors",
            "type": "array",
            "description": "Optional. Either plain names [\"Coda\", \"Obsidian\"] or objects [{\"name\": \"Coda\", \"aliases\": [\"Coda.io\"], \"domain\": \"coda.io\"}]. Up to 25."
          },
          "prompts": {
            "title": "Prompts",
            "type": "array",
            "description": "Questions to ask each AI, written the way a buyer would ask. Up to 100. Leave empty to generate prompts from category + keywords.",
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "Category (for generated prompts)",
            "type": "string",
            "description": "Used only when Prompts is empty, e.g. \"note-taking app\". Combined with templates like \"What is the best {category}?\"."
          },
          "keywords": {
            "title": "Keywords (for generated prompts)",
            "type": "array",
            "description": "Optional use cases combined with the category, e.g. \"for small teams\", \"for students\".",
            "items": {
              "type": "string"
            }
          },
          "providers": {
            "title": "AI providers",
            "type": "array",
            "description": "Which AI assistants to ask. Each selected provider needs your own API key below. AI usage is billed by that provider to your key.",
            "items": {
              "type": "string",
              "enum": [
                "openai",
                "perplexity"
              ],
              "enumTitles": [
                "OpenAI (ChatGPT models, no web citations)",
                "Perplexity (web search with citations)"
              ]
            }
          },
          "openaiApiKey": {
            "title": "OpenAI API key",
            "type": "string",
            "description": "Required if OpenAI is selected. Create one at https://platform.openai.com/api-keys (needs a few dollars of prepaid credit). Billed by OpenAI to you; stored encrypted by Apify and never written to the output."
          },
          "perplexityApiKey": {
            "title": "Perplexity API key",
            "type": "string",
            "description": "Required if Perplexity is selected. Create one at https://console.perplexity.ai (paid credit required; $10 minimum top-up). Billed by Perplexity to you; stored encrypted and never written to the output."
          },
          "models": {
            "title": "Model per provider",
            "type": "object",
            "description": "Optional overrides. Defaults: {\"openai\": \"gpt-6-luna\", \"perplexity\": \"sonar\"}. For Perplexity, \"sonar\" = Agent API effort \"fast\"; you can also use \"low\", \"medium\" or a provider/model id."
          },
          "runsPerPrompt": {
            "title": "Runs per prompt",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "AI answers vary from one ask to the next. Ask each prompt this many times per provider to measure how consistently your brand appears (3 is a good weekly setting).",
            "default": 1
          },
          "sentimentMode": {
            "title": "Sentiment",
            "enum": [
              "rules",
              "llm",
              "off"
            ],
            "type": "string",
            "description": "How to label the tone around the brand mention.",
            "default": "rules"
          },
          "maxConcurrency": {
            "title": "Max parallel calls",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Calls in flight at once, across providers.",
            "default": 3
          },
          "maxRetries": {
            "title": "Retries per call",
            "minimum": 0,
            "maximum": 6,
            "type": "integer",
            "description": "Retries on rate limits (429), timeouts and 5xx, with exponential backoff (honours Retry-After).",
            "default": 3
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (s)",
            "minimum": 10,
            "maximum": 300,
            "type": "integer",
            "description": "Per-call timeout.",
            "default": 90
          },
          "maxCalls": {
            "title": "Max AI calls per run",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Safety cap on prompts × providers × runs per prompt, so a typo can't run up your AI bill. The run stops before any AI call if the plan is bigger than this.",
            "default": 50
          },
          "dryRun": {
            "title": "Dry run (mock answers)",
            "type": "boolean",
            "description": "Use built-in fake answers instead of calling any AI. No keys needed. For testing the setup and output format.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}