{
  "openapi": "3.0.1",
  "info": {
    "title": "SiteVerdict — Passive Website Security Scanner",
    "description": "Passive, non-intrusive security check for sites you own or manage: TLS and certificate expiry, security headers, CSP, cookie flags, exposed .git/.env/backups, directory listing, mixed content, outdated JS libraries (Retire.js). Grade A+ to F, fixes, HTML report, monitoring, alerts.",
    "version": "1.1",
    "x-build-id": "rnctAcI5wNHGBBdtY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/siteverdict~siteverdict-passive-security-scanner/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-siteverdict-siteverdict-passive-security-scanner",
        "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-passive-security-scanner/runs": {
      "post": {
        "operationId": "runs-sync-siteverdict-siteverdict-passive-security-scanner",
        "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-passive-security-scanner/run-sync": {
      "post": {
        "operationId": "run-sync-siteverdict-siteverdict-passive-security-scanner",
        "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": {
          "urls": {
            "title": "Websites (that you own or manage)",
            "type": "array",
            "description": "Domains or URLs, one per line. Private, internal and cloud-metadata addresses are refused.",
            "items": {
              "type": "string"
            }
          },
          "confirmAuthorised": {
            "title": "I own or manage these sites, or have written permission to test them",
            "type": "boolean",
            "description": "Required. Scanning systems without permission may be illegal (e.g. Computer Misuse Act 1990 in the UK).",
            "default": false
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "On by default: paths disallowed for our crawler are skipped and reported as skipped. Owners may switch it off for their own sites.",
            "default": true
          },
          "probeLegacyTls": {
            "title": "Check whether TLS 1.0/1.1 are still accepted",
            "type": "boolean",
            "description": "Two extra ordinary handshakes.",
            "default": true
          },
          "exposureChecks": {
            "title": "Check for exposed files (.git, .env, backups, server-status...)",
            "type": "boolean",
            "description": "One GET per path from a fixed list of ~25 well-known paths; first 4 KB only; contents never output.",
            "default": true
          },
          "directoryListing": {
            "title": "Check common folders for directory listing",
            "type": "boolean",
            "description": "Check common folders for directory listing.",
            "default": true
          },
          "scriptFetches": {
            "title": "Script files to read for library versions",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "First 8 KB of up to N script files referenced by the page (to read version banners).",
            "default": 5
          },
          "expiryWarnDays": {
            "title": "Warn when the certificate expires within (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Warn when the certificate expires within (days).",
            "default": 21
          },
          "generateHtmlReport": {
            "title": "Save an HTML report per site",
            "type": "boolean",
            "description": "Stored in the run's key-value store; link in each result.",
            "default": true
          },
          "monitorStateName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Remembers findings per site and reports new/resolved findings and grade changes next run.",
            "default": "default"
          },
          "onlyChanged": {
            "title": "Only output sites that changed",
            "type": "boolean",
            "description": "Only output sites that changed.",
            "default": false
          },
          "alertMinSeverity": {
            "title": "Alert on new findings of at least",
            "enum": [
              "critical",
              "high",
              "medium",
              "low"
            ],
            "type": "string",
            "description": "Alert on new findings of at least.",
            "default": "high"
          },
          "slackWebhookUrl": {
            "title": "Slack incoming webhook URL",
            "type": "string",
            "description": "HTTPS only. Stored encrypted, never logged."
          },
          "webhookUrl": {
            "title": "Webhook URL (JSON POST)",
            "type": "string",
            "description": "HTTPS only; private addresses refused. Stored encrypted, never logged."
          },
          "enableAiFix": {
            "title": "AI fix snippets (your Anthropic key)",
            "type": "boolean",
            "description": "Off by default. Sends the host name, Server header, your stack hint and finding titles/details (titles may include cookie names; never page content or cookie values) to Anthropic with YOUR key and adds stack-specific configuration fixes. Charged only when produced.",
            "default": false
          },
          "anthropicApiKey": {
            "title": "Anthropic API key",
            "type": "string",
            "description": "Stored encrypted, never logged or written to output."
          },
          "aiModel": {
            "title": "Anthropic model",
            "type": "string",
            "description": "Anthropic model.",
            "default": "claude-sonnet-5-5"
          },
          "stackHint": {
            "title": "Your stack (helps the AI fixes)",
            "type": "string",
            "description": "e.g. nginx + WordPress on Ubuntu, Cloudflare in front"
          },
          "concurrency": {
            "title": "Sites in parallel",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Sites in parallel.",
            "default": 2
          },
          "sampleMode": {
            "title": "Sample mode (two simulated fictional sites, no network, no charge)",
            "type": "boolean",
            "description": "Sample mode (two simulated fictional sites, no network, no charge). Sample mode only reports on fictional sample sites. If the authorisation tick is off and the only targets are reserved example names (e.g. example.org), the run uses sample mode automatically and every row is marked isSampleData: true. Real sites always need the tick.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}