Skip to main content
Version: v1

/screencast API

The screencast API is still under beta, and isn't recommended yet for production usage.

The screencast API allows for generating video files, on demand, of your puppeteer scripts. This simple REST API allows for POSTing of an application/json or application/javascript body of your code you'd like to record. The resulting response is a webm file with the video attached. Audio is now supported in our screencast API as of docker version 1.8.0.

The resulting video's dimensions are inherited by the width and height of the browser. You can change this very easily by calling page.setViewport with your dimensions in your scripts as well as setting --window-size in the URL.

Check out this API schema defined in Swagger.

Basic Usage

Example body

module.exports = async ({ page }) => {
const sleep = (ms) => new Promise((res) => setTimeout(res, ms));

await page.setViewport({ width: 1920, height: 1080 });
await page.goto('https://www.youtube.com/watch?v=GnEmD17kYsE');
await sleep(10000);
};

And the resulting cURL call:

Full cURL request

curl -X POST \
https://chrome.browserless.io/screencast?token=MY-API-TOKEN&--window-size=1920,1080 \
-o video.webm \
-H 'Content-Type: application/javascript' \
-d '
module.exports = async ({ page }) => {
const sleep = (ms) => new Promise((res) => setTimeout(res, ms));

await page.setViewport({ width: 1920, height: 1080 });
await page.goto(`https://www.youtube.com/watch?v=GnEmD17kYsE`);
await sleep(10000);
};
'

Using application/javascript content-type

The application/javascript content-type is great for testing quick scripts and seeing their output and works with many tools like postman for faster feedback. When using this API you'll need to specify an appropriate content-type for the body of the request. When the type is application/json the /screencast API follows a similar semantic of the /function API, where you'll apply both a code property and a context property.

This makes your request more reusable as you can specify arguments in the context property that your code can reference. The only limitation is that all parameters will need to be hard-coded.

Example code body

module.exports = async ({ page, context }) => {
const sleep = (ms) => new Promise((res) => setTimeout(res, ms));

const { url, wait, width, height } = context;
await page.setViewport({ width, height });
await page.goto(url);
await sleep(wait);
};

context object example

// JSON body
// Code is minified here!
{
"code": "module.exports = async ({ page, context }) => { const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); const { url, wait, width, height } = context; await page.setViewport({ width, height }); await page.goto(url); await sleep(wait); };",
"context": {
"url": "https://www.youtube.com/watch?v=GnEmD17kYsE",
"wait": 1000,
"width": 1920,
"height": 1080
}
}

Full cURL request

curl -X POST \
https://chrome.browserless.io/screencast?token=YOUR-API-TOKEN&--window-size=1920,1080 \
-o video.webm \
-H 'Content-Type: application/json' \
-d '{
"code": "module.exports = async ({ page, context }) => { const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); const { url, wait, width, height } = context; await page.setViewport({ width, height }); await page.goto(url); await sleep(wait); };",
"context": {
"url": "https://www.youtube.com/watch?v=GnEmD17kYsE",
"wait": 5000,
"width": 1920,
"height": 1080
}
}'

Programmatic control

By default, browserless will start recording the session immediately and will stop once your function completes execution. You can change this behavior by using two functions in your code: startScreencast and stopScreencast:

Starting the screencast after load

module.exports = async ({ page, startScreencast, stopScreencast }) => {
const sleep = (ms) => new Promise((res) => setTimeout(res, ms));

await page.goto('https://vclock.com/stopwatch');
await page.click('#btn-resume');
startScreencast();
await sleep(5000);
stopScreencast();
};

Full cURL request

curl -X POST \
https://chrome.browserless.io/screencast?token=YOUR-API-TOKEN \
-H 'Content-Type: application/javascript' \
-d 'module.exports = async ({ page, startScreencast, stopScreencast }) => {
const sleep = (ms) => new Promise((res) => setTimeout(res, ms));

await page.goto("https://vclock.com/stopwatch");
await page.click("#btn-resume");
startScreencast();
await sleep(5000);
stopScreencast();
}'