The Videas public API lets a server of yours work with your organization’s
library and its channels: read what the library holds — its assets and the
workspaces they are filed in —, add files and videos hosted elsewhere to it, edit
what is in it, and publish it on the organization’s channels. It answers at
https://api.videas.com/v1, speaks JSON over HTTPS, and is described by an
OpenAPI 3.1 contract, which the API reference
renders and lets you download.
Three things to do, in this order: create a key, keep it on a server, and send it with every request.
Create a key
An owner or an administrator of the organization creates keys, in the Videas app:
- Open Settings → API Access, then Create a key.
- Key name: what the key is for — “CMS sync”, “LMS import” — so that it can be recognized in the list, and in the history of the assets it edits.
- Expiration: no expiration, 30 days, 60 days, 90 days or one year. A key that expires on its own is one less forgotten secret.
- What the key may do: tick the permissions the integration needs, and nothing more. The ones that read are ticked by default; the ones that write are unticked, so that a key that writes is always created on purpose.
- Create the key, then Copy the key. Its full value,
ak_…, is shown this once and cannot be read again: store it straight away. A key whose value was lost is revoked and replaced.
A key belongs to the organization, not to the person who created it. It keeps working when they leave, and everything it reaches is that one organization’s.
Its permissions
A key opens the API with the permissions it carries, and no other. It may carry seven, and each opens what it says:
| On the keys screen | Permission | What it opens | By default |
|---|---|---|---|
| Read the library through the API | assets.library.read |
Listing, counting and reading the assets, the collections, the workspaces and the custom fields. | ticked |
| Add files to the library through the API | assets.library.upload |
Adding a file with POST /v1/uploads, then following or giving up the uploads it opened. |
unticked |
| Edit the library through the API | assets.library.edit |
Changing an asset already there: its words, its tags, its custom fields and its thumbnail. | unticked |
| Import videos from other platforms | assets.third_party_video.import |
With assets.library.upload beside it, adding a YouTube, Vimeo or Dailymotion video with POST /v1/assets. |
unticked |
| Read the channels through the API | websites.catalogue.read |
Reading the channels, their categories and what they publish. | ticked |
| Publish on the channels through the API | websites.catalogue.publish |
Publishing assets on the channels, and changing what they publish. | unticked |
| Read the playback sessions through the API | analytics.sessions.read |
Reading the organization’s playback sessions: who watched which asset, when and how much. | ticked |
- None implies another: a key made to publish cannot edit an asset, and a key made to edit cannot read the library. A write answers what it wrote whether or not the key may also read it.
- Three depend on what the organization uses. The two channel permissions
open nothing for an organization that does not publish channels: every channel
endpoint answers it
403, as it would a key without them. Andassets.third_party_video.importopens nothing until Videas turns on videos hosted elsewhere for the organization: until then,POST /v1/assetsanswers404. A key may carry either beforehand, and works with no change once the organization has the feature. - A key with no permission opens nothing.
Keep it on a server
The key is a secret, like a password:
- keep it in a secrets manager or in an environment variable your server reads — never in a repository, a web page or an app you ship to your users;
- give each integration a key of its own, so that one can be revoked without touching the others;
- to revoke one, Revoke in the same screen: anything still using it stops authenticating at once.
A web page cannot call the API anyway: /v1 sends no CORS headers, so a
browser refuses to hand a page its answers. To let your users send files from
their browser, your server opens the upload and hands the page that upload’s own
token, never the key — see
Add a file with the API.
Send it with every request
The key goes in the Authorization header, as a Bearer token:
Authorization: Bearer ak_…
Without it, or with a key that is unknown, expired or revoked, the answer is a
401 with the code unauthorized. A key that does not carry the permission an
endpoint requires gets a 403, forbidden.
Your first call
List the assets of your library:
export VIDEAS_API_KEY="ak_…" # better: from your secrets manager
curl https://api.videas.com/v1/assets \
-H "Authorization: Bearer $VIDEAS_API_KEY"
The answer is one page of assets, oldest first, and the cursor of the next page:
{
"data": [
{
"id": "0192a6b2-4f1a-7b90-8e0d-51c3a7f2b046",
"name": "Opening lecture",
"type": "video",
"status": "ready",
"workspace_id": "0192a6b1-7c3e-7d40-9a51-3f0e2b6c8d10",
"description": null,
"external_ref": "course-42/lecture-1",
"language": "en",
"duration_ms": 2712000,
"created_at": "2026-09-26T09:12:44Z",
"updated_at": "2026-09-26T09:31:02Z",
"third_party": null,
"thumbnail_url": "https://app.videas.com/images/assets/0192a6b2-4f1a-7b90-8e0d-51c3a7f2b046/thumbnail.jpg"
}
],
"next": "MDE5MmE2YjItNGYxYS03Yjkw…"
}
The same call from Node.js (18 or later) and from Python, on your server:
const response = await fetch('https://api.videas.com/v1/assets', {
headers: { Authorization: `Bearer ${process.env.VIDEAS_API_KEY}` },
})
const page = await response.json()
if (!response.ok) throw new Error(`${page.code}: ${page.message}`)
console.log(page.data.length, 'assets on this page')
import os
import requests
response = requests.get(
"https://api.videas.com/v1/assets",
headers={"Authorization": f"Bearer {os.environ['VIDEAS_API_KEY']}"},
)
response.raise_for_status()
page = response.json()
print(len(page["data"]), "assets on this page")
A 403 here means the key cannot read the library: create one with
Read the library through the API ticked.
What the API does
The library
| Endpoint | What it does | Permission |
|---|---|---|
GET /v1/assets |
Lists the assets, one page at a time, filtered by type, workspace or your own reference | assets.library.read |
GET /v1/assets/count |
Counts them, under the same filters | assets.library.read |
GET /v1/assets/{asset_id} |
Reads one asset, with its tags and its custom fields | assets.library.read |
GET /v1/workspaces |
Lists the workspaces an asset can be in — and …/count counts them |
assets.library.read |
GET /v1/custom-fields |
Lists the organization’s custom fields, and …/{field_id}/choices the options of a choice field — each with its …/count |
assets.library.read |
GET /v1/collections |
Lists the collections, the lists of assets played one after the other — …/{collection_id} reads one, …/count counts them |
assets.library.read |
GET /v1/collections/{collection_id}/items |
Lists what a collection plays, with each asset’s position | assets.library.read |
Adding to it
| Endpoint | What it does | Permission |
|---|---|---|
POST /v1/uploads |
Adds a file: one you send, or one fetched from a link | assets.library.upload |
GET /v1/uploads/{upload_id} |
Says how far an upload got | assets.library.upload |
DELETE /v1/uploads/{upload_id} |
Gives an upload up | assets.library.upload |
POST /v1/assets |
Adds a video hosted on YouTube, Vimeo or Dailymotion | assets.library.upload and assets.third_party_video.import |
Editing an asset
| Endpoint | What it does | Permission |
|---|---|---|
PATCH /v1/assets/{asset_id} |
Changes its words: title, description, excerpt, copyright notice, language, reference, SEO texts | assets.library.edit |
PUT /v1/assets/{asset_id}/tags |
Sets its tags, by their words | assets.library.edit |
PATCH /v1/assets/{asset_id}/custom-fields |
Writes its values of the custom fields | assets.library.edit |
PUT /v1/assets/{asset_id}/thumbnail |
Chooses its thumbnail, by sending it | assets.library.edit |
The channels
| Endpoint | What it does | Permission |
|---|---|---|
GET /v1/channels |
Lists the organization’s channels — …/{channel_id} reads one, …/count counts them |
websites.catalogue.read |
GET /v1/categories |
Lists the channels’ categories, and …/count counts them |
websites.catalogue.read |
GET /v1/publications |
Lists what the channels publish — …/{publication_id} reads one, …/count counts them |
websites.catalogue.read |
POST /v1/publications |
Publishes an asset on a channel | websites.catalogue.publish |
PATCH /v1/publications/{publication_id} |
Changes a publication: status, date, access, address, filing | websites.catalogue.publish |
What was watched
| Endpoint | What it does | Permission |
|---|---|---|
GET /v1/analytics/sessions |
Lists the playback sessions — who watched which asset, when, how much and which stretches —, narrowed by asset or by viewer, and …/count counts them |
analytics.sessions.read |
New resources land under /v1 without changing what is already there —
Errors, limits and versions says
what may change and what may not.
Next steps
- Read the library — filters, pages, counts, one asset, the workspaces.
- Add a file with the API, from a link, or a video hosted elsewhere.
- Edit an asset, its custom fields and its thumbnail.
- Publish on a channel.
- Errors, limits and versions — what to do with each refusal.
- The API reference: every endpoint, field and error, generated from the contract.