Videos

Videos

You can manage the videos within your content library by making the following requests:

Create a video
POST /videos

Required parameters

KeyTypeDescription
nameStringIts title (1-100 characters)
inputStringEither:
A URL e.g. https://www.dropbox.com/my-video.mp4?dl=1
A reference to an upload e.g vidbeo://uploads/abcde12345abcde12345a

So if the video is on your computer, you need to upload the video before you can submit it. To do that using the API, request an upload ID via a call to POST /uploads. Upload the video file to that upload URL, then send us a reference to it here, like this: vidbeo://uploads/UPLOAD-ID-GOES-HERE.

Example request (1)

Our video can be fetched from https://www.example.com/video.mp4:

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"input":"https://www.example.com/video.mp4", "name":"New video"}' \
"https://api.vidbeo.com/v2/videos"

Example request (2)

The video is on our computer. So we have to upload it first:

  1. Request an upload ID. See POST /uploads
  2. Upload the video to that URL
  3. Send a reference to the uploaded file, formatted as shown below
curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"input":"vidbeo://uploads/abcde12345abcde12345a", "name":"New video"}' \
"https://api.vidbeo.com/v2/videos"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"type": "vod",
"name": "New video",
"description": "",
"outputs": [],
"thumbnail": "",
"sprite": "",
"duration": 0,
"privacy": "private",
"tracks": [],
"categories": [],
"enabled": true,
"transcoder": "",
"content_rating": "all",
"spherical": false,
"projection": "",
"cards": [],
"gates": [],
"hotspots": [],
"chapters": [],
"page_url": "",
"progress": 0,
"status": "preparing",
"tags": [],
"start_time": "",
"end_time": "",
"created_by": "abcde12345abcde1234a",
"created_time": "2022-01-01T00:00:00.000Z",
"updated_by": "abcde12345abcde12345a",
"updated_time": "2022-01-01T00:00:00.000Z"
},
"links": null,
"errors": []
}

In both cases the response structure is the same. Internally our system retrieves the file from the appropriate place.

The most important attribute returned is id. This is the unique identifier that this video has now been assigned. You can then use that, via GET /videos/:id to get the details of this video.

Your video file needs to be transcoded before it is available to watch online. Once it is picked up for processing, the system will attempt to download the source file from the provided input. If it can do so, it will verify the file. Assuming it is a supported format it will then be transcoded into various formats to make it suitable for delivery over the web. A thumbnail frame will be extracted to represent it too.

You will see that its status attribute will update to be ready once the video has successfully transcoded, or error if this failed.

Live event

Live events work slightly differently.

Assuming your package/plan includes live streaming, you initiate a new live event by sending a type which should be event and not sending an input (as we assign you that URL: it can be discovered with a subsequent GET /videos/:id after a few moments).

Clips

We support clipping (currently limited to two minutes in duration).

Our system looks for two custom parameters in your input: vidbeo_clip_start and vidbeo_clip_end. These should be time-codes (HH:MM:SS). If both are provided, we will extract just that part of the video.

For example below we have a two-minute video in Dropbox but rather than the whole thing, we only want a ten-second clip from it between 00:00:10 and 00:00:20. Notice how we have added those two extra parameters to its input URL:

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"input":"https://www.dropbox.com/s/madeupid/video.mp4?dl=1&vidbeo_clip_start=00:00:10&vidbeo_clip_end=00:00:20", "name":"Clip"}' \
"https://api.vidbeo.com/v2/videos"

Optional parameters

KeyTypeDescription
descriptionStringThe description to give to this video
privacyStringCurrently we support "public", "private", "password" or "authenticated". If set as authenticated, the viewer will need to provide either a cookie or JWT when requesting a landing page, embed code or HLS manifest URL. The default is "private"
passwordStringIf you set the value of privacy as "password", you will need to send that password too. This value should be at least 8 characters. It should contain at least one letter and at least one number
sphericalBooleanWas the video shot in 360?
projectionStringIf the video was shot in 360, the projection used: we currently only support "equirectangular" so please send that for now
tagsArrayAn array of up to ten lowercase, single-word, alphanumeric strings
Return the details of all of the videos in your account
GET /videos

