Video API reference
Robolly features a flexible video API that enables you to create personalized videos in large quantities automatically. The Robolly video API works based on Robolly dynamic templates. Create videos with natural animations based on real-world physics, multiple clip support, video in video support, audio, high FPS, high definition resolution, and all other features available from our template editor like smart cover. To start with the video API, you need a Robolly account.
Available endpoints:
| Endpoint | Method | Type |
|---|---|---|
https://api.robolly.com/v1/video/render | POST | Render a video |
Authentication
Robolly API key must be included in the authorization header:
Authorization: Bearer {ROBOLLY_API_KEY}
Parameters
| Parameter | Validation | Description |
|---|---|---|
timeline | array, required | An array with timeline objects. |
audio | array | An array with audio objects. |
fps | number | Specify video FPS. Must be of one: 24, 30, 50, 60. Default 30. |
movieId | string | Movie ID. If supplied, this render will be associated with a specified movie. |
webhookUrl | string | A valid webhook URL that will be called once render is done. |
Timeline object
| Parameter | Validation | Description |
|---|---|---|
templateId | string, required | Template ID. |
duration | number, required | Duration of the clip in milliseconds. Min 500, max 20000. |
modifications | array | An array with template modifications. |
Modification object
| Parameter | Validation | Description |
|---|---|---|
target | string, required | A name of template's element that will receive this modification |
value | string, required | A new value for the target element. |
in | number | A value in milliseconds when this modification should start. Min 0. Max 20000. Useful, for example, for subtitles. When not specified, the modification starts at 0. |
out | number | A value in milliseconds when this modification should end. Min 0. Max 20000. When not specified, the modifications ends at the same time as the current clip. |
Audio object
| Parameter | Validation | Description |
|---|---|---|
src | string, required | A valid source URL of a MP3 file. |
in | number | Audio starting point in milliseconds. Max 20000. |
out | number | Audio ending point in milliseconds. Max 20000. |
volume | number | Control this audio volume. Min 0.1 (10% volume). Max 2 (200% volume). |
Example
An example on how to queue a 3 clip video with background music for a render via Robolly API. TIP: Use the Movie page at the Robolly dashboard to help you create the JSON payload data. Here's the request JSON payload:
{
"audio": [
{
"src": "https://file-examples.com/storage/feaade38c1651bd01984236/2017/11/file_example_MP3_700KB.mp3",
"volume": 0.7,
}
],
"timeline": [
{
"templateId": "123",
"duration": 5000,
"modifications": [
{
"value": "https://images.unsplash.com/photo-1491067852826-a60f365ff611?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&w=2000",
"target": "image"
},
{
"value": "breakingnews.com",
"target": "website"
},
{
"value": "Texas falls outside preseason college football rankings despite first-place vote in coaches poll",
"target": "title"
},
{
"value": "Daryl Lyon",
"target": "uptitle"
},
{
"value": "Sport",
"target": "category"
}
]
},
{
"templateId": "123",
"duration": 5000,
"modifications": [
{
"value": "https://images.unsplash.com/photo-1518183214770-9cffbec72538?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&w=2000",
"target": "image"
},
{
"value": "breakingnews.com",
"target": "website"
},
{
"value": "Here’s what investors should do as the housing market faces tough times",
"target": "title"
},
{
"value": "Cyan Hendry",
"target": "uptitle"
},
{
"value": "Finance",
"target": "category"
}
]
},
{
"templateId": "124",
"duration": 5000,
"modifications": [
{
"value": "Visit our website to read more.",
"target": "title"
},
{
"value": "breakingnews.com",
"target": "uptitle"
}
]
}
]
}
In a response, Robolly will include the ID of the render and a resourceUrl which you can periodically call to check the status of the video. We recommend to save the video render ID or the resourceUrl on your side for later use (so you can get the file URL after rendering is done). Here's an example of a typical response:
{
"status": "queued",
"id": "1526e51daaa23s6450s170g9",
"renderCostApprox": 250,
"renderCreditsLeft": 986599,
"resourceUrl": "https://api.robolly.com/v1/renders?id=1526e51daaa23s6450s170g9"
}
Calling the resourceUrl will return the data about the video render. It's recommended to periodically call resourceUrl to check the status of the render and to get a fileUrl. Here's an example of a typical JSON response:
{
"hasMore": false,
"paginationCursorNext": null,
"paginationCursorPrevious": null,
"value": [
{
"id": "1526e51daaa23s6450s170g9",
"organizationId": "666e51daaa23s6450s170f0",
"templateId": "64f99dd328a32b6ed8fd5a25",
"cacheHash": null,
"modifications": [],
"createdAt": "2023-10-11T17:02:21.377Z",
"size": 594944,
"width": 1080,
"height": 1080,
"formatType": "mp4",
"timemark": 16.01,
"fileName": "1526e51daaa23s6450s170g9",
"assetsLoaded": [],
"hits": 0,
"status": "done",
"timeline": [
// your timeline items...
],
"audio": [
// your audio items...
],
"renderCost": 250,
"file": "{HERE_WILL_BE_VIDEO_FILE_URL_WHEN_DONE}",
"preview": "{HERE_WILL_BE_VIDEO_THUMBNAIL_URL_WHEN_DONE}"
}
]
}
Webhooks
Alternatively, you can use webhooks to get notified when the video render is done. Register a webhook by providing a webhookUrl into the render video API request. Note that Robolly will attempt the webhook request only once. Here's an example:
{
"webhookUrl": "https://myapp.com/robolly-webhook-handler",
"timeline": [
{
"templateId": "123",
"duration": 5000,
"modifications": [
{
"value": "Texas falls outside preseason college football rankings despite first-place vote in coaches poll",
"target": "title"
},
]
}
]
}
Webhook JSON payload
Verify the legitimacy of the webhook request by checking the robolly-secret header against your Robolly API key.
{
"type": "render.done",
"data": {
"time": "2020-11-07T09:50:09.951Z",
"render": {
"id": "123",
"resourceUrl": "https://api.robolly.com/v1/renders?id=123",
"file": "https://robolly.s3.eu-central-1.amazonaws.com/123",
"preview": "https://robolly.s3.eu-central-1.amazonaws.com/123",
"createdAt": "2020-11-07T09:50:09.951Z",
},
}
}
Node.js webhook handler example
function handleSidemailWebhook(req, res, next) {
// Verify that the request is coming from Sidemail
if (req.headers["robolly-secret"] !== ROBOLLY_API_KEY) {
return res.status(401).send();
}
// Your custom logic ...
console.log(req.body.type, req.body.data);
// Acknowledge the webhook by responding with 200 status code
return res.status(200).send();
}