> For the complete documentation index, see [llms.txt](https://docs.ipcheck.ing/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ipcheck.ing/developer/zh-tw/reference/api-endpoints.md).

# API 端點

所有後端 API 路由、其保護機制，以及邊緣快取存留時間。

{% hint style="warning" %}
**這不是公開 API。** 這些路由存在是為了服務 MyIP 自己的前端。它們受到一個 `Referer` 檢查所把關，其結構會在未事先通知的情況下變動，而且沒有版本控管、淘汰政策或穩定性契約。不要為另一個執行個體的 `/api/*`。此頁將它們記錄下來，以便 **你能操作並除錯你自己的部署**.
{% endhint %}

每個路由都定義在 `backend-server.js` 中，並掛載到後端伺服器（`BACKEND_PORT`，預設 `11966`）。在正式環境中， `frontend-server.js` 會代理 `/api` 從 `FRONTEND_PORT` （預設 `18966`）到後端，所以從部署外部看來，一切都位於 `/api` 同一個來源下。參見 [後端](/developer/zh-tw/architecture/backend.md).

## 全域中介軟體

這些會套用到 **每一個** `/api/*` 路由，依掛載順序。

| 順序 | 中介軟體                               | 行為                                                                                                                                                                                                                                                                                 |
| -- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1  | `pino-http`                        | 僅在 `LOG_HTTP=true`時啟用。記錄方法、URL 與狀態。會在限制器之前掛載，所以 429 也會被記錄。                                                                                                                                                                                                                         |
| 2  | `express-rate-limit`               | 僅在 `SECURITY_RATE_LIMIT` 不為零時啟用。每個 IP 在每 20 分鐘視窗內最多 N 次請求 → `429 {"message":"請求過多"}`。會跳過 `/api/monitoring`。並不是唯一會產生 429 的來源： `/api/invisibility` 以及 `/api/dnsleaktest/session/:token` 都可能從上游傳回一個，且可藉由其 `code: "quota_exceeded"` 內容辨識出來，還有 `/api/persona/evaluate` 會原封不動地轉發上游的 429。 |
| 3  | `express-slow-down`                | 僅在 `SECURITY_DELAY_AFTER` 不為零時啟用。在每個 IP 每 60 分鐘視窗內達到 N 次請求後，會增加 `hits × 400 ms` 的延遲。會跳過 `/api/monitoring`.                                                                                                                                                                         |
| 4  | `express.json({ limit: '500kb' })` | JSON 主體解析。超過 500 KB 的主體會得到一個原始的 `413`.                                                                                                                                                                                                                                             |
| 5  | `Cache-Control: no-store`          | **作為每個路由的預設值。** 想要邊緣快取的路由會明確覆寫它。                                                                                                                                                                                                                                                   |
| 6  | `requireReferer`                   | 拒絕任何其 `Referer` 主機名稱不是 `localhost` 或不在 `ALLOWED_DOMAINS`.                                                                                                                                                                                                                          |

### Referer 門檻

`requireReferer` 是每個請求首先遇到的檢查。比對方式是針對 `['localhost', ...ALLOWED_DOMAINS.split(',')]`.

| 條件                    | 回應                       |
| --------------------- | ------------------------ |
| 無 `Referer` 任何標頭      | `403 {"error":"你在做什麼？"}` |
| `Referer` 已存在但主機名稱不允許 | `403 {"error":"存取遭拒"}`   |
| `Referer` 無法解析為 URL   | `403 {"error":"存取遭拒"}`   |

這就是為什麼 `curl http://your-host:18966/api/configs` 總是 403——curl 不會送出 `Referer`。參見 [安全選項](/developer/zh-tw/configuration/security-options.md).

### 快取

這個 `cacheable(seconds)` 中介軟體工廠會包裝 `res.json` 並設定 `Cache-Control: public, max-age=<seconds>` **僅於 2xx 回應上**，因此錯誤絕不會被快取到邊緣。它也會把該值存到 `res.locals.cacheControl` ，供串流二進位且繞過 `res.json` 的處理器使用（只有 `/api/map` 會這麼做）。

任何未標記為可快取的內容都會繼承全域的 `no-store` 預設值。

### 守衛

守衛位於 `common/guards.js` ，並按路由套用。它們都會以 `400` 以及一個 JSON `錯誤` 字串拒絕。

| 守衛                         | 讀取         | 驗證                                                                                                                                                                                        | 錯誤                                       |
| -------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- |
| `requirePublicIP()`        | `?ip`      | 有效的 IPv4 或 IPv6，且可公開路由——保留位址空間（RFC 1918、loopback、CGNAT、link-local、文件、multicast）絕不會到達處理器                                                                                                   | `未提供 IP 位址` / `無效的 IP 位址` / `不是公開 IP 位址` |
| `requireValidDomain()`     | `?domain`  | 語法上正確的網域；會就地將值轉為小寫，讓邊緣快取看到單一標準形式。標籤可以帶有前導底線（例如 RFC 8552 名稱 `_dmarc.example.com`）；但頂級網域不能。它是一個工廠—— `/api/dnsresolver` 會將其掛載為 `requireValidDomain('hostname')`，而錯誤字串仍維持 `domain` ，無論參數名稱叫什麼 | `未提供網域` / `無效的網域`                        |
| `requireValidPrefix()`     | `?prefix`  | 格式正確的 CIDR（任何長度——前端決定量化方式）                                                                                                                                                                | `未提供前綴` / `無效的前綴`                        |
| `requireValidASN()`        | `?asn`     | 數字，可選 `AS` 前綴；會就地移除該前綴                                                                                                                                                                    | `未提供 ASN` / `無效的 ASN`                    |
| `requireValidCountry()`    | `?country` | 剛好兩個 ASCII 字母（alpha-2 國碼）；會就地轉為大寫，讓邊緣快取對每個國家只看到一個鍵                                                                                                                                        | `未提供國家` / `無效的國家`                        |
| `requireValidProviderId()` | `?id`      | 是否屬於 service-status 提供者 slug 白名單                                                                                                                                                          | `未提供提供者 ID` / `無效的提供者 ID`                |
| `requireValidRecordType()` | `?type`    | 是否屬於 `DNS_RECORD_TYPES` (`common/dns-record-types.js`）——解析器回應的 DNS 記錄類型。會就地將值轉為大寫，因此參數大小寫不敏感                                                                                              | `未提供記錄類型` / `無效的記錄類型`                    |
| `requireValidReportId()`   | 路由參數 `:id` | 剛好 22 個 base64url 字元（16 個隨機位元組）                                                                                                                                                           | `無效的報告 ID`                               |

## IP 地理定位

這些都會回傳相同的標準化結構（`ip`, `city`, `region`, `country`, `country_name`, `country_code`, `latitude`, `longitude`, `timezone`, `asn`, `org`），由 `makeGeoHandler` 工廠在 `common/geo-handler.js`. `timezone` 產生；其中的例外是這個工廠的 `withTimeZone()` 中介軟體會從回應中已存在的座標推導出它並附加上去，這就是為什麼 `/api/ipchecking` 也包含它。參見 [IP 資料來源](/developer/zh-tw/architecture/ip-data-sources.md).

`/api/ipchecking` 另外還包含一個 `advancedData` 區塊。只有已登入且在每月配額內的呼叫者，其欄位才會保有真實值；否則該區塊中的每個欄位都會是字串哨兵 `sign_in_required` 或 `quota_exceeded` ——回應會維持 `200` 且地理欄位不受影響。前端的 `transform-ip-data.js` 會傳遞這些哨兵，讓 UI 能顯示對應提示。

| 路由                     | 參數                     | 守衛 · 快取                      | 用途                                                                                                                  |
| ---------------------- | ---------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `GET /api/ipinfo`      | `ip`                   | `requirePublicIP` · 1 天      | 透過 ipinfo.io 做地理定位。 `IPINFO_API_KEY` 可選。                                                                            |
| `GET /api/ipapicom`    | `ip`, `lang` （預設 `en`) | `requirePublicIP` · 1 天      | 透過 ip-api.com 做地理定位。無需金鑰。                                                                                           |
| `GET /api/ipsb`        | `ip`                   | `requirePublicIP` · 1 天      | 透過 api.ip.sb 做地理定位。無需金鑰。                                                                                            |
| `GET /api/ipapiis`     | `ip`                   | `requirePublicIP` · 1 天      | 透過 api.ipapi.is 做地理定位；也會回傳 `isHosting` / `isProxy`。需要 `IPAPIIS_API_KEY`.                                            |
| `GET /api/ip2location` | `ip`                   | `requirePublicIP` · 1 天      | 透過 ip2location.io 做地理定位。需要 `IP2LOCATION_API_KEY`.                                                                   |
| `GET /api/maxmind`     | `ip`, `lang` （可選）      | `requirePublicIP` · 1 天      | 本機 GeoLite2 City + ASN 查詢。需要 MaxMind 憑證或預先播種的 `.mmdb`; **503** 當資料庫未載入時。                                            |
| `GET /api/ipchecking`  | `ip`, `lang` （預設 `en`) | `requirePublicIP` · no-store | 透過私有的 IPCheck.ing API 做地理定位。需要 `IPCHECKING_API_KEY` + `IPCHECKING_API_ENDPOINT`; `500 {"error":"缺少 API 金鑰"}` 而沒有它們。 |

