{
  "openapi": "3.1.1",
  "info": {
    "title": "Cactus Security API",
    "description": "Free, no-key JSON endpoints for the Cactus Security tools. Rate-limited per IP. Pass ?lang=fr-CA or an Accept-Language header for French text.",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://cactus.net/"
    }
  ],
  "paths": {
    "/api/check-url": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "parameters": [
          {
            "name": "u",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "tags": [
          "SafeCheck"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckUrlApiRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/feedback": {
      "post": {
        "tags": [
          "SafeCheck"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FeedbackEntry"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-email": {
      "post": {
        "tags": [
          "SafeCheck"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckEmailApiRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-tls": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "parameters": [
          {
            "name": "host",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-email-auth": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-message": {
      "post": {
        "tags": [
          "SafeCheck"
        ],
        "summary": "Analyze a text message (SMS/chat) for scam signals.",
        "description": "Local heuristic analysis; the message is never stored. JSON body: { \"message\": \"...\" }.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckMessageApiRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-headers": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "summary": "Grade a site's HTTP security headers.",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-typosquat": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "summary": "Find registered look-alike / typosquat domains for a domain.",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-certs": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "summary": "List Certificate Transparency records (subdomains + recent certs) for a domain.",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-ip": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "summary": "Reputation/identity for an IP address (rDNS, owner/ASN, DNS blocklists).",
        "parameters": [
          {
            "name": "ip",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-dns": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "summary": "Common DNS records for a domain (A, AAAA, MX, TXT, NS, CAA, SOA, CNAME).",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-whois": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "summary": "WHOIS/RDAP registration record for a domain (registrar, dates, status, DNSSEC, nameservers).",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/check-hash": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "summary": "VirusTotal multi-engine reputation for a file hash (MD5/SHA-1/SHA-256). Only the hash is sent — no file is uploaded.",
        "parameters": [
          {
            "name": "hash",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/pwned-range": {
      "get": {
        "tags": [
          "SafeCheck"
        ],
        "parameters": [
          {
            "name": "prefix",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CheckEmailApiRequest": {
        "type": "object",
        "properties": {
          "emailBody": {
            "type": [
              "null",
              "string"
            ]
          },
          "rawHeaders": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "CheckMessageApiRequest": {
        "type": "object",
        "properties": {
          "message": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "CheckUrlApiRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "FeedbackEntry": {
        "type": "object",
        "properties": {
          "analysisType": {
            "type": "string"
          },
          "subject": {
            "type": [
              "null",
              "string"
            ]
          },
          "score": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "verdict": {
            "type": "string"
          },
          "feedback": {
            "type": "string"
          },
          "comment": {
            "type": [
              "null",
              "string"
            ]
          },
          "timestamp": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "HeroBeacon": {
        "required": [
          "outcome",
          "route"
        ],
        "type": "object",
        "properties": {
          "outcome": {
            "type": [
              "null",
              "string"
            ]
          },
          "route": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "SafeCheck"
    },
    {
      "name": "Program"
    }
  ]
}