{
  "openapi": "3.0.1",
  "info": {
    "title": "SiteVerdict — AI Search Readiness Checker",
    "description": "Check if ChatGPT, Claude, Perplexity & Google AI Overviews can find and cite your site: robots.txt matrix for 20 AI bots, llms.txt, CDN blocking signals, JS-only content, structured data and trust signals. Scores 0-100 with copy-paste fixes.",
    "version": "2.0",
    "x-build-id": "gdqd0z0MyDiJvcqHY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/siteverdict~siteverdict-ai-search-readiness/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-siteverdict-siteverdict-ai-search-readiness",
        "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/siteverdict~siteverdict-ai-search-readiness/runs": {
      "post": {
        "operationId": "runs-sync-siteverdict-siteverdict-ai-search-readiness",
        "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/siteverdict~siteverdict-ai-search-readiness/run-sync": {
      "post": {
        "operationId": "run-sync-siteverdict-siteverdict-ai-search-readiness",
        "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": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Websites to check",
            "type": "array",
            "description": "Homepages (or any page) to audit. One result per URL. Bare domains like example.com are fine. robots.txt, llms.txt and sitemap are checked at the site root; on-page checks run on the URL you enter.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxPagesPerSite": {
            "title": "Pages to audit per site (multi-page audit)",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "1 = only the URL you enter. Above 1, extra pages are picked from your sitemap and internal links, spread across site sections, and each is audited with the same checks (robots per path, noindex, structure, schema, citability). Each extra page is a separate pay-per-event charge.",
            "default": 1
          },
          "recommendedPolicy": {
            "title": "AI crawler policy for the generated robots.txt fixes",
            "enum": [
              "search-only",
              "allow-all",
              "block-all"
            ],
            "type": "string",
            "description": "Which policy the copy-paste robots.txt snippet should implement. 'search-only' keeps you visible in AI search and assistant answers while opting out of model training. Training bots are never penalised in the score (it is a business choice). All three snippets are always included.",
            "default": "search-only"
          },
          "compareRendered": {
            "title": "Measure JavaScript dependence (raw HTML vs rendered)",
            "type": "boolean",
            "description": "Renders the page in headless Chromium and measures how much of the visible text, structured data, headings and meta tags exist only after JavaScript runs (most AI crawlers do not run JavaScript). Slower; use 2048 MB memory or more.",
            "default": false
          },
          "captureScreenshots": {
            "title": "Evidence screenshot",
            "type": "boolean",
            "description": "Saves a timestamped screenshot of the rendered page to the key-value store and embeds it in the report (uses the headless browser).",
            "default": false
          },
          "checkLlmsTxtLinks": {
            "title": "Verify links inside llms.txt",
            "type": "boolean",
            "description": "When a site has /llms.txt, request up to 8 of its same-site links (politely, respecting robots.txt) and report broken ones.",
            "default": true
          },
          "accessLogUrl": {
            "title": "Your access logs (https URL) — verify what REAL AI bots receive",
            "type": "string",
            "description": "Optional, for a site you own (applies to the FIRST website). An https link to an access-log export (combined log format or JSON lines, e.g. Cloudflare Logpush; .gz is fine; max 50 MB). We count requests by each AI agent, verify the source IPs against the vendors' published IP ranges, and report which bots your server/CDN refused. This is the only reliable way to confirm CDN/WAF blocking — we never fake other bots' user agents. IP addresses are processed in memory only and never output."
          },
          "accessLogText": {
            "title": "…or paste access-log lines",
            "type": "string",
            "description": "Alternative to the URL: paste log lines directly (same formats)."
          },
          "saveHtmlReports": {
            "title": "Save HTML reports",
            "type": "boolean",
            "description": "Stores a shareable HTML report per site (reportUrl) and a SUMMARY page in the key-value store.",
            "default": true
          },
          "generatePdfReport": {
            "title": "PDF client report",
            "type": "boolean",
            "description": "Also saves an A4 PDF of each site's report (pdfUrl). Uses the headless browser; charged per PDF.",
            "default": false
          },
          "reportPreparedBy": {
            "title": "White-label: prepared by",
            "type": "string",
            "description": "Your agency or company name shown at the top of HTML/PDF reports."
          },
          "reportLogoUrl": {
            "title": "White-label: logo URL (https)",
            "type": "string",
            "description": "Shown at the top of HTML/PDF reports."
          },
          "reportAccentColor": {
            "title": "White-label: accent colour",
            "type": "string",
            "description": "Hex colour such as #0f766e."
          },
          "monitoringMode": {
            "title": "Monitoring mode (compare with the previous run)",
            "type": "boolean",
            "description": "Keeps a snapshot per site in a named key-value store and reports what changed since the last run: AI crawlers newly blocked in robots.txt, noindex/nosnippet appearing, bot challenges, CDN assessment, llms.txt, structured data and score changes. Schedule the Actor (e.g. daily or weekly) to monitor.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitoring store name",
            "type": "string",
            "description": "Named key-value store that keeps snapshots between runs. Use a different name per client or project.",
            "default": "siteverdict-ai-search-monitor"
          },
          "onlyChanged": {
            "title": "Only output sites that changed",
            "type": "boolean",
            "description": "In monitoring mode, skip dataset rows for sites with no changes (the first run always outputs a baseline). Unchanged re-checks are charged at the lower 'site-rechecked-unchanged' price.",
            "default": false
          },
          "alertMinSeverity": {
            "title": "Alert on",
            "enum": [
              "critical",
              "warning",
              "info"
            ],
            "type": "string",
            "description": "Minimum severity that triggers an alert.",
            "default": "warning"
          },
          "scoreChangeThreshold": {
            "title": "Score change that counts as a change",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Score movements smaller than this are ignored.",
            "default": 5
          },
          "slackWebhookUrl": {
            "title": "Slack incoming webhook URL",
            "type": "string",
            "description": "https only. Receives a message when monitored sites change."
          },
          "webhookUrl": {
            "title": "Webhook URL (JSON POST)",
            "type": "string",
            "description": "https only. Receives a JSON payload with every change (for Zapier, Make, n8n or your own endpoint)."
          },
          "aiFixProvider": {
            "title": "AI fix drafts (uses YOUR LLM key)",
            "enum": [
              "none",
              "anthropic",
              "openai"
            ],
            "type": "string",
            "description": "Off by default. When set, your own Anthropic or OpenAI key drafts an llms.txt, a meta description, an answer-first opening paragraph and FAQ + FAQPage JSON-LD for each site. FAQ answers must quote a sentence that exists on the page or they are dropped. LLM usage is billed by your provider.",
            "default": "none"
          },
          "aiApiKey": {
            "title": "Your LLM API key",
            "type": "string",
            "description": "Anthropic or OpenAI API key. Stored encrypted by Apify, never logged or output."
          },
          "aiModel": {
            "title": "Model (optional)",
            "type": "string",
            "description": "Defaults: claude-sonnet-5-5 (Anthropic) or gpt-5-mini (OpenAI). Any model your key can use."
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt for our own checker",
            "type": "boolean",
            "description": "Our checker identifies itself as SiteVerdictBot and by default does not fetch pages that robots.txt disallows for it. robots.txt, llms.txt and sitemap files are always read. Only disable this for sites you own or have permission to audit.",
            "default": true
          },
          "maxSites": {
            "title": "Max sites",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Safety cap on the number of sites checked in this run.",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "Sites in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many sites are checked at the same time (max 3 when the browser is used). Requests to any single site are always sequential and spaced out.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Timeout for each HTTP request.",
            "default": 20
          },
          "siteTimeoutSecs": {
            "title": "Time budget per site (seconds)",
            "minimum": 30,
            "maximum": 1800,
            "type": "integer",
            "description": "A site that takes longer than this is reported as an error (and not charged). Default 180 s, or 600 s in multi-page mode."
          },
          "delayBetweenRequestsMs": {
            "title": "Delay between requests to the same site (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Politeness delay between consecutive requests to one site.",
            "default": 300
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}