> ## 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 Python Didit untuk KYC, AML, dan Transaksi

> Panduan cepat SDK Python resmi Didit: klien sinkron dan asinkron bertipe untuk API server, verifikasi webhook, dan pemeriksaan token autentikasi.

Library resmi Didit untuk Python. Membutuhkan Python 3.10 atau versi yang lebih baru, dan menyediakan klien sinkron, `Didit`, serta klien asinkron, `AsyncDidit`, dengan metode yang sama. 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}
pip install didit-sdk
```

Paketnya adalah [`didit-sdk` di PyPI](https://pypi.org/project/didit-sdk/). Sumber dan log perubahannya ada di [didit-protocol/sdk-python](https://github.com/didit-protocol/sdk-python) di GitHub.

Untuk memverifikasi token [Authentication](#verifikasi-token-authentication), instal paket tambahan yang menambahkan pemeriksaan tanda tangan:

```bash theme={null}
pip install "didit-sdk[auth]"
```

## Konfigurasi klien

`Didit()` membaca `DIDIT_API_KEY` dari lingkungan. Berikan opsi untuk menimpanya, atau untuk mengatur ID organisasi dan ID aplikasi yang dibutuhkan panggilan berlingkup aplikasi (kasus, jaringan, laporan regulasi).

```python theme={null}
import os

from didit import Didit

client = Didit(
    api_key=os.environ["DIDIT_API_KEY"],
    organization_id=os.environ.get("DIDIT_ORGANIZATION_ID"),
    application_id=os.environ.get("DIDIT_APPLICATION_ID"),
    timeout=30,
    max_retries=2,
)

# Options for a single call.
fast = client.with_options(timeout=5, max_retries=0)
```

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

```python theme={null}
from didit import Didit

client = Didit()

session = client.sessions.create(
    workflow_id="11111111-2222-3333-4444-555555555555",
    vendor_data="user-123",
    callback="https://example.com/verification/done",
)
print(session.url)
```

## Membaca keputusan

Saat pengguna selesai (atau saat webhook tiba), [baca keputusannya](https://docs.didit.me/id/sessions-api/retrieve-session.md). Setiap hasil fitur berupa daftar dengan satu entri untuk setiap node alur kerja.

```python theme={null}
from didit import Didit

client = Didit()

decision = client.sessions.retrieve_decision("11111111-2222-3333-4444-555555555555")
print(decision.status)
for verification in decision.id_verifications or []:
    print(verification.first_name, verification.last_name)
```

## Verifikasi webhook

Berikan byte isi mentah yang persis sama dan header permintaan. `verify` memunculkan `WebhookVerificationError` untuk setiap pengiriman yang tidak valid atau sudah kedaluwarsa, jadi menangkap kelas tersebut saja sudah cukup.

```python theme={null}
import os

import didit

WEBHOOK_SECRET = os.environ["DIDIT_WEBHOOK_SECRET"]


def handle_webhook(raw_body: bytes, headers: didit.webhooks.HeadersLike) -> int:
    try:
        event = didit.webhooks.verify(raw_body, headers, WEBHOOK_SECRET)
    except didit.WebhookVerificationError as error:
        print("rejected:", error.reason)
        return 400
    if isinstance(event, didit.webhooks.SessionStatusUpdatedEvent):
        print(event.session_id, event.status)
    return 200
```

Di Flask, caranya `handle_webhook(request.get_data(), dict(request.headers))`; di FastAPI, `handle_webhook(await request.body(), request.headers)`. Selama Anda merotasi rahasia, berikan keduanya: `[new_secret, old_secret]`. Lihat [Webhook](https://docs.didit.me/id/integration/webhooks.md) untuk event webhook dan skema tanda tangannya.

## Skrining transaksi

Kirim pembayaran, penarikan, atau transfer kripto ke [Pemantauan Transaksi](https://docs.didit.me/id/transaction-monitoring/overview.md); respons memuat statusnya dan skor risikonya.

```python theme={null}
from didit import Didit

client = Didit()

transaction = client.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"},
)
print(transaction.status, transaction.score)
```

## Verifikasi token Authentication

`didit.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, memperbarui token, memeriksa dan mencabut sesi, serta menjalankan autentikasi step-up.

> [!NOTE]
>
> Verifikasi token melakukan pemeriksaan 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.

```python theme={null}
from didit.authentication import Authentication, TokenVerificationError

# The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
auth = Authentication.from_publishable_key("pk_live_...", client_id="your-application-id")


def current_user(access_token: str) -> str | None:
    try:
        claims = auth.verify_access_token(access_token)
    except TokenVerificationError as error:
        print("rejected:", error.reason)
        return None
    return claims.sub
```

## Kesalahan

```python theme={null}
import didit
from didit import Didit

client = Didit()

try:
    client.sessions.retrieve_decision("11111111-2222-3333-4444-555555555555")
except didit.NotFoundError:
    print("no such session")
except didit.RateLimitError as error:
    print("slow down, request", error.request_id)
except didit.APIStatusError as error:
    print(error.status_code, error.body)
```

## Daftar, berkas, dan asinkron

```python theme={null}
import asyncio
from pathlib import Path

from didit import AsyncDidit, Didit

client = Didit()

# Lists page through every result.
for session in client.sessions.list(status="Approved"):
    print(session.session_id)

# Uploads take a path, bytes or an open file.
result = client.id_verification.verify(front_image=Path("id-front.jpg"), back_image=Path("id-back.jpg"))
print(result.id_verification)


async def main() -> None:
    async with AsyncDidit() as aclient:
        session = await aclient.sessions.create(workflow_id="11111111-2222-3333-4444-555555555555")
        print(session.url)


asyncio.run(main())
```

Halaman endpoint server di [referensi API](https://docs.didit.me/id/api-reference/overview.md) memiliki contoh Python untuk operasinya, kecuali endpoint dan kolom yang belum ada di rilis 1.0.1 mana pun, yang disebutkan di [ringkasan](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.