> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# KYC・AML向けNode.js/TypeScript SDK

> Didit公式Node.js/TypeScript SDKのクイックスタート。サーバーAPIの型付き呼び出し、Webhookの署名検証、Authenticationトークンの検証に対応します。

Node.jsおよびTypeScript向けのDidit公式ライブラリです。Node.js 18以降、Bun、Deno、および`fetch`を備えたエッジランタイムで動作し、ESモジュールとCommonJSの両方のビルドを提供し、ランタイム依存関係はありません。すべてのSDKに共通する内容は[サーバーSDKの概要](https://docs.didit.me/ja/integration/server-sdks/overview.md)を参照してください。

## インストール

```bash theme={null}
npm install @didit-protocol/sdk-node
```

パッケージは[npmの`@didit-protocol/sdk-node`](https://www.npmjs.com/package/@didit-protocol/sdk-node)です。ソースコードと変更履歴はGitHubの[didit-protocol/sdk-node](https://github.com/didit-protocol/sdk-node)にあります。

## クライアントを設定する

`new Didit()`は、Node.js、Bun、Deno(`--allow-env`指定時)では環境変数から`DIDIT_API_KEY`を読み込みます。エッジランタイムにはプロセス環境がないため、キーをオプションとして渡してください: `new Didit({ apiKey: env.DIDIT_API_KEY })`。オプションを渡すと、この値を上書きしたり、アプリケーション単位の呼び出し(ケース、ネットワーク、規制当局向けレポート)に必要な組織IDとアプリケーションIDを設定したりできます。タイムアウトの単位はミリ秒です。

```typescript theme={null}
import Didit from "@didit-protocol/sdk-node";

const didit = new Didit({
  apiKey: process.env.DIDIT_API_KEY,
  organizationId: process.env.DIDIT_ORGANIZATION_ID,
  applicationId: process.env.DIDIT_APPLICATION_ID,
  timeout: 30_000,
  maxRetries: 2,
});

// Options for a single call.
const fast = didit.withOptions({ timeout: 5_000, maxRetries: 0 });
console.log(await fast.sessions.retrieveDecision("11111111-2222-3333-4444-555555555555"));
```

CommonJSでは`const { Didit } = require("@didit-protocol/sdk-node");`を使用します。

## セッションを作成する

ワークフロー用に[認証セッション](https://docs.didit.me/ja/sessions-api/create-session.md)を作成し、ユーザーをそのURLに誘導します。リクエストのフィールドはAPIと同じ名前のままです。

```typescript theme={null}
import Didit from "@didit-protocol/sdk-node";

const didit = new Didit();

const session = await didit.sessions.create({
  workflow_id: "11111111-2222-3333-4444-555555555555",
  vendor_data: "user-123",
  callback: "https://example.com/verification/done",
});
console.log(session.url);
```

## 判定を読み取る

ユーザーが完了したとき（またはWebhookが届いたとき）に、[判定を読み取ってください](https://docs.didit.me/ja/sessions-api/retrieve-session.md)。各機能の結果はワークフローのノードごとに1件のエントリを持つリストで、日時は`Date`オブジェクトです。

```typescript theme={null}
import Didit from "@didit-protocol/sdk-node";

const didit = new Didit();

const decision = await didit.sessions.retrieveDecision("11111111-2222-3333-4444-555555555555");
console.log(decision.status);
for (const verification of decision.id_verifications ?? []) {
  console.log(verification.first_name, verification.last_name);
}
```

## Webhookを検証する

生のボディ(パース済みのJSONではないもの)とリクエストヘッダーを渡します。ヘッダーにはNode.jsまたはExpressの`req.headers`オブジェクト、Fetchの`Headers`オブジェクト、または`[name, value]`ペア(`WebhookHeaders`型)を使用できます。`verify`はPromiseを返し、有効で、かつ最新の配信ではない場合`WebhookVerificationError`でrejectします。

```typescript theme={null}
import { webhooks, WebhookVerificationError, type WebhookHeaders } from "@didit-protocol/sdk-node";

const secret = process.env.DIDIT_WEBHOOK_SECRET ?? "";

export async function handleWebhook(rawBody: Buffer, headers: WebhookHeaders): Promise<number> {
  try {
    const event = await webhooks.verify(rawBody, headers, secret);
    if (event.webhook_type === "status.updated") {
      console.log(event.session_id, event.status);
    }
    return 200;
  } catch (error) {
    if (error instanceof WebhookVerificationError) return 400;
    throw error;
  }
}
```

Expressでは、`express.raw({ type: "application/json" })`でボディを読み取り、`handleWebhook(req.body, req.headers)`を呼び出します。シークレットをローテーションしている間は、`[newSecret, oldSecret]`のように両方を渡してください。イベントと署名方式については[Webhook](https://docs.didit.me/ja/integration/webhooks.md)を参照してください。

## 取引をスクリーニングする

支払い、出金、暗号資産の送金を[トランザクションモニタリング](https://docs.didit.me/ja/transaction-monitoring/overview.md)に送信します。レスポンスにはそのステータスとリスクスコアが含まれます。

```typescript theme={null}
import Didit from "@didit-protocol/sdk-node";

const didit = new Didit();

const transaction = await didit.transactions.create({
  transaction_id: "txn-1001",
  transaction_category: "finance",
  transaction_details: { direction: "outbound", amount: 1500, currency: "EUR" },
  subject: { entity_type: "individual", vendor_data: "user-123", full_name: "Maria Garcia" },
});
console.log(transaction.status, transaction.score);
```

## Authenticationトークンを検証する

`Authentication`は、[Authentication](https://docs.didit.me/ja/authentication/overview.md)の発行者が署名したアクセストークンを、リクエストごとにDiditを呼び出すことなくバックエンドで検証します。また、コードの交換、トークンのリフレッシュ、セッションの確認と失効、ステップアップの実行も行います。

> [!NOTE]
>
> トークン検証では、アプリケーションの発行者と署名鍵に対して、[サーバーでトークンを検証する](https://docs.didit.me/ja/authentication/tokens-and-jwks.md#サーバーでトークンを検証する)に記載されたチェックを行います。

```typescript theme={null}
import { Authentication, TokenVerificationError } from "@didit-protocol/sdk-node";

// The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
const auth = Authentication.fromPublishableKey("pk_live_...", { clientId: "your-application-id" });

export async function currentUser(accessToken: string): Promise<string | null> {
  try {
    const claims = await auth.verifyAccessToken(accessToken);
    return claims.sub;
  } catch (error) {
    if (error instanceof TokenVerificationError) return null;
    throw error;
  }
}
```

## エラー

```typescript theme={null}
import Didit, { APIStatusError, NotFoundError, RateLimitError } from "@didit-protocol/sdk-node";

const didit = new Didit();

try {
  await didit.sessions.retrieveDecision("11111111-2222-3333-4444-555555555555");
} catch (error) {
  if (error instanceof NotFoundError) console.log("no such session");
  else if (error instanceof RateLimitError) console.log("slow down, request", error.requestId);
  else if (error instanceof APIStatusError) console.log(error.status, error.body);
  else throw error;
}
```

## リストとファイル

```typescript theme={null}
import Didit, { fileFromPath } from "@didit-protocol/sdk-node";

const didit = new Didit();

// Lists page through every result.
for await (const session of didit.sessions.list({ status: "Approved" })) {
  console.log(session.session_id);
}

// Uploads take a Blob, a Buffer, a stream or fileFromPath.
const result = await didit.idVerification.verify({
  front_image: await fileFromPath("id-front.jpg"),
  back_image: await fileFromPath("id-back.jpg"),
});
console.log(result.id_verification);
```

[APIリファレンス](https://docs.didit.me/ja/api-reference/overview.md)のサーバーエンドポイントの各ページには、操作用のNode.jsサンプルがあります。ただし、[概要](https://docs.didit.me/ja/integration/server-sdks/overview.md)に記載されている、まだどの1.0.1リリースにも含まれていないエンドポイントとフィールドは除きます。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.