API und MCP-Server
PPWR-Ready ist kein geschlossenes System. Ihre Verpackungs-, Produkt- und Meldedaten erreichen Sie über eine REST-Schnittstelle, über einen MCP-Server für KI-Assistenten und über Massenimport und -export im Dashboard. Diese Seite beschreibt alle drei Wege vollständig.
Alle Schnittstellen nutzen denselben persönlichen API-Schlüssel, dieselbe Zugangsprüfung, dieselbe Ratengrenze und dasselbe Fehlerformat. Was Sie hier einmal verstanden haben, gilt für jeden Endpunkt.
1. Zugang
Schlüssel erzeugen
Den persönlichen API-Schlüssel erzeugen Sie im Dashboard unter Einstellungen → API-Zugang. Er beginnt mit epr_live_ und ist genau einem Konto zugeordnet. Ein neu erzeugter Schlüssel ersetzt den bisherigen sofort — laufende Integrationen müssen dann umgestellt werden.
Der Schlüssel ist ein Geheimnis wie ein Passwort. Er gehört in die Konfiguration Ihres Systems, nicht in den Quelltext einer Anwendung, die im Browser läuft, und nicht in eine URL.
Basis-URL
https://cuugzslijbqurmeuvshh.supabase.co/functions/v1/
Zwei gleichwertige Wege, den Schlüssel zu senden
Empfohlen ist der Header X-Api-Key. Er funktioniert in jeder Konfiguration:
X-Api-Key: epr_live_...
Alternativ nimmt jeder Endpunkt den Schlüssel auch im Authorization-Header entgegen:
Authorization: Bearer epr_live_...
Beide Wege führen zur selben Prüfung. Wenn Ihre Umgebung den Authorization-Header bereits anderweitig belegt, nehmen Sie X-Api-Key.
Erster Aufruf zur Probe
Dieser Aufruf schreibt nichts und ist der schnellste Weg zu prüfen, ob Schlüssel und Verbindung stimmen:
curl https://cuugzslijbqurmeuvshh.supabase.co/functions/v1/materials-summary \ -H "X-Api-Key: epr_live_..."
{
"year": 2026,
"used_kg": 607184.6,
"rate_limit_per_minute": 120,
"used_this_minute": 1
}
2. Grenzen und Fehler
Ratengrenze
Die Grenze gilt je Konto über alle Endpunkte zusammen, nicht je Endpunkt, und bezieht sich auf die letzten 60 Sekunden. MCP-Aufrufe zählen mit. Sie richtet sich nach dem gebuchten Tarif:
| Tarif | Aufrufe je Minute |
|---|---|
basic | 60 |
starter, standard | 120 |
pro | 300 |
growth | 600 |
scale | 1200 |
| jeder andere Tarif | 120 |
Jede erfolgreiche Antwort nennt Ihren Stand mit: rate_limit_per_minute und used_this_minute. Damit können Sie Ihre Aufruffolge selbst steuern, ohne auf einen Fehler zu warten. Wird die Grenze erreicht, antwortet der Endpunkt mit 429; ein Wiederholungsversuch nach einer Minute ist dann erfolgreich.
Fehlerformat
Jeder Fehler kommt als JSON-Objekt mit dem Feld error und einem stabilen Fehlerschlüssel. Dieser Schlüssel ist maschinenlesbar und ändert sich nicht — werten Sie ihn aus, nicht den HTTP-Status allein.
{ "error": "api-schluessel-ungueltig", "rate_limit_per_minute": null }
| HTTP | error | Bedeutung und was zu tun ist |
|---|---|---|
401 | missing-api-key | Kein Schlüssel mitgesendet. Header prüfen. |
401 | api-schluessel-ungueltig | Der Schlüssel gehört zu keinem Konto. Möglicherweise wurde er im Dashboard neu erzeugt. |
403 | abo-nicht-aktiv | Das Abonnement ruht oder das Konto ist gesperrt. Der Schlüssel selbst ist gültig. |
403 | poa-not-signed | Nur bei Mengenmeldungen im Tarif mit Vertretung: es fehlt die unterschriebene Vollmacht. |
429 | ratengrenze-erreicht: … | Ratengrenze ausgeschöpft. Nach einer Minute erneut versuchen. |
400 | invalid-body, invalid-value-for-… | Der Rumpf ist kein JSON-Objekt, oder ein Feld hat einen unzulässigen Wert. Der Feldname steht im Fehlerschlüssel. |
400 | no-known-fields-provided | Der Aufruf enthielt kein einziges bekanntes Feld. Es wurde nichts geschrieben. |
405 | method-not-allowed | Falsches HTTP-Verb. Die erlaubten Verben stehen bei jedem Endpunkt. |
500 | db-error: …, auth-error: … | Serverseitiger Fehler. Der Aufruf darf wiederholt werden. |
3. REST-Endpunkte
POST /submit-materials — Mengenmeldung
Überträgt in Verkehr gebrachte Verpackungsmengen. Der Endpunkt schreibt in eine eigene Quelle api; manuelle Eingaben im Dashboard und Mengen aus dem Packtisch bleiben davon unberührt. Die ausgewiesene Periodenmenge ist die Summe aller Quellen.
Mengen werden addiert, nicht ersetzt. Ein Aufruf ist ein Ereignis — typischerweise eine Bestellung oder eine Lieferung —, kein neuer Gesamtstand. Wenn Ihr System denselben Vorgang zweimal senden könnte, müssen Sie selbst dafür sorgen, dass es das nicht tut (etwa: je Auftragsnummer nur einmal senden).
Mengenfelder, alle in Kilogramm, alle optional — mitschicken, was angefallen ist:
| Feld | Typ | Bedeutung |
|---|---|---|
paper_cardboard | Zahl | Papier und Karton |
plastic_rigid | Zahl | Kunststoff, formstabil |
plastic_flexible | Zahl | Kunststoff, flexibel (Folien, Beutel) |
beverage_cartons | Zahl | Getränkekartons |
glass | Zahl | Glas |
metal_aluminum | Zahl | Aluminium |
metal_steel | Zahl | Stahl und Weißblech |
wood | Zahl | Holz |
other_composite | Zahl | Sonstige und Verbunde |
sup_pieces | Ganzzahl | Stückzahl Einwegkunststoff-Verpackungen. Wird ebenfalls addiert. Ab dem ersten Stück deklarationspflichtig, unabhängig von jeder Gewichtsgrenze. |
period | Text | Meldeperiode, etwa "2026 H2". Ohne Angabe die laufende Periode. |
plastic_pcr | Wahrheitswert | Rezyklatanteil vorhanden. Gilt für die Periode und wird überschrieben, nicht summiert. |
plastic_mono | Wahrheitswert | Monomaterial. Gilt für die Periode. |
plastic_color | Wahrheitswert | Farbgebung nach Rabattkriterium. Gilt für die Periode. |
Rabattfähige Kunststoffmenge
Die drei Wahrheitswerte oben gelten pauschal für die ganze Periode. Wenn in Ihrem Sortiment nur ein Teil der Kunststoffverpackungen ein Rabattkriterium erfüllt, geben Sie stattdessen die rabattfähige Menge je Materialklasse und Kriterium an — dann wird auch nur diese Teilmenge verbilligt:
"discountable_plastic": {
"plastic_flexible": { "pcr": 1.2, "mono": 3.0 },
"plastic_rigid": {}
}
Ein leeres Objekt ("plastic_rigid": {}) ist eine Aussage: gerechnet, nichts rabattfähig. Ein fehlender Schlüssel bedeutet das Gegenteil — die volle Menge gilt als rabattfähig. Wer dieses Feld benutzt, muss es deshalb für jede gemeldete Kunststoffklasse mitschicken.
Beispiel
curl -X POST https://cuugzslijbqurmeuvshh.supabase.co/functions/v1/submit-materials \
-H "X-Api-Key: epr_live_..." \
-H "Content-Type: application/json" \
-d '{
"paper_cardboard": 12.5,
"plastic_flexible": 3.2,
"sup_pieces": 40,
"discountable_plastic": { "plastic_flexible": { "pcr": 3.2 } }
}'
{
"ok": true,
"period": "2026 H2",
"amounts": { "paper": 12.5, "flexpl": 3.2 },
"plastic_recycling": { "pcr": false, "mono": false, "color": false },
"total_kg": 15.7,
"sup_pieces": 40,
"orders_synced_count": 1,
"rate_limit_per_minute": 120,
"used_this_minute": 3
}
Die Antwort zeigt den Stand nach dem Aufruf und über alle Quellen hinweg, nicht nur Ihre eigene Zeile. Die Gebühr wird ausschließlich in der Datenbank gerechnet; sie lässt sich nicht über die Schnittstelle setzen.
GET /materials-summary — Jahresmenge abfragen
Liefert die kumulierte Jahresmenge des Kontos über alle Meldewege hinweg. Rein lesend, schreibt nichts.
curl https://cuugzslijbqurmeuvshh.supabase.co/functions/v1/materials-summary \ -H "X-Api-Key: epr_live_..."
{ "year": 2026, "used_kg": 607184.6, "rate_limit_per_minute": 120, "used_this_minute": 1 }
POST /submit-product-passport — Produktdaten und Produktpass
Überträgt Produktstammdaten und die Vorbereitungsfelder für den digitalen Produktpass. Schlüssel ist die sku: existiert sie im Konto, werden nur die mitgeschickten Felder aktualisiert; existiert sie nicht, wird das Produkt angelegt — dafür ist name dann Pflicht.
Der digitale Produktpass ist eine kommende Pflicht aus der ESPR. Diese Felder dienen der Vorbereitung darauf; sie stellen keine Konformitätserklärung dar.
| Feld | Typ | Bedeutung |
|---|---|---|
sku | Text | Pflicht. Artikelnummer, der Schlüssel für Zuordnung und Anlage. |
name | Text | Produktbezeichnung. Pflicht, wenn das Produkt neu angelegt wird. |
ean | Text | EAN/GTIN |
length_mm, width_mm, height_mm | Zahl | Maße in Millimetern |
volume_cm3 | Zahl | Volumen in Kubikzentimetern |
durability_info | Text | Angaben zur Lebensdauer |
repairability_score | Text | Reparierbarkeitskennzahl |
repair_instructions_url | Text | Link zur Reparaturanleitung |
spare_parts_info | Text | Verfügbarkeit von Ersatzteilen |
disassembly_instructions_url | Text | Link zur Demontageanleitung |
substances_of_concern | Text | Besorgniserregende Stoffe |
substances_status | Text | Einer von not_started, none_known, contains_listed, unknown |
restricted_substances_list | Text | Beschränkte Stoffe im Klartext |
carbon_footprint_value | Zahl | CO₂-Fußabdruck. Wird ohne carbon_footprint_methodology abgelehnt — eine Zahl ohne Methodik ist kein Nachweis. |
carbon_footprint_methodology | Text | Methodik und Quelle, etwa „GHG Protocol, eigene Berechnung“ |
recycled_content_pct | Zahl | Rezyklatanteil in Prozent |
recyclability_grade | Text | Eigene Einstufung zur Recyclingfähigkeit |
passport_status | Text | Einer von not_started, in_progress, ready_for_review |
curl -X POST https://cuugzslijbqurmeuvshh.supabase.co/functions/v1/submit-product-passport \
-H "X-Api-Key: epr_live_..." \
-H "Content-Type: application/json" \
-d '{
"sku": "ART-1234",
"name": "Präzisionsdrehteil M8",
"carbon_footprint_value": 2.4,
"carbon_footprint_methodology": "GHG Protocol, eigene Berechnung"
}'
{ "ok": true, "id": "…", "sku": "ART-1234", "created": false,
"updated_fields": ["name", "carbon_footprint_value", "carbon_footprint_methodology"] }
4. MCP-Server
Das Model Context Protocol (MCP) ist der offene Standard, über den KI-Assistenten auf Fachsysteme zugreifen. PPWR-Ready betreibt dafür einen eigenen Server: Sie verbinden ihn einmal mit Ihrem Assistenten, und danach lassen sich Ihre Verpackungs- und Meldedaten in natürlicher Sprache befragen — „Welche Verpackungen haben keine Konformitätserklärung?“, „Wie viel Kunststoff haben wir 2026 gemeldet?“.
Ausschließlich lesend. Der MCP-Server kennt kein einziges schreibendes Werkzeug. Ein Assistent kann Ihre Daten auswerten, aber weder ändern noch löschen noch eine Meldung einreichen.
Eckdaten
| Endpunkt | https://cuugzslijbqurmeuvshh.supabase.co/functions/v1/mcp |
| Transport | Streamable HTTP, JSON-RPC 2.0 über POST |
| Protokollfassung | 2025-06-18 |
| Servername | ppwr-ready |
| Anmeldung | derselbe API-Schlüssel, in X-Api-Key oder Authorization: Bearer |
Einrichtung in Claude Desktop oder Claude Code
{
"mcpServers": {
"ppwr-ready": {
"type": "http",
"url": "https://cuugzslijbqurmeuvshh.supabase.co/functions/v1/mcp",
"headers": { "X-Api-Key": "epr_live_..." }
}
}
}
Die sechs Werkzeuge
| Werkzeug | Was es liefert |
|---|---|
get_account | Firma, Tarif und die Länder, in denen dieses Konto meldet. Sinnvoll als erster Aufruf. |
list_data_sources | Alle abfragbaren Datenbereiche mit Feldanzahl — Verpackungen, Produkte, Mengenmeldungen, Lieferanten, Aufgaben und weitere. |
list_fields | Die Felder eines Datenbereichs mit Typ. Parameter: source. |
query_data | Die eigentliche Abfrage: Felder auswählen, filtern (where), sortieren, gruppieren (group_by) und verdichten (metrics), bis 1000 Zeilen. |
get_reporting_periods | Die Mengenmeldungen: Periode, Gesamtgewicht, Gebühr, Einreichungszeitpunkt. |
get_open_tasks | Offene Compliance-Aufgaben mit Dringlichkeit und Frist — etwa eine fehlende Konformitätserklärung oder ein auslaufendes Dokument. |
Ein leerer Wert in einem Ergebnis bedeutet nicht erfasst — nicht null und nicht „nein“. Der Server macht diesen Unterschied ausdrücklich, damit ein Assistent eine Datenlücke nicht als Sachaussage ausgibt.
Aufruf ohne Assistent
Der Server ist gewöhnliches JSON-RPC und lässt sich direkt ansprechen:
curl -X POST https://cuugzslijbqurmeuvshh.supabase.co/functions/v1/mcp \
-H "X-Api-Key: epr_live_..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
5. Massenimport und Export
Nicht jede Anbindung braucht eine Programmierung. Für den einmaligen oder regelmäßigen Datenaustausch gibt es im Dashboard drei Wege ohne eine Zeile Code.
Import
Produkte, Verpackungen und Lieferanten lassen sich als CSV einlesen. Der Import erkennt Semikolon wie Komma als Trennzeichen und kommt mit den Zeichensätzen zurecht, die Excel erzeugt. Vor dem Schreiben sehen Sie eine Vorschau mit Spaltenzuordnung; jeder Durchlauf wird protokolliert und lässt sich als Ganzes wieder zurücknehmen, wenn eine Datei falsch war.
Export und Berichte
In der Berichtszentrale stellen Sie sich Berichte selbst zusammen: Datenquelle wählen, Felder wählen, filtern, gruppieren — und als XLSX oder als prüfsicheres PDF ausgeben. Eine einmal gebaute Zusammenstellung lässt sich als Vorlage sichern und jederzeit erneut ausgeben, etwa halbjährlich für dieselbe Behördenabfrage.
Dieselben Datenquellen und Felder, die dort zur Auswahl stehen, erreichen Sie über query_data am MCP-Server. Es ist derselbe Katalog — was im Bericht erscheinen darf, darf auch abgefragt werden, und umgekehrt.
Vollständiger Datenexport
Unabhängig davon können Sie unter Einstellungen → Datenschutz einen vollständigen Export aller Daten Ihres Kontos anfordern. Er wird serverseitig erzeugt und als Archiv bereitgestellt.
6. Sicherheit
Mandantentrennung
Jede Abfrage über API und MCP läuft in der Datenbank mit den Rechten Ihres Kontos, abgesichert über Row Level Security. Die Trennung entsteht nicht durch einen Filter, den die Schnittstelle setzt, sondern durch dieselbe Regel, die auch im Dashboard gilt. Eine Abfrage, die ausdrücklich nach fremden Daten fragt, liefert kein Ergebnis — nicht weil sie abgefangen würde, sondern weil die Zeilen für dieses Konto nicht existieren.
Zugriffsprotokoll
Jeder Zugriff wird mit Zeitpunkt, Endpunkt, Ergebnis, IP-Adresse und Kennung des aufrufenden Programms protokolliert — auch abgewiesene. Ungültige Schlüssel und gesperrte Konten erzeugen zusätzlich einen Eintrag im Sicherheitsprotokoll. Diese Einträge sind die Grundlage der Ratengrenze und zugleich der Nachweis, wer wann was abgerufen hat.
Schlüssel verloren
Erzeugen Sie im Dashboard einen neuen Schlüssel. Der alte verliert damit sofort seine Gültigkeit; Aufrufe damit werden ab diesem Moment mit 401 abgewiesen und im Sicherheitsprotokoll vermerkt.
Fragen zur Anbindung?
Wenn Sie ein ERP oder Warenwirtschaftssystem anbinden möchten und nicht sicher sind, welcher Weg der richtige ist, schreiben Sie uns — mit einer kurzen Beschreibung Ihres Systems und der Datenlage genügt meist eine Antwort.
info@ppwr-ready.app