Verpackungspflichten-Monitor
Sprache: Deutsch

Verpackungspflichten-Monitor · ENTWICKLERZUGANG

API und Webhooks

Verwenden Sie in den folgenden Beispielen die URL Ihres Produkts. Bewahren Sie API-Schlüssel auf Ihrem Server auf. Interaktive API-Dokumentation öffnen ↗

Agent purchases: free discovery, per-record access, and spending-limited MCP

Öffentliche Einträge lesen

curl 'https://verpackung.getregisters.com/api/v1/feeds/de-packaging-compliance/records?limit=50&offset=0'

Öffentliche Antworten enthalten nur die drei neuesten Einträge pro Register. Für Inhalte älterer Einträge ist PRO erforderlich; direkte URLs bieten eine eingeschränkte Vorschau. Folgen Sie next_offset, bis der Wert null ist, auch wenn eine gefilterte Seite keine Einträge enthält. Geben Sie jeweils die ursprüngliche source_url als Quelle an. Veröffentlichungs- und Erfassungsdatum bezeichnen unterschiedliche Ereignisse.

PRO-Einträge lesen

curl 'https://verpackung.getregisters.com/api/v1/feeds/de-packaging-compliance/records?limit=50&offset=0' \
  -H 'Authorization: Bearer YOUR_SCOPED_KEY'

Erstellen oder erneuern Sie Ihren Schlüssel in Ihrem Konto. Ein Schlüssel gilt nur für dieses Produkt und nur bei aktivem kostenpflichtigem Zugang.

Exportformate

PRO umfasst CSV, Excel (.xlsx), XML, RSS und Atom. Verwenden Sie den API-Schlüssel Ihres Produkts und für jedes Format dieselben Filter. Laden Sie beispielsweise bis zu 100 Einträge als Excel-Arbeitsmappe herunter:

curl 'https://verpackung.getregisters.com/api/v1/feeds/de-packaging-compliance/records/export.xlsx?limit=100&offset=0' \
  -H 'Authorization: Bearer YOUR_SCOPED_KEY' \
  -D export-headers.txt -o records.xlsx

Ersetzen Sie xlsx durch csv, xml, rss oder atom. Fügen Sie Filter wie document_type=adopted oder facility_id=YOUR_FACILITY_ID hinzu. Folgen Sie dem Link-Header der Antwort mit rel="next", bis er nicht mehr vorhanden ist. Behalten Sie bei jeder Anfrage den Authorization-Header bei. Jede Seite ist auf 100 Einträge begrenzt; eine gefilterte Seite kann leer sein, obwohl eine weitere Seite existiert.

Konfigurieren Sie für RSS und Atom einen Reader, der den Authorization-Header unterstützt. Reader-URLs enthalten keinen Schlüssel. Einträge haben stabile IDs. Reader ohne Unterstützung der Seitennavigation erhalten die neueste Seite. Verwenden Sie die paginierte API, wenn Sie alle Einträge benötigen.

Den Verlauf eines Eintrags lesen

curl 'https://verpackung.getregisters.com/api/v1/records/RECORD_ID/history?limit=50&offset=0' \
  -H 'Authorization: Bearer YOUR_SCOPED_KEY'

Ersetzen Sie RECORD_ID durch eine zurückgegebene Eintrags-ID. Der Verlauf liefert ein Array mit den neuesten Versionen zuerst. Erhöhen Sie offset jeweils um die Länge der Seite, bis eine Seite weniger Elemente als das angeforderte Limit enthält. Versionen können Quellenänderungen oder Korrekturen der Extraktion abbilden.

Mit MCP verbinden

curl 'https://verpackung.getregisters.com/api/v1/mcp' \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"read_register","arguments":{"feed_id":"de-packaging-compliance"}}}'

Fügen Sie für PRO-Felder denselben Authorization-Header hinzu. Der Endpunkt unterstützt außerdem initialize, tools/list und notifications/initialized. Verwenden Sie die oben beschriebene REST-Seitennavigation, um ein vollständiges Register zu lesen.

Webhook-Signaturen prüfen

Der Signatur-Header lautet X-Register-Signature: t=TIMESTAMP,v1=HEX_DIGEST. Prüfen Sie den unveränderten Anfragetext, bevor Sie JSON verarbeiten. Speichern Sie erfolgreich verarbeitete X-Register-Event-IDs dauerhaft, damit Wiederholungsversuche keine Aktionen doppelt ausführen.

import { createHmac, timingSafeEqual } from 'node:crypto';

export function verify(rawBody, header, secret) {
  const fields = Object.fromEntries(header.split(',').map(x => x.split('=')));
  const timestamp = Number(fields.t);
  if (!Number.isFinite(timestamp) || Math.abs(Date.now()/1000 - timestamp) > 300) return false;
  if (!/^[a-f0-9]{64}$/.test(fields.v1 || '')) return false;
  const expected = createHmac('sha256', secret).update(fields.t + '.').update(rawBody).digest();
  const supplied = Buffer.from(fields.v1, 'hex');
  return supplied.length === expected.length && timingSafeEqual(supplied, expected);
}

Geben Sie eine erfolgreiche Antwort erst zurück, nachdem das Ereignis dauerhaft gespeichert wurde. Die Anzahl der Zustellversuche ist begrenzt; Ihr Konto zeigt das zuletzt gespeicherte Ergebnis. Eine Zustellbestätigung bedeutet nicht, dass Ihre Anwendung die Verarbeitung des Ereignisses abgeschlossen hat.