curl --request POST \
--url https://app.polygon-one.com/api/v1/ppwr/mengenmeldung/reports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"periodYear": 2025,
"market": "DE",
"format": "lucid_de",
"reportType": "HJM1",
"systemOperatorId": "DE1234567890123"
}
'import requests
url = "https://app.polygon-one.com/api/v1/ppwr/mengenmeldung/reports"
payload = {
"periodYear": 2025,
"market": "DE",
"format": "lucid_de",
"reportType": "HJM1",
"systemOperatorId": "DE1234567890123"
}
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({
periodYear: 2025,
market: 'DE',
format: 'lucid_de',
reportType: 'HJM1',
systemOperatorId: 'DE1234567890123'
})
};
fetch('https://app.polygon-one.com/api/v1/ppwr/mengenmeldung/reports', 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/mengenmeldung/reports",
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([
'periodYear' => 2025,
'market' => 'DE',
'format' => 'lucid_de',
'reportType' => 'HJM1',
'systemOperatorId' => 'DE1234567890123'
]),
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/v1/ppwr/mengenmeldung/reports"
payload := strings.NewReader("{\n \"periodYear\": 2025,\n \"market\": \"DE\",\n \"format\": \"lucid_de\",\n \"reportType\": \"HJM1\",\n \"systemOperatorId\": \"DE1234567890123\"\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/v1/ppwr/mengenmeldung/reports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"periodYear\": 2025,\n \"market\": \"DE\",\n \"format\": \"lucid_de\",\n \"reportType\": \"HJM1\",\n \"systemOperatorId\": \"DE1234567890123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/v1/ppwr/mengenmeldung/reports")
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 \"periodYear\": 2025,\n \"market\": \"DE\",\n \"format\": \"lucid_de\",\n \"reportType\": \"HJM1\",\n \"systemOperatorId\": \"DE1234567890123\"\n}"
response = http.request(request)
puts response.read_body{
"id": "2b6d0f4a-8c39-4e17-9f5a-1a7c3e9d6b28",
"version": 1,
"systemOperatorId": "DE1234567890123"
}{
"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": "reportAlreadyGenerated"
}{
"error": "blocking_errors",
"blockingErrors": [
{
"kind": "missing_mass",
"specRef": "U-2",
"componentCode": "K-2",
"componentName": "Lid",
"material": null,
"familyLabelsDe": null
}
]
}{
"error": {
"code": "rate_limited",
"message": "…"
}
}{
"error": "Internal server error"
}Generate Volume Report
Generate and freeze a report for one period, market and register. Re-generating the same scope (period, market, register and reportType) after the data changed is the normal flow: the new report supersedes the previous one of the same reportType (its version increments, the old row stays listed as superseded); a report of another type stays active. A 422 names precisely which data is not declarable yet, item by item — nothing is written. Requires packaging:write; customer workspace with the PPWR module enabled — see the guide.
curl --request POST \
--url https://app.polygon-one.com/api/v1/ppwr/mengenmeldung/reports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"periodYear": 2025,
"market": "DE",
"format": "lucid_de",
"reportType": "HJM1",
"systemOperatorId": "DE1234567890123"
}
'import requests
url = "https://app.polygon-one.com/api/v1/ppwr/mengenmeldung/reports"
payload = {
"periodYear": 2025,
"market": "DE",
"format": "lucid_de",
"reportType": "HJM1",
"systemOperatorId": "DE1234567890123"
}
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({
periodYear: 2025,
market: 'DE',
format: 'lucid_de',
reportType: 'HJM1',
systemOperatorId: 'DE1234567890123'
})
};
fetch('https://app.polygon-one.com/api/v1/ppwr/mengenmeldung/reports', 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/mengenmeldung/reports",
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([
'periodYear' => 2025,
'market' => 'DE',
'format' => 'lucid_de',
'reportType' => 'HJM1',
'systemOperatorId' => 'DE1234567890123'
]),
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/v1/ppwr/mengenmeldung/reports"
payload := strings.NewReader("{\n \"periodYear\": 2025,\n \"market\": \"DE\",\n \"format\": \"lucid_de\",\n \"reportType\": \"HJM1\",\n \"systemOperatorId\": \"DE1234567890123\"\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/v1/ppwr/mengenmeldung/reports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"periodYear\": 2025,\n \"market\": \"DE\",\n \"format\": \"lucid_de\",\n \"reportType\": \"HJM1\",\n \"systemOperatorId\": \"DE1234567890123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/v1/ppwr/mengenmeldung/reports")
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 \"periodYear\": 2025,\n \"market\": \"DE\",\n \"format\": \"lucid_de\",\n \"reportType\": \"HJM1\",\n \"systemOperatorId\": \"DE1234567890123\"\n}"
response = http.request(request)
puts response.read_body{
"id": "2b6d0f4a-8c39-4e17-9f5a-1a7c3e9d6b28",
"version": 1,
"systemOperatorId": "DE1234567890123"
}{
"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": "reportAlreadyGenerated"
}{
"error": "blocking_errors",
"blockingErrors": [
{
"kind": "missing_mass",
"specRef": "U-2",
"componentCode": "K-2",
"componentName": "Lid",
"material": null,
"familyLabelsDe": null
}
]
}{
"error": {
"code": "rate_limited",
"message": "…"
}
}{
"error": "Internal server error"
}Authorizations
API key generated in Settings > API Keys. Include as Authorization: Bearer <key>.
Body
Trigger a report generation. reportType is required for lucid_de; systemOperatorId is too, unless your workspace stores one (then it is the default). Both are unused by the worksheet registers, which always produce the annual report.
Calendar year to report (2000–2100).
2000 <= x <= 2100ISO alpha-2 (case-insensitive).
^[A-Z]{2}$The register: lucid_de (Germany, LUCID XML) or one of the worksheet registers (verpact_nl, ara_at, bdo_pl, miteco_es, conai_it). market must match the register.
lucid_de, verpact_nl, ara_at, bdo_pl, miteco_es, conai_it lucid_de only: the LUCID report type (HPM1 plan, HMM1 intra-year, HJM1 year-end, HNM1 supplementary, HAM1 deduction). Worksheet registers always report ANNUAL.
HPM1, HMM1, HJM1, HNM1, HAM1 Your dual system's LUCID number: two letters + 13 digits (lower case is accepted and upper-cased). For lucid_de, omit it to use the SystemOperatorID stored in your workspace; a value sent here wins. Without either, lucid_de answers 400. Unused by the worksheet registers.
^[A-Z]{2}[0-9]{13}$Response
Report generated and frozen
UUID of the new report — what GET /api/v1/ppwr/mengenmeldung/{reportId}/xml takes.
Version of the report within its (periodYear, market, format) scope; each regeneration increments it.
lucid_de only: the LUCID SystemOperatorID the report was generated with — the one you sent, or your workspace's stored one when you omitted it. Absent for the worksheet registers.