{
  "openapi": "3.1.0",
  "info": {
    "title": "TablePulse API",
    "description": "Board-game and tabletop intelligence for recommendations, comparisons, expansions, collection valuation, crowdfunding, party/solo/family picks, complexity, pricing, and awards. All endpoints require x402 payment (USDC on Base mainnet) via the PAYMENT-SIGNATURE header. Never uses BoardGameGeek API or data.",
    "version": "1.0.0",
    "contact": {
      "url": "https://tablepulse.vercel.app"
    }
  },
  "servers": [
    {
      "url": "https://tablepulse.vercel.app"
    }
  ],
  "components": {
    "securitySchemes": {
      "x402": {
        "type": "apiKey",
        "in": "header",
        "name": "PAYMENT-SIGNATURE",
        "description": "x402 payment signature. Send a GET request without this header to receive a 402 with payment requirements. Sign the payment and retry with the PAYMENT-SIGNATURE header."
      }
    }
  },
  "paths": {
    "/api/table/recommend": {
      "get": {
        "summary": "Board-game recommendations by group profile",
        "description": "Ranked shortlist of game recommendations for a group profile \u2014 player count, complexity tolerance, theme, playtime, budget, ages. Grounded in current web sources, never BoardGameGeek data.",
        "operationId": "tableRecommend",
        "parameters": [
          {
            "name": "player_count",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "e.g. 3-4, 2, 6+"
          },
          {
            "name": "complexity_tolerance",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "light",
                "medium",
                "heavy"
              ]
            }
          },
          {
            "name": "themes",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "playtime_minutes",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "budget",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ages",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Recommendation shortlist",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 payment requirements"
              }
            }
          }
        },
        "x-price-usd": 0.15
      }
    },
    "/api/table/compare": {
      "get": {
        "summary": "Head-to-head board-game comparison",
        "description": "Compares 2-4 games across mechanics, complexity, replayability, and price, plus a use-case-specific verdict.",
        "operationId": "tableCompare",
        "parameters": [
          {
            "name": "games",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated titles, 2-4"
          },
          {
            "name": "use_case",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Comparison result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.1
      }
    },
    "/api/table/expansion-check": {
      "get": {
        "summary": "Expansion worth-it check",
        "description": "Which expansions are worth it for a base game \u2014 compatibility, standalone status, and buy order.",
        "operationId": "tableExpansionCheck",
        "parameters": [
          {
            "name": "base_game",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "expansions",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Expansion assessment",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.08
      }
    },
    "/api/table/collection-value": {
      "get": {
        "summary": "Board-game collection valuation",
        "description": "Estimates-only collection valuation \u2014 out-of-print premiums, reprint-risk warnings, condition factors. Never an appraisal.",
        "operationId": "tableCollectionValue",
        "parameters": [
          {
            "name": "games",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated titles, edition optional per item"
          },
          {
            "name": "condition",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Valuation result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.15
      }
    },
    "/api/table/crowdfunding-radar": {
      "get": {
        "summary": "Crowdfunding back-now-vs-wait radar",
        "description": "Back-now-vs-wait-for-retail analysis for a Kickstarter/Gamefound campaign. Uses the real Gamefound public API for campaign figures when the project is hosted there.",
        "operationId": "tableCrowdfundingRadar",
        "parameters": [
          {
            "name": "project",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "platform_hint",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "gamefound",
                "kickstarter"
              ]
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Crowdfunding radar result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.12
      }
    },
    "/api/table/party-finder": {
      "get": {
        "summary": "Party/social game finder",
        "description": "Best-fit party/social games by group size, vibe, drinking-or-not, and family-mixed-ages.",
        "operationId": "tablePartyFinder",
        "parameters": [
          {
            "name": "group_size",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "vibe",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "drinking_ok",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "family_mixed_ages",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Party-game shortlist",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.1
      }
    },
    "/api/table/solo-picks": {
      "get": {
        "summary": "Best solo-mode board games",
        "description": "Best-fit solo-mode games by preference, with an honest read on solo-variant quality.",
        "operationId": "tableSoloPicks",
        "parameters": [
          {
            "name": "preference",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "experience_level",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Solo-game shortlist",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.1
      }
    },
    "/api/table/family-fit": {
      "get": {
        "summary": "Family age-fit and gateway ladder",
        "description": "Age-appropriate picks with an actual-age-vs-box-age reality check and a gateway-game progression ladder.",
        "operationId": "tableFamilyFit",
        "parameters": [
          {
            "name": "youngest_age",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "oldest_age",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "player_count",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Family-fit result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.1
      }
    },
    "/api/table/complexity-explainer": {
      "get": {
        "summary": "Is this game right for my group",
        "description": "Plain-language complexity breakdown, honest teach-time reality, and a rules-overhead verdict for a specific game and group experience level.",
        "operationId": "tableComplexityExplainer",
        "parameters": [
          {
            "name": "game",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "group_experience_level",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Complexity explainer result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.08
      }
    },
    "/api/table/deal-watch": {
      "get": {
        "summary": "Board-game pricing guidance",
        "description": "MSRP vs street price, when/where deals happen, holiday cycles, and Kickstarter-vs-retail math. Uses the real BoardGamePrices.co.uk multi-retailer API.",
        "operationId": "tableDealWatch",
        "parameters": [
          {
            "name": "game",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "GB",
                "DE",
                "US",
                "DK",
                "SE"
              ]
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Pricing guidance result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.1
      }
    },
    "/api/table/award-tracker": {
      "get": {
        "summary": "Board-game award tracker",
        "description": "Spiel des Jahres, Kennerspiel des Jahres, Kinderspiel des Jahres, and Golden Geek \u2014 nominees, winner status, and what the award means for buyers and publishers.",
        "operationId": "tableAwardTracker",
        "parameters": [
          {
            "name": "award",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "spiel-des-jahres",
                "kennerspiel",
                "kinderspiel",
                "golden-geek",
                "general"
              ]
            }
          },
          {
            "name": "year",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Award status result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "402": {
            "description": "Payment required.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "x-price-usd": 0.08
      }
    }
  }
}