{
  "openapi": "3.1.0",
  "info": {
    "title": "EU Whistleblower Tool Directory — read-only catalog",
    "summary": "Static JSON catalog of whistleblower reporting platforms reviewed for EU Directive 2019/1937 compliance.",
    "description": "A read-only, static JSON catalog served from the whistleblowertools.eu Hugo site. No authentication, no rate limits, no state — each endpoint is a CDN-cached JSON file regenerated on every deploy. Suitable for AI agents that need structured comparison data for whistleblower platforms.",
    "version": "1.0.0",
    "contact": {
      "name": "EthicsPortal",
      "url": "https://ethicsportal.eu",
      "email": "support@ethicsportal.eu"
    },
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    }
  },
  "servers": [
    { "url": "https://whistleblowertools.eu", "description": "Production" }
  ],
  "tags": [
    { "name": "catalog", "description": "Directory listing and per-tool profiles" }
  ],
  "paths": {
    "/tools/index.json": {
      "get": {
        "operationId": "listTools",
        "summary": "List all reviewed whistleblower tools",
        "description": "Returns a summary record for every tool in the directory, sorted alphabetically by name.",
        "tags": ["catalog"],
        "responses": {
          "200": {
            "description": "Tool list",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ToolList" }
              }
            }
          }
        }
      }
    },
    "/tools/{slug}/index.json": {
      "get": {
        "operationId": "getTool",
        "summary": "Get full profile for a single tool",
        "description": "Returns the complete structured profile for one tool, including pricing, hosting, certifications, country coverage, and notes.",
        "tags": ["catalog"],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Tool identifier, lower-case-hyphenated.",
            "schema": {
              "type": "string",
              "enum": [
                "canaletico", "clym", "cortina", "digitalpa", "easywhistle",
                "ethicsportal", "faceup", "formalize", "hintbox", "hintcatcher",
                "iblow", "integrityline", "ithikios", "legaltegrity", "navex",
                "osapiens", "speakup", "sygnanet", "trusty", "vispato",
                "whispli", "whistlelink", "witik"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tool profile",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Tool" }
              }
            }
          },
          "404": {
            "description": "Unknown slug"
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "llmsSummary",
        "summary": "LLM-oriented site summary (plain text)",
        "tags": ["catalog"],
        "responses": {
          "200": {
            "description": "Plain-text summary",
            "content": { "text/plain": { "schema": { "type": "string" } } }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "llmsFull",
        "summary": "Complete site content dump (plain text)",
        "tags": ["catalog"],
        "responses": {
          "200": {
            "description": "Plain-text full content",
            "content": { "text/plain": { "schema": { "type": "string" } } }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ToolList": {
        "type": "object",
        "required": ["count", "tools"],
        "properties": {
          "source": { "type": "string", "format": "uri" },
          "generated_at": { "type": "string", "format": "date-time" },
          "count": { "type": "integer", "minimum": 0 },
          "tools": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/ToolSummary" }
          }
        }
      },
      "ToolSummary": {
        "type": "object",
        "required": ["slug", "name", "website", "profile_url"],
        "properties": {
          "slug": { "type": "string" },
          "name": { "type": "string" },
          "tagline": { "type": "string" },
          "website": { "type": "string", "format": "uri" },
          "profile_url": { "type": "string", "format": "uri" },
          "data_url": { "type": "string", "format": "uri", "description": "URL to the full Tool JSON for this entry" },
          "headquarters": { "type": ["string", "null"] },
          "eu_hosting": { "type": ["string", "null"], "enum": ["eu", "mixed", "non_eu", "undisclosed", null] },
          "pricing": { "type": ["string", "null"] },
          "pricing_model": { "type": ["string", "null"], "enum": ["flat", "tiered", "quote", "per_employee", "per_user", null] },
          "procurement_model": { "type": ["string", "null"], "enum": ["self_serve", "sales_assisted", "sales_only", null] },
          "free_trial": { "type": ["boolean", "null"] },
          "api_access": { "type": ["boolean", "null"] },
          "anonymous_reporting": { "type": ["boolean", "null"] },
          "case_management": { "type": ["boolean", "null"] },
          "multi_channel": { "type": ["boolean", "null"] },
          "gdpr_compliant": { "type": ["boolean", "null"] },
          "eu_directive_compliant": { "type": ["boolean", "null"] },
          "cert_tier": { "type": ["string", "null"] },
          "certifications": { "type": "array", "items": { "type": "string" } },
          "geographic_reach": { "type": ["string", "null"] },
          "country_codes": { "type": "array", "items": { "type": "string", "pattern": "^[A-Z]{2}$" } },
          "last_verified": { "type": ["string", "null"], "format": "date" }
        }
      },
      "Tool": {
        "allOf": [
          { "$ref": "#/components/schemas/ToolSummary" },
          {
            "type": "object",
            "properties": {
              "founded": { "type": ["integer", "null"] },
              "ownership": { "type": ["string", "null"] },
              "employees": { "type": ["string", "null"] },
              "hosting": { "type": ["string", "null"] },
              "uses_ai": { "type": ["boolean", "null"] },
              "pricing_note": { "type": ["string", "null"] },
              "pricing_surprises": { "type": "array", "items": { "type": "string" } },
              "ideal_for": { "type": ["string", "null"] },
              "strengths": { "type": "array", "items": { "type": "string" } },
              "national_laws_supported": { "type": "array", "items": { "type": "string" } },
              "sources": { "type": "array", "items": { "type": "string", "format": "uri" } },
              "notes_markdown": { "type": "string" }
            }
          }
        ]
      }
    }
  }
}
