Videos
Videos
You can manage the videos within your content library by making the following requests:
Request | Description |
---|---|
POST /videos | Create a video |
GET /videos | Return the details of all of the videos in your account |
GET /videos/:id | Get the details of a single video |
PATCH /videos/:id | Update a video |
DELETE /videos/:id | Delete a video |
POST /videos/:id/tracks | Add a track (subtitles or captions) |
DELETE /videos/:id/tracks/:id | Delete a track (subtitles or captions) |
POST /videos/:id/thumbnail | Add a new thumbnail image |
POST /videos/:id/cards | Add a card (a call-to-action) |
PATCH /videos/:id/cards/:id | Update a card (a call-to-action) |
DELETE /videos/:id/cards/:id | Delete a card (a call-to-action) |
POST /videos/:id/gates | Add a gate |
PATCH /videos/:id/gates/:id | Update a gate |
DELETE /videos/:id/gates/:id | Delete a gate |
POST /videos/:id/hotspots | Add a hotspot (clickable region) |
PATCH /videos/:id/hotspots/:id | Update a hotspot (clickable region |
DELETE /videos/:id/hotspots/:id | Delete a hotspot (clickable region |
POST /videos
VOD (video on-demand)
You need to send us your video file. The value of input
depends on your workflow: is your video file already online somewhere?
Yes
Send us its URL to save you uploading it again. Our system will attempt to pull the file from that. What that URL is of course depends on what service you are using. For example we wrote a guide how to get a URL from Dropbox.
No
Then you need to upload the file first. Using the API you need to 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. Like this: vidbeo://uploads/UPLOAD-ID-GOES-HERE
.
Required parameters
Key | Type | Description |
---|---|---|
name | String | Its title (1-100 characters) |
input | String | Its source file. Either a URL e.g. https://www.dropbox.com/my-video.mp4?dl=1 or a reference e.g vidbeo://uploads/abcde12345abcde12345a |
Example request
We will pretend it's uploaded to https://www.example.com/video.mp4
. So we can tell the system to fetch it from there without having to upload video.mp4 again:
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 response
{ "success": true, "result": { "id": "abcde12345abcde12345a", "type": "vod", "name": "New video", "description": "", "outputs": [], "thumbnail": "", "sprite": "", "duration": 0, "privacy": "unlisted", "tracks": [], "categories": [], "enabled": true, "transcoder": "", "spherical": false, "projection": "", "cards": [], "gates": [], "hotspots": [], "progress": 0, "status": "preparing", "tags": [], "created_by": "abcde12345abcde1234a", "created_time": "2021-02-01T00:00:00.000Z", "updated_by": "abcde12345abcde12345a", "updated_time": "2021-02-01T00:00:00.000Z" }, "links": null, "errors": []}
Example request
Here the video file is not already online. So we have to upload it.
- Request an upload ID. See POST /uploads
- Upload the file to that URL. See How do I upload to that URL
- Send that upload's ID in input like vidbeo://uploads/THE-ID-HERE
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": "unlisted", "tracks": [], "categories": [], "enabled": true, "transcoder": "", "spherical": false, "projection": "", "cards": [], "gates": [], "hotspots": [], "progress": 0, "status": "preparing", "tags": [], "created_by": "abcde12345abcde1234a", "created_time": "2021-02-01T00:00:00.000Z", "updated_by": "abcde12345abcde12345a", "updated_time": "2021-02-01T00:00:00.000Z" }, "links": null, "errors": []}
As you can see, in both cases the response structure is actually 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
Key | Type | Description |
---|---|---|
description | String | The description to give to this video |
privacy | String | Currently we support "private", "public" or "unlisted". If set as private, 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 "unlisted" |
spherical | Boolean | Was the video shot in 360? |
projection | String | If the video was shot in 360, the projection used: we currently only support "equirectangular" so please send that for now |
tags | Array | An array of up to ten lowercase, single-word, alphanumeric strings |
GET /videos
Return the details of all of the videos in your account.
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": "unlisted", "tracks": [ { "id": "abcde12345abcde12345a", "kind": "captions", "label": "English", "language": "en", "url": "https://cdn.example.com/captions.vtt" } ], "categories": [], "enabled": true, "transcoder": "", "spherical": false, "projection": "", "cards": [], "gates": [], "hotspots": [], "progress": 100, "status": "ready", "tags": [], "created_by": "abcde12345abcde1234a", "created_time": "2021-02-01T00:00:00.000Z", "updated_by": "abcde12345abcde12345a", "updated_time": "2021-02-01T00:00:00.000Z" }, ... ], "links": {}, "errors": []}
Optional parameters
Name | Type | Default | Information |
---|---|---|---|
limit | String | 25 | Maximum number to return |
cursor | String | "" | Used to get the next page of results: if applicable we return this as part of the links.next URL |
GET /videos/:id
Get the details of a single video.
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": "unlisted", "tracks": [ { "id": "abcde12345abcde12345a", "kind": "captions", "label": "English", "language": "en", "url": "https://cdn.example.com/captions.vtt" } ], "categories": [], "enabled": true, "transcoder": "", "spherical": false, "projection": "", "cards": [], "gates": [], "hotspots": [], "progress": 100, "status": "ready", "tags": [], "created_by": "abcde12345abcde1234a", "created_time": "2021-02-01T00:00:00.000Z", "updated_by": "abcde12345abcde12345a", "updated_time": "2021-02-01T00:00:00.000Z" }, "links": null, "errors": []}
Get the details of one video
Response format
Key | Type | Description |
---|---|---|
id | String | The unique identifier given to this video |
type | String | This can be "vod" (the default) or "event" (if live streaming is included in your package) |
name | String | The name given to this video |
description | String | The description given to this video |
input | String | For 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 |
outputs | Array | URLs for the generated versions of the uploaded video file, once it has been processed. A combination of .mpd, .m3u8 and .mp4 |
thumbnail | String | If one is available, a .jpg image, extracted at source size |
sprite | String | If one is available, a .jpg image that contains a grid of preview images used for seeking |
duration | Number | The video's duration, in seconds |
privacy | String | Accsss to the video. Either "public", "private" or "unlisted" |
tracks | Array | Any captions or subtitles, each as an object |
categories | Array | An optional array of categories (selected from those listed within categories) |
enabled | Boolean | A video can be temporarily disabled to block access to it rather than deleting it |
transcoder | String | Set if a custom profile was used to transcode the video's files |
spherical | Boolean | Is this video filmed in 360 degress |
projection | String | If this video is 360, what projction is used? Assumed "equirectangular" |
cards | Array | Interctive content: each element is an object containing the details of a single card |
gates | Array | Interctive content: each element is an object containing the details of a single gate |
hotspots | Array | Interctive content: each element is an object containing the details of a single hotspot |
progress | Int | For a vod: the percentage transcoded (will be 0 initially, then 100 once completed) |
status | String | For a vod: this can be either "preparing", "processing", "ready" or "error". A live event also includes "live" |
tags | Array | Each element is a lowercase alphanumeric string |
created_by | String | The ID of the user who created it (if known) |
created_time | String | The date and time it was created |
updated_by | String | The ID of the user who last modified it (if known) |
updated_time | String | The date and time it was last modified |
PATCH /videos/:id
Update a video.
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 while others will be rejected/ignored:
- input This can not be updated once sent (in the initial POST). The system may update it: for example internally translating a sent upload ID to a file URL.
- 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.
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": "unlisted", "tracks": [ { "id": "abcde12345abcde12345a", "kind": "captions", "label": "English", "language": "en", "url": "https://cdn.example.com/captions.vtt" } ], "categories": [], "enabled": true, "transcoder": "", "spherical": false, "projection": "", "cards": [], "gates": [], "hotspots": [], "progress": 100, "status": "ready", "tags": [], "created_by": "abcde12345abcde1234a", "created_time": "2021-02-01T00:00:00.000Z", "updated_by": "abcde12345abcde12345a", "updated_time": "2021-02-01T00:00:00.000Z" }, "links": null, "errors": []}
DELETE /videos/:id
Delete a video.
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": []}
POST /videos/:id/tracks
Add a track (subtitles or captions).
Currently tracks are only supported for video on-demand (of type 'vod').
The subtitles/captions must be the standard WebVTT format (a .vtt
file). To save time, please make sure the .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.
This endpoint does not currently support pull ingest from a URL. And so you will first need to upload your .vtt to us before you can add it as a track:
- Request an upload ID. See POST /uploads
- Upload the .vtt file to that URL. See How do I upload to that URL
- Send that upload's ID in url like vidbeo://uploads/THE-ID-HERE
Example request
curl \-g \-H "Authorization: Bearer YOUR-API-KEY" \-H "Content-Type: application/json" \-X POST \-d '{"label": "English", "language": "en", "kind": "captions", "url": "vidbeo://uploads/abcde12345abcde12345a"}' \"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/tracks"
Example response
{ "success": true, "result": { "id": "abcde12345abcde12345a", "label": "English", "language": "en", "kind": "captions", "url": "https://www.example.com/english.vtt" }, "links": null, "errors": []}
Required parameters
Note: You can get the language code from https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes.
Key | Type | Description |
---|---|---|
label | String | A short label that will be shown in the player, like "English" |
language | String | The two-letter international code for the language, like "en" |
kind | String | Either "captions" or "subtitles" |
url | String | The upload ID of your .vtt file |
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": []}
POST /videos/:id/thumbnail
Add a new thumbnail image.
Note: For video on-demand, our system will automatically set the initial thumbnail image for you as part of the transcoding process.
If you want to replace it with your own, the image must be a JPEG (the extension .jpg) and be under 100KB in size. We recommend using one that is the same dimensions of the video, normally 1280x720 or 1920x1080.
This endpoint does not currently support pull ingest from a URL. And so you will first need to upload your .jpg to us before you can add it as a thumbnail:
- Request an upload ID. See POST /uploads
- Upload the .jpg file to that URL. See How do I upload to that URL
- Send that upload's ID in url like vidbeo://uploads/THE-ID-HERE
Example request
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
{ "success": true, "result": { "url": "https://www.example.com/frame.jpg" }, "links": null, "errors": []}
Required parameters
Key | Type | Description |
---|---|---|
url | String | The upload ID of your .jpg file |
DELETE /videos/:id/thumbnail
Note: It is not possible to remove a thumbnail as we felt there was no need to ever do that. So if you do upload the wrong image, simply send another request to replace it with a different image.
If you really don't want any thumbnail image, you could replace it with a black rectangle .jpg.
POST /videos/:id/cards
Add a card (a call-to-action).
Currently cards are only supported for video on-demand (of type 'vod').
We position the card in the top-right 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. The card will appear at
the chosen time in seconds, and appear until
the chosen time in seconds (unless skipped by the viewer).
The icon
, if used, comes from the Material Icons. Simply enter the name of one from their list. For example "place".
Example request
curl \-g \-H "Authorization: Bearer YOUR-API-KEY" \-H "Content-Type: application/json" \-X POST \-d '{"name": "A card", "at": 10, "until": 20, "skip": true, "top_text": "Visit our site", "bottom_text": "Find out more", "link": "https://www.example.com", "link_text": "Visit", "icon": "place"}' \"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/cards"
Example response
{ "success": true, "result": { "id": "abcde12345abcde12345a", "name": "A card", "at": 10, "until": 20, "skip": true, "top_text": "Visit our site", "bottom_text": "Find out more", "link": "https://www.example.com", "link_text": "Visit", "icon": "place" }, "links": null, "errors": []}
Required parameters
We require all the parameters to be sent, even if empty:
Key | Type | Description |
---|---|---|
name | String | A short label for the card |
at | Int | The time in seconds the card should appear |
until | Int | The time in seconds the card should disappear if not manually skipped |
skip | Boolean | Should the player add a cross icon to let the viewer skip it? |
top_text | String | A few words of main text at the top of the card |
bottom_text | String | Some smaller sub text |
link | String | The URL viewers will be taken to if they click the card |
link_text | String | A short label for the card's button |
icon | String | The name of an icon from the Material set to show at the top of the card |
PATCH /videos/:id/cards/:id
Update a card (call-to-action).
Example request
curl \-g \-H "Authorization: Bearer YOUR-API-KEY" \-H "Content-Type: application/json" \-X PATCH \-d '{"at": 5, "until": 10}' \"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/cards/abcde12345abcde12345a"
Example response
{ "success": true, "result": { "id": "abcde12345abcde12345a", "name": "A card", "at": 5, "until": 10, "skip": true, "top_text": "Visit our site", "bottom_text": "Find out more", "link": "https://www.example.com", "link_text": "Visit", "icon": "place" }, "links": null, "errors": []}
DELETE /videos/:id/cards/:id
Delete a card (call-to-action).
The first :id
is the ID of the 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": []}
POST /videos/:id/gates
Add a gate.
A gate covers the 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. The gate will appear at
the chosen time in seconds. So for a pre-roll gate, enter 0.
We currently support adding form inputs to ask for one or more of these:
- first_name
- last_name
- telephone
Those must be passed as strings, in an array called fields
. As shown below.
Example request
curl \-g \-H "Authorization: Bearer YOUR-API-KEY" \-H "Content-Type: application/json" \-X POST \-d '{"name": "A gate", "at": 10, "skip": true, "top_text": "Please enter your email", "bottom_text": "", "checkbox_text": "", "fields": ["email"]}' \"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/gates"
Example response
{ "success": true, "result": { "id": "abcde12345abcde12345a", "name": "A gate", "at": 10, "skip": true, "top_text": "Please enter your email", "bottom_text": "", "checkbox_text": "", "fields": ["email"] }, "links": null, "errors": []}
Required parameters
We require all the parameters to be sent, even if empty:
Key | Type | Description |
---|---|---|
name | String | A short label for the card |
at | Int | The time in seconds the gate should appear (0 for pre-roll) |
skip | Boolean | Should the player add a cross icon to let the viewer skip it? |
top_text | String | A few words of main text at the top of the gate |
bottom_text | String | Some smaller sub text |
checkbox_text | String | If you would like an opt-in checkbox, what should its label be? |
fields | Array | An array of fields to ask for. One or more from "email" "first_name" "last_name" "telephone" |
PATCH /videos/:id/gates/:id
Update a gate.
Example request
curl \-g \-H "Authorization: Bearer YOUR-API-KEY" \-H "Content-Type: application/json" \-X PATCH \-d '{"at": 5}' \"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/gates/abcde12345abcde12345a"
Example response
{ "success": true, "result": { "id": "abcde12345abcde12345a", "name": "A gate", "at": 5, "skip": true, "top_text": "Please enter your email", "bottom_text": "", "checkbox_text": "", "fields": ["email"] }, "links": null, "errors": []}
DELETE /videos/:id/gates/:id
Delete a gate.
The first :id
is the ID of the 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": []}
POST /videos/:id/hotspots
Add a hotspot (otherwise known as a clickable region or clickable video).
Currently hotspots are only supported for video on-demand (of type 'vod') as they need content with a defined duration.
The icon
, if used, comes from the Material Icons. Simply enter the name of one. For example "place".
The x
and y
are percentages (since we don't know what size the video will ultimately be embedded at, we can't use pixels). So values of 50 for both will put the hotspot in the centre of the video.
The pitch
and yaw
values come into play for 360 video (since a two-dimensional x
and y
position would not make sense for a spherical video). The pitch and yaw values use PI. If your video is not in 360, simply send 0 for those as they are not used.
If you would like this clickable region to be invisible, send 0 for opacity
. Normally we show a translucent circle.
Example request
curl \-g \-H "Authorization: Bearer YOUR-API-KEY" \-H "Content-Type: application/json" \-X POST \-d '{"name": "Buy this", "at": 10, "until": 20, "x": 25, "y": 25, "pitch": 0, "yaw": 0, "link": "https://www.example.com", "icon": "shopping_basket", "opacity": 0.5}' \"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/hotspots"
Example response
{ "success": true, "result": { "id": "abcde12345abcde12345a", "name": "Buy this", "at": 10, "until": 20, "x": 25, "y": 25, "pitch": 0, "yaw": 0, "link": "https://www.example.com", "icon": "shopping_basket", "opacity": 0.5 }, "links": null, "errors": []}
Required parameters
We require all these parameters to be sent, even if empty:
Key | Type | Description |
---|---|---|
name | String | A short label for the hotspot |
at | Int | The time in seconds the hotspot should appear |
until | Int | The time in seconds the hotspot should disappear |
x | Int | A value between 0 and 100 for where the hotspot should be horizontally positioned (we suggest 25-75) |
y | Int | A value between 0 and 100 for where the hotspot should be vertically positioned (we suggest 25-75) |
pitch | Float | A value between -PI and PI for where the hotspot should be positioned |
yaw | Float | A value between -PI and PI for where the hotspot should be positioned |
link | String | The URL viewers will be taken to if they click the hotspot |
icon | String | The name of an icon from the Material set to show on it, if wanted |
opacity | Float | A value between 0 and 1 (0 meaning invisible) |
PATCH /videos/:id/hotspots/:id
Update a hotspot.
Example request
curl \-g \-H "Authorization: Bearer YOUR-API-KEY" \-H "Content-Type: application/json" \-X PATCH \-d '{"at": 5}' \"https://api.vidbeo.com/v2/videos/abcde12345abcde12345a/hotspots/abcde12345abcde12345a"
Example response
{ "success": true, "result": { "id": "abcde12345abcde12345a", "name": "Buy this", "at": 5, "until": 20, "x": 25, "y": 25, "pitch": 0, "yaw": 0, "link": "https://www.example.com", "icon": "shopping_basket", "opacity": 0.5 }, "links": null, "errors": []}
DELETE /videos/:id/hotspots/:id
Delete a hotspot.
The first :id
is the ID of the 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": []}