Example request

curl \
-H "Authorization: Bearer YOUR-API-KEY" \
"https://api.vidbeo.com/v2/videos"

Example response

{
"success": true,
"result": [
{
"id": "abcde12345abcde12345a",
"type": "vod",
"name": "Example video",
"description": "",
"outputs": [
{
"label": "hls_ts",
"url": "https://cdn.example.com/hls.m3u8"
}
],
"thumbnail": "https://cdn.example.com/thumbnail.jpg",
"sprite": "",
"duration": 123,
"privacy": "private",
"tracks": [
{
"id": "abcde12345abcde12345a",
"kind": "subtitles",
"label": "English",
"language": "en",
"url": "https://cdn.example.com/captions.vtt"
}
],
"categories": [],
"enabled": true,
"transcoder": "",
"content_rating": "all",
"spherical": false,
"projection": "",
"cards": [],
"gates": [],
"hotspots": [],
"chapters": [],
"page_url": "",
"progress": 100,
"status": "ready",
"tags": [],
"start_time": "",
"end_time": "",
"created_by": "abcde12345abcde1234a",
"created_time": "2022-01-01T00:00:00.000Z",
"updated_by": "abcde12345abcde12345a",
"updated_time": "2022-01-01T00:00:00.000Z"
},
...
],
"links": {},
"errors": []
}

Optional parameters

NameTypeDefaultInformation
limitString25Maximum number to return
cursorString""Used to get the next page of results: if applicable we return this as part of the links.next URL
Get the details of a single video
GET /videos/:id

Example request

curl \
-H "Authorization: Bearer YOUR-API-KEY" \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"type": "vod",
"name": "Example video",
"description": "",
"outputs": [
{
"label": "hls_ts",
"url": "https://cdn.example.com/hls.m3u8"
}
],
"thumbnail": "https://cdn.example.com/thumbnail.jpg",
"sprite": "",
"duration": 123,
"privacy": "private",
"tracks": [
{
"id": "abcde12345abcde12345a",
"kind": "subtitles",
"label": "English",
"language": "en",
"url": "https://cdn.example.com/captions.vtt"
}
],
"categories": [],
"enabled": true,
"transcoder": "",
"content_rating": "all",
"spherical": false,
"projection": "",
"cards": [],
"gates": [],
"hotspots": [],
"chapters": [],
"page_url": "",
"progress": 100,
"status": "ready",
"tags": [],
"start_time": "",
"end_time": "",
"created_by": "abcde12345abcde1234a",
"created_time": "2022-01-01T00:00:00.000Z",
"updated_by": "abcde12345abcde12345a",
"updated_time": "2022-01-01T00:00:00.000Z"
},
"links": null,
"errors": []
}

Response format

