Announcements
ExpTech service announcements, the same content shown on the announcement site https://announcement.exptech.com.tw: service incidents, maintenance, updates, API changes, and similar notices. Only announcements that are published and not yet expired are returned. Use this to show ExpTech maintenance and incident status inside your own service.
Data license
Section titled “Data license”Where to show it, examples and commercial-use requests: Data licensing and attribution.
Authentication
Section titled “Authentication”No API Token is required right now.
Announcement object
Section titled “Announcement object”All three endpoints return an announcement in this shape:
| Field | Type | Description |
|---|---|---|
id | int | Announcement ID. |
type | int | Announcement type: 1 general, 2 incident, 4 maintenance, 8 update, 16 change. |
title | string | Title. |
content | string | Body, in Markdown. It may contain the summary separator {/* truncate */}, which you can remove before display. |
tags | string[] | Tags. Examples: an affected service (TREM Lite, DPIP, API(HTTP), …) or an impact level (無 none, 小 small, 中 medium, 大 large, 重大 major). Incident and maintenance announcements include either 進行中 (in progress) or 已結案 (closed). |
status | int | Status. The public API returns only published announcements, so this is always 1. |
expires_at | string | null | Expiry time, ISO 8601 UTC (for example 2026-11-20T00:00:00.000Z). null when it does not expire. |
created_at | string | Created time, ISO 8601 UTC. |
updated_at | string | Last updated time, ISO 8601 UTC. |
List announcements
Section titled “List announcements”Newest created_at first, 50 per page. Only announcements that are published and not yet expired are included.
https://announcement.exptech.com.tw/api/announcements pagePage number, starting at 1.
searchKeyword, matched against the title, body, and tags (partial match, case-insensitive).
typeList only this type: 1 general, 2 incident, 4 maintenance, 8 update, 16 change. Only one type at a time.
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
{ "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 matches the ETag. Empty bodyNo response body
Try it
Response fields
Section titled “Response fields”| Field | Type | Description |
|---|---|---|
success | boolean | true on success. |
data.announcements | object[] | Announcements on this page. See Announcement object for the shape. |
data.total | int | Total number of announcements that match. |
data.page | int | Current page number. |
data.totalPages | int | Total number of pages (50 per page). 0 when there are no announcements. |
Counts by type
Section titled “Counts by type”https://announcement.exptech.com.tw/api/announcements/stats 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
{ "success": true, "data": { "stats": { "1": 12, "4": 3, "8": 20 } }}If-None-Match matches the ETag. Empty bodyNo response body
Try it
Response fields
Section titled “Response fields”| Field | Type | Description |
|---|---|---|
data.stats | object | Announcement type → count of announcements that are published and not yet expired. The key is the type number as a string. A type with a count of 0 is omitted. |
Get one announcement
Section titled “Get one announcement”https://announcement.exptech.com.tw/api/announcements/{id} idAnnouncement ID (path parameter).
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
{ "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 matches the ETag. Empty bodyNo response body
The announcement does not exist, or it is not published
{ "success": false, "error": "找不到公告"}Try it
Response fields
Section titled “Response fields”The shape of data.announcement is the announcement object.
- Cache. The server caches for 10 seconds. The response includes
ETag. The sameIf-None-Matchreturns304. - Expired announcements. The list and the counts omit expired announcements. Fetching one by ID still returns it as long as it is still published.
- Error format. An error response is
{"success": false, "error": "<message>"}. An unknown path returns404, anderroris找不到此路徑. - Time format. Time fields are ISO 8601 UTC strings (ending in
Z). Convert them to Taiwan time for display. - Do not call this directly from a browser. See the CORS note above.
