curl --request GET \
--url https://app.polygon-one.com/api/v1/ppwr/declarations/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.polygon-one.com/api/v1/ppwr/declarations/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.polygon-one.com/api/v1/ppwr/declarations/{id}', 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/v1/ppwr/declarations/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.polygon-one.com/api/v1/ppwr/declarations/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.polygon-one.com/api/v1/ppwr/declarations/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/v1/ppwr/declarations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "f1a5c9e3-4b72-4d86-b3f0-7e2a6c8d1b95",
"version": 1,
"status": "issued",
"origin": "generated",
"referenceNumber": "DOC-U-1-A4C8E2-V1",
"issuedAt": "2026-04-14T12:00:00.000Z",
"withdrawnAt": null,
"supersededAt": null,
"supersedesId": null,
"verified": true,
"isFallback": false,
"pdfUrl": "/api/v1/ppwr/declarations/f1a5c9e3-4b72-4d86-b3f0-7e2a6c8d1b95/pdf",
"specIds": [
"a4c8e2f6-9b13-4d75-a1e8-3f7c0b6d9e52"
],
"activeSpecIds": [
"a4c8e2f6-9b13-4d75-a1e8-3f7c0b6d9e52"
]
}{
"error": "Validation failed",
"details": [
{
"origin": "string",
"code": "too_small",
"minimum": 1,
"inclusive": true,
"path": [
"address",
"street"
],
"message": "Address is required."
}
]
}{
"error": "Invalid or expired API key"
}{
"error": "Forbidden"
}{
"error": "Resource not found"
}{
"error": {
"code": "rate_limited",
"message": "…"
}
}{
"error": "Internal server error"
}Get Declaration of Conformity by ID
Retrieve one Declaration of Conformity (metadata). A declaration of another company, a soft-deleted one and an id that is not a UUID all answer 404. Requires packaging:read (a packaging:write key satisfies it); customer workspace with the PPWR module enabled.
curl --request GET \
--url https://app.polygon-one.com/api/v1/ppwr/declarations/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.polygon-one.com/api/v1/ppwr/declarations/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.polygon-one.com/api/v1/ppwr/declarations/{id}', 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/v1/ppwr/declarations/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.polygon-one.com/api/v1/ppwr/declarations/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.polygon-one.com/api/v1/ppwr/declarations/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/v1/ppwr/declarations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "f1a5c9e3-4b72-4d86-b3f0-7e2a6c8d1b95",
"version": 1,
"status": "issued",
"origin": "generated",
"referenceNumber": "DOC-U-1-A4C8E2-V1",
"issuedAt": "2026-04-14T12:00:00.000Z",
"withdrawnAt": null,
"supersededAt": null,
"supersedesId": null,
"verified": true,
"isFallback": false,
"pdfUrl": "/api/v1/ppwr/declarations/f1a5c9e3-4b72-4d86-b3f0-7e2a6c8d1b95/pdf",
"specIds": [
"a4c8e2f6-9b13-4d75-a1e8-3f7c0b6d9e52"
],
"activeSpecIds": [
"a4c8e2f6-9b13-4d75-a1e8-3f7c0b6d9e52"
]
}{
"error": "Validation failed",
"details": [
{
"origin": "string",
"code": "too_small",
"minimum": 1,
"inclusive": true,
"path": [
"address",
"street"
],
"message": "Address is required."
}
]
}{
"error": "Invalid or expired API key"
}{
"error": "Forbidden"
}{
"error": "Resource not found"
}{
"error": {
"code": "rate_limited",
"message": "…"
}
}{
"error": "Internal server error"
}Authorizations
API key generated in Settings > API Keys. Include as Authorization: Bearer <key>.
Path Parameters
Query Parameters
Comma-separated list of the resource's top-level keys to return (per element for a list), e.g. id,name; omit for the full body. Top-level only; whitespace is trimmed and duplicates count once. fields never adds keys: a selected optional key that is absent on a row stays absent. 400 when passed more than once, when empty, or when it names an unknown key (the error names it and lists the allowed ones).
Response
Declaration details
UUID of the declaration — what GET /api/v1/ppwr/declarations/{id} takes.
Version number; a successor that supersedes this declaration carries a higher one.
Status of the declaration: draft, issued, superseded or withdrawn. One of: draft, issued, superseded, withdrawn.
generated (drawn up in the app) or collected (the manufacturer's uploaded DoC). One of: generated, collected.
Reference number printed on the declaration, or null (e.g. for a draft).
When the declaration was issued (ISO 8601, UTC); null for a draft.
When the declaration was withdrawn (ISO 8601, UTC); null unless withdrawn.
When a newer declaration replaced this one for its last unit (ISO 8601, UTC); null unless status is superseded, and can also be null for a declaration superseded before 2026-10 whose successors were since deleted. A family declaration that loses only some units to a newer one stays issued with supersededAt: null — those units leave its activeSpecIds.
UUID of the earlier declaration this one replaces, or null.
A generated DoC always; a collected DoC once its verification passed and while its file is on record.
An importer substitute DoC (Ersatz-Konformitätserklärung).
Path of the PDF download (GET, same API key); null for a draft, and for a collected declaration whose uploaded file is no longer on record (the download would answer 404) — verified is then false too.
Every packaging unit the declaration covers (a family DoC covers several).
The units it is currently the active DoC for.