**沒有處理器會驗證 `?lang` 是否在白名單內。** 在 `/api/maxmind` 原始標籤會送到 `lookupMaxMind()`，它會將其標準化為已隨附 City 資料庫實際支援的語言—— `de`, `en`, `es`, `fr`, `ja`, `pt-BR`, `ru`, `zh-CN` (`SUPPORTED_LANGS` 位於 `common/maxmind-service.js`）——先比對完全相同的標籤，再比對基礎語言，接著比對同語系中的兄弟變體（`zh-TW` 讀取 `zh-CN`），最後回退到 `en`。在 `/api/ipapicom` 以及 `/api/ipchecking` 上，該標籤會原封不動轉發給上游，由上游自行負責解析。

前端會為啟用中的 UI 語言傳送登錄表的 `apiTag` ，而不是 UI 程式碼本身——繁體中文 UI 已經會要求 `zh-CN`，所以上述的語系步驟是為了其他呼叫者。參見 [i18n](/developer/zh-tw/development/i18n.md).

地理處理器上的上游失敗會回傳 `500 {"error": "<message>"}`.

## 網路工具

| 路由                                    | 參數                                                                        | 守衛 · 快取                                                                  | 用途                                                                                                                                                                                                                                                                                                        |
| ------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /api/whois`                      | `q` （IP 或網域）                                                              | inline · 1 天                                                             | WHOIS / RDAP 查詢。IP 會先送到 RDAP，並以 `whoiser` 作為備援。因為 `q` 可以接受任一形式，所以會在內聯驗證： `400 無效的 IP 或位址`，或 `400 不是公開 IP 位址` ，適用於保留位址空間； `404` 當頂級網域既不提供 WHOIS 也不提供 RDAP 時。                                                                                                                                               |
| `GET /api/dnsresolver`                | `hostname`, `type`                                                        | `requireValidDomain('hostname')` + `requireValidRecordType()` · no-store | 並行地透過數個純 DNS 與 DoH 解析器解析主機名稱，用於污染比較。                                                                                                                                                                                                                                                                      |
| `GET /api/dnsleaktest/session/:token` | 路由 `:token` （32 個十六進位字元）， `lang` （可選，原樣轉發）                                | inline · no-store                                                        | 取得增強版 DNS 洩漏測試工作階段結果。會轉發請求標頭（包括 `Authorization`）並原封不動傳遞上游狀態——包括 `429` 以及 `code: "quota_exceeded"` 當每月配額用盡時。需要 `IPCHECKING_API_KEY` + `IPCHECKING_API_ENDPOINT`.                                                                                                                                           |
| `GET /api/ooni-blocking`              | `domain`                                                                  | `requireValidDomain` · 1 天                                               | 30 天 UTC 視窗內的 OONI 審查彙總；會同時查詢 apex 與 `www.` 變體並進行合併。                                                                                                                                                                                                                                                      |
| `GET /api/globalping-probes`          | —                                                                         | — · 7 天                                                                  | 供 MTR / 延遲 / 審查國家選擇器使用的線上 Globalping 探測器精簡國家清單。                                                                                                                                                                                                                                                           |
| `GET /api/macchecker`                 | `mac` （移除後恰好為 12 個十六進位字元 `:` 以及 `-`)                                      | 行內 · 30 天                                                                | 透過 maclookup.app 進行 IEEE OUI 廠商查詢。 `MAC_LOOKUP_API_KEY` 可選。                                                                                                                                                                                                                                               |
| `GET /api/map`                        | `latitude`, `longitude`, `language` （2 個字母）， `CanvasMode` (`深色` （適用於深色樣式） | 行內 · 1 年                                                                 | 代理 Google Static Maps 的 JPEG。 **回傳二進位資料**，而非 JSON。需要 `GOOGLE_MAP_API_KEY`.                                                                                                                                                                                                                                |
| `GET /api/invisibility`               | `id` （28 個英數字元）                                                           | inline · no-store                                                        | 輪詢代理偵測結果。上游的 404 會轉譯為 `200 {"status":"pending"}`；上游的 429 會直接傳遞為 `429 {"error":…,"code":"quota_exceeded"}` （每月配額已用盡——前端只會依代碼判斷）。需要 `IPCHECKING_API_KEY` + `IPCHECKING_API_ENDPOINT`.                                                                                                                       |
| `POST /api/persona/evaluate`          | JSON 主體 `{ persona, observation }`                                        | inline · no-store                                                        | 將瀏覽器觀察到的訊號與宣告的人設進行評分，供 In-depth Persona Check 工具使用。 `405` 在任何其他方法上； `400 {"error":"未提供 persona"}` 不含 `persona.country`; `500 {"error":"缺少 API 金鑰"}` 不含 `IPCHECKING_API_KEY` + `IPCHECKING_API_ENDPOINT`。會將呼叫端的標頭轉送（見下方）並原樣傳遞上游狀態與負載—— `429` 表示該帳號的每月配額已用盡，而前端只依狀態判斷。無法連線的評估器會回傳 `502 {"error":"上游擷取失敗"}`. |

本節中的三個私有 API 路由—— `/api/dnsleaktest/session/:token`, `/api/invisibility` 以及 `/api/persona/evaluate` — 會將呼叫端的請求標頭轉送到上游，因為該 API 需要呼叫端的上下文（`Accept-Language`，以及 `Authorization` token）。 `/api/persona/evaluate` 是第一個會先丟棄描述此跳轉而非呼叫端的標頭（`host`, `content-length`, `content-type`, `connection`, `transfer-encoding`）：它會重新序列化 JSON 主體，因此呼叫端的 `Content-Length` 已不再描述實際送出的內容。

## ASN 與 BGP

所有 Cloudflare Radar 資料都經由單一的 `GET /api/cfradar` 路由。需要一個必填的 `view` 參數來選擇資料集；每個 view 都有自己的守衛與邊緣快取 TTL。缺少 `view` 會回傳 `400 {"error":"未提供 view"}`，未知值則 `400 {"error":"無效的 view"}`，任何非 GET 方法 `405`，以及沒有設定 `CLOUDFLARE_API_KEY` 會回應 `500 {"error":"缺少 API 金鑰"}` ——在通過該 view 的守衛後才會處理，因此即使在無金鑰部署中，錯誤參數也仍會維持 400。

| 路由                                      | 參數                      | 守衛 · 快取                      | 用途                                                                                                                                                                                                                                                                                                                     |
| --------------------------------------- | ----------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /api/cfradar?view=asn`             | `asn`                   | `requireValidASN` · 30 天     | 某 ASN 的 Cloudflare Radar 檔案：實體資訊、7 天流量／採用分布、已公告 IPv4／IPv6 前綴數、上游／下游／對等 AS 數，以及速度測試品質彙總（頻寬、延遲、抖動）。部分區段失敗會記錄並照常提供——關係計數會回退到本機 CAIDA 快照；完全失敗則回傳 500。                                                                                                                                                                      |
| `GET /api/cfradar?view=country-traffic` | `country`, `human` （可選） | `requireValidCountry` · 30 天 | 國家線上活動熱圖：將 Cloudflare Radar 的每小時 HTTP 請求時間序列在 28 天視窗內彙總成以星期一為首的 7×24 平日/小時矩陣，回傳為 `{"trafficMatrix": …}`。刻意以國家層級呈現——全球 ASN 沒有單一的日夜節律。 `human=1` 會將流量限制為可能是人類的流量；只有完全相同的字串才算數，這可讓每個國家的快取維持兩個鍵。 `trafficMatrix: null` （沒有可用序列）是有效且已快取的 `200`，不是錯誤。矩陣維持 UTC——回應會在跨時區的邊緣快取中快取，因此前端負責小時旋轉。上游失敗會回傳 `500 {"error":"內部伺服器錯誤"}`. |
| `GET /api/cfradar?view=outages`         | —                       | — · 1 小時                     | 供 Earth Online 面板使用的全球網際網路中斷資訊流：將 Cloudflare Radar 已驗證的中斷與流量異常在 30 天視窗內合併，移除已升格為中斷的異常，並將進行中的事件排在前面（每組內以最新優先，最多 30 筆）。若有一個來源失敗，會降級為部分資訊流；兩個都失敗則回傳 500。                                                                                                                                                                  |
| `GET /api/asn-history`                  | `prefix` (CIDR)         | `requireValidPrefix` · 30 天  | 某前綴的歷史 BGP 公告，取自 RIPEstat routing-history，並附相對可見度百分比。上游非 2xx 會回傳 `502 {"error":"上游錯誤"}`. `RIPESTAT_SOURCE_APP` 可選。                                                                                                                                                                                                     |
| `GET /api/asn-connectivity`             | `asn`                   | `requireValidASN` · 30 天     | 從 ASN 指向 Tier-1 骨幹的上游拓樸圖，根據本機 CAIDA as-rel 快照建立。邊的類型為 `transit` （p2c）或 `對等互連` （與 Tier 1 的 p2p）；Tier-1 起點會回傳其連向其餘 clique 的對等互連邊，而不是空圖。                                                                                                                                                                                  |

## 服務狀態

兩個處理器都讀取由背景輪詢器以固定 5 分鐘排程維護的記憶體快照。它們在請求時都不會碰觸上游，因此請求量永遠不會影響上游負載。

| 路由                               | 參數                   | 守衛 · 快取                         | 用途                      |
| -------------------------------- | -------------------- | ------------------------------- | ----------------------- |
| `GET /api/service-status`        | —                    | — · 5 分鐘                        | 概覽：每個供應商一個狀態燈，不含大型詳細陣列。 |
| `GET /api/service-status/detail` | `id` （provider slug） | `requireValidProviderId` · 5 分鐘 | 某個供應商的子元件加上近期事件。        |

## 平台

| 路由                               | 參數                            | 守衛 · 快取                           | 用途                                                                        |
| -------------------------------- | ----------------------------- | --------------------------------- | ------------------------------------------------------------------------- |
| `GET /api/configs`               | —                             | — · 1 小時                          | 前端的功能旗標。回傳 **僅布林值**，絕不回傳鍵值。                                               |
| `GET /api/github-stars`          | —                             | — · 1 天                           | 下列項目的星標數： `jason5ng32/MyIP`，以未驗證方式擷取。                                     |
| `GET /api/getuserinfo`           | —（轉送請求標頭，包括 `Authorization`)  | — · no-store                      | 來自配套 API 的已登入使用者個人資料。需要 `IPCHECKING_API_KEY` + `IPCHECKING_API_ENDPOINT`. |
| `PUT /api/updateuserachievement` | JSON 主體                       | — · no-store                      | 記錄成就解鎖。需要 `IPCHECKING_API_KEY` + `IPCHECKING_API_ENDPOINT`.               |
| `POST /api/report`               | JSON 主體 `{ report, ttlDays }` | schema 白名單 + 大小上限 · no-store      | 將可分享的診斷報告儲存在 Workers KV 中並回傳其 id。需要這三個 `CLOUDFLARE_*` 變數。                 |
| `GET /api/report/:id`            | 路由 `:id` （22 個字元）             | `requireValidReportId` · no-store | 為唯讀 `/r/:id` 頁面讀取已儲存的報告。需要相同的三個 `CLOUDFLARE_*` 變數。                        |
| `POST /api/monitoring`           | 原始信封本文（最大 10 MB）              | 專屬限制器 · no-store                  | 第一方 Sentry 隧道。 **僅在以下情況掛載 `VITE_SENTRY_DSN_FRONTEND` 已設定。**               |

