Authentication
Every VoxelAI Studio endpoint authenticates the same way: a Bearer token in the
Authorization header.
Authorization: Bearer YOUR_ACCESS_TOKENIf the token is missing, expired, or invalid, the API returns 401 Unauthorized.
Token types
Section titled “Token types”Both are sent in the exact same Authorization: Bearer ... header; the server
detects which one you sent.
1. Supabase session token
Section titled “1. Supabase session token”The short-lived JWT issued when a user signs in to the web app. The browser uses it for every in-app call. If you are developing against the app itself, you can read it from your session state. These tokens expire and must be refreshed by signing in again.
2. Personal Access Token (vxlrbx_…)
Section titled “2. Personal Access Token (vxlrbx_…)”A long-lived token for programmatic clients — currently the Roblox Studio plugin.
It looks like vxlrbx_ followed by a hex string. Only a SHA-256 hash of the
token is stored server-side, so it is shown to you exactly once, at the moment it
is minted. Treat it like a password.
You obtain a PAT through the device-link pairing flow — there is no
password-style endpoint. See Roblox Studio
for the full walkthrough, and revoke a token any time with
POST /api/plugin/tokens/revoke.
Error codes
Section titled “Error codes”When a request is rejected for a reason beyond plain auth, the JSON body carries
a machine-readable code alongside the HTTP status:
| HTTP | code |
Meaning |
|---|---|---|
| 401 | — | Missing, expired, or invalid token. |
| 402 | INSUFFICIENT_TOKENS |
Authenticated, but out of tokens. Top up or upgrade. |
| 402 | ADULT_CONTENT_PAID_ONLY |
Prompt flagged adult/violent; blocked for free plans. |
| 403 | NO_BALANCE |
No token balance record exists for the account. |
| 403 | CONTENT_FLAGGED |
Flagged content cannot be saved to the gallery. |
| 422 | EMPTY_MODEL |
The agentic build produced nothing; the charge was refunded. |
| 429 | — | Rate limited (per-endpoint cooldown). |
See Endpoints for which codes each route can return.