> ## 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.

# SDK Node.js dan TypeScript untuk KYC dan AML

> Panduan cepat SDK Node.js dan TypeScript resmi Didit: panggilan API bertipe, verifikasi webhook, dan pemeriksaan token autentikasi.

Pustaka resmi Didit untuk Node.js dan TypeScript. Pustaka ini berjalan di Node.js 18 atau yang lebih baru, Bun, Deno, dan runtime edge dengan `fetch`. Pustaka ini menyediakan build ES module dan CommonJS, serta tidak memiliki dependensi runtime. Lihat [ikhtisar SDK server](https://docs.didit.me/id/integration/server-sdks/overview.md) untuk hal-hal yang dimiliki bersama oleh setiap SDK.

## Instalasi

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

Paket ini tersedia di [`@didit-protocol/sdk-node` di npm](https://www.npmjs.com/package/@didit-protocol/sdk-node). Sumber dan catatan perubahannya ada di [didit-protocol/sdk-node](https://github.com/didit-protocol/sdk-node) di GitHub.

## Mengonfigurasi klien

`new Didit()` membaca `DIDIT_API_KEY` dari lingkungan di Node.js, Bun, dan Deno (dengan `--allow-env`). Runtime edge tidak memiliki lingkungan proses, jadi di sana kunci API harus diteruskan sebagai opsi: `new Didit({ apiKey: env.DIDIT_API_KEY })`. Teruskan opsi untuk menimpa nilai tersebut, atau untuk mengatur ID organisasi dan aplikasi yang dibutuhkan panggilan berlingkup aplikasi (kasus, jaringan, laporan regulasi). Timeout dinyatakan dalam milidetik.

```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"));
```

Dengan CommonJS, gunakan `const { Didit } = require("@didit-protocol/sdk-node");`.

## Membuat sesi

Buat [sesi verifikasi](https://docs.didit.me/id/sessions-api/create-session.md) untuk sebuah alur kerja, lalu arahkan pengguna Anda ke URL-nya. Nama kolom permintaan mengikuti nama yang digunakan 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);
```

## Membaca keputusan

Ketika pengguna menyelesaikan proses (atau ketika webhook tiba), [baca keputusannya](https://docs.didit.me/id/sessions-api/retrieve-session.md). Setiap hasil fitur berupa daftar dengan satu entri per node alur kerja, dan nilai tanggal-waktu berupa objek `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);
}
```

## Memverifikasi webhook

Teruskan body mentah (bukan JSON yang sudah diuraikan) dan header permintaan: objek `req.headers` dari Node.js atau Express, objek `Headers` dari Fetch, atau pasangan `[name, value]` (tipe `WebhookHeaders`). `verify` mengembalikan promise dan menolak dengan `WebhookVerificationError` untuk setiap pengiriman yang tidak valid atau sudah kedaluwarsa.

```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;
  }
}
```

Dengan Express, baca body menggunakan `express.raw({ type: "application/json" })` lalu panggil `handleWebhook(req.body, req.headers)`. Selama Anda merotasi rahasia, teruskan keduanya: `[newSecret, oldSecret]`. Lihat [Webhook](https://docs.didit.me/id/integration/webhooks.md) untuk event webhook dan skema tanda tangan.

## Skrining transaksi

Kirimkan pembayaran, penarikan, atau transfer kripto ke [pemantauan transaksi](https://docs.didit.me/id/transaction-monitoring/overview.md); respons memuat status dan skor risikonya.

```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);
```

## Memverifikasi token Authentication

`Authentication` memeriksa token akses yang ditandatangani oleh penerbit [Authentication](https://docs.didit.me/id/authentication/overview.md) Anda, di backend Anda, tanpa memanggil Didit untuk setiap permintaan. Modul ini juga menukar kode, menyegarkan token, memeriksa dan mencabut sesi, serta menjalankan peningkatan autentikasi.

> [!NOTE]
>
> Verifikasi token melakukan pemeriksaan yang dijelaskan di [Verifikasi token di server Anda](https://docs.didit.me/id/authentication/tokens-and-jwks.md#verifikasi-token-di-server-anda), terhadap penerbit dan kunci penandatanganan aplikasi Anda.

```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;
  }
}
```

## Kesalahan

```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;
}
```

## Daftar dan file

```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);
```

Halaman endpoint server dalam [referensi API](https://docs.didit.me/id/api-reference/overview.md) memiliki contoh Node.js untuk operasinya, kecuali endpoint dan kolom yang belum ada di rilis 1.0.1 mana pun, yang disebutkan di [ikhtisar](https://docs.didit.me/id/integration/server-sdks/overview.md).


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