### `/api/configs` 回應

每個欄位都是布林值。 `originalSite` 是 `true` 僅在請求的 `Referer` 主機名稱是 IPCheck.ing 的正規主機名稱之一時才會為真。

{% code title="GET /api/configs" %}

```json
{
  "map": false,
  "ipInfo": false,
  "ipChecking": false,
  "ip2location": false,
  "originalSite": false,
  "cloudFlare": false,
  "ipapiis": false,
  "reportSharing": false
}
```

{% endcode %}

### 報告分享狀態碼

| 代碼    | 意義                                                      |
| ----- | ------------------------------------------------------- |
| `503` | 這三個 `CLOUDFLARE_*` 變數並未全部設定。                            |
| `400` | 報告本文未通過 schema 驗證（`{"error":"無效的報告","details":[...]}`). |
| `413` | 序列化後的報告超過 256 KB。                                       |
| `404` | 在 `GET`：找不到報告，或其 KV TTL 已過期。                            |

`ttlDays` 必須為 `1`, `3` 或 `7`；任何其他值都會被靜默降為 `1`.

### `/api/monitoring`

僅在以下情況掛載 `VITE_SENTRY_DSN_FRONTEND` 設定於 **後端程序**。它有一個專用限制器，每個 IP 在 20 分鐘視窗內限 600 次請求，且明確被兩個全域限制器跳過——與應用程式配額共享的遙測，是錯誤回報悄悄失效的原因。本文會以 `express.raw` 使用萬用型別匹配器，因為 Sentry Replay 信封送出時完全沒有 `Content-Type` 。

