サーバーと Base URL
ExpTech API は、用途ごとにいくつかのサーバーグループに分かれています。多くのグループには、DNS がノードを自動で割り当てる名前(以下では Auto)と、直接指定できるノード名(例:TNN-1)があります。各エンドポイントの上にあるドロップダウンが、ここにある host です。そのエンドポイントを提供する host だけが並びます。
Base URL は https:// と host だけで、エンドポイントのパスは必ず /api/... から続けます。例:https://api.core.exptech.dev/api/v2/eq/report。
サーバー一覧
Section titled “サーバー一覧”データ API
Section titled “データ API”- Auto:
https://api.core.exptech.dev - TNN-1:
https://api.core-tnn1.exptech.dev - TYO-1:
https://api.core-tyo1.exptech.dev
地震情報、MCP サーバーなどのデータ API を提供します。次の節のルートもこの名前の下にありますが、提供するのは TNN-1 ノードだけです。
TNN-1 のみが提供するルート
Section titled “TNN-1 のみが提供するルート”- TNN-1:
https://api.core-tnn1.exptech.dev
気象データ、および地図タイルの一覧(レーダー、衛星、風向・風速、QPESUMS の list)です。
静的ファイルとタイル
Section titled “静的ファイルとタイル”- TNN-1:
https://static.core-tnn1.exptech.dev
地図タイルの画像(レーダー、衛星、風向・風速、QPESUMS)と、気象データのうち指定時刻の履歴ファイルです。これらのレスポンスは長時間キャッシュされます。このグループに Auto はありません。DNS がノードを割り当てる名前は、これらのファイルがないノードに向くことがあるため、TNN-1 を直接使ってください。
リアルタイム配信と時刻同期
Section titled “リアルタイム配信と時刻同期”- Auto:
https://api.lb.exptech.dev - TPE-1:
https://api.lb-tpe1.exptech.dev - KHH-1:
https://api.lb-khh1.exptech.dev
SSE のリアルタイム配信と時刻同期です。TPE-1 と KHH-1 は同じルートを提供する 2 つのノードで、どちらを選んでもかまいません。
アカウント、OAuth2、公開情報
Section titled “アカウント、OAuth2、公開情報”- Manager:
https://manager.exptech.com.tw
OAuth2 と公開情報 APIです。host は 1 つだけです。
- Announcement:
https://announcement.exptech.com.tw
お知らせです。
ベースマップのタイル
Section titled “ベースマップのタイル”- LB:
https://lb.exptech.dev
旧版の気象 API(非推奨)
Section titled “旧版の気象 API(非推奨)”- TNN:
https://tnn.exptech.dev
非推奨の旧版気象 API だけを提供します。新しいプログラムは、気象のページにある新しい API を使ってください。
ノードと Auto
Section titled “ノードと Auto”- Auto は、DNS がいずれかのノードに割り当てます。割り当て方と切り替え時間は保証されません。あるノードが故障しても、DNS がすぐには外さないことがあり、その間 Auto 経由のリクエストは失敗することがあります。
- ノード指定(TNN-1、TYO-1、TPE-1、KHH-1)は、常に同じマシンへ接続します。そのノードのメンテナンス中や故障中は使えません。
- データ API の各ノードが提供するルートは、完全には同じではありません。上の「TNN-1 のみが提供するルート」を参照してください。
- アカウント、API Token、クォータは、すべてのノードで共有されます。ノードを変えても、認証と利用量の計算には影響しません。
- データ API、静的ファイル、リアルタイム配信、ベースマップのタイルは、ほとんどが任意のオリジンを許可します(
Access-Control-Allow-Origin: *)。ブラウザから直接呼べます。例外は各エンドポイントの説明に書いてあります。 - アカウント、OAuth2、公開情報のグループは、公式サイトだけを許可します。サーバー側から呼んでください。唯一の例外は権限一覧で、任意のオリジンを許可します。
Base URL を自分で切り替える
Section titled “Base URL を自分で切り替える”host を 1 つだけ使うと、その host が故障したときにサービスも止まります。クライアント側で host のリストを持ち、失敗したら切り替えることを推奨します。
- グループごとにリストを用意し、優先順に並べます。例:データ API は Auto → TNN-1 → TYO-1 です。TNN-1 のみのルートと静的ファイルは TNN-1 だけで、切り替えられる host はありません(アーキテクチャと地理冗長化を参照)。
- リクエストごとにタイムアウトを設定します(例:5 秒)。
- 接続エラー、タイムアウト、5xx のときだけ、次の host に切り替えます。
- 400、401、403、429 はパラメータまたはアカウントの問題です。どのノードでも結果は同じなので、host を変えて再試行しないでください。404 は、ルートがノードによって違うとき(上の「TNN-1 のみが提供するルート」)だけ、host を変える価値があります。
- 最後に成功した host を覚えておき、次のリクエストではそれを先に使います。しばらくしてから(例:10 分)、先頭に戻して試してもかまいません。
- 同じリクエストをすべての host に同時に送らないでください。負荷が増えるだけです。
const CORE_HOSTS = [ "https://api.core.exptech.dev", "https://api.core-tnn1.exptech.dev", "https://api.core-tyo1.exptech.dev",];
let preferred = 0;
export async function fetchWithFailover(path, init = {}, hosts = CORE_HOSTS) { let lastError; for (let i = 0; i < hosts.length; i++) { const index = (preferred + i) % hosts.length; try { const res = await fetch(hosts[index] + path, { ...init, signal: AbortSignal.timeout(5000), }); if (res.status >= 500) { lastError = new Error(`HTTP ${res.status} from ${hosts[index]}`); continue; // サーバーエラー:次の host に切り替え } preferred = index; return res; // 2xx、3xx、4xx は呼び出し側に任せる } catch (err) { lastError = err; // 接続エラーまたはタイムアウト:次の host に切り替え } } throw lastError;}
const res = await fetchWithFailover("/api/v2/eq/report?limit=5");const reports = await res.json();