{
  "openapi": "3.1.0",
  "info": {
    "title": "Ads Risk Check API",
    "version": "1.0.0",
    "description": "Paste a Google Ads or Meta Ads notice. Get a plain-language risk card.\n\nFree, no API key, CORS open. Fair use: about 120 requests per minute per IP. Also available as MCP tools at https://free-agent-tools.vercel.app/mcp"
  },
  "servers": [
    {
      "url": "https://ads-risk-check.vercel.app"
    }
  ],
  "paths": {
    "/api/score": {
      "get": {
        "operationId": "adsNoticeRiskCheck",
        "summary": "Read a Google Ads or Meta Ads suspension, disapproval, or policy notice and return a HIGH / MED / LOW risk card",
        "description": "Paste the notice text (20 to 20,000 characters). Matches known policy phrases (circumvention, cloaking, misrepresentation, malware, counterfeit, billing, destination mismatch, trademark, restricted categories, verification, limited account, repeat violations, editorial, disapproval), ignores negated mentions, and returns the risk level, platform, reasons with plain-language explanations, and a next-step checklist. It never files appeals. Use POST for long notices.\n\nExample: https://ads-risk-check.vercel.app/api/score?notice=Your%20Google%20Ads%20headline%20was%20disapproved%20for%20editorial%20issues%3A%20excessive%20capitalization.%20The%20account%20remains%20active.",
        "parameters": [
          {
            "name": "notice",
            "in": "query",
            "required": true,
            "description": "The full text of the ads policy notice or email. Do not include personal or account identifiers.",
            "schema": {
              "type": "string",
              "description": "The full text of the ads policy notice or email. Do not include personal or account identifiers."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Result as JSON. Always includes a `disclaimer` field.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Missing or invalid input. The body explains what to send and gives an example."
          },
          "429": {
            "description": "Too many requests from one IP. Retry after the Retry-After seconds."
          }
        }
      },
      "post": {
        "operationId": "adsNoticeRiskCheckPost",
        "summary": "Read a Google Ads or Meta Ads suspension, disapproval, or policy notice and return a HIGH / MED / LOW risk card (JSON body)",
        "description": "Paste the notice text (20 to 20,000 characters). Matches known policy phrases (circumvention, cloaking, misrepresentation, malware, counterfeit, billing, destination mismatch, trademark, restricted categories, verification, limited account, repeat violations, editorial, disapproval), ignores negated mentions, and returns the risk level, platform, reasons with plain-language explanations, and a next-step checklist. It never files appeals. Use POST for long notices.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "notice"
                ],
                "properties": {
                  "notice": {
                    "type": "string",
                    "description": "The full text of the ads policy notice or email. Do not include personal or account identifiers."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result as JSON. Always includes a `disclaimer` field.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Missing or invalid input. The body explains what to send and gives an example."
          },
          "429": {
            "description": "Too many requests from one IP. Retry after the Retry-After seconds."
          }
        }
      }
    }
  }
}