## 快取 TTL 摘要

| TTL        | 路由                                                                                                                                                                                                                                     |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 5 分鐘       | `/api/service-status`, `/api/service-status/detail`                                                                                                                                                                                    |
| 1 小時       | `/api/configs`, `/api/cfradar?view=outages`                                                                                                                                                                                            |
| 1 天        | `/api/ipinfo`, `/api/ipapicom`, `/api/ipsb`, `/api/ipapiis`, `/api/ip2location`, `/api/maxmind`, `/api/whois`, `/api/github-stars`, `/api/ooni-blocking`                                                                               |
| 7 天        | `/api/globalping-probes`                                                                                                                                                                                                               |
| 30 天       | `/api/cfradar` (`view=asn`, `view=country-traffic`), `/api/asn-history`, `/api/asn-connectivity`, `/api/macchecker`                                                                                                                    |
| 1 年        | `/api/map`                                                                                                                                                                                                                             |
| `no-store` | 其餘所有內容—— `/api/ipchecking`, `/api/dnsresolver`, `/api/dnsleaktest/session/:token`, `/api/invisibility`, `/api/persona/evaluate`, `/api/getuserinfo`, `/api/updateuserachievement`, `/api/report`, `/api/report/:id`, `/api/monitoring` |

TTL 會根據各上游的自然更新頻率來選擇。共享報告會維持 `no-store` 刻意如此：邊緣快取可能會在 KV 到期後仍提供報告，而私人診斷資料不應該出現在公開快取中。

## 非`/api` 路由

`frontend-server.js` 會提供其他所有內容：靜態 `dist/` 輸出，並依資產類別提供個別的 `Cache-Control`，以及一個會回傳的 SPA history fallback `index.html` （含 `no-store`）

前端流量中有一部分完全繞過此後端： **Earth Online**的社交半部（狀態編輯器、最新動態、訪客地圖、造訪信標）會呼叫由以下名稱指定的外部服務 `VITE_PULSE_BEACON_URL` 直接從瀏覽器發出，因此這些請求不會出現在 `/api` ，而且上述守衛或快取規則都不適用於它們。除非在建置時設定該變數，否則它們會關閉。面板的全域中斷資訊流則不同——它沿用文件中記載的 `GET /api/cfradar?view=outages` 路由，且只需要 `CLOUDFLARE_API_KEY` — 參見 [與 IPCheck.ing 綁定的功能](/developer/zh-tw/configuration/features-tied-to-ipcheck-ing.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.ipcheck.ing/developer/zh-tw/reference/api-endpoints.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
