{
  "openapi": "3.1.0",
  "info": {
    "title": "AdultInfra Public Site Catalog API",
    "version": "1.0.0",
    "description": "Read-only discovery of AdultInfra public capability, solution, guide, legal, and contact pages. This API does not submit inquiries or expose private customer information."
  },
  "externalDocs": { "description": "AdultInfra information for agents", "url": "https://adultinfra.com/llms.txt" },
  "servers": [
    {
      "url": "https://adultinfra.com"
    }
  ],
  "paths": {
    "/api/site": {
      "get": {
        "operationId": "getAdultInfraSiteCatalog",
        "summary": "List AdultInfra public pages and their purposes",
        "security": [],
        "responses": {
          "200": {
            "description": "Public site catalog",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["name", "canonical", "description", "dateModified", "pages", "capabilities", "agentResources"],
                  "additionalProperties": false,
                  "properties": {
                    "name": { "type": "string" },
                    "canonical": { "type": "string", "format": "uri" },
                    "description": { "type": "string" },
                    "dateModified": { "type": "string", "format": "date" },
                    "pages": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": ["id", "title", "kind", "topics", "canonicalUrl", "url", "description", "dateModified"],
                        "additionalProperties": false,
                        "properties": {
                          "id": { "type": "string" },
                          "title": { "type": "string" },
                          "kind": { "type": "string", "enum": ["company", "service", "article", "contact", "policy"] },
                          "topics": { "type": "array", "items": { "type": "string" } },
                          "canonicalUrl": { "type": "string", "format": "uri" },
                          "url": { "type": "string", "format": "uri" },
                          "description": { "type": "string" },
                          "dateModified": { "type": "string", "format": "date" }
                        }
                      }
                    },
                    "capabilities": { "type": "array", "items": { "type": "object" } },
                    "agentResources": {
                      "type": "object",
                      "required": ["llms", "ard", "skills", "openapi"],
                      "additionalProperties": false,
                      "properties": {
                        "llms": { "type": "string", "format": "uri" },
                        "ard": { "type": "string", "format": "uri" },
                        "skills": { "type": "string", "format": "uri" },
                        "openapi": { "type": "string", "format": "uri" }
                      }
                    }
                  }
                }
              }
            }
          },
          "405": { "description": "Method not allowed" },
          "500": { "description": "Unexpected server error" }
        }
      }
    },
    "/api/agent-interest": {
      "post": {
        "operationId": "registerAdultInfraInterest",
        "summary": "Register interest on behalf of a prospective customer",
        "description": "Consequential action. Call only after the person you represent has explicitly agreed to submit an inquiry. Sends personal and business information to AdultInfra and its configured notification provider. Never set userConfirmed to true on your own initiative.",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["company", "contactName", "contactEmail", "userConfirmed"],
                "additionalProperties": false,
                "properties": {
                  "company": { "type": "string", "maxLength": 200 },
                  "contactName": { "type": "string", "maxLength": 120 },
                  "contactEmail": { "type": "string", "format": "email", "maxLength": 254 },
                  "workload": { "type": "string", "maxLength": 120 },
                  "monthlyDelivery": { "type": "string", "maxLength": 120 },
                  "regions": {
                    "oneOf": [
                      { "type": "string", "maxLength": 200 },
                      { "type": "array", "items": { "type": "string" }, "maxItems": 20 }
                    ]
                  },
                  "notes": { "type": "string", "maxLength": 4000 },
                  "agent": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "name": { "type": "string", "maxLength": 120 },
                      "model": { "type": "string", "maxLength": 120 },
                      "purpose": { "type": "string", "maxLength": 240 }
                    }
                  },
                  "userConfirmed": { "type": "boolean", "const": true },
                  "idempotencyKey": { "type": "string", "maxLength": 160 },
                  "company_website_trap": { "type": "string", "maxLength": 200 }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Interest registered and durably stored",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["success", "id", "status"],
                  "properties": {
                    "success": { "type": "boolean" },
                    "id": { "type": "string", "format": "uuid" },
                    "status": { "type": "string", "enum": ["registered"] },
                    "notification": { "type": "string" },
                    "idempotent": { "type": "boolean" },
                    "receivedAt": { "type": "string", "format": "date-time" }
                  }
                }
              }
            }
          },
          "400": { "description": "Missing or invalid fields, or userConfirmed not true" },
          "415": { "description": "Content-Type must be application/json" },
          "429": { "description": "Rate limit exceeded" },
          "503": { "description": "Storage unavailable" }
        }
      }
    }
  }
}