KeyTypeDescription
idStringThe unique identifier given to this video
typeStringThis can be "vod" (the default) or "event" (if live streaming is included in your package)
nameStringThe name given to this video
descriptionStringThe description given to this video
inputStringFor a 'vod', either an upload ID or the URL to fetch the file from. For a live 'event', the URL to ingest the stream from. This field may not be returned as it may contain authentication data
outputsArrayURLs for the generated versions of the uploaded video file, once it has been processed. A combination of .mpd, .m3u8 and .mp4
thumbnailStringIf one is available, a .jpg image, extracted at source size
spriteStringIf one is available, a .jpg image that contains a grid of preview images used for seeking
durationNumberThe video's duration, in seconds
privacyStringAccsss to the video. Either "public", "private", "password" or "authenticated"
tracksArrayAny captions or subtitles, each as an object
categoriesArrayAn optional array of categories (selected from those listed within categories)
enabledBooleanA video can be temporarily disabled to block access to it rather than deleting it
transcoderStringSet if a custom profile was used to transcode the video's files
content_ratingStringEither 'all' or 'mature': we default to 'all'
sphericalBooleanIs this video filmed in 360 degress
projectionStringIf this video is 360, what projction is used? Assumed "equirectangular"
cardsArrayInteractive content: each element is an object containing the details of a single card
gatesArrayInteractive content: each element is an object containing the details of a single gate
hotspotsArrayInteractive content: each element is an object containing the details of a single hotspot
chaptersArrayEach element is an object containing the details of one chapter
page_urlStringThe URL of the page on your site you have embedded this video on, which we can then use to automatically build metadata for you
progressIntFor a vod: the percentage transcoded (will be 0 initially, then 100 once completed)
statusStringFor a vod: this can be either "preparing", "processing", "ready" or "error". A live event also includes "live"
tagsArrayEach element is a lowercase alphanumeric string
created_byStringThe ID of the user who created it (if known)
created_timeStringThe date and time it was created
updated_byStringThe ID of the user who last modified it (if known)
updated_timeStringThe date and time it was last modified
Update a video
PATCH /videos/:id

The body of the request should contain one, or more, attributes that you would like to update for the video. Please be very careful when making changes to existing items to avoid losing data, particularly if a particular key has sub-keys.

Some fields can only be set by the system. For example:

  • outputs This is managed by the system. The system may update it, for example as new files become available during processing/archiving.
  • progress This is managed by the system: it indicates the percentage progress of the current operation (generally when transcoding).
  • status This is managed by the system: it indicates the status of the current operation.
  • sprite This is managed by the system: a sprite may be generated as part of the transcoding process.

And some of the video's fields are updated using separate API endpoints to make them easier to manage (for example when adding interactive content).

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"name":"New name"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"type": "vod",
"name": "New name",
"description": "",
"outputs": [
{
"label": "hls_ts",
"url": "https://cdn.example.com/hls.m3u8"
}
],
"thumbnail": "https://cdn.example.com/thumbnail.jpg",
"sprite": "",
"duration": 123,
"privacy": "private",
"tracks": [
{
"id": "abcde12345abcde12345a",
"kind": "subtitles",
"label": "English",
"language": "en",
"url": "https://cdn.example.com/captions.vtt"
}
],
"categories": [],
"enabled": true,
"transcoder": "",
"content_rating": "all",
"spherical": false,
"projection": "",
"cards": [],
"gates": [],
"hotspots": [],
"chapters": [],
"page_url": "",
"progress": 100,
"status": "ready",
"tags": [],
"start_time": "",
"end_time": "",
"created_by": "abcde12345abcde1234a",
"created_time": "2022-01-01T00:00:00.000Z",
"updated_by": "abcde12345abcde12345a",
"updated_time": "2022-01-01T00:00:00.000Z"
},
"links": null,
"errors": []
}
Delete a video
DELETE /videos/:id

Example request

curl \
-H "Authorization: Bearer YOUR-API-KEY" \
-X DELETE \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {},
"links": null,
"errors": []
}
Add a track (subtitles or captions)
POST /videos/:id/tracks

Note: Currently tracks are only supported for video on-demand (type 'vod').

According to the HLS specification Apple insists that subtitles use the WebVTT format (.vtt). So please make sure your WebVTT .vtt file is valid before uploading it. You can paste its content into a free online validator such as https://quuz.org/webvtt/ to make sure.

Note: If your WebVTT .vtt file is not already available online (such as from Dropbox) for us to fetch it, you will need to upload it first. To upload it to us:

  1. Request an upload ID. See POST /uploads
  2. Upload the file to that URL
  3. Send us a reference to it, formatted as shown below

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"label": "English", "language": "en", "kind": "subtitles", "url": "vidbeo://uploads/abcde12345abcde12345a"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/tracks"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"label": "English",
"language": "en",
"kind": "subtitles",
"url": "https://www.example.com/english.vtt"
},
"links": null,
"errors": []
}

