包裝義務監測
語言: 繁體中文

包裝義務監測 · 開發者存取

API 和 Webhook

請在以下範例中使用您所訂閱產品的 URL。將 API 金鑰儲存在您的伺服器上。 開啟互動式 API 文件 ↗

讀取公開紀錄

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

公開回應僅包含每個登記冊最近三筆紀錄。較早的紀錄內容需要 PRO;直接開啟紀錄 URL 只會顯示有限的預覽。即使篩選後某一頁沒有紀錄,也應持續依 next_offset 取得下一頁,直到其值為 null。引用每筆紀錄的原始 source_url。發布日期與觀測日期代表不同事件。

讀取 PRO 紀錄

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

在帳戶中建立或輪換金鑰. 金鑰僅適用於此產品,且僅在付費存取權限有效時可用。

匯出格式

PRO 提供 CSV、Excel (.xlsx)、XML、RSS 和 Atom。所有格式均使用您所訂閱產品的 API 金鑰及相同的篩選條件。例如,可按以下方式將最多 100 筆紀錄下載為 Excel 工作簿:

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

將 xlsx 換成 csv、xml、rss 或 atom。加入 document_type=adopted 或 facility_id=YOUR_FACILITY_ID 等篩選條件。請沿著回應的 Link 標頭中 rel="next" 的連結繼續取得資料,直到該連結不再出現,並在每次要求中保留 Authorization 標頭。每頁最多 100 筆紀錄;篩選後某頁可能為空,但後面仍可能有下一頁。

使用 RSS 或 Atom 時,請設定支援 Authorization 標頭的閱讀器。閱讀器 URL 不含金鑰。每個項目都有固定的紀錄 ID;不支援分頁的閱讀器只會收到最新一頁。如需取得所有紀錄,請使用分頁 API。

讀取紀錄歷史

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

將 RECORD_ID 替換為返回的紀錄 ID。歷史以陣列形式返回,最新版本在前。每次將 offset 增加當前頁的長度,直到返回頁長度小於請求的 limit。新版本可能來自來源變化,也可能來自擷取內容修正。

透過 MCP 連線

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"}}}'

存取 PRO 欄位時,請新增相同的 Authorization 標頭。此端點也支援 initialize、tools/list 和 notifications/initialized。如需讀取完整登記冊,請使用上述 REST 分頁方式。

驗證 Webhook 簽名

簽章標頭格式為 X-Register-Signature: t=TIMESTAMP,v1=HEX_DIGEST。解析 JSON 前,請先驗證原始要求本文。請永久保存已成功處理的 X-Register-Event ID,避免重試時重複產生副作用。

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);
}

請先永久記錄事件,再回傳成功回應。寄送重試有次數上限;帳戶會顯示最近一次記錄的結果。確認收到事件,不代表您的應用程式已完成處理。