{
  "openapi": "3.1.0",
  "info": {
    "title": "Evallot API",
    "version": "0.1.0",
    "description": "Evallot is LayerBrick's hosting platform, built fully custom (no licensed panel). This is the Phase-1 CONTROL PLANE: sites (traditional or git-connected), plans (incl. Managed WordPress), TR/EU region choice at creation (KVKK residency), backups as records, and cross-brand DNS attachment — a site's records publish into the customer's NetDNS zone one-click as a protected managed set under the evallot owner tag. Hosting nodes provision through the Comphive broker in a later phase; every site is honestly pending_infra until real infrastructure exists. AI Site Studio (agentic site builder, Firecracker microVM isolation) is deferred by locked plan.\n\nAuthentication: LayerBrick SSO bearer token; the plans catalog is public.\n\nCross-brand facts an agent should know: one LayerBrick SSO session works on every brand (brands forward bearer tokens to Core's /v1/auth/me); each subdomain proxies Core same-origin at /core-api/*; organizations/wallets/AI-tokens/projects live on Core (albos.tr) — projects are Core-level workspaces resources link to via project_id, validated against Core's GET /v1/projects/{id}. Full platform spec: https://albos.tr/openapi.json and https://albos.tr/llms.txt. Every brand also mounts the uniform service-contract lifecycle surface at /v1/service-contract/*."
  },
  "servers": [
    {
      "url": "https://evallot.albos.tr"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "LayerBrick SSO session token or lb_live_ API key — one credential, every brand."
      }
    }
  },
  "paths": {
    "/v1/plans": {
      "get": {
        "summary": "Plan catalog (starter, growth, managed-wordpress, custom)",
        "description": "Access: public.",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/v1/sites": {
      "get": {
        "summary": "Sites (optional project_id filter)",
        "description": "Access: member.",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "summary": "Create site: {org_id, domain, kind: traditional|git, plan, region: tr|eu, git_repo?, project_id?}",
        "description": "Access: admin.",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/v1/sites/{id}/dns-attach": {
      "post": {
        "summary": "Publish the site's records into its NetDNS zone as a protected managed set (owner_tag=evallot)",
        "description": "Access: technical.",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/sites/{id}/backups": {
      "get": {
        "summary": "Backup records",
        "description": "Access: member.",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "summary": "Request a manual backup (recorded now; real snapshots need the data plane)",
        "description": "Access: technical.",
        "responses": {
          "200": {
            "description": "OK"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    }
  }
}