{
  "openapi": "3.1.0",
  "info": {
    "title": "Vanish Hub API",
    "version": "1.0.0",
    "summary": "Read-only catalogue and Roblox client utilities.",
    "description": "Public endpoints for Vanish Hub, a storefront selling Roblox script executors, scripts and external tools. The catalogue is readable programmatically; ordering is not. Checkout runs through Komerza's hosted flow and requires a human, so there is no public commerce API and none is described here. No authentication is required for any operation below.\n\n## Versioning\nThe current version is v1. Every catalogue path is served both unversioned (`/api/products`) and path-versioned (`/api/v1/products`); the unversioned path always tracks the current major version. Every JSON response carries an `X-API-Version` header. Deprecation policy: a retired endpoint keeps working for at least 90 days and is served with `Deprecation` and `Sunset` response headers for the whole window, so an integration is never broken without notice.\n\n## Rate limits\nThere is no per-request throttle. A generous ceiling — 600 requests per 60 seconds, declared statically in the `RateLimit-Limit` and `RateLimit-Policy` response headers — is enforced at the edge as abuse protection. A `429` response, in the rare event you see one, carries `Retry-After`.",
    "contact": {
      "name": "Vanish Hub support",
      "email": "support@vanishhub.com",
      "url": "https://discord.gg/vanishhub"
    },
    "license": {
      "name": "Proprietary",
      "url": "https://vanishhub.com/terms"
    }
  },
  "servers": [
    {
      "url": "https://vanishhub.com",
      "description": "Catalogue"
    },
    {
      "url": "https://cdn.vanishhub.com",
      "description": "Roblox client downloads and executor status (Cloudflare Worker)"
    }
  ],
  "externalDocs": {
    "description": "Agent guide (llms.txt)",
    "url": "https://vanishhub.com/llms.txt"
  },
  "tags": [
    {
      "name": "Catalogue",
      "description": "What Vanish Hub sells, and for how much."
    },
    {
      "name": "Roblox",
      "description": "Roblox client versions, downloads and executor status."
    }
  ],
  "paths": {
    "/api/products": {
      "get": {
        "operationId": "listProducts",
        "tags": [
          "Catalogue"
        ],
        "summary": "List every product on sale",
        "description": "Returns the full public catalogue with current prices. Products hidden in the store dashboard are excluded.",
        "responses": {
          "200": {
            "description": "The catalogue.",
            "headers": {
              "X-API-Version": {
                "description": "The API version that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Limit": {
                "description": "Requests permitted per window.",
                "schema": {
                  "type": "integer",
                  "examples": [
                    600
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "The rate-limit policy, per the RFC RateLimit header draft.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"public\";q=600;w=60"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "object",
                    "count",
                    "data"
                  ],
                  "properties": {
                    "object": {
                      "type": "string",
                      "const": "list"
                    },
                    "count": {
                      "type": "integer",
                      "examples": [
                        9
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Product"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded. Retry after the interval given in the Retry-After header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The upstream store could not be reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/products/{slug}": {
      "get": {
        "operationId": "getProductBySlug",
        "tags": [
          "Catalogue"
        ],
        "summary": "Get one product by its handle",
        "description": "Returns a single product. On a miss the error hint lists every valid handle, so a wrong guess is correctable in one further call.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Store handle, as returned by listProducts.",
            "schema": {
              "type": "string",
              "examples": [
                "volt-executor"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The product.",
            "headers": {
              "X-API-Version": {
                "description": "The API version that served this response.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "1"
                  ]
                }
              },
              "RateLimit-Limit": {
                "description": "Requests permitted per window.",
                "schema": {
                  "type": "integer",
                  "examples": [
                    600
                  ]
                }
              },
              "RateLimit-Policy": {
                "description": "The rate-limit policy, per the RFC RateLimit header draft.",
                "schema": {
                  "type": "string",
                  "examples": [
                    "\"public\";q=600;w=60"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                }
              }
            }
          },
          "400": {
            "description": "No handle supplied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No product with that handle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded. Retry after the interval given in the Retry-After header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/versions/current": {
      "servers": [
        {
          "url": "https://cdn.vanishhub.com"
        }
      ],
      "get": {
        "operationId": "getCurrentRobloxVersion",
        "tags": [
          "Roblox"
        ],
        "summary": "Current Roblox client version",
        "description": "The version string Roblox is shipping now, for Windows and Mac.",
        "responses": {
          "200": {
            "description": "Version metadata.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "Windows": {
                      "type": "string",
                      "examples": [
                        "version-ddf602d9cfe44005"
                      ]
                    },
                    "WindowsDate": {
                      "type": "string"
                    },
                    "Mac": {
                      "type": "string"
                    },
                    "MacDate": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "The upstream version service is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/versions/past": {
      "servers": [
        {
          "url": "https://cdn.vanishhub.com"
        }
      ],
      "get": {
        "operationId": "listPastRobloxVersions",
        "tags": [
          "Roblox"
        ],
        "summary": "Previous Roblox client versions",
        "description": "Earlier version strings, used to install a specific build when the current one is not wanted.",
        "responses": {
          "200": {
            "description": "Past versions, newest first.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "Windows": {
                      "type": "string",
                      "examples": [
                        "version-ce0bcd0fbd484804"
                      ]
                    },
                    "WindowsDate": {
                      "type": "string",
                      "examples": [
                        "8/18/2026, 4:00:48 PM UTC"
                      ]
                    },
                    "Mac": {
                      "type": "string"
                    },
                    "MacDate": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "The upstream version service is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/rbxcdn": {
      "servers": [
        {
          "url": "https://cdn.vanishhub.com"
        }
      ],
      "get": {
        "operationId": "downloadRobloxClientFile",
        "tags": [
          "Roblox"
        ],
        "summary": "Stream a Roblox client file",
        "description": "Passthrough to Roblox's own CDN for one file of a client build. Supports HTTP Range for resumable downloads.",
        "parameters": [
          {
            "name": "file",
            "in": "query",
            "required": true,
            "description": "Filename from a version manifest, e.g. version-abc123-RobloxApp.zip.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The file.",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "The file parameter was missing or malformed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Roblox's CDN did not respond.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/status": {
      "servers": [
        {
          "url": "https://cdn.vanishhub.com"
        }
      ],
      "get": {
        "operationId": "getExploitStatus",
        "tags": [
          "Roblox"
        ],
        "summary": "Working status for an executor",
        "description": "Whether a named executor currently works against the live Roblox client, with its version, UNC and sUNC percentages.",
        "parameters": [
          {
            "name": "exploit",
            "in": "query",
            "required": true,
            "description": "Executor name.",
            "schema": {
              "type": "string",
              "examples": [
                "Volt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Status for that executor.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    },
                    "version": {
                      "type": "string"
                    },
                    "updateStatus": {
                      "type": "boolean",
                      "description": "True when it works against the current client."
                    },
                    "detected": {
                      "type": "boolean"
                    },
                    "uncPercentage": {
                      "type": "number"
                    },
                    "suncPercentage": {
                      "type": "number"
                    },
                    "platform": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "No exploit name supplied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The upstream status service is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable identifier for the failure.",
                "examples": [
                  "product_not_found",
                  "catalogue_unavailable"
                ]
              },
              "message": {
                "type": "string",
                "description": "Human-readable description."
              },
              "hint": {
                "type": "string",
                "description": "What to do about it. Drives retry and correction behaviour."
              }
            }
          }
        }
      },
      "Product": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Store handle. Use this as the path parameter.",
            "examples": [
              "volt-executor"
            ]
          },
          "name": {
            "type": "string",
            "examples": [
              "Volt Roblox Executor"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "category": {
            "type": "string",
            "examples": [
              "SOFTWARE"
            ]
          },
          "price_from": {
            "type": [
              "number",
              "null"
            ],
            "description": "Lowest variant price. Null when no priced variant exists.",
            "examples": [
              5.99
            ]
          },
          "currency": {
            "type": "string",
            "examples": [
              "USD"
            ]
          },
          "image_url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Human-facing product page."
          },
          "object": {
            "type": "string",
            "const": "product",
            "description": "Present on the single-product response, absent on list items."
          },
          "purchase": {
            "type": "object",
            "description": "How this product is bought. Present on the single-product response.",
            "properties": {
              "method": {
                "type": "string",
                "const": "hosted_checkout"
              },
              "note": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}