{
  "openapi": "3.0.1",
  "info": {
    "title": "SiteVerdict — robots.txt & Sitemap Monitor",
    "description": "Catch SEO disasters before Google does: watches robots.txt, XML sitemaps and key pages for Disallow: /, noindex, canonical and status changes, sitemap URL drops and errors. Diffs vs last run, Slack/webhook alerts, HTML report.",
    "version": "1.0",
    "x-build-id": "kt0Ecayhro9pRpRTH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/siteverdict~siteverdict-robots-sitemap-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-siteverdict-siteverdict-robots-sitemap-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/siteverdict~siteverdict-robots-sitemap-monitor/runs": {
      "post": {
        "operationId": "runs-sync-siteverdict-siteverdict-robots-sitemap-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/siteverdict~siteverdict-robots-sitemap-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-siteverdict-siteverdict-robots-sitemap-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",
        "properties": {
          "executionMode": {
            "title": "Mode",
            "enum": [
              "live",
              "sample"
            ],
            "type": "string",
            "description": "<b>Live</b> checks your sites. <b>Sample</b> replays two recorded days of a demo shop (a leaked 'Disallow: /' for Googlebot, a new noindex and a sitemap drop) so you can see the alert output for free, with no network calls.",
            "default": "live"
          },
          "sites": {
            "title": "Sites to monitor",
            "type": "array",
            "description": "Homepages or any URL of each site; only the origin (scheme + host) is used. robots.txt and sitemaps are discovered automatically.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "keyUrls": {
            "title": "Key URLs (money pages)",
            "type": "array",
            "description": "Important pages to watch for noindex, canonical, redirect, status and robots.txt-block changes, e.g. your homepage, top category and product pages. Their sites are added automatically.",
            "items": {
              "type": "string"
            }
          },
          "sitemapUrls": {
            "title": "Extra sitemap URLs (optional)",
            "type": "array",
            "description": "Sitemaps to check in addition to those declared in robots.txt (or /sitemap.xml). .gz is supported.",
            "items": {
              "type": "string"
            }
          },
          "sampleSitemapUrls": {
            "title": "Sitemap URLs to spot-check per site",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "This many URLs, spread across the sitemap, are fetched to check they return 200, are indexable, not redirected and self-canonical. 0 = off. Each is billed as a URL check.",
            "default": 10
          },
          "maxSitemapFiles": {
            "title": "Max sitemap files per site",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Safety cap on sitemap files read per site (sitemap indexes are followed up to 3 levels).",
            "default": 50
          },
          "countDropWarnPct": {
            "title": "Sitemap URL drop: warning at (%)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Warn when the number of sitemap URLs falls by at least this percentage since the last run.",
            "default": 20
          },
          "countDropCriticalPct": {
            "title": "Sitemap URL drop: critical at (%)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Critical alert when the sitemap URL count falls by at least this percentage.",
            "default": 50
          },
          "outputMode": {
            "title": "Output",
            "enum": [
              "all",
              "changes"
            ],
            "type": "string",
            "description": "'All sites' writes one row per site every run. 'Only changes' writes a row only for the first (baseline) run and when something changed; ideal for hourly schedules.",
            "default": "all"
          },
          "alertMinSeverity": {
            "title": "Alert on",
            "enum": [
              "critical",
              "warning",
              "info"
            ],
            "type": "string",
            "description": "Send an alert when a change of at least this severity is detected. Critical = e.g. 'Disallow: /' for Googlebot, noindex on a key URL, sitemap 404, URL count down 50%+.",
            "default": "warning"
          },
          "webhookUrl": {
            "title": "Webhook URL (https)",
            "type": "string",
            "description": "We POST a JSON alert (site, changes, robots.txt diff) here, e.g. a Zapier/Make/n8n hook. Stored encrypted."
          },
          "slackWebhookUrl": {
            "title": "Slack incoming webhook URL",
            "type": "string",
            "description": "https://hooks.slack.com/services/... Stored encrypted."
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store holding the last snapshot and change history of each site. Use one name per client/project.",
            "default": "siteverdict-robots-sitemap-monitor"
          },
          "historySize": {
            "title": "Changes kept in history",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Past change events kept per site in the state store.",
            "default": 30
          },
          "resetBaseline": {
            "title": "Reset baseline",
            "type": "boolean",
            "description": "Ignore saved snapshots and start fresh this run.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Sites checked in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Requests to the same host are always sequential, at most 1 per second (or the site's Crawl-delay).",
            "default": 3
          },
          "timeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Per request.",
            "default": 30
          },
          "aiEnabled": {
            "title": "AI fix suggestions (your own key)",
            "type": "boolean",
            "description": "Off by default. When on, the findings (no personal data) are sent to your chosen LLM provider with YOUR API key to get concrete, prioritised fix snippets. Charged as one 'ai-fix' event per successful answer; your provider bills tokens separately.",
            "default": false
          },
          "aiProvider": {
            "title": "AI provider",
            "enum": [
              "anthropic",
              "openai"
            ],
            "type": "string",
            "description": "Which API your key belongs to.",
            "default": "anthropic"
          },
          "aiApiKey": {
            "title": "AI API key",
            "type": "string",
            "description": "Your Anthropic or OpenAI API key. Stored encrypted by Apify, never logged or written to the output."
          },
          "aiModel": {
            "title": "AI model (optional)",
            "type": "string",
            "description": "Leave empty for the default (Anthropic: claude-sonnet-5-5, OpenAI: gpt-5-mini)."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}