curl --request POST \
--url https://app.polygon-one.com/api/ppwr/formats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"specInternalRef": "<string>",
"reference": "<string>",
"gtin": "<string>",
"label": "<string>",
"widthMm": 123,
"heightMm": 123,
"depthMm": 123
}
]
'import requests
url = "https://app.polygon-one.com/api/ppwr/formats"
payload = [
{
"specInternalRef": "<string>",
"reference": "<string>",
"gtin": "<string>",
"label": "<string>",
"widthMm": 123,
"heightMm": 123,
"depthMm": 123
}
]
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([
{
specInternalRef: '<string>',
reference: '<string>',
gtin: '<string>',
label: '<string>',
widthMm: 123,
heightMm: 123,
depthMm: 123
}
])
};
fetch('https://app.polygon-one.com/api/ppwr/formats', 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://app.polygon-one.com/api/ppwr/formats",
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([
[
'specInternalRef' => '<string>',
'reference' => '<string>',
'gtin' => '<string>',
'label' => '<string>',
'widthMm' => 123,
'heightMm' => 123,
'depthMm' => 123
]
]),
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://app.polygon-one.com/api/ppwr/formats"
payload := strings.NewReader("[\n {\n \"specInternalRef\": \"<string>\",\n \"reference\": \"<string>\",\n \"gtin\": \"<string>\",\n \"label\": \"<string>\",\n \"widthMm\": 123,\n \"heightMm\": 123,\n \"depthMm\": 123\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://app.polygon-one.com/api/ppwr/formats")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"specInternalRef\": \"<string>\",\n \"reference\": \"<string>\",\n \"gtin\": \"<string>\",\n \"label\": \"<string>\",\n \"widthMm\": 123,\n \"heightMm\": 123,\n \"depthMm\": 123\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/ppwr/formats")
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 {\n \"specInternalRef\": \"<string>\",\n \"reference\": \"<string>\",\n \"gtin\": \"<string>\",\n \"label\": \"<string>\",\n \"widthMm\": 123,\n \"heightMm\": 123,\n \"depthMm\": 123\n }\n]"
response = http.request(request)
puts response.read_body{
"imported": 123,
"updated": [
"<string>"
],
"skipped": [
"<string>"
],
"failed": [
{
"identifier": "<string>",
"error": "<string>"
}
],
"invalid": [
{
"index": 123,
"identifier": "<string>",
"error": "<string>"
}
],
"sizesCreated": 123,
"articleNumbersUnmatched": 123,
"articleLinksCreated": 123,
"componentLinksCreated": 123,
"componentStubsCreated": 123
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}Größen anlegen & aktualisieren
Upsert the sizes (formats) a packaging unit comes in, keyed on (specInternalRef, reference). Idempotent and blank-is-keep: a replayed row comes back as skipped, and an omitted field keeps the stored value — this door can add and change size data, never clear it. A unit carries at most 50 sizes (formatCapReached). Sizes can also be sent on the unit intake itself (sizes[] or grouped rows), which is the primary way. At most 1000 rows per request (400 otherwise). Requires packaging:write; customer workspace with the PPWR module enabled — see the guide.
curl --request POST \
--url https://app.polygon-one.com/api/ppwr/formats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
[
{
"specInternalRef": "<string>",
"reference": "<string>",
"gtin": "<string>",
"label": "<string>",
"widthMm": 123,
"heightMm": 123,
"depthMm": 123
}
]
'import requests
url = "https://app.polygon-one.com/api/ppwr/formats"
payload = [
{
"specInternalRef": "<string>",
"reference": "<string>",
"gtin": "<string>",
"label": "<string>",
"widthMm": 123,
"heightMm": 123,
"depthMm": 123
}
]
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([
{
specInternalRef: '<string>',
reference: '<string>',
gtin: '<string>',
label: '<string>',
widthMm: 123,
heightMm: 123,
depthMm: 123
}
])
};
fetch('https://app.polygon-one.com/api/ppwr/formats', 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://app.polygon-one.com/api/ppwr/formats",
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([
[
'specInternalRef' => '<string>',
'reference' => '<string>',
'gtin' => '<string>',
'label' => '<string>',
'widthMm' => 123,
'heightMm' => 123,
'depthMm' => 123
]
]),
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://app.polygon-one.com/api/ppwr/formats"
payload := strings.NewReader("[\n {\n \"specInternalRef\": \"<string>\",\n \"reference\": \"<string>\",\n \"gtin\": \"<string>\",\n \"label\": \"<string>\",\n \"widthMm\": 123,\n \"heightMm\": 123,\n \"depthMm\": 123\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://app.polygon-one.com/api/ppwr/formats")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"specInternalRef\": \"<string>\",\n \"reference\": \"<string>\",\n \"gtin\": \"<string>\",\n \"label\": \"<string>\",\n \"widthMm\": 123,\n \"heightMm\": 123,\n \"depthMm\": 123\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/ppwr/formats")
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 {\n \"specInternalRef\": \"<string>\",\n \"reference\": \"<string>\",\n \"gtin\": \"<string>\",\n \"label\": \"<string>\",\n \"widthMm\": 123,\n \"heightMm\": 123,\n \"depthMm\": 123\n }\n]"
response = http.request(request)
puts response.read_body{
"imported": 123,
"updated": [
"<string>"
],
"skipped": [
"<string>"
],
"failed": [
{
"identifier": "<string>",
"error": "<string>"
}
],
"invalid": [
{
"index": 123,
"identifier": "<string>",
"error": "<string>"
}
],
"sizesCreated": 123,
"articleNumbersUnmatched": 123,
"articleLinksCreated": 123,
"componentLinksCreated": 123,
"componentStubsCreated": 123
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}Autorisierungen
API key generated in Settings > API Keys. Include as Authorization: Bearer <key>.
Body
- object[]
- object
One size of an existing packaging unit, for POST /api/ppwr/formats. Upsert key: (specInternalRef, reference). Blank-is-keep: an omitted or blank field keeps the stored value, so this door can add and change size data but never clear it. Naming the unit's own internalRef addresses its PRIMARY size (its reference always follows the unit and is never renamed here).
internalRef of an existing packaging unit in YOUR company. An unknown reference is the row error unknownUnitRef — the unit is never auto-created.
The size's identifier, unique within your company.
1 - 120^(\d{8}|\d{12}|\d{13}|\d{14})$120Width in mm.
Height in mm.
Depth in mm.
Antwort
Intake result (partial accept — see the schema).
Result of a synchronous PPWR intake. Partial accept: valid rows commit even when other rows are invalid or failed — the one exception is the 409 overwrite gate, which is all-or-nothing. Idempotent: replaying an identical request changes nothing (matched rows return as skipped), except unit rows without internalRef, which are always creates.
ENTITIES created (units, components, links) — never sizes.
Identifiers of rows whose existing match changed. A size created on an existing unit appears as <unit ref> / <size ref>.
Identifiers of rows that matched with nothing to change.
Rows the upsert engine rejected (unknown reference, ambiguous match, …). Its error values are stable machine keys.
Show child attributes
Show child attributes
Rows rejected by schema validation before the engine ran. Most error values are stable machine keys, but a field with no custom message falls back to the validator's own English text — match on the key, fall back to displaying the string.
Show child attributes
Show child attributes
Unit intake only: sizes created for the rows' units.
Unit intake only: distinct articleNumbers no live article matched. Skipped, never a row error.
Unit intake only: unit⇄article links created from articleNumbers.
Unit intake only: unit⇄component links created from componentCodes.
Unit intake only: minimal placeholder components created for unknown componentCodes.