Save timeline edits to the canvas HTML, refusing to overwrite a newer version.
curl --request PUT \
--url https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"htmlContent": "<string>",
"baseHtmlSha256": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html"
payload = {
"companyId": "<string>",
"htmlContent": "<string>",
"baseHtmlSha256": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({companyId: '<string>', htmlContent: '<string>', baseHtmlSha256: '<string>'})
};
fetch('https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'companyId' => '<string>',
'htmlContent' => '<string>',
'baseHtmlSha256' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"htmlContent\": \"<string>\",\n \"baseHtmlSha256\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"htmlContent\": \"<string>\",\n \"baseHtmlSha256\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"htmlContent\": \"<string>\",\n \"baseHtmlSha256\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"companyId": "<string>",
"name": "<string>",
"width": 123,
"height": 123,
"format": "<string>",
"htmlContent": "<string>",
"animated": true,
"videoDuration": 123,
"imageId": "<string>",
"imageUrl": "<string>",
"videoId": "<string>",
"videoUrl": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Content
Save timeline edits to the canvas HTML, refusing to overwrite a newer version.
PUT
/
api
/
v0
/
content
/
canvases
/
{canvasId}
/
html
Save timeline edits to the canvas HTML, refusing to overwrite a newer version.
curl --request PUT \
--url https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"htmlContent": "<string>",
"baseHtmlSha256": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html"
payload = {
"companyId": "<string>",
"htmlContent": "<string>",
"baseHtmlSha256": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({companyId: '<string>', htmlContent: '<string>', baseHtmlSha256: '<string>'})
};
fetch('https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'companyId' => '<string>',
'htmlContent' => '<string>',
'baseHtmlSha256' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"htmlContent\": \"<string>\",\n \"baseHtmlSha256\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"htmlContent\": \"<string>\",\n \"baseHtmlSha256\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/content/canvases/{canvasId}/html")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"htmlContent\": \"<string>\",\n \"baseHtmlSha256\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"companyId": "<string>",
"name": "<string>",
"width": 123,
"height": 123,
"format": "<string>",
"htmlContent": "<string>",
"animated": true,
"videoDuration": 123,
"imageId": "<string>",
"imageUrl": "<string>",
"videoId": "<string>",
"videoUrl": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
CompanyApiKeyBearerAuth & CompanyId
Company API key - scoped to a specific company. Generate from the Integrations page in your dashboard.
Path Parameters
Body
application/json
The edited canvas HTML
Response
Updated canvas design
Canvas design
Canvas ID
Company ID
Canvas name
Canvas width in pixels
Canvas height in pixels
Named canvas format id, when the size came from one
The standalone HTML document for the canvas
Whether the canvas is animated (exports a looping MP4 instead of a PNG)
Loop length in seconds for animated canvases
Images table id of the last render
Public PNG URL of the last render
Videos table id of the last recording (animated canvases)
Public MP4 URL of the last recording (animated canvases)

