公告
ExpTech 的服務公告:服務異常、維護、更新與 API 異動等通知。只會回傳已發布且未過期的公告。適合在自己的服務中顯示 ExpTech 的維護與異常狀態。網站上的公告頁就是用這組 API 顯示的。
目前不需要 API Token。
三個端點回傳的公告都是下面的格式:
| 欄位 | 類型 | 說明 |
|---|---|---|
id | int | 公告 ID。 |
type | int | 公告類型:1 一般、2 異常、4 維護、8 更新、16 異動。 |
title | string | 標題。 |
content | string | 內文,Markdown 格式。可能含有摘要分隔標記 {/* truncate */},顯示前可以移除。 |
tags | string[] | 標籤,例如受影響的服務(TREM Lite、DPIP、API(HTTP)…)、影響程度(無、小、中、大、重大)。異常與維護公告會帶「進行中」或「已結案」其中一個。 |
status | int | 狀態。公開 API 只回傳已發布的公告,固定為 1。 |
expires_at | string | null | 到期時間,ISO 8601 UTC(例如 2026-11-20T00:00:00.000Z);不會到期時為 null。 |
created_at | string | 建立時間,ISO 8601 UTC。 |
updated_at | string | 最後更新時間,ISO 8601 UTC。 |
取得公告列表
Section titled “取得公告列表”依建立時間由新到舊,每頁固定 50 則。只包含已發布且未過期的公告。
GET
https://announcement.exptech.com.tw/api/announcements 伺服器Announcement
Query 參數
page頁碼,從 1 開始。
search關鍵字,比對標題、內文與標籤(部分相符,不分大小寫)。
type只列出這個類型:1 一般、2 異常、4 維護、8 更新、16 異動。一次只能指定一個。
curl "https://announcement.exptech.com.tw/api/announcements"const res = await fetch("https://announcement.exptech.com.tw/api/announcements");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get("https://announcement.exptech.com.tw/api/announcements", timeout=10)res.raise_for_status()print(res.json())成功
{ "success": true, "data": { "announcements": [ { "id": 42, "type": 4, "title": "API 伺服器例行維護", "content": "11 月 20 日 02:00–04:00 進行例行維護,期間 API 可能短暫無法連線。", "tags": [ "API(HTTP)", "小", "進行中" ], "status": 1, "expires_at": "2026-11-20T00:00:00.000Z", "created_at": "2026-11-14T03:00:00.000Z", "updated_at": "2026-11-14T03:00:00.000Z" } ], "total": 1, "page": 1, "totalPages": 1 }}If-None-Match 與 ETag 相同,沒有內容沒有回應本文
試試看
| 欄位 | 類型 | 說明 |
|---|---|---|
success | boolean | 成功時為 true。 |
data.announcements | object[] | 這一頁的公告,格式見「公告物件」。 |
data.total | int | 符合條件的公告總數。 |
data.page | int | 目前頁碼。 |
data.totalPages | int | 總頁數(每頁 50 則)。沒有公告時為 0。 |
取得各類公告數量
Section titled “取得各類公告數量”GET
https://announcement.exptech.com.tw/api/announcements/stats 伺服器Announcement
curl "https://announcement.exptech.com.tw/api/announcements/stats"const res = await fetch("https://announcement.exptech.com.tw/api/announcements/stats");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://announcement.exptech.com.tw/api/announcements/stats", timeout=10,)res.raise_for_status()print(res.json())成功
{ "success": true, "data": { "stats": { "1": 12, "4": 3, "8": 20 } }}If-None-Match 與 ETag 相同,沒有內容沒有回應本文
試試看
| 欄位 | 類型 | 說明 |
|---|---|---|
data.stats | object | 公告類型 → 已發布且未過期的公告數量。key 是類型數字的字串;數量為 0 的類型不會出現。 |
取得單筆公告
Section titled “取得單筆公告”GET
https://announcement.exptech.com.tw/api/announcements/{id} 伺服器Announcement
路徑參數
id公告 ID(路徑參數)。
curl "https://announcement.exptech.com.tw/api/announcements/<id>"const res = await fetch("https://announcement.exptech.com.tw/api/announcements/<id>");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://announcement.exptech.com.tw/api/announcements/<id>", timeout=10,)res.raise_for_status()print(res.json())成功
{ "success": true, "data": { "announcement": { "id": 42, "type": 4, "title": "API 伺服器例行維護", "content": "11 月 20 日 02:00–04:00 進行例行維護,期間 API 可能短暫無法連線。", "tags": [ "API(HTTP)", "小", "進行中" ], "status": 1, "expires_at": "2026-11-20T00:00:00.000Z", "created_at": "2026-11-14T03:00:00.000Z", "updated_at": "2026-11-14T03:00:00.000Z" } }}If-None-Match 與 ETag 相同,沒有內容沒有回應本文
公告不存在或未發布
{ "success": false, "error": "找不到公告"}試試看
data.announcement 的格式見公告物件。
- 快取。 伺服器端快取 10 秒;回應帶
ETag,請求帶相同的If-None-Match會得到304。 - 已過期的公告。 列表與數量不包含已過期的公告,但用 ID 查單筆時,只要公告仍是已發布狀態就查得到。
- 錯誤格式。 錯誤回應是
{"success": false, "error": "<訊息>"}。路徑不存在時回404,error為找不到此路徑。 - 時間格式。 時間欄位是 ISO 8601 UTC 字串(結尾
Z),顯示時請自行換算成臺灣時間。 - 不要在瀏覽器直接呼叫。 見上方 CORS 說明。
