{
  "openapi": "3.1.1",
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "info": {
    "title": "Nexus Connect public API",
    "version": "1.0.0",
    "summary": "Read-only facts about Nexus Connect’s live games, plans and pricing for AI agents.",
    "description": "Nexus Connect is a live polling, trivia and game platform for school events such as pep rallies and assemblies; students join from their phones with no app or account. This API is public, unauthenticated and read-only. It describes the product — games, plans, list prices and a plan recommender — and never exposes school, event or student data. The same operations are available as MCP tools; connection details are in the MCP Server Card at https://www.nexusconnect.live/mcp/server-card. Errors use RFC 9457 problem details (application/problem+json) with a stable `code`, a `hint` and a `docs` link.",
    "termsOfService": "https://www.nexusconnect.live/terms",
    "contact": {
      "name": "Nexus Connect support",
      "email": "support@nexusconnect.live",
      "url": "https://www.nexusconnect.live/contact"
    },
    "license": {
      "name": "Proprietary",
      "url": "https://www.nexusconnect.live/terms"
    }
  },
  "externalDocs": {
    "description": "Developer documentation",
    "url": "https://www.nexusconnect.live/developers"
  },
  "servers": [
    {
      "url": "https://www.nexusconnect.live",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Product",
      "description": "What Nexus Connect is and when to use it."
    },
    {
      "name": "Games",
      "description": "Live games schools can run."
    },
    {
      "name": "Plans",
      "description": "Plans, pricing and plan recommendations."
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "List the endpoints of this API.",
        "description": "Entry point. Returns the API name and version, links to this OpenAPI document, the documentation and the MCP endpoint, and the list of endpoints.",
        "tags": [
          "Product"
        ],
        "responses": {
          "200": {
            "description": "The API index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/product": {
      "get": {
        "operationId": "getProductOverview",
        "summary": "What Nexus Connect is, who it is for and when to use it.",
        "description": "A structured summary of Nexus Connect: what it does, who it is for, typical use cases, how it works, and links to pricing, games, FAQ, security and contact pages. Call this first to decide whether Nexus Connect fits a user’s need.",
        "tags": [
          "Product"
        ],
        "responses": {
          "200": {
            "description": "Product overview.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/games": {
      "get": {
        "operationId": "listGames",
        "summary": "List every live game, optionally filtered by tier.",
        "description": "Every live game a school can run at an event (polls, trivia, Cups, Mascot Hunt, Yearbook, Name Game), with its tier, description, optional bonus feature and which plans include it.",
        "tags": [
          "Games"
        ],
        "parameters": [
          {
            "name": "tier",
            "in": "query",
            "required": false,
            "description": "Only return games of this tier.",
            "schema": {
              "type": "string",
              "enum": [
                "standard",
                "premium"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The games, in display order.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GameList"
                }
              }
            }
          },
          "400": {
            "description": "`tier` was not `standard` or `premium` (code `invalid_tier`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/games/{gameId}": {
      "get": {
        "operationId": "getGame",
        "summary": "Get one game by id.",
        "description": "One game by id. Returns 404 with code `game_not_found` and the list of valid ids if the id is unknown.",
        "tags": [
          "Games"
        ],
        "parameters": [
          {
            "name": "gameId",
            "in": "path",
            "required": true,
            "description": "Game id.",
            "schema": {
              "type": "string",
              "enum": [
                "polling",
                "trivia",
                "cups",
                "mascot",
                "yearbook",
                "namegame",
                "lightsout"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The game.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Game"
                }
              }
            }
          },
          "404": {
            "description": "No game has this id (code `game_not_found`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/plans": {
      "get": {
        "operationId": "listPlans",
        "summary": "List plans, list prices, limits and add-ons.",
        "description": "Plans (Free, Basic, Pro, Max) with annual list prices in USD, participant caps, Standard/Premium game slots, leaderboards and branding, plus the optional student SSO add-on.",
        "tags": [
          "Plans"
        ],
        "responses": {
          "200": {
            "description": "Plans and add-ons, cheapest first.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanList"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/plans/recommend": {
      "get": {
        "operationId": "recommendPlan",
        "summary": "Recommend the cheapest plan that meets a school’s requirements.",
        "description": "The cheapest plan meeting the given requirements — expected participants, games wanted, leaderboards, custom branding — using the same rules the product enforces, with the total annual price (including the SSO add-on if requested) and the reasons for the choice.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "name": "participants",
            "in": "query",
            "required": false,
            "description": "Expected number of people joining a single event.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "games",
            "in": "query",
            "required": false,
            "description": "Game ids the school wants to run. Comma-separated or repeated.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "polling",
                  "trivia",
                  "cups",
                  "mascot",
                  "yearbook",
                  "namegame",
                  "lightsout"
                ]
              }
            }
          },
          {
            "name": "leaderboards",
            "in": "query",
            "required": false,
            "description": "Whether live team leaderboards are needed.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "customBranding",
            "in": "query",
            "required": false,
            "description": "Whether custom branding / a custom domain is needed.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "studentSso",
            "in": "query",
            "required": false,
            "description": "Whether students should sign in with district Google/Microsoft accounts (paid add-on).",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The recommended plan and total price.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Recommendation"
                }
              }
            }
          },
          "400": {
            "description": "A parameter was invalid (codes `invalid_participants`, `invalid_parameter`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "A requested game id does not exist (code `game_not_found`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "description",
          "openapi",
          "documentation",
          "mcp",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "openapi": {
            "type": "string",
            "format": "uri",
            "description": "OpenAPI description of this API."
          },
          "documentation": {
            "type": "string",
            "format": "uri",
            "description": "Human-readable documentation."
          },
          "mcp": {
            "type": "string",
            "format": "uri",
            "description": "MCP (Streamable HTTP) endpoint exposing the same data as tools."
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "method",
                "path",
                "operationId",
                "summary"
              ],
              "properties": {
                "method": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "operationId": {
                  "type": "string"
                },
                "summary": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "Product": {
        "type": "object",
        "required": [
          "name",
          "website",
          "summary",
          "audience",
          "useCases",
          "howItWorks",
          "keyFacts",
          "notAFitFor",
          "links",
          "contact"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "website": {
            "type": "string",
            "format": "uri",
            "description": "Marketing site."
          },
          "summary": {
            "type": "string"
          },
          "audience": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "useCases": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "howItWorks": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "keyFacts": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "notAFitFor": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "links": {
            "type": "object",
            "description": "Canonical URLs for the main pages and machine-readable files.",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "contact": {
            "type": "object",
            "required": [
              "email",
              "url"
            ],
            "properties": {
              "email": {
                "type": "string",
                "format": "email"
              },
              "url": {
                "type": "string",
                "format": "uri",
                "description": "Contact page."
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "Game": {
        "type": "object",
        "description": "A live game a school can run at an event.",
        "required": [
          "id",
          "name",
          "tier",
          "description",
          "hostDescription",
          "bonusFeature",
          "hasContentLibrary",
          "acceptsImageUploads",
          "includedInPlans",
          "bonusFeatureIncludedInPlans",
          "url",
          "apiUrl"
        ],
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "polling",
              "trivia",
              "cups",
              "mascot",
              "yearbook",
              "namegame",
              "lightsout"
            ],
            "description": "Game id."
          },
          "name": {
            "type": "string",
            "description": "Display name."
          },
          "tier": {
            "type": "string",
            "enum": [
              "standard",
              "premium"
            ],
            "description": "Standard games fit any plan’s standard slots; Premium games need Pro or Max."
          },
          "description": {
            "type": "string",
            "description": "What participants experience."
          },
          "hostDescription": {
            "type": "string",
            "description": "What the host runs, in one line."
          },
          "bonusFeature": {
            "type": [
              "string",
              "null"
            ],
            "description": "Optional extra ability unlocked on Pro and Max; null if the game has none."
          },
          "hasContentLibrary": {
            "type": "boolean",
            "description": "Whether the game draws from a reusable content library."
          },
          "acceptsImageUploads": {
            "type": "boolean",
            "description": "Whether schools can upload their own images for it."
          },
          "includedInPlans": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "free",
                "basic",
                "pro",
                "max"
              ],
              "description": "Plan id."
            },
            "description": "Plans that can enable this game."
          },
          "bonusFeatureIncludedInPlans": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "free",
                "basic",
                "pro",
                "max"
              ],
              "description": "Plan id."
            },
            "description": "Plans on which the bonus feature is unlocked automatically."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Human-readable page describing the game."
          },
          "apiUrl": {
            "type": "string",
            "format": "uri",
            "description": "This game’s API URL."
          }
        },
        "additionalProperties": false
      },
      "GameList": {
        "type": "object",
        "required": [
          "games"
        ],
        "properties": {
          "games": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A live game a school can run at an event.",
              "required": [
                "id",
                "name",
                "tier",
                "description",
                "hostDescription",
                "bonusFeature",
                "hasContentLibrary",
                "acceptsImageUploads",
                "includedInPlans",
                "bonusFeatureIncludedInPlans",
                "url",
                "apiUrl"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "enum": [
                    "polling",
                    "trivia",
                    "cups",
                    "mascot",
                    "yearbook",
                    "namegame",
                    "lightsout"
                  ],
                  "description": "Game id."
                },
                "name": {
                  "type": "string",
                  "description": "Display name."
                },
                "tier": {
                  "type": "string",
                  "enum": [
                    "standard",
                    "premium"
                  ],
                  "description": "Standard games fit any plan’s standard slots; Premium games need Pro or Max."
                },
                "description": {
                  "type": "string",
                  "description": "What participants experience."
                },
                "hostDescription": {
                  "type": "string",
                  "description": "What the host runs, in one line."
                },
                "bonusFeature": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Optional extra ability unlocked on Pro and Max; null if the game has none."
                },
                "hasContentLibrary": {
                  "type": "boolean",
                  "description": "Whether the game draws from a reusable content library."
                },
                "acceptsImageUploads": {
                  "type": "boolean",
                  "description": "Whether schools can upload their own images for it."
                },
                "includedInPlans": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "free",
                      "basic",
                      "pro",
                      "max"
                    ],
                    "description": "Plan id."
                  },
                  "description": "Plans that can enable this game."
                },
                "bonusFeatureIncludedInPlans": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "free",
                      "basic",
                      "pro",
                      "max"
                    ],
                    "description": "Plan id."
                  },
                  "description": "Plans on which the bonus feature is unlocked automatically."
                },
                "url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Human-readable page describing the game."
                },
                "apiUrl": {
                  "type": "string",
                  "format": "uri",
                  "description": "This game’s API URL."
                }
              },
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false
      },
      "PlanList": {
        "type": "object",
        "required": [
          "plans",
          "addons",
          "pricingUrl",
          "note"
        ],
        "properties": {
          "plans": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "An annual subscription plan.",
              "required": [
                "id",
                "name",
                "pricingPageName",
                "tagline",
                "description",
                "priceUsd",
                "currency",
                "billingInterval",
                "maxParticipants",
                "standardGameSlots",
                "premiumGameSlots",
                "bonusFeaturesUnlocked",
                "leaderboards",
                "customBranding",
                "signUpUrl"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "enum": [
                    "free",
                    "basic",
                    "pro",
                    "max"
                  ],
                  "description": "Plan id."
                },
                "name": {
                  "type": "string"
                },
                "pricingPageName": {
                  "type": "string",
                  "description": "Name used on the pricing page (Free is marketed as “Trial”)."
                },
                "tagline": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "priceUsd": {
                  "type": "number",
                  "minimum": 0,
                  "description": "Annual list price in US dollars."
                },
                "currency": {
                  "type": "string",
                  "const": "USD"
                },
                "billingInterval": {
                  "type": "string",
                  "const": "year"
                },
                "maxParticipants": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "Participant cap per event; null means unlimited."
                },
                "standardGameSlots": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "Standard games included; null means all of them."
                },
                "premiumGameSlots": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "Premium games included; null means all of them."
                },
                "bonusFeaturesUnlocked": {
                  "type": "boolean",
                  "description": "Whether Standard games’ bonus features come unlocked."
                },
                "leaderboards": {
                  "type": "boolean",
                  "description": "Whether live team leaderboards are included."
                },
                "customBranding": {
                  "type": "boolean",
                  "description": "Whether custom branding and a custom domain are included."
                },
                "signUpUrl": {
                  "type": "string",
                  "format": "uri",
                  "description": "Where a school signs up for this plan."
                }
              },
              "additionalProperties": false
            }
          },
          "addons": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "name",
                "description",
                "priceUsd",
                "currency",
                "billingInterval",
                "availableOnPlans",
                "howToEnable"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "const": "sso"
                },
                "name": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "priceUsd": {
                  "type": "number",
                  "minimum": 0
                },
                "currency": {
                  "type": "string",
                  "const": "USD"
                },
                "billingInterval": {
                  "type": "string",
                  "const": "year"
                },
                "availableOnPlans": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "free",
                      "basic",
                      "pro",
                      "max"
                    ],
                    "description": "Plan id."
                  }
                },
                "howToEnable": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "pricingUrl": {
            "type": "string",
            "format": "uri",
            "description": "Authoritative pricing page."
          },
          "note": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "Recommendation": {
        "type": "object",
        "required": [
          "recommendedPlan",
          "ssoAddon",
          "totalAnnualPriceUsd",
          "currency",
          "reasons",
          "requirements",
          "signUpUrl"
        ],
        "properties": {
          "recommendedPlan": {
            "type": "object",
            "description": "An annual subscription plan.",
            "required": [
              "id",
              "name",
              "pricingPageName",
              "tagline",
              "description",
              "priceUsd",
              "currency",
              "billingInterval",
              "maxParticipants",
              "standardGameSlots",
              "premiumGameSlots",
              "bonusFeaturesUnlocked",
              "leaderboards",
              "customBranding",
              "signUpUrl"
            ],
            "properties": {
              "id": {
                "type": "string",
                "enum": [
                  "free",
                  "basic",
                  "pro",
                  "max"
                ],
                "description": "Plan id."
              },
              "name": {
                "type": "string"
              },
              "pricingPageName": {
                "type": "string",
                "description": "Name used on the pricing page (Free is marketed as “Trial”)."
              },
              "tagline": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "priceUsd": {
                "type": "number",
                "minimum": 0,
                "description": "Annual list price in US dollars."
              },
              "currency": {
                "type": "string",
                "const": "USD"
              },
              "billingInterval": {
                "type": "string",
                "const": "year"
              },
              "maxParticipants": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Participant cap per event; null means unlimited."
              },
              "standardGameSlots": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Standard games included; null means all of them."
              },
              "premiumGameSlots": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Premium games included; null means all of them."
              },
              "bonusFeaturesUnlocked": {
                "type": "boolean",
                "description": "Whether Standard games’ bonus features come unlocked."
              },
              "leaderboards": {
                "type": "boolean",
                "description": "Whether live team leaderboards are included."
              },
              "customBranding": {
                "type": "boolean",
                "description": "Whether custom branding and a custom domain are included."
              },
              "signUpUrl": {
                "type": "string",
                "format": "uri",
                "description": "Where a school signs up for this plan."
              }
            },
            "additionalProperties": false
          },
          "ssoAddon": {
            "type": "boolean",
            "description": "Whether the SSO add-on is included in the total."
          },
          "totalAnnualPriceUsd": {
            "type": "number",
            "minimum": 0,
            "description": "Plan price plus the add-on, if requested."
          },
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "reasons": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Why this plan was chosen."
          },
          "requirements": {
            "type": "object",
            "description": "The requirements as understood, after normalization.",
            "required": [
              "participants",
              "games",
              "customBranding",
              "leaderboards",
              "studentSso"
            ],
            "properties": {
              "participants": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "games": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "polling",
                    "trivia",
                    "cups",
                    "mascot",
                    "yearbook",
                    "namegame",
                    "lightsout"
                  ],
                  "description": "Game id."
                }
              },
              "customBranding": {
                "type": "boolean"
              },
              "leaderboards": {
                "type": "boolean"
              },
              "studentSso": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "signUpUrl": {
            "type": "string",
            "format": "uri",
            "description": "Sign-up link pre-selecting the recommended plan."
          }
        },
        "additionalProperties": false
      },
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details, with `code`, `hint` and `docs` extension members.",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "code",
          "error",
          "docs"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Identifies the problem type; links to its documentation."
          },
          "title": {
            "type": "string",
            "description": "Short summary of the HTTP status."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code."
          },
          "detail": {
            "type": "string",
            "description": "What went wrong, for this request."
          },
          "instance": {
            "type": "string",
            "description": "Request path the problem relates to."
          },
          "code": {
            "type": "string",
            "description": "Stable machine-readable error code.",
            "examples": [
              "not_found",
              "game_not_found"
            ]
          },
          "error": {
            "type": "string",
            "description": "Same as `detail`."
          },
          "hint": {
            "type": "string",
            "description": "How to fix or work around the problem."
          },
          "docs": {
            "type": "string",
            "format": "uri",
            "description": "Error reference."
          },
          "allowed": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Valid values, when a parameter was rejected."
          }
        }
      }
    }
  }
}