> ## 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・取引モニタリング向けPython SDK

> Didit公式Python SDKのクイックスタート。サーバーAPI向けの型付き同期・非同期クライアント、Webhook署名検証、認証トークンの確認方法を解説します。

PythonのDidit公式ライブラリです。Python 3.10以降が必要で、同じメソッドを備えた同期クライアント`Didit`と非同期クライアント`AsyncDidit`を提供します。すべてのSDKに共通する内容は[サーバーSDKの概要](https://docs.didit.me/ja/integration/server-sdks/overview.md)を参照してください。

## インストール

```bash theme={null}
pip install didit-sdk
```

パッケージは[PyPIの`didit-sdk`](https://pypi.org/project/didit-sdk/)です。ソースコードと変更履歴はGitHubの[didit-protocol/sdk-python](https://github.com/didit-protocol/sdk-python)にあります。

[Authentication](#authenticationトークンの検証)のトークンを検証するには、署名チェックを追加する追加機能をインストールします。

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

## クライアントの設定

`Didit()`は環境から`DIDIT_API_KEY`を読み取ります。これを上書きする場合や、アプリケーションスコープの呼び出し(ケース、ネットワーク、規制レポート)に必要な組織IDとアプリケーションIDを設定する場合は、オプションを渡します。

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

## セッションの作成

ワークフローに対して[認証セッション](https://docs.didit.me/ja/sessions-api/create-session.md)を作成し、ユーザーをそのURLに誘導します。

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

## 判定の取得

ユーザーが完了したとき(またはWebhookが届いたとき)に、[判定を取得](https://docs.didit.me/ja/sessions-api/retrieve-session.md)します。各機能の結果は、ワークフローのノードごとに1つのエントリーを含むリストです。

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

## Webhookの検証

生のボディのバイト列をそのまま、リクエストヘッダーとともに渡します。`verify`は有効で、許容時間内に配信されたものではない場合に対して`WebhookVerificationError`を発生させるため、このクラスだけを捕捉すれば十分です。

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

Flaskでは`handle_webhook(request.get_data(), dict(request.headers))`、FastAPIでは`handle_webhook(await request.body(), request.headers)`となります。シークレットをローテーションする間は、`[new_secret, old_secret]`のように両方を渡します。イベントと署名方式については[Webhook](https://docs.didit.me/ja/integration/webhooks.md)を参照してください。

## 取引のスクリーニング

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

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

## Authenticationトークンの検証

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

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

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

## エラー

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

## リスト、ファイル、非同期

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

[APIリファレンス](https://docs.didit.me/ja/api-reference/overview.md)のサーバーエンドポイントの各ページには、その操作のPythonサンプルが掲載されています。ただし、[概要](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.