curl --request PATCH \
--url https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId} \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"field": "items/1/text",
"text": "Your knowledge stays in the IP Vault",
"revision": 3
}
'import requests
url = "https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}"
payload = {
"field": "items/1/text",
"text": "Your knowledge stays in the IP Vault",
"revision": 3
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
field: 'items/1/text',
text: 'Your knowledge stays in the IP Vault',
revision: 3
})
};
fetch('https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}', 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://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'field' => 'items/1/text',
'text' => 'Your knowledge stays in the IP Vault',
'revision' => 3
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <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://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}"
payload := strings.NewReader("{\n \"field\": \"items/1/text\",\n \"text\": \"Your knowledge stays in the IP Vault\",\n \"revision\": 3\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-access-token", "<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.patch("https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"field\": \"items/1/text\",\n \"text\": \"Your knowledge stays in the IP Vault\",\n \"revision\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"field\": \"items/1/text\",\n \"text\": \"Your knowledge stays in the IP Vault\",\n \"revision\": 3\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"unchanged": true,
"presentationId": "<string>",
"sceneId": "<string>",
"field": "<string>",
"revision": 4,
"version": 2,
"narrationChanged": true,
"narrationQueued": true,
"estimatedTotal": 64.1,
"presenterRerecord": true,
"presenterCreditsEstimate": 123,
"contentValid": true,
"report": {
"errorCount": 123,
"warningCount": 123,
"errors": [
{
"level": "content",
"code": "UNSOURCED_NUMERAL",
"path": "/scenes/4/props/items/1/text",
"message": "<string>"
}
],
"warnings": [
{
"level": "content",
"code": "UNSOURCED_NUMERAL",
"path": "/scenes/4/props/items/1/text",
"message": "<string>"
}
]
}
}{
"success": false,
"code": "CONTENT_INVALID",
"errors": [
{
"level": "content",
"code": "UNSOURCED_NUMERAL",
"path": "/scenes/4/props/items/1/text",
"message": "<string>"
}
]
}Edit one scene's narration or on-screen text
Small direct text edit by the owner: the scene’s narration, or one on-screen text field of its component, named by its path below props (title kicker|title|subtitle; statement kicker|text|emphasis; bullets title, items/<i>/text; metric label|caption; bar-chart title|caption, bars/<i>/label; flow title, steps/<i>/label|detail; quote quote|attribution|role only when the quote has no source; cta title|subtitle) — only fields the scene already has. A statement’s emphasis must stay part of its text. Numbers, number prefixes/suffixes/units, the cta address, claim references, component, layout and background are not editable here. The text is trimmed and capped by the document schema (narration 600 characters; on-screen text 24–200 depending on the field). The edit is validated like the Digital Twin’s own saves: a number that no claim of the scene backs, a link or e-mail address, an address spelled out in narration or more than 50 narration words is refused (422 with the validator’s errors). An accepted edit creates a new version; the narration is re-made in the background (only an edited scene is voiced again and charged), and the Digital Twin’s face is recorded again only when the narration changed. An export estimate for the previous version is stale afterwards. revision (the version you edited) is required. A narration edit is refused up front when the video would clearly leave its length (55–65 s for a 1-minute video, 170–190 s for a 3-minute one; 422 NARRATION_TIMING with the projected total and the word range that fits). Not while the Digital Twin is still building the video (409 BUILD_IN_PROGRESS). Fields you edited are listed on later versions as ownerEdited until the Digital Twin rewrites them. Owner only; 30 edits per minute.
curl --request PATCH \
--url https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId} \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"field": "items/1/text",
"text": "Your knowledge stays in the IP Vault",
"revision": 3
}
'import requests
url = "https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}"
payload = {
"field": "items/1/text",
"text": "Your knowledge stays in the IP Vault",
"revision": 3
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
field: 'items/1/text',
text: 'Your knowledge stays in the IP Vault',
revision: 3
})
};
fetch('https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}', 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://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'field' => 'items/1/text',
'text' => 'Your knowledge stays in the IP Vault',
'revision' => 3
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <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://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}"
payload := strings.NewReader("{\n \"field\": \"items/1/text\",\n \"text\": \"Your knowledge stays in the IP Vault\",\n \"revision\": 3\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-access-token", "<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.patch("https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"field\": \"items/1/text\",\n \"text\": \"Your knowledge stays in the IP Vault\",\n \"revision\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/user/presentations/{id}/scenes/{sceneId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"field\": \"items/1/text\",\n \"text\": \"Your knowledge stays in the IP Vault\",\n \"revision\": 3\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"unchanged": true,
"presentationId": "<string>",
"sceneId": "<string>",
"field": "<string>",
"revision": 4,
"version": 2,
"narrationChanged": true,
"narrationQueued": true,
"estimatedTotal": 64.1,
"presenterRerecord": true,
"presenterCreditsEstimate": 123,
"contentValid": true,
"report": {
"errorCount": 123,
"warningCount": 123,
"errors": [
{
"level": "content",
"code": "UNSOURCED_NUMERAL",
"path": "/scenes/4/props/items/1/text",
"message": "<string>"
}
],
"warnings": [
{
"level": "content",
"code": "UNSOURCED_NUMERAL",
"path": "/scenes/4/props/items/1/text",
"message": "<string>"
}
]
}
}{
"success": false,
"code": "CONTENT_INVALID",
"errors": [
{
"level": "content",
"code": "UNSOURCED_NUMERAL",
"path": "/scenes/4/props/items/1/text",
"message": "<string>"
}
]
}Authorizations
JWT token passed in x-access-token header
Body
Response
Saved as a new version — or unchanged: true (same text, nothing saved; revision is the current one)
true
Present (true) only when the text was already that
4
The new version (each edit is its own version)
2
The narration of the new version is being made
Projected video length (narration edits)
64.1
The Digital Twin's face will be recorded again
Estimated credits for that recording
Show child attributes
Show child attributes
Was this page helpful?