コンテンツにスキップ

API クライアント

Framedash API クライアント(@framedash/api-client)は、Framedash 開発者プラットフォームの REST API を型付きで扱う TypeScript / JavaScript クライアントです。@framedash/cli@framedash/mcp-server の内部で使われているものと同じクライアントを単独パッケージとして公開しており、Framedash のテレメトリを自社の内製ツール・ダッシュボード・自動化処理に直接組み込めます。

認証、プロジェクトスコープのパス生成、レスポンスのアンラップ、構造化エラーに加え、いくつかのセキュリティガード(HTTPS 限定のベース URL、認証情報を漏らさないリダイレクト拒否、リクエストタイムアウト)を内蔵しているため、データの取得に集中できます。

  • Node.js 18 以降(グローバル fetchAbortSignal.timeoutnode:net を使用)
  • Web API アクセス用の管理者 API キー(fd_admin_ プレフィックス)
Terminal window
npm install @framedash/api-client
import { ApiClient, ApiError } from "@framedash/api-client";
const client = new ApiClient({
baseUrl: "https://app.framedash.dev",
apiKey: process.env.FRAMEDASH_API_KEY ?? "",
projectId: process.env.FRAMEDASH_PROJECT_ID ?? "",
onError: (err: ApiError) => {
// onError は成功以外のレスポンスで呼ばれます。必ず throw(または終了)すること。
// 戻り値の型は `never` です。throw した値は await へ伝播します。
throw err;
},
});
// プロジェクトスコープの GET -> /api/v1/projects/{projectId}/dashboard?days=30
const dashboard = await client.get(client.projectPath("dashboard?days=30"));
console.log(dashboard);

クライアントは API のエンベロープを自動でアンラップします。成功時の { "success": true, "data": ... }data の値だけに解決されます。

ApiClient のコンストラクタは 1 つのオプションオブジェクトを受け取ります:

オプション説明
baseUrlstringアプリケーションホスト URL(例: https://app.framedash.dev)。HTTPS 必須(HTTP は localhost / ループバックのみ許可)。
apiKeystring管理者 API キー。毎リクエストの X-API-Key ヘッダーで送信されます。
projectIdstringデフォルトのプロジェクト UUID。projectPath() に必須。プロジェクト外パスでは X-Project-Id ヘッダーとしても送信されます。
onError(error: ApiError) => never成功以外のレスポンスで呼ばれます。throw またはプロセス終了が必須です。

ベース URL はクライアント構築時に検証され、安全でない、または不正な URL は即座に throw されます。同じチェックは公開関数 assertSafeBaseUrl(baseUrl) で自分でも実行できます。

4 つの HTTP ヘルパーで Web API をカバーします。いずれもアンラップ済みの data ペイロードを返し、ジェネリックパラメータで型を指定できます:

const data = await client.get<MyType>("/api/v1/...");
await client.post("/api/v1/...", body);
await client.patch("/api/v1/...", body);
await client.delete("/api/v1/...");

ほとんどのエンドポイントはプロジェクト単位です。projectPath(suffix) は、クライアントに設定された projectId を使って /api/v1/projects/{projectId}/{suffix} を構築します:

// GET /api/v1/projects/{projectId}/status
const status = await client.get(client.projectPath("status"));
// GET /api/v1/projects/{projectId}/retention?days=30
const retention = await client.get(client.projectPath("retention?days=30"));
// GET /api/v1/projects/{projectId}/maps
const maps = await client.get(client.projectPath("maps"));

projectId が未設定のまま projectPath() を呼ぶと throw されます。

プロジェクトコンテキストの切り替え

Section titled “プロジェクトコンテキストの切り替え”

withProject(projectId) は、同じベース URL・API キー・エラーハンドラを再利用しつつ、別プロジェクトにバインドされた新しいクライアントを返します。元のクライアントは変更されません:

const other = client.withProject("another-project-uuid");
const otherStatus = await other.get(other.projectPath("status"));
// 現在バインドされているプロジェクト ID:
console.log(client.currentProjectId);
const rows = await client.post("/api/v1/query", {
sql: "SELECT event_name, count() FROM events GROUP BY event_name",
project_id: client.currentProjectId,
limit: 100,
});
// アラートルールの一覧取得
const alerts = await client.get(client.projectPath("alerts"));
// アラートルールの作成
const created = await client.post(client.projectPath("alerts"), {
name: "FPS Alert",
// ...残りのルールフィールド
});
// アラートルールの無効化
await client.delete(client.projectPath(`alerts/${alertId}`));

コンテンツレジストリへのインポート

Section titled “コンテンツレジストリへのインポート”
// content エンドポイントはパス上ではプロジェクトスコープではありません。
// クライアントが設定済みの projectId から X-Project-Id ヘッダーを自動付加します。
// 一括 upsert のボディは配列を entries プロパティで包みます(1 リクエストあたり最大 500 件)。
await client.post("/api/v1/content", { entries });
const content = await client.get("/api/v1/content");

エンドポイント・クエリパラメータ・ペイロード構造の一覧は API リファレンス を参照してください。

成功以外のレスポンス(ネットワークエラー、2xx 以外のステータス、success: true を持たないボディ)はすべて ApiError に変換され、onError コールバックに渡されます。ApiError は解析済みの RFC 9457 Problem Details を保持します:

メンバー説明
statusnumberHTTP ステータスコード。
headersHeadersレスポンスヘッダー(例: X-RateLimit-Reset)。
messagestring人間可読のエラーメッセージ。
retryablebooleanAPI がリトライ可能と示したかどうか。
retryAfternumber | undefined推奨リトライ間隔(秒)。
errorCategorystring | undefinedAPI のエラーカテゴリ。
problemProblemDetails解析済みの生の Problem Details オブジェクト。

レート制限を考慮したハンドラ:

const client = new ApiClient({
baseUrl: "https://app.framedash.dev",
apiKey: process.env.FRAMEDASH_API_KEY ?? "",
projectId: process.env.FRAMEDASH_PROJECT_ID ?? "",
onError: (err: ApiError): never => {
if (err.status === 429) {
const retryAfter = err.retryAfter ?? err.headers.get("X-RateLimit-Reset");
throw new Error(`Rate limited; retry after ${retryAfter}`);
}
throw err;
},
});

管理者キーが漏れないよう、クライアントはいくつかの安全策を強制します:

  • HTTPS 限定のベース URL。プレーンな HTTP は localhost / ループバックの開発エンドポイントを除き拒否され、認証情報を埋め込んだ URL(https://...@host)も拒否されます。
  • リダイレクト不可。API はプログラム的な JSON リクエストをリダイレクトしないため、3xx はすべてエラー扱いです。クライアントはリダイレクト先に X-API-Key ヘッダーを再送しません。
  • 1 リクエストあたり 30 秒のタイムアウト(AbortSignal.timeout 経由)。