數位減碳雲資料交換平台(DSCE) · PACT Technical Specifications v3.0.3 · 支援 CBAM Extension · 適用對象:合作廠商的系統整合開發人員
English version: DSCE PACT v3 API Technical Specification(PDF)
PACT v3 原生 API(所有 /api/3/* 端點)預設不開放。帳號必須由平台管理者於後台開啟「APIv3 使用」權限(isApiV3Enabled = 1)後才能呼叫;未開啟前,即使持有有效 Token,所有 /api/3/* 請求一律回:
HTTP/1.1 403 Forbidden
{ "code": "AccessDenied", "message": "PACT v3 API access is not enabled for this account." }
開通流程見 1-3. APIv3 使用權限開通流程。一般整合情境請優先使用權限受控的 DSCE API。
本 API 依循 WBCSD PACT Technical Specifications for PCF Data Exchange (v3.0.3),所有端點以
/api/3/為前綴;認證相關端點(/api/auth/*)與 DSCE API 共用。
呼叫任何 /api/3/* 端點前,需同時滿足:
isApiV3Enabled = 1)。未開啟一律回 403。402。首次使用前,需申請一組 client_id 與 client_secret。
POST/api/auth/credentials(無需任何認證標頭)
{
"client_id": "seq260921-121701",
"client_secret": "Xy9kLmNoPqRsTuVwXy12"
}
⚠️
client_secret僅顯示一次,請立即妥善保存。取得憑證不代表已可使用 v3 API,仍須完成 1-3 開通。
以 HTTP Basic Authentication 帶入憑證換取 Bearer Token,Token 有效期限 30 分鐘(1800 秒),到期請重新取得。
POST/api/auth/token
| 標頭 | 值 |
|---|---|
Authorization | Basic <Base64(client_id:client_secret)> |
Content-Type | application/x-www-form-urlencoded |
| 欄位 | 值 |
|---|---|
grant_type | client_credentials(固定值) |
curl -X POST https://<host>/api/auth/token \
-u "<client_id>:<client_secret>" \
-d "grant_type=client_credentials"
{
"access_token": "eyJhbGci...",
"expires_in": 1800,
"token_type": "Bearer",
"scope": "profile email"
}
後續所有 v3 API 請在
Authorization標頭帶入:Bearer <access_token>(Bearer不分大小寫)。
本權限僅能由平台管理者開啟,使用者、資訊商皆無法自行開通。
isApiV3Enabled = 1)。/api/3/*,已取得的 Token 不需重新申請。403。未開通時的回應:
HTTP/1.1 403 Forbidden
{ "code": "AccessDenied", "message": "PACT v3 API access is not enabled for this account." }
確認 Token 是否仍有效,並取得 Token 內含的身份資訊。
POST/api/auth/tokenVerify(標頭 Authorization: Bearer <access_token>)
{
"valid": true,
"client_id": "seq260921-121701",
"clientHost": "1.2.3.4",
"role": { "roles": ["offline_access", "uma_authorization", "default-roles-demo"] }
}
重新產生 client_secret,舊的密鑰立即失效。APIv3 使用權限不受影響。
PATCH/api/auth/credentials/{clientId}(標頭 Authorization: Bearer <access_token>)
⚠️ 重置後請更新所有使用舊憑證的系統,並重新取得 Token。
| 項目 | 規則 |
|---|---|
| 建立的碳足跡 | 資料擁有者一定是呼叫端自己的公司(v3 API 不支援代管;代管請使用 DSCE API 的 X-On-Behalf-Of)。 |
| 可讀取的碳足跡 | 自己擁有的碳足跡,以及其他公司已授權給自己的碳足跡。 |
| 可讀取的事件 | 自己發送或接收的事件(見 5. 事件)。 |
| 無權限的資料 | 一律回 404,不洩漏資料是否存在。 |
companyIds 規則companyName / companyIds 時,系統自動填入呼叫端公司的名稱與 companyId(建議作法)。companyIds 時必須為 JSON array;系統會確保自己的 companyId 在第一個(沒有就補上)。400。| 方法 | 路徑 | 說明 |
|---|---|---|
| POST | /api/3/footprints | 建立碳足跡(CreateFootprint) |
| GET | /api/3/footprints | 列表(ListFootprints),支援篩選與分頁 |
| GET | /api/3/footprints/{id} | 取得單筆(GetFootprint),Deprecated 資料仍可取得 |
| PATCH | /api/3/footprints/{id} | 廢棄碳足跡(status → Deprecated,version + 1) |
id(pfpId)由系統產生(RFC 4122 v4 UUID,小寫),請以回應中的 id 為準。string<decimal>,例如 "2.0"),不可使用 JSON number 或科學記號;系統依原值儲存,不做四捨五入。specVersion 須為 3.x。curl -X POST https://<host>/api/3/footprints \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d @footprint.json
{ "id": "bc30e6e5-d7c3-4ad8-91f6-5d8be04f9627" }
| 參數 | 說明 |
|---|---|
limit / offset | 分頁,預設 limit=10;非正整數時使用預設值 |
productId、companyId | URN,可重複帶入多個值 |
geography、classification | 地理區域、產品分類 |
validOn、validAfter、validBefore | 有效期間(ISO 8601) |
status | Active / Deprecated |
回應格式為 { "data": [ ProductFootprint, ... ] },分頁連結放在 Link 回應標頭(rel="first"、"prev"、"next"、"last")。
依 PACT v3.0.3 §4.6.1,extensions 為 array,每個成員為一個 DataModelExtension object。系統分兩層驗證,任一層不通過即回 400 且不寫入:
| 欄位 | 規則 |
|---|---|
extensions | JSON array(不可為 object) |
specVersion | 必填,semver 字串(例 0.9.0、2.0.0) |
dataSchema | 必填,URI |
documentation | 選填,URI |
data | 必填,JSON object |
當 dataSchema 為 https://cbam.corporate-harmony.org/schemas/pact-extension.json 時,依 Product Footprint Extension for CBAM(specVersion 0.9.0)驗證。其他 dataSchema 只做第一層驗證並原樣保存。
| 區塊 | 必填欄位與允許值 |
|---|---|
directEmissions(必填) | determinationType:01 / 02 / 03applicableReportingTypeMethodology:TOM01 / TOM02 / TOM03specificEmbeddedEmissions:string<decimal>(t-CO₂e/t)measurementUnit:EMU1 |
indirectEmissions(選填) | determinationType:01 / 02 / 03specificEmbeddedEmissions:string<decimal>measurementUnit:EMU1electricitySource:SOE01 / SOE02 / SOE03 |
| 加總一致性 | direct + indirect 的 specificEmbeddedEmissions 須等於 pcfExcludingBiogenicUptake ÷ productMassPerDeclaredUnit |
CBAM 規格另要求
companyIds代表前驅物的製造設施、productIds可被交貨對象辨識。建議在自己的 companyId 之外加上設施識別碼,並使用雙方共通的產品識別碼(例如 GTIN)。
"extensions": [
{
"specVersion": "0.9.0",
"dataSchema": "https://cbam.corporate-harmony.org/schemas/pact-extension.json",
"data": {
"directEmissions": {
"determinationType": "01",
"applicableReportingTypeMethodology": "TOM01",
"specificEmbeddedEmissions": "1.5",
"measurementUnit": "EMU1"
},
"indirectEmissions": {
"determinationType": "01",
"specificEmbeddedEmissions": "0.5",
"measurementUnit": "EMU1",
"electricitySource": "SOE01"
}
}
}
]
上例搭配 pcfExcludingBiogenicUptake = "2.0"、productMassPerDeclaredUnit = "1.0":1.5 + 0.5 = 2.0 ÷ 1.0,加總一致。
| 方法 | 路徑 | 說明 |
|---|---|---|
| POST | /api/3/events | 接收 PACT 事件(CloudEvents,Content-Type: application/cloudevents+json) |
| GET | /api/3/events | 與自己有關(發送或接收)的事件列表 |
| GET | /api/3/events/{id} | 取得單一事件;與自己無關者回 404 |
| type | 用途 | 接收方判定 |
|---|---|---|
org.wbcsd.pact.ProductFootprint.RequestCreatedEvent.3 | 請求碳足跡 | data.companyId 指定的公司,與 data.productId 對應碳足跡的擁有者 |
…PublishedEvent.3 | 通知碳足跡已發布/更新 | data.pfIds 中發送方自己擁有之碳足跡的授權對象 |
…RequestFulfilledEvent.3 | 回覆請求(附碳足跡) | 原請求的發送方 |
…RequestRejectedEvent.3 | 拒絕請求 | 原請求的發送方 |
curl -X POST https://<host>/api/3/events \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/cloudevents+json" \
-d '{
"type": "org.wbcsd.pact.ProductFootprint.RequestCreatedEvent.3",
"specversion": "1.0",
"id": "71f32fda-5ab6-4855-a88f-c085f31a523b",
"source": "https://<your-host>/api",
"time": "2026-09-30T06:31:44Z",
"data": { "productId": ["urn:gtin:4712345060507"], "companyId": ["urn:company:III-DTRI:00000257"] }
}'
事件驗證通過即回 200,請求於後續非同步處理;列表與單筆回應只包含 type、specversion、id、source、time、data。
⚠️ 系統會依
source回呼RequestFulfilledEvent/RequestRejectedEvent。回呼主機須事先由平台管理者登錄於允許清單,未登錄的主機不會收到回呼(事件本身仍會被接受)。
| 方法 | 路徑 | 說明 |
|---|---|---|
| GET | /api/3/p2p/pcfRequest/{taxId} | 查詢供應商(統一編號)的產品清單 |
| GET | /api/3/p2p/productMapping/{pfpId} | 查詢特定 pfpId 所屬供應商 |
| POST | /api/3/p2p/pcfDeposit | 建立 PCF 雜湊存證,記錄中心廠與供應商關係(Body:taxId、pfpId、pcfHash、content) |
| GET | /api/3/p2p/pcfQuery/{taxId} | 查詢特定供應商提供的 PCF 資料 |
| GET | /api/3/p2p/pcfVerify/{pcfHash} | 驗證供應商 Hash 資料是否一致 |
錯誤回應一律為 PACT Error 物件:{ "code": "...", "message": "..." }(/api/* 不會回傳 HTML 錯誤頁)。
| HTTP | code | 常見情境 |
|---|---|---|
| 400 | BadRequest | 參數缺漏或格式錯誤、extensions/CBAM 驗證失敗、companyIds 含其他公司、重複廢棄 |
| 401 | TokenExpired | 未帶 Token(Missing or malformed Authorization header.)、Token 無效(The access token is invalid.)、Token 過期(The specified access token has expired.) |
| 402 | PaymentRequired | 帳號未啟用 |
| 403 | AccessDenied | 未由管理者開啟 APIv3 使用權限(isApiV3Enabled=0) |
| 404 | NotFound | 資料不存在或非可存取範圍(不洩漏存在與否)、路由不存在 |
| 405 | BadRequest | HTTP 方法不支援 |
| 500 | InternalError | 伺服器內部錯誤、授權伺服器無法連線 |
© 數位減碳雲資料交換平台(DSCE)· 本文件為 PACT v3 API 技術說明;權限受控的整合 API 請見「DSCE API 使用指南」,UI 操作請見「使用者指南」。