curl --request POST \
--url https://api.print.app/v2/designs/{id}/ops \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"units": "mm",
"ops": [
{
"op": "shape.add",
"ref": "band",
"kind": "rect",
"box": [
0,
0,
85,
14
],
"fill": "#1f2a44"
},
{
"op": "text.add",
"ref": "name",
"box": [
6,
22,
73,
10
],
"content": "Ada Lovelace",
"font": "open sans",
"size": 14,
"weight": 700,
"align": "left",
"color": "#1f2a44",
"field": {
"title": "Name",
"maxTextCount": 30
}
},
{
"op": "graphic.add",
"ref": "logo",
"box": [
62,
3,
18,
8
],
"asset": "file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png"
}
]
}
'import requests
url = "https://api.print.app/v2/designs/{id}/ops"
payload = {
"units": "mm",
"ops": [
{
"op": "shape.add",
"ref": "band",
"kind": "rect",
"box": [0, 0, 85, 14],
"fill": "#1f2a44"
},
{
"op": "text.add",
"ref": "name",
"box": [6, 22, 73, 10],
"content": "Ada Lovelace",
"font": "open sans",
"size": 14,
"weight": 700,
"align": "left",
"color": "#1f2a44",
"field": {
"title": "Name",
"maxTextCount": 30
}
},
{
"op": "graphic.add",
"ref": "logo",
"box": [62, 3, 18, 8],
"asset": "file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
units: 'mm',
ops: [
{
op: 'shape.add',
ref: 'band',
kind: 'rect',
box: [0, 0, 85, 14],
fill: '#1f2a44'
},
{
op: 'text.add',
ref: 'name',
box: [6, 22, 73, 10],
content: 'Ada Lovelace',
font: 'open sans',
size: 14,
weight: 700,
align: 'left',
color: '#1f2a44',
field: {title: 'Name', maxTextCount: 30}
},
{
op: 'graphic.add',
ref: 'logo',
box: [62, 3, 18, 8],
asset: 'file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png'
}
]
})
};
fetch('https://api.print.app/v2/designs/{id}/ops', 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.print.app/v2/designs/{id}/ops",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'units' => 'mm',
'ops' => [
[
'op' => 'shape.add',
'ref' => 'band',
'kind' => 'rect',
'box' => [
0,
0,
85,
14
],
'fill' => '#1f2a44'
],
[
'op' => 'text.add',
'ref' => 'name',
'box' => [
6,
22,
73,
10
],
'content' => 'Ada Lovelace',
'font' => 'open sans',
'size' => 14,
'weight' => 700,
'align' => 'left',
'color' => '#1f2a44',
'field' => [
'title' => 'Name',
'maxTextCount' => 30
]
],
[
'op' => 'graphic.add',
'ref' => 'logo',
'box' => [
62,
3,
18,
8
],
'asset' => 'file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.print.app/v2/designs/{id}/ops"
payload := strings.NewReader("{\n \"units\": \"mm\",\n \"ops\": [\n {\n \"op\": \"shape.add\",\n \"ref\": \"band\",\n \"kind\": \"rect\",\n \"box\": [\n 0,\n 0,\n 85,\n 14\n ],\n \"fill\": \"#1f2a44\"\n },\n {\n \"op\": \"text.add\",\n \"ref\": \"name\",\n \"box\": [\n 6,\n 22,\n 73,\n 10\n ],\n \"content\": \"Ada Lovelace\",\n \"font\": \"open sans\",\n \"size\": 14,\n \"weight\": 700,\n \"align\": \"left\",\n \"color\": \"#1f2a44\",\n \"field\": {\n \"title\": \"Name\",\n \"maxTextCount\": 30\n }\n },\n {\n \"op\": \"graphic.add\",\n \"ref\": \"logo\",\n \"box\": [\n 62,\n 3,\n 18,\n 8\n ],\n \"asset\": \"file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://api.print.app/v2/designs/{id}/ops")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"units\": \"mm\",\n \"ops\": [\n {\n \"op\": \"shape.add\",\n \"ref\": \"band\",\n \"kind\": \"rect\",\n \"box\": [\n 0,\n 0,\n 85,\n 14\n ],\n \"fill\": \"#1f2a44\"\n },\n {\n \"op\": \"text.add\",\n \"ref\": \"name\",\n \"box\": [\n 6,\n 22,\n 73,\n 10\n ],\n \"content\": \"Ada Lovelace\",\n \"font\": \"open sans\",\n \"size\": 14,\n \"weight\": 700,\n \"align\": \"left\",\n \"color\": \"#1f2a44\",\n \"field\": {\n \"title\": \"Name\",\n \"maxTextCount\": 30\n }\n },\n {\n \"op\": \"graphic.add\",\n \"ref\": \"logo\",\n \"box\": [\n 62,\n 3,\n 18,\n 8\n ],\n \"asset\": \"file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.print.app/v2/designs/{id}/ops")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"units\": \"mm\",\n \"ops\": [\n {\n \"op\": \"shape.add\",\n \"ref\": \"band\",\n \"kind\": \"rect\",\n \"box\": [\n 0,\n 0,\n 85,\n 14\n ],\n \"fill\": \"#1f2a44\"\n },\n {\n \"op\": \"text.add\",\n \"ref\": \"name\",\n \"box\": [\n 6,\n 22,\n 73,\n 10\n ],\n \"content\": \"Ada Lovelace\",\n \"font\": \"open sans\",\n \"size\": 14,\n \"weight\": 700,\n \"align\": \"left\",\n \"color\": \"#1f2a44\",\n \"field\": {\n \"title\": \"Name\",\n \"maxTextCount\": 30\n }\n },\n {\n \"op\": \"graphic.add\",\n \"ref\": \"logo\",\n \"box\": [\n 62,\n 3,\n 18,\n 8\n ],\n \"asset\": \"file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "ops_result",
"dryRun": true,
"results": [
{
"index": 123,
"op": "<string>",
"ok": true,
"id": "<string>",
"pageId": "<string>",
"ref": "<string>",
"error": "<string>",
"path": "<string>",
"warnings": [
"<string>"
]
}
],
"design": {
"object": "design",
"id": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"title": "Business Card",
"unit": "mm",
"pages": [
{
"index": 0,
"title": "Front",
"previewUrl": "https://d1p81tn8mwpox2.cloudfront.net/?k=s3%3A%2F%2Fapp-print-cdn%2Fcontent_f1.png&size=1000"
},
{
"index": 1,
"title": "Back",
"previewUrl": "https://d1p81tn8mwpox2.cloudfront.net/?k=s3%3A%2F%2Fapp-print-cdn%2Fcontent_b1.png&size=1000"
}
],
"tags": [
"cards"
],
"created": "2026-09-02T14:05:11Z",
"modified": "2026-10-11T08:40:27Z"
},
"content": {
"object": "design_content",
"designId": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"unit": "mm",
"pages": [
{
"index": 0,
"id": "page_5b1e",
"title": "Front",
"width": 85,
"height": 55,
"bleed": 3,
"safeMargin": 3,
"items": [
{
"id": "itm_7f3a",
"ref": "band",
"type": "rect",
"box": [
0,
0,
85,
14
],
"fill": "#1f2a44",
"lock": "decor"
},
{
"id": "itm_7f3b",
"ref": "name",
"type": "text",
"box": [
6,
22,
73,
10
],
"text": "Ada Lovelace",
"font": "open sans",
"weight": 700,
"size": 14,
"align": "left",
"color": "#1f2a44",
"field": {
"title": "Name"
},
"lock": "field"
}
]
}
]
}
}{
"error": true,
"code": "invalid_request",
"message": "width is required.",
"param": "width",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "unauthorized",
"message": "Missing or invalid secret key. Send it as \"Authorization: Bearer sk_…\".",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "account_suspended",
"message": "This account is suspended. Settle the outstanding invoice in the Print.App dashboard.",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "not_found",
"message": "Not found.",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "folder_not_empty",
"message": "The folder still holds designs. Remove them from it (or delete them) first.",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "unsupported_media_type",
"message": "Send the request body as JSON, with \"Content-Type: application/json\".",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "ops_failed",
"message": "ops[1] (item.update) failed: no item 'logo'. Nothing was saved.",
"param": "ops",
"requestId": "FZn-uhymjoEEJow=",
"details": [
{
"index": 0,
"op": "text.add",
"ok": true,
"id": "itm_7f3b",
"ref": "name"
},
{
"index": 1,
"op": "item.update",
"ok": false,
"error": "no item 'logo'"
}
]
}{
"message": "Too Many Requests"
}{
"error": true,
"code": "internal_error",
"message": "Something went wrong on our side. Retry the request; if it keeps failing, contact support with the requestId.",
"requestId": "FZn-uhymjoEEJow="
}Edit page content
Adds, changes and removes text, images, shapes, frames, QR codes and other items on a design’s pages, as one batch of operations. The batch is checked against the operation schemas first and refused as a whole if any operation is malformed (400). It then runs in order; if any operation fails, nothing is saved (422). With dryRun: true it runs without saving.
Place images and SVG graphics as files: upload them with POST /v2/files (from a URL) or POST /v2/files/uploads, then give the file id as asset. An SVG file stays vector in print. Don’t send SVG markup inline (svg): the firewall in front of the API refuses request bodies that carry markup, with an HTML 403.
curl --request POST \
--url https://api.print.app/v2/designs/{id}/ops \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"units": "mm",
"ops": [
{
"op": "shape.add",
"ref": "band",
"kind": "rect",
"box": [
0,
0,
85,
14
],
"fill": "#1f2a44"
},
{
"op": "text.add",
"ref": "name",
"box": [
6,
22,
73,
10
],
"content": "Ada Lovelace",
"font": "open sans",
"size": 14,
"weight": 700,
"align": "left",
"color": "#1f2a44",
"field": {
"title": "Name",
"maxTextCount": 30
}
},
{
"op": "graphic.add",
"ref": "logo",
"box": [
62,
3,
18,
8
],
"asset": "file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png"
}
]
}
'import requests
url = "https://api.print.app/v2/designs/{id}/ops"
payload = {
"units": "mm",
"ops": [
{
"op": "shape.add",
"ref": "band",
"kind": "rect",
"box": [0, 0, 85, 14],
"fill": "#1f2a44"
},
{
"op": "text.add",
"ref": "name",
"box": [6, 22, 73, 10],
"content": "Ada Lovelace",
"font": "open sans",
"size": 14,
"weight": 700,
"align": "left",
"color": "#1f2a44",
"field": {
"title": "Name",
"maxTextCount": 30
}
},
{
"op": "graphic.add",
"ref": "logo",
"box": [62, 3, 18, 8],
"asset": "file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
units: 'mm',
ops: [
{
op: 'shape.add',
ref: 'band',
kind: 'rect',
box: [0, 0, 85, 14],
fill: '#1f2a44'
},
{
op: 'text.add',
ref: 'name',
box: [6, 22, 73, 10],
content: 'Ada Lovelace',
font: 'open sans',
size: 14,
weight: 700,
align: 'left',
color: '#1f2a44',
field: {title: 'Name', maxTextCount: 30}
},
{
op: 'graphic.add',
ref: 'logo',
box: [62, 3, 18, 8],
asset: 'file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png'
}
]
})
};
fetch('https://api.print.app/v2/designs/{id}/ops', 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.print.app/v2/designs/{id}/ops",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'units' => 'mm',
'ops' => [
[
'op' => 'shape.add',
'ref' => 'band',
'kind' => 'rect',
'box' => [
0,
0,
85,
14
],
'fill' => '#1f2a44'
],
[
'op' => 'text.add',
'ref' => 'name',
'box' => [
6,
22,
73,
10
],
'content' => 'Ada Lovelace',
'font' => 'open sans',
'size' => 14,
'weight' => 700,
'align' => 'left',
'color' => '#1f2a44',
'field' => [
'title' => 'Name',
'maxTextCount' => 30
]
],
[
'op' => 'graphic.add',
'ref' => 'logo',
'box' => [
62,
3,
18,
8
],
'asset' => 'file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.print.app/v2/designs/{id}/ops"
payload := strings.NewReader("{\n \"units\": \"mm\",\n \"ops\": [\n {\n \"op\": \"shape.add\",\n \"ref\": \"band\",\n \"kind\": \"rect\",\n \"box\": [\n 0,\n 0,\n 85,\n 14\n ],\n \"fill\": \"#1f2a44\"\n },\n {\n \"op\": \"text.add\",\n \"ref\": \"name\",\n \"box\": [\n 6,\n 22,\n 73,\n 10\n ],\n \"content\": \"Ada Lovelace\",\n \"font\": \"open sans\",\n \"size\": 14,\n \"weight\": 700,\n \"align\": \"left\",\n \"color\": \"#1f2a44\",\n \"field\": {\n \"title\": \"Name\",\n \"maxTextCount\": 30\n }\n },\n {\n \"op\": \"graphic.add\",\n \"ref\": \"logo\",\n \"box\": [\n 62,\n 3,\n 18,\n 8\n ],\n \"asset\": \"file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.post("https://api.print.app/v2/designs/{id}/ops")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"units\": \"mm\",\n \"ops\": [\n {\n \"op\": \"shape.add\",\n \"ref\": \"band\",\n \"kind\": \"rect\",\n \"box\": [\n 0,\n 0,\n 85,\n 14\n ],\n \"fill\": \"#1f2a44\"\n },\n {\n \"op\": \"text.add\",\n \"ref\": \"name\",\n \"box\": [\n 6,\n 22,\n 73,\n 10\n ],\n \"content\": \"Ada Lovelace\",\n \"font\": \"open sans\",\n \"size\": 14,\n \"weight\": 700,\n \"align\": \"left\",\n \"color\": \"#1f2a44\",\n \"field\": {\n \"title\": \"Name\",\n \"maxTextCount\": 30\n }\n },\n {\n \"op\": \"graphic.add\",\n \"ref\": \"logo\",\n \"box\": [\n 62,\n 3,\n 18,\n 8\n ],\n \"asset\": \"file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.print.app/v2/designs/{id}/ops")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"units\": \"mm\",\n \"ops\": [\n {\n \"op\": \"shape.add\",\n \"ref\": \"band\",\n \"kind\": \"rect\",\n \"box\": [\n 0,\n 0,\n 85,\n 14\n ],\n \"fill\": \"#1f2a44\"\n },\n {\n \"op\": \"text.add\",\n \"ref\": \"name\",\n \"box\": [\n 6,\n 22,\n 73,\n 10\n ],\n \"content\": \"Ada Lovelace\",\n \"font\": \"open sans\",\n \"size\": 14,\n \"weight\": 700,\n \"align\": \"left\",\n \"color\": \"#1f2a44\",\n \"field\": {\n \"title\": \"Name\",\n \"maxTextCount\": 30\n }\n },\n {\n \"op\": \"graphic.add\",\n \"ref\": \"logo\",\n \"box\": [\n 62,\n 3,\n 18,\n 8\n ],\n \"asset\": \"file_01JB2W3X4Y5Z6A7B8C9D0E1F2G.png\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "ops_result",
"dryRun": true,
"results": [
{
"index": 123,
"op": "<string>",
"ok": true,
"id": "<string>",
"pageId": "<string>",
"ref": "<string>",
"error": "<string>",
"path": "<string>",
"warnings": [
"<string>"
]
}
],
"design": {
"object": "design",
"id": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"title": "Business Card",
"unit": "mm",
"pages": [
{
"index": 0,
"title": "Front",
"previewUrl": "https://d1p81tn8mwpox2.cloudfront.net/?k=s3%3A%2F%2Fapp-print-cdn%2Fcontent_f1.png&size=1000"
},
{
"index": 1,
"title": "Back",
"previewUrl": "https://d1p81tn8mwpox2.cloudfront.net/?k=s3%3A%2F%2Fapp-print-cdn%2Fcontent_b1.png&size=1000"
}
],
"tags": [
"cards"
],
"created": "2026-09-02T14:05:11Z",
"modified": "2026-10-11T08:40:27Z"
},
"content": {
"object": "design_content",
"designId": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"unit": "mm",
"pages": [
{
"index": 0,
"id": "page_5b1e",
"title": "Front",
"width": 85,
"height": 55,
"bleed": 3,
"safeMargin": 3,
"items": [
{
"id": "itm_7f3a",
"ref": "band",
"type": "rect",
"box": [
0,
0,
85,
14
],
"fill": "#1f2a44",
"lock": "decor"
},
{
"id": "itm_7f3b",
"ref": "name",
"type": "text",
"box": [
6,
22,
73,
10
],
"text": "Ada Lovelace",
"font": "open sans",
"weight": 700,
"size": 14,
"align": "left",
"color": "#1f2a44",
"field": {
"title": "Name"
},
"lock": "field"
}
]
}
]
}
}{
"error": true,
"code": "invalid_request",
"message": "width is required.",
"param": "width",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "unauthorized",
"message": "Missing or invalid secret key. Send it as \"Authorization: Bearer sk_…\".",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "account_suspended",
"message": "This account is suspended. Settle the outstanding invoice in the Print.App dashboard.",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "not_found",
"message": "Not found.",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "folder_not_empty",
"message": "The folder still holds designs. Remove them from it (or delete them) first.",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "unsupported_media_type",
"message": "Send the request body as JSON, with \"Content-Type: application/json\".",
"requestId": "FZn-uhymjoEEJow="
}{
"error": true,
"code": "ops_failed",
"message": "ops[1] (item.update) failed: no item 'logo'. Nothing was saved.",
"param": "ops",
"requestId": "FZn-uhymjoEEJow=",
"details": [
{
"index": 0,
"op": "text.add",
"ok": true,
"id": "itm_7f3b",
"ref": "name"
},
{
"index": 1,
"op": "item.update",
"ok": false,
"error": "no item 'logo'"
}
]
}{
"message": "Too Many Requests"
}{
"error": true,
"code": "internal_error",
"message": "Something went wrong on our side. Retry the request; if it keeps failing, contact support with the requestId.",
"requestId": "FZn-uhymjoEEJow="
}Authorizations
A secret key from Print.App admin → Domains → Secret keys, sent as Authorization: Bearer sk_…. Server-side only.
Path Parameters
The designId.
Body
A batch of design operations, run in order as one change: either every operation succeeds and the design is saved, or nothing is. Each operation is checked against its own schema (the DesignOp schemas) before anything runs.
The operations, run in order. Items added in the batch can be targeted by later operations through their ref.
1 - 100 elements- text.add
- text.add
- frame.add
- graphic.add
- graphic.add
- shape.add
- pattern.add
- border.add
- module.add
- page.add
- page.set
- design.set
- item.update
- item.remove
- align
Show child attributes
Show child attributes
The unit of every box and length in the batch. Default: the design's unit (mm for designs measured in ft). Text sizes are always in points.
mm, cm, in, pt, px The page item operations go on: a page number from 1, or a page's ref. An operation's own page wins. Default 1.
1 <= x <= 500Run the batch and report every operation's result and the resulting content, without saving anything.
Response
OK.
The outcome of a batch that ran: every operation's result, the design as saved (unchanged on a dry run), and its content now.
"ops_result"Show child attributes
Show child attributes
A design (template) your customers start from. Open it in the editor with new PrintAppClient({ designId }).
Show child attributes
Show child attributes
{
"object": "design",
"id": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"title": "Business Card",
"unit": "mm",
"pages": [
{
"index": 0,
"title": "Front",
"previewUrl": "https://d1p81tn8mwpox2.cloudfront.net/?k=s3%3A%2F%2Fapp-print-cdn%2Fcontent_f1.png&size=1000"
},
{
"index": 1,
"title": "Back",
"previewUrl": "https://d1p81tn8mwpox2.cloudfront.net/?k=s3%3A%2F%2Fapp-print-cdn%2Fcontent_b1.png&size=1000"
}
],
"tags": ["cards"],
"created": "2026-09-02T14:05:11Z",
"modified": "2026-10-11T08:40:27Z"
}
What is on each page of a design. Boxes are [x, y, width, height] in unit, measured from the top-left of the trim (of the print area, on garment pages); text sizes are in points.
Show child attributes
Show child attributes
{
"object": "design_content",
"designId": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"unit": "mm",
"pages": [
{
"index": 0,
"id": "page_5b1e",
"title": "Front",
"width": 85,
"height": 55,
"bleed": 3,
"safeMargin": 3,
"items": [
{
"id": "itm_7f3a",
"ref": "band",
"type": "rect",
"box": [0, 0, 85, 14],
"fill": "#1f2a44",
"lock": "decor"
},
{
"id": "itm_7f3b",
"ref": "name",
"type": "text",
"box": [6, 22, 73, 10],
"text": "Ada Lovelace",
"font": "open sans",
"weight": 700,
"size": 14,
"align": "left",
"color": "#1f2a44",
"field": { "title": "Name" },
"lock": "field"
}
]
}
]
}