API Reference

MCP server

The same endpoints this reference documents, offered as tools an AI assistant can call. Point an MCP client at Vsub, approve one workspace, and it can create videos, check on them and export them without you writing any code.

Connect your client

One url, spoken over Streamable HTTP. Clients that can sign in need nothing else: paste it, approve one workspace in the browser tab that opens, and the tools appear. Clients that only send static headers can carry an API token instead.

MCP endpoint
https://api.vsub.io/mcp
OAuth, no API token needed
  1. 1Open Settings and go to Connectors.
  2. 2Click Add custom connector and paste the url.
  3. 3Click Connect, sign in, then pick a workspace and approve.
Remote MCP server url
https://api.vsub.io/mcp

Menu names move around between client versions, and any client built on an MCP SDK works the same way. The url is the part that matters.

Tools

Each tool is one endpoint of this API, with the same validation, credit cost and webhooks. Creating a video returns immediately with a processing status, so an assistant should call get_video again a little later, or pass webhookUrl and wait to be told.

Available tools
create_caption_video
video
Transcribes a spoken video from a url and burns captions in.
create_ai_video
video
Turns a script into a narrated video with generated images.
create_quiz_video
video
Builds a quiz video from questions and answers.
create_roblox_video
video
Narrates a script over Roblox gameplay.
create_fake_text_video
video
Plays out a chat conversation as a video.
get_video
read
Status of a video, with the mp4 url once it exists.
render_video
video
Exports the mp4 of a video that finished generating.
upload_file
write
Stores an image, gif or video from a url and returns its key.
list_voices
read
The voices a voiceId can be set to.
list_caption_templates
read
The caption styles a video can burn in.
get_workspace
read
Plan, credit balance and owner of the workspace.
list_credit_logs
read
Credit movements, with the video each one paid for.
list_balance_logs
read
Cash balance movements: top ups and marketplace charges.

Tools marked video spend credits, exactly as the same call over HTTP would. A tool that fails answers with the error text rather than breaking the conversation, so an assistant can correct its arguments and try again.

Authorization

Vsub is both the resource server and the authorization server, so there is nothing to set up before connecting. A client registers itself, sends you here to approve a workspace, and receives a token scoped to that one workspace. PKCE is required and client secrets are not used.

Discovery
GET /.well-known/oauth-protected-resource
metadata
What /mcp is and which authorization server guards it, RFC 9728.
GET /.well-known/oauth-authorization-server
metadata
Where to register, authorize and get tokens, RFC 8414.
POST /oauth/register
endpoint
Dynamic client registration, RFC 7591. Returns a client_id, no secret. Redirect urls must be https, or http on localhost.
GET /oauth/authorize
endpoint
Sends the user to the consent screen, where they sign in if needed and pick a workspace. Requires code_challenge with S256.
POST /oauth/token
endpoint
Trades the code for a token, or refreshes one. Access tokens last 12 hours, refresh tokens 90 days and rotate on every use.
POST /oauth/revoke
endpoint
Ends a connection, RFC 7009. Both halves of the pair stop working at once.

An unauthorized call to /mcp answers 401 with the resource metadata url in WWW-Authenticate, which is how a client finds its way to the flow above on its own.

Unauthorized response
curl -i -X POST "https://api.vsub.io/mcp"

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://api.vsub.io/.well-known/oauth-protected-resource"

Trying it by hand

The endpoint speaks plain JSON-RPC, so an API token is enough to see what an assistant sees.

Calling a tool
curl -X POST "https://api.vsub.io/mcp" \
  -H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "create_roblox_video",
      "arguments": {
        "script": "My little brother deleted my Roblox account...",
        "render": {}
      }
    }
  }'