{
  "openapi": "3.1.0",
  "info": {
    "title": "CrawlLedger public API",
    "version": "0.1.0",
    "description": "Read-only observation metadata for public machine-readable policy signals. Records are not legal conclusions, and raw source bytes remain private."
  },
  "servers": [
    {
      "url": "https://crawlledger.net"
    }
  ],
  "paths": {
    "/v1/health": {
      "get": {
        "summary": "Service and archive health",
        "responses": {
          "200": {
            "description": "Healthy"
          },
          "503": {
            "description": "Degraded"
          }
        }
      }
    },
    "/v1/agents": {
      "get": {
        "summary": "Versioned tracked-agent registry",
        "responses": {
          "200": {
            "description": "Registry"
          }
        }
      }
    },
    "/v1/agents/{slug}": {
      "get": {
        "summary": "One tracked agent and its current observed policy states",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Agent reference and observations"
          },
          "404": {
            "description": "Agent not tracked"
          }
        }
      }
    },
    "/v1/policy-landscape": {
      "get": {
        "summary": "Current policy observations grouped by tracked agent",
        "responses": {
          "200": {
            "description": "Policy landscape"
          }
        }
      }
    },
    "/v1/domains/{domain}": {
      "get": {
        "summary": "Latest observations for a domain",
        "parameters": [
          {
            "name": "domain",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "hostname"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current observation metadata"
          },
          "404": {
            "description": "Domain not observed"
          }
        }
      }
    },
    "/v1/domains/{domain}/history": {
      "get": {
        "summary": "Bounded append-only observation history",
        "parameters": [
          {
            "name": "domain",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "hostname"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Newest-first event history"
          },
          "404": {
            "description": "Domain not observed"
          }
        }
      }
    }
  }
}