API Reference

Workspace

A token is minted for one workspace by one member. These endpoints tell you which, along with the plan, what is left to spend and where it went, so you can check a token works, watch the balance before queueing a batch of videos and account for what each one cost.

GET/v1/workspace

Get workspace

Returns the workspace the token was minted for and the member who created it. Nothing to pass, the token identifies both.
Response fields
idrequired
number
Workspace id, the same one shown in the app.
namerequired
string
Workspace name.
planrequired
string
One of free, starter, pro or premium, or a lifetime plan such as sumo_1. Rendering requires a paid plan.
creditsrequired
number
Credits left this billing period. Generating and rendering both spend them, so a create call fails once this hits zero.
balancerequired
number
Cash balance in US dollars, topped up separately from the plan. Only the gameplay marketplace and the AI tools spend it, videos never do.
createdAtrequired
string
ISO timestamp of when the workspace was created.
userrequired
object
The member who created the token, with id, name and email. Videos created with this token are owned by them.
Request
curl "https://api.vsub.io/v1/workspace" \
  -H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90"
Response 200
{
  "id": 1842,
  "name": "Acme Studio",
  "plan": "premium",
  "credits": 4180,
  "balance": 12.5,
  "createdAt": "2025-11-02T09:14:33.000Z",
  "user": {
    "id": 933,
    "name": "Alex Nguyen",
    "email": "alex@acme.studio"
  }
}
GET/v1/workspace/credit-logs

List credit logs

Every credit movement in the workspace, newest first. Each entry says what spent or added the credits and what the balance was either side of it, so you can attribute a bill to the videos that ran up.
Query parameters
page
number, 1 to 10000
Page to read, counting from 1. Entries are ordered newest first.
default: 1
pageSize
number, 1 to 200
How many entries a page holds.
default: 50
Response fields
logs[].idrequired
number
Log entry id.
logs[].amountrequired
number
Credits added or, when negative, spent. Generation charges land as several small entries, one per model call.
logs[].beforerequired
number
Credit balance before the entry.
logs[].afterrequired
number
Credit balance after the entry.
logs[].reasonrequired
string
What the credits went on, such as Elevenlabs TTS, ChatGPT AI automation, Video rendering or Top-up. Treat it as a human readable label rather than a fixed set, new entries appear as features ship.
logs[].videoId
string
The video the charge belongs to, when there is one. Videos created in the app show up here too, so an id you don't recognise won't resolve on Video status.
logs[].userIdrequired
number
The member whose action caused the change.
logs[].createdAtrequired
string
ISO timestamp of the entry.
pagerequired
number
The page returned.
pageSizerequired
number
Entries a page holds.
totalrequired
number
Entries across every page. Keep requesting pages while page is below totalPages.
totalPagesrequired
number
Pages available at this page size.
Request
curl "https://api.vsub.io/v1/workspace/credit-logs?page=1&pageSize=50" \
  -H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90"
Response 200
{
  "logs": [
    {
      "id": 90412,
      "amount": -30,
      "before": 4210,
      "after": 4180,
      "reason": "Video rendering",
      "videoId": "b4c1f0d2-7a55-4e0e-9a1f-2c8d3e5b7a10",
      "userId": 933,
      "createdAt": "2026-08-05T09:14:33.000Z"
    },
    {
      "id": 90411,
      "amount": -12,
      "before": 4222,
      "after": 4210,
      "reason": "Elevenlabs TTS",
      "videoId": "b4c1f0d2-7a55-4e0e-9a1f-2c8d3e5b7a10",
      "userId": 933,
      "createdAt": "2026-08-05T09:12:58.000Z"
    }
  ],
  "page": 1,
  "pageSize": 50,
  "total": 412,
  "totalPages": 9
}
GET/v1/workspace/balance-logs

List balance logs

The same history for the cash balance: top ups, gameplay purchases and conversions to credits. Amounts are in US dollars.
Query parameters
page
number, 1 to 10000
Page to read, counting from 1. Entries are ordered newest first.
default: 1
pageSize
number, 1 to 200
How many entries a page holds.
default: 50
Response fields
logs[].idrequired
number
Log entry id.
logs[].amountrequired
number
Dollars added or, when negative, spent.
logs[].beforerequired
number
Cash balance before the entry.
logs[].afterrequired
number
Cash balance after the entry.
logs[].reasonrequired
string
What the money went on, such as Top-up, Convert to credits or Buy game play.
logs[].userIdrequired
number
The member whose action caused the change.
logs[].createdAtrequired
string
ISO timestamp of the entry.
pagerequired
number
The page returned.
pageSizerequired
number
Entries a page holds.
totalrequired
number
Entries across every page. Keep requesting pages while page is below totalPages.
totalPagesrequired
number
Pages available at this page size.
Request
curl "https://api.vsub.io/v1/workspace/balance-logs?page=1&pageSize=50" \
  -H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90"
Response 200
{
  "logs": [
    {
      "id": 5120,
      "amount": -1.5,
      "before": 14,
      "after": 12.5,
      "reason": "Buy game play: 8821",
      "userId": 933,
      "createdAt": "2026-08-03T18:02:11.000Z"
    },
    {
      "id": 5119,
      "amount": 10,
      "before": 4,
      "after": 14,
      "reason": "Top-up",
      "userId": 933,
      "createdAt": "2026-07-28T11:40:06.000Z"
    }
  ],
  "page": 1,
  "pageSize": 50,
  "total": 18,
  "totalPages": 1
}

A revoked or mistyped token answers 401 here, which makes this the cheapest call to verify credentials with. See Errors for the rest of the status codes.