{
  "openapi": "3.0.3",
  "info": {"title": "WDG Reseller API", "version": "1.3.0", "description": "Supplier-neutral digital products, vouchers and game top-ups."},
  "servers": [{"url": "/api/v1"}],
  "security": [{"ApiKey": []}],
  "components": {
    "securitySchemes": {"ApiKey": {"type": "apiKey", "in": "header", "name": "X-API-Key"}},
    "schemas": {
      "Purchase": {"type": "object", "required": ["quantity"], "properties": {"quantity": {"type": "integer", "minimum": 1, "maximum": 100}, "player_id": {"type": "string"}, "callback_url": {"type": "string", "format": "uri", "description": "Public HTTPS endpoint for terminal order events."}}},
      "Webhook": {"type": "object", "required": ["id", "event", "created_at", "data"], "properties": {"id": {"type": "string", "format": "uuid"}, "event": {"type": "string", "enum": ["order.completed", "order.failed", "order.refunded"]}, "created_at": {"type": "string", "format": "date-time"}, "data": {"type": "object"}}}
    }
  },
  "paths": {
    "/me": {"get": {"summary": "Current reseller and wallet", "responses": {"200": {"description": "Account"}, "401": {"description": "Unauthorized"}}}},
    "/health": {"get": {"summary": "Platform health", "responses": {"200": {"description": "Operational"}}}},
    "/catalog": {"get": {"summary": "Choose Voucher or Top Up catalog", "responses": {"200": {"description": "Catalog types"}}}},
    "/catalog/{type}/categories": {"get": {"summary": "Root categories or subcategories", "parameters": [{"name": "type", "in": "path", "required": true, "schema": {"type": "string", "enum": ["vouchers", "topups"]}}, {"name": "parent_id", "in": "query", "schema": {"type": "integer"}, "description": "Omit for root categories; send the selected category ID for its children."}], "responses": {"200": {"description": "Categories with has_children and next fields"}}}},
    "/catalog/{type}/categories/{category_id}/products": {"get": {"summary": "Products in a leaf category", "parameters": [{"name": "type", "in": "path", "required": true, "schema": {"type": "string", "enum": ["vouchers", "topups"]}}, {"name": "category_id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "in_stock", "in": "query", "schema": {"type": "integer", "enum": [1]}}, {"name": "page", "in": "query", "schema": {"type": "integer", "minimum": 1}}, {"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 100}}], "responses": {"200": {"description": "Products"}, "409": {"description": "A subcategory must be selected first"}}}},
    "/categories": {"get": {"summary": "Active category tree", "responses": {"200": {"description": "Categories"}}}},
    "/products": {"get": {"summary": "Products, prices and live stock", "parameters": [{"name": "category_id", "in": "query", "schema": {"type": "integer"}}, {"name": "type", "in": "query", "schema": {"type": "string", "enum": ["voucher", "topup", "manual"]}}, {"name": "in_stock", "in": "query", "schema": {"type": "integer", "enum": [1]}}, {"name": "page", "in": "query", "schema": {"type": "integer", "minimum": 1}}, {"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 100}}], "responses": {"200": {"description": "Products"}}}},
    "/products/{id}": {"get": {"summary": "One product", "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "Product"}, "404": {"description": "Not found"}}}},
    "/products/{id}/purchase": {"post": {"summary": "Create an idempotent purchase", "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "X-Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "maxLength": 100}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Purchase"}}}}, "responses": {"201": {"description": "Created"}, "200": {"description": "Idempotent replay"}, "409": {"description": "Out of stock"}, "422": {"description": "Invalid request"}}}},
    "/orders": {"get": {"summary": "Order history", "responses": {"200": {"description": "Orders"}}}},
    "/orders/{id}": {"get": {"summary": "One order", "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "Order"}, "404": {"description": "Not found"}}}},
    "/orders/{id}/delivery": {"get": {"summary": "Poll delivery", "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "Ready"}, "202": {"description": "Processing"}, "410": {"description": "Refunded"}}}},
    "/transactions": {"get": {"summary": "Wallet ledger", "responses": {"200": {"description": "Transactions"}}}}
  }
}
