{
  "openapi": "3.0.3",
  "info": {
    "title": "BeyondBound Public Information API",
    "version": "1.0.0",
    "description": "Read-only access to public BeyondBound organization and service information. No authentication is required. This API does not accept submissions, research documents, payments, or changes.",
    "contact": {
      "name": "BeyondBound",
      "email": "info@beyondbound.org",
      "url": "https://beyondbound.org/contact"
    }
  },
  "servers": [
    {
      "url": "https://beyondbound.org",
      "description": "BeyondBound public website"
    }
  ],
  "tags": [
    {
      "name": "Public information",
      "description": "Public business information, with no personal inquiry or study data."
    }
  ],
  "security": [],
  "paths": {
    "/api/v1/info": {
      "get": {
        "operationId": "getBeyondBoundInfo",
        "summary": "Get public BeyondBound organization information",
        "description": "Read the official public description, audience, contact details, office address, and how to request pricing.",
        "tags": [
          "Public information"
        ],
        "parameters": [],
        "security": [],
        "responses": {
          "200": {
            "description": "Public information retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInfo"
                }
              }
            }
          },
          "400": {
            "description": "Unsupported query parameters; remove the query string.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown endpoint; use a documented path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "405": {
            "description": "Unsupported method; use GET or HEAD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/services": {
      "get": {
        "operationId": "listBeyondBoundServices",
        "summary": "List public BeyondBound services",
        "description": "Read descriptions and official page URLs for IRB review and regulatory support services. Pricing and contact links are included.",
        "tags": [
          "Public information"
        ],
        "parameters": [],
        "security": [],
        "responses": {
          "200": {
            "description": "Public information retrieved successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceList"
                }
              }
            }
          },
          "400": {
            "description": "Unsupported query parameters; remove the query string.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown endpoint; use a documented path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "405": {
            "description": "Unsupported method; use GET or HEAD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "OrganizationInfo": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "description",
          "website",
          "email",
          "telephone",
          "address",
          "pricing",
          "contact_url",
          "audience"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Organization name"
          },
          "description": {
            "type": "string",
            "description": "Summary of the public offering"
          },
          "website": {
            "type": "string",
            "description": "Official homepage"
          },
          "email": {
            "type": "string",
            "description": "Public business contact email"
          },
          "telephone": {
            "type": "string",
            "description": "Public business telephone"
          },
          "address": {
            "type": "string",
            "description": "Public office address"
          },
          "pricing": {
            "type": "string",
            "description": "How to obtain project-specific pricing"
          },
          "contact_url": {
            "type": "string",
            "description": "Contact page"
          },
          "audience": {
            "type": "array",
            "description": "People and organizations the service supports",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Service": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "name",
          "description",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable service identifier"
          },
          "name": {
            "type": "string",
            "description": "Service name"
          },
          "description": {
            "type": "string",
            "description": "Service summary"
          },
          "url": {
            "type": "string",
            "description": "Official service information page"
          }
        }
      },
      "ServiceList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "services",
          "pricing_url",
          "contact_url"
        ],
        "properties": {
          "services": {
            "type": "array",
            "description": "Public service information",
            "items": {
              "$ref": "#/components/schemas/Service"
            }
          },
          "pricing_url": {
            "type": "string",
            "description": "Project-specific pricing information URL"
          },
          "contact_url": {
            "type": "string",
            "description": "Public inquiry page URL"
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "status",
          "error",
          "documentation"
        ],
        "properties": {
          "status": {
            "type": "integer",
            "description": "HTTP error status"
          },
          "error": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "code",
              "message",
              "resolution"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable error code"
              },
              "message": {
                "type": "string",
                "description": "Explanation of the error"
              },
              "resolution": {
                "type": "string",
                "description": "How the client can recover"
              }
            }
          },
          "documentation": {
            "type": "string",
            "description": "API documentation URL"
          }
        }
      }
    }
  }
}
