curl --request POST \
--url https://api.print.app/v2/connectors/test \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"connectorId": "01KADX3Q7M2B8C4D5E6F7G8H9J",
"designId": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"url": "https://shop.example.com/products/custom-tee"
}
'import requests
url = "https://api.print.app/v2/connectors/test"
payload = {
"connectorId": "01KADX3Q7M2B8C4D5E6F7G8H9J",
"designId": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"url": "https://shop.example.com/products/custom-tee"
}
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({
connectorId: '01KADX3Q7M2B8C4D5E6F7G8H9J',
designId: 'design_01J8Z9K2M3N4P5Q6R7S8T9V0W1',
url: 'https://shop.example.com/products/custom-tee'
})
};
fetch('https://api.print.app/v2/connectors/test', 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/connectors/test",
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([
'connectorId' => '01KADX3Q7M2B8C4D5E6F7G8H9J',
'designId' => 'design_01J8Z9K2M3N4P5Q6R7S8T9V0W1',
'url' => 'https://shop.example.com/products/custom-tee'
]),
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/connectors/test"
payload := strings.NewReader("{\n \"connectorId\": \"01KADX3Q7M2B8C4D5E6F7G8H9J\",\n \"designId\": \"design_01J8Z9K2M3N4P5Q6R7S8T9V0W1\",\n \"url\": \"https://shop.example.com/products/custom-tee\"\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/connectors/test")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"connectorId\": \"01KADX3Q7M2B8C4D5E6F7G8H9J\",\n \"designId\": \"design_01J8Z9K2M3N4P5Q6R7S8T9V0W1\",\n \"url\": \"https://shop.example.com/products/custom-tee\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.print.app/v2/connectors/test")
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 \"connectorId\": \"01KADX3Q7M2B8C4D5E6F7G8H9J\",\n \"designId\": \"design_01J8Z9K2M3N4P5Q6R7S8T9V0W1\",\n \"url\": \"https://shop.example.com/products/custom-tee\"\n}"
response = http.request(request)
puts response.read_body{
"object": "connector_test",
"ok": true,
"connector": {
"object": "connector",
"id": "01KADX3Q7M2B8C4D5E6F7G8H9J",
"title": "Print side → pages",
"mode": "pageIndex",
"source": {
"type": "selector",
"selector": "input[name=\"Print side\"]:checked"
},
"query": "input[name=\"Print side\"]:checked",
"mappings": [
{
"from": "Front",
"to": "1"
},
{
"from": "Back",
"to": "2"
},
{
"from": "Front and back",
"to": "1,2"
}
],
"twoWay": true,
"page": null,
"text": null,
"event": null,
"created": "2026-10-27T10:00:00Z",
"modified": "2026-10-27T10:00:00Z"
},
"design": {
"id": "<string>",
"title": "<string>",
"editor": "new",
"attached": true,
"pages": [
{
"index": 123,
"title": "<string>",
"previewUrl": "<string>"
}
]
},
"page": {
"url": "<string>",
"productId": "<string>",
"passwordProtected": true,
"control": {
"kind": "select",
"name": "<string>",
"label": "<string>",
"selector": "<string>",
"matches": 123,
"inProductForm": true,
"sends": "<string>",
"choices": [
{
"value": "<string>",
"label": "<string>",
"selected": true
}
],
"value": "<string>",
"notes": [
"<string>"
]
},
"field": {
"id": "<string>",
"label": "<string>",
"type": "<string>",
"role": "<string>",
"source": {
"role": "<string>",
"field": "<string>"
},
"reference": "<string>",
"sends": "<string>",
"choices": [
{
"value": "<string>",
"label": "<string>",
"selected": true
}
]
}
},
"results": [
{
"outcome": "<string>",
"result": "<string>",
"ok": true,
"choice": {
"value": "<string>",
"label": "<string>"
},
"count": 123,
"sends": {
"value": "<string>",
"text": "<string>"
},
"mapping": {
"from": "<string>",
"to": "<string>"
},
"problem": "<string>",
"note": "<string>",
"pages": [
{
"index": 123,
"number": 123,
"title": "<string>"
}
],
"designId": "<string>",
"orientation": "<string>",
"color": {
"title": "<string>",
"hex": "<string>"
}
}
],
"issues": [
{
"level": "error",
"code": "<string>",
"message": "<string>"
}
]
}{
"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": "unsupported_media_type",
"message": "Send the request body as JSON, with \"Content-Type: application/json\".",
"requestId": "FZn-uhymjoEEJow="
}{
"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="
}Test a connector
Plays a connector (saved, or one you are about to create) against a design for every choice of its field: what the product page sends, which mapping matches, and what the editor then does, such as the pages it shows or the design it opens. With url, the field and its choices are read from your product page, and the test also checks the selector finds it, the design is assigned to the product, and no other connector on the design fights it. Nothing is saved.
curl --request POST \
--url https://api.print.app/v2/connectors/test \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"connectorId": "01KADX3Q7M2B8C4D5E6F7G8H9J",
"designId": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"url": "https://shop.example.com/products/custom-tee"
}
'import requests
url = "https://api.print.app/v2/connectors/test"
payload = {
"connectorId": "01KADX3Q7M2B8C4D5E6F7G8H9J",
"designId": "design_01J8Z9K2M3N4P5Q6R7S8T9V0W1",
"url": "https://shop.example.com/products/custom-tee"
}
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({
connectorId: '01KADX3Q7M2B8C4D5E6F7G8H9J',
designId: 'design_01J8Z9K2M3N4P5Q6R7S8T9V0W1',
url: 'https://shop.example.com/products/custom-tee'
})
};
fetch('https://api.print.app/v2/connectors/test', 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/connectors/test",
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([
'connectorId' => '01KADX3Q7M2B8C4D5E6F7G8H9J',
'designId' => 'design_01J8Z9K2M3N4P5Q6R7S8T9V0W1',
'url' => 'https://shop.example.com/products/custom-tee'
]),
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/connectors/test"
payload := strings.NewReader("{\n \"connectorId\": \"01KADX3Q7M2B8C4D5E6F7G8H9J\",\n \"designId\": \"design_01J8Z9K2M3N4P5Q6R7S8T9V0W1\",\n \"url\": \"https://shop.example.com/products/custom-tee\"\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/connectors/test")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"connectorId\": \"01KADX3Q7M2B8C4D5E6F7G8H9J\",\n \"designId\": \"design_01J8Z9K2M3N4P5Q6R7S8T9V0W1\",\n \"url\": \"https://shop.example.com/products/custom-tee\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.print.app/v2/connectors/test")
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 \"connectorId\": \"01KADX3Q7M2B8C4D5E6F7G8H9J\",\n \"designId\": \"design_01J8Z9K2M3N4P5Q6R7S8T9V0W1\",\n \"url\": \"https://shop.example.com/products/custom-tee\"\n}"
response = http.request(request)
puts response.read_body{
"object": "connector_test",
"ok": true,
"connector": {
"object": "connector",
"id": "01KADX3Q7M2B8C4D5E6F7G8H9J",
"title": "Print side → pages",
"mode": "pageIndex",
"source": {
"type": "selector",
"selector": "input[name=\"Print side\"]:checked"
},
"query": "input[name=\"Print side\"]:checked",
"mappings": [
{
"from": "Front",
"to": "1"
},
{
"from": "Back",
"to": "2"
},
{
"from": "Front and back",
"to": "1,2"
}
],
"twoWay": true,
"page": null,
"text": null,
"event": null,
"created": "2026-10-27T10:00:00Z",
"modified": "2026-10-27T10:00:00Z"
},
"design": {
"id": "<string>",
"title": "<string>",
"editor": "new",
"attached": true,
"pages": [
{
"index": 123,
"title": "<string>",
"previewUrl": "<string>"
}
]
},
"page": {
"url": "<string>",
"productId": "<string>",
"passwordProtected": true,
"control": {
"kind": "select",
"name": "<string>",
"label": "<string>",
"selector": "<string>",
"matches": 123,
"inProductForm": true,
"sends": "<string>",
"choices": [
{
"value": "<string>",
"label": "<string>",
"selected": true
}
],
"value": "<string>",
"notes": [
"<string>"
]
},
"field": {
"id": "<string>",
"label": "<string>",
"type": "<string>",
"role": "<string>",
"source": {
"role": "<string>",
"field": "<string>"
},
"reference": "<string>",
"sends": "<string>",
"choices": [
{
"value": "<string>",
"label": "<string>",
"selected": true
}
]
}
},
"results": [
{
"outcome": "<string>",
"result": "<string>",
"ok": true,
"choice": {
"value": "<string>",
"label": "<string>"
},
"count": 123,
"sends": {
"value": "<string>",
"text": "<string>"
},
"mapping": {
"from": "<string>",
"to": "<string>"
},
"problem": "<string>",
"note": "<string>",
"pages": [
{
"index": 123,
"number": 123,
"title": "<string>"
}
],
"designId": "<string>",
"orientation": "<string>",
"color": {
"title": "<string>",
"hex": "<string>"
}
}
],
"issues": [
{
"level": "error",
"code": "<string>",
"message": "<string>"
}
]
}{
"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": "unsupported_media_type",
"message": "Send the request body as JSON, with \"Content-Type: application/json\".",
"requestId": "FZn-uhymjoEEJow="
}{
"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.
Body
A connector to play against a design: a saved one (connectorId) or one to try before saving (connector).
The design it is (or will be) attached to.
1 - 200A saved connector.
1 - 100A connector to try without saving it, as POST /v2/connectors takes it.
Show child attributes
Show child attributes
The product page, to read the field and its choices from it. A page of your store only.
2000The choices to play, when there is no page to read them from (or to play others than the page has): a value, or { value, label } for a choice whose label differs.
100200Response
OK.
What a connector does for each choice, and what stands in its way.
"connector_test"Every choice does what it should and nothing blocks it.
Links an option on a store's product page to the editor: the choice a customer makes shows the right pages, opens the right design, sets the size or the colour.
Show child attributes
Show child attributes
{
"object": "connector",
"id": "01KADX3Q7M2B8C4D5E6F7G8H9J",
"title": "Print side → pages",
"mode": "pageIndex",
"source": {
"type": "selector",
"selector": "input[name=\"Print side\"]:checked"
},
"query": "input[name=\"Print side\"]:checked",
"mappings": [
{ "from": "Front", "to": "1" },
{ "from": "Back", "to": "2" },
{ "from": "Front and back", "to": "1,2" }
],
"twoWay": true,
"page": null,
"text": null,
"event": null,
"created": "2026-10-27T10:00:00Z",
"modified": "2026-10-27T10:00:00Z"
}
Show child attributes
Show child attributes
Show child attributes
Show child attributes
One per choice played (pageCount and printedPageCount: one per page count).
Show child attributes
Show child attributes
Show child attributes
Show child attributes