{
  "openapi": "3.1.0",
  "info": {
    "title": "DeployRadar AI crawler access API",
    "version": "1",
    "description": "Whether each AI crawler can actually read a site: its robots.txt policy, whether a CDN or firewall treats the crawler differently, and how much content is present without JavaScript. Read `health` before `groups`: when the scan could not establish something, the verdicts that depend on it are provisional."
  },
  "externalDocs": {
    "url": "https://deployradar.dev/api"
  },
  "servers": [
    {
      "url": "https://deployradar.dev"
    }
  ],
  "paths": {
    "/api/v1/scan": {
      "get": {
        "operationId": "scanSite",
        "summary": "Scan one site's AI crawler access",
        "description": "Scans the origin of `url`. Results are cached for 24 hours per domain; a cached answer is immediate, is not counted against the rate limit, and carries `cached: true` with `scannedAt`.",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "A hostname or full URL. Only the origin is scanned; path and query are ignored.",
            "schema": {
              "type": "string",
              "examples": [
                "example.com"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The scan.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "https://deployradar.dev/schemas/scan-v1.json#/$defs/Scan"
                }
              }
            }
          },
          "400": {
            "description": "`missing_url`: No ?url= was given. `invalid_target`: The URL could not be resolved, or resolves to a private or loopback address. The message says which.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "https://deployradar.dev/schemas/scan-v1.json#/$defs/Error"
                }
              }
            }
          },
          "429": {
            "description": "`rate_limited`: You have used this hour's scans. Cached results still answer immediately and do not count.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a new scan will be accepted.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "https://deployradar.dev/schemas/scan-v1.json#/$defs/Error"
                }
              }
            }
          },
          "502": {
            "description": "`scan_failed`: The scan started and did not finish, usually a timeout on the way to the target.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "https://deployradar.dev/schemas/scan-v1.json#/$defs/Error"
                }
              }
            }
          },
          "503": {
            "description": "`at_capacity`: Our own hourly ceiling on new scans, not yours. Retry-After says when to come back.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a new scan will be accepted.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "https://deployradar.dev/schemas/scan-v1.json#/$defs/Error"
                }
              }
            }
          }
        }
      }
    }
  }
}