Required parameters

KeyTypeDescription
labelStringA short label that will be shown in the player, like "English"
languageStringThe two-letter international code for the language, like "en"
kindStringWe currently only support "subtitles"
urlStringEither a full URL we can fetch the .vtt from or a reference to an upload you have just sent it to

Note: You can get the international language codes from https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes.

Delete a track (subtitles or captions)
DELETE /videos/:id/tracks/:id
Delete a track (subtitles or captions).

The first :id is the ID of the video. The second :id is the ID of the track to delete from it.

Example request

curl \
-H "Authorization: Bearer YOUR-API-KEY" \
-X DELETE \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/tracks/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {},
"links": null,
"errors": []
}
Add a new thumbnail image
POST /videos/:id/thumbnail

Note: For video on-demand, our system will automatically set a thumbnail image for you as part of the transcoding process.

If you want to replace it, you can ask for another frame within the video (by sending a HH:MM:SS time-code in place of a file URL) or by uploading an image. Any image must be a JPEG (a .jpg) and be under 100KB in size. We recommend using one that is the same dimensions of the video (normally 1280x720 or 1920x1080).

Note: If your .jpg file is not already available from a URL (such as on Dropbox) for us to fetch it from, you will need to upload it to us first. So:

  1. Request an upload ID. See POST /uploads
  2. Upload the image to that URL
  3. Send a reference to the uploaded file, formatted as shown below

Example request 1

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"url": "vidbeo://uploads/abcde12345abcde12345a"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/thumbnail"

Example response 1

{
"success": true,
"result": {
"url": "https://www.example.com/frame.jpg"
},
"links": null,
"errors": []
}

Example request 2

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"url": "00:00:52"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/thumbnail"

Example response 2

{
"success": true,
"result": {
"url": ""
},
"links": null,
"errors": []
}

Required parameters

KeyTypeDescription
urlStringEither a HH:MM:SS timecode or the URL to fetch your .jpg from or a reference to your prior upload of it to our system
Add a card (a call-to-action)
POST /videos/:id/cards

Note: Currently cards are only supported for video on-demand (of type 'vod').

We position the card in the corner of the video. Since the video needs to be embedded at a sufficiently large size to see the card, they generally only work on desktops.

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name": "A card", "show_at": 00:00:20", "hide_at": "00:00:30", "skip": true, "top_text": "Visit our site", "bottom_text": "Find out more", "link": "https://www.example.com"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/cards"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"name": "A card",
"show_at": "00:00:20",
"hide_at": "00:00:30",
"skip": true,
"top_text": "Visit our site",
"bottom_text": "Find out more",
"link": "https://www.example.com"
},
"links": null,
"errors": []
}

Required parameters

We require all the parameters to be sent, even if empty:

KeyTypeDescription
nameStringA short label for the card
show_atStringThe time-code the card should appear
hide_atStringThe time-code the card should disappear if not manually skipped
skipBooleanShould the player add a cross icon to let the viewer skip it?
top_textStringA few words of main text at the top of the card
bottom_textStringSome smaller sub text
linkStringThe URL viewers will be taken to if they click the card
Update a card (a call-to-action)
PATCH /videos/:id/cards/:id

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"show_at": "00:00:05"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/cards/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"name": "A card",
"show_at": "00:00:05",
"hide_at": "00:00:30",
"skip": true,
"top_text": "Visit our site",
"bottom_text": "Find out more",
"link": "https://www.example.com"
},
"links": null,
"errors": []
}
Delete a card (a call-to-action)
DELETE /videos/:id/cards/:id

Using this endpoint, the first :id is the ID of your video. The second :id is the ID of the card to delete from it.

Example request

curl \
-H "Authorization: Bearer YOUR-API-KEY" \
-X DELETE \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/cards/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {},
"links": null,
"errors": []
}
Add a gate
POST /videos/:id/gates

A gate is used to ask the viewer for some information, likely their email address.

