{
  "openapi": "3.1.0",
  "info": {
    "title": "V-Sum Public API",
    "version": "1.0.0",
    "description": "Read-only JSON API for V-Sum technical briefings, interviews, events, people, and companies. No authentication required. No URL versioning — clients should follow _links in responses.",
    "contact": {
      "name": "V-Sum",
      "email": "hello@v-sum.com",
      "url": "https://v-sum.com/contact"
    },
    "license": {
      "name": "Read-only public data (no license fee, attribution appreciated)",
      "url": "https://v-sum.com/privacy"
    },
    "x-sdks": {
      "npm": [
        {
          "name": "v-sum",
          "url": "https://www.npmjs.com/package/v-sum",
          "primary": true
        },
        {
          "name": "vsum-api-client",
          "url": "https://www.npmjs.com/package/vsum-api-client"
        },
        {
          "name": "vsum-cli",
          "url": "https://www.npmjs.com/package/vsum-cli"
        }
      ],
      "pypi": [
        {
          "name": "vsum-api-client",
          "url": "https://pypi.org/project/vsum-api-client/",
          "primary": true
        }
      ],
      "go": [
        {
          "name": "github.com/superduperdot/vsum-sdk-go",
          "url": "https://pkg.go.dev/github.com/superduperdot/vsum-sdk-go",
          "primary": true
        }
      ]
    }
  },
  "servers": [
    {
      "url": "https://api.v-sum.com"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "summary": "API index",
        "operationId": "getRoot",
        "description": "Returns JSON resource index (Accept: application/json) or HTML documentation (Accept: text/html).",
        "responses": {
          "200": {
            "description": "API index or HTML docs"
          }
        }
      }
    },
    "/briefings": {
      "get": {
        "summary": "List briefings",
        "operationId": "listBriefings",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Full-text search"
          },
          {
            "name": "event",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by event name"
          },
          {
            "name": "tag",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by tag"
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 25,
              "maximum": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated briefing list with _links"
          }
        }
      }
    },
    "/briefings/{slug}": {
      "get": {
        "summary": "Get briefing",
        "operationId": "getBriefing",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Briefing detail with chapters and _links"
          },
          "404": {
            "description": "Briefing not found"
          }
        }
      }
    },
    "/events": {
      "get": {
        "summary": "List events",
        "operationId": "listEvents",
        "responses": {
          "200": {
            "description": "Events with briefing counts and _links"
          }
        }
      }
    },
    "/events/{slug}": {
      "get": {
        "summary": "Get event",
        "operationId": "getEvent",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Event detail with sponsors and _links"
          },
          "404": {
            "description": "Event not found"
          }
        }
      }
    },
    "/people": {
      "get": {
        "summary": "List people",
        "operationId": "listPeople",
        "responses": {
          "200": {
            "description": "People directory with _links"
          }
        }
      }
    },
    "/people/{slug}": {
      "get": {
        "summary": "Get person",
        "operationId": "getPerson",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Person with briefing appearances and _links"
          },
          "404": {
            "description": "Person not found"
          }
        }
      }
    },
    "/companies": {
      "get": {
        "summary": "List companies",
        "operationId": "listCompanies",
        "responses": {
          "200": {
            "description": "Companies directory with _links"
          }
        }
      }
    },
    "/companies/{slug}": {
      "get": {
        "summary": "Get company",
        "operationId": "getCompany",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Company with briefings and _links"
          },
          "404": {
            "description": "Company not found"
          }
        }
      }
    },
    "/interviews": {
      "get": {
        "summary": "List interviews",
        "operationId": "listInterviews",
        "responses": {
          "200": {
            "description": "Published interviews with _links"
          }
        }
      }
    },
    "/interviews/{slug}": {
      "get": {
        "summary": "Get interview",
        "operationId": "getInterview",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Interview with guest details and _links"
          },
          "404": {
            "description": "Interview not found"
          }
        }
      }
    },
    "/spec.json": {
      "get": {
        "summary": "OpenAPI spec",
        "operationId": "getSpec",
        "description": "This specification document. Also available at /openapi.json.",
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 spec"
          }
        }
      }
    },
    "/health": {
      "get": {
        "summary": "Health check",
        "operationId": "getHealth",
        "responses": {
          "200": {
            "description": "Service healthy"
          }
        }
      }
    }
  }
}