It covers the entire video. Since the video needs to be embedded at a sufficiently large size for the gate's form fields to be usable, they generally only work on desktops.

Note: For privacy, we do not store your viewer's submissions. The submitted data is sent to a service you have already connected to your account (for example Mailchimp). Hence when creating the gate we need you to provide the unique ID of that service as connect_service_id. Generally you will be adding the viewer's data to an existing mailing list of contacts and so we need to know its ID too: pass that as connect_list_id.

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name": "A gate", "show_at": "00:00:00", "skip": true, "top_text": "Please enter your email", "bottom_text": "By submitting you consent to us storing your data", "fields": [{"label": "Email", "value": "email"}], "connect_service_id": "abcde12345abcde12345a", "connect_list_id": "abcde12345"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/gates"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"name": "A gate",
"show_at": "00:00:00",
"skip": true,
"top_text": "Please enter your email",
"bottom_text": "",
"fields": [
{
"label": "Email",
"value": "email"
}
],
"connect_service_id": "abcde12345abcde12345a",
"connect_list_id": "abcde12345"
},
"links": null,
"errors": []
}

Required parameters

We require all the parameters to be sent, even if empty:

KeyTypeDescription
nameStringA short label for the card
show_atStringThe time-code the gate should appear ("00:00:00" for pre-roll)
skipBooleanShould the player add a cross icon to let the viewer skip it?
top_textStringA few words of main text at the top of the gate
bottom_textStringSome smaller sub text
fieldsArrayAn array of objects for the field(s) to ask for, each with a label and value. For example [{{"label": "Email", "value": "email"}]
connect_service_idStringThe id of a service connected to your account such as Mailchimp
connect_list_idStringThe id of a contacts list/audience you have within that connected service that the viewer's data will be added to
Update a gate
PATCH /videos/:id/gates/:id

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"show_at": "00:00:05"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/gates/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"name": "A gate",
"show_at": "00:00:05",
"skip": true,
"top_text": "Please enter your email",
"bottom_text": "",
"fields": [
{
"label": "Email",
"value": "email"
}
],
"connect_service_id": "abcde12345abcde12345a",
"connect_list_id": "abcde12345"
},
"links": null,
"errors": []
}
Delete a gate
DELETE /videos/:id/gates/:id

The first :id is the ID of your video. The second :id is the ID of the gate to delete from it.

Example request

curl \
-H "Authorization: Bearer YOUR-API-KEY" \
-X DELETE \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/gates/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {},
"links": null,
"errors": []
}
Add a hotspot (clickable region)
POST /videos/:id/hotspots

Note: Currently hotspots are only supported for video on-demand (of type 'vod').

For a normal video, the x and y values should be percentages (since we don't know what size the video will ultimately be embedded at, we can't use pixels). For example, a value of 50 for both will put the hotspot in the centre of the video. For 360 video, positioning is more complicated. Two-dimensional x and y percentages would not make sense for a spherical video. So these values need instead to be in degrees. For example, 90.

If you would like this clickable region to be invisible, send "invisible" for opacity. Our default is a translucent circle. We recommend using visible regions to make sure the feature is working as expected and the regions are positioned where you intended. Debugging using invisible regions is considerably harder!

The target value will normally be set as "_parent". That means the same page your video is embedded on (it is embedded in an iframe which is why it is its parent page). But you can also use "_blank" to open it in a new tab/window.

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name": "Buy this", "show_at": "00:00:10", "hide_at": "00:00:20", "x": 25, "y": 25, "action": "link", "link": "https://www.example.com", "target": "_parent", "opacity": "translucent"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/hotspots"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"name": "Buy this",
"show_at": "00:00:10",
"hide_at": "00:00:20",
"x": 25,
"y": 25,
"action": "link",
"link": "https://www.example.com",
"target": "_parent",
"opacity": "translucent"
},
"links": null,
"errors": []
}

Required parameters

We require all these parameters to be sent, even if empty:

KeyTypeDescription
nameStringA short label for the hotspot
show_atStringThe time-code the hotspot should appear
hide_atStringThe time-code the hotspot should disappear
xIntWhere the hotspot should be horizontally positioned (we suggest 25-75)
yIntWhere the hotspot should be vertically positioned (we suggest 25-75)
actionStringWe currently only support "link" however we plan on adding additional functionality
linkStringThe URL viewers will be taken to if they click the hotspot
targetStringWhere a link should open: normally you should use "_parent" however you can use "_blank" to open the link in a new tab/window
opacityStringEither "invisible", "translucent" or "opaque": we recommend "translucent"
Update a hotspot (clickable region)
PATCH /videos/:id/hotspots/:id

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"show_at": "00:00:05"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/hotspots/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"name": "Buy this",
"show_at": "00:00:05",
"hide_at": "00:00:20",
"x": 25,
"y": 25,
"action": "link",
"link": "https://www.example.com",
"target": "_parent",
"opacity": "translucent"
},
"links": null,
"errors": []
}
Delete a hotspot (clickable region)
DELETE /videos/:id/hotspots/:id

The first :id is the ID of your video. The second :id is the ID of the hotspot to delete from it.

Example request

curl \
-H "Authorization: Bearer YOUR-API-KEY" \
-X DELETE \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/hotspots/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {},
"links": null,
"errors": []
}
Add a chapter
POST /videos/:id/chapters

Tip: We recommend using chapters only if a video is sufficiently long. At least 30 seconds.

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"name": "What is this", "start": "00:00:10", "end": "00:00:20"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/chapters"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"name": "What is this",
"start": "00:00:10",
"end": "00:00:20"
},
"links": null,
"errors": []
}

Required parameters

We require all these parameters to be sent, even if empty:

KeyTypeDescription
nameStringA short label for it
startStringThe time-code the chapter starts
endStringThe time-code the chapter ends
Update a chapter
PATCH /videos/:id/chapters/:id

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X PATCH \
-d '{"start": "00:00:05"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/chapters/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"name": "What is this",
"start": "00:00:05",
"end": "00:00:20"
},
"links": null,
"errors": []
}
Delete a chapter
DELETE /videos/:id/chapters/:id

The first :id is the ID of your video. The second :id is the ID of the chapter to delete from it.

Example request

curl \
-H "Authorization: Bearer YOUR-API-KEY" \
-X DELETE \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/chapters/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {},
"links": null,
"errors": []
}
Request an auto transcription
POST /videos/:id/transcribe

It is important to add subtitles/captions to your videos to improve accessibility.

We support automatically transcribing your video using AI and speech recognition. This is a paid service, billed by the minute. It means you can add captions with a single API call and avoid the extra time and cost of sourcing captions yourself. Simply call this API endpoint. In the body of the request please specify the language the audio is in. For example en-US for US English.

Automated transcriptions naturally work best with content such as speeches where there is a single speaker at a time who is clearly audible.

If successful the captions will be automatically added to your video once ready as a WebVTT captions track.

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{"language":"en-US"}' \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/transcribe"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"language": "en-US",
"status": "preparing"
},
"links": null,
"errors": []
}
Get the status of an auto transcription job
GET /videos/:id/transcribe/:id

You can get the status of a recent automated transcription job using this endpoint. Pass the video ID as the first parameter, and the ID of the job as the second parameter. Usually these will be the same.

The response status will be one of:

  • queued
  • processing
  • error
  • ready

When a transcription is completed, you do not need to do anything to add the generated captions to your video. We do that for you. This endpoint is just for reference.

Example request

curl \
-g \
-H "Authorization: Bearer YOUR-API-KEY" \
-H "Content-Type: application/json" \
-X GET \
"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/transcribe/abcde12345abcde12345a"

Example response

{
"success": true,
"result": {
"id": "abcde12345abcde12345a",
"language": "en-US",
"status": "ready"
},
"links": null,
"errors": []
}