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

# Didit Python SDK: KYC, AML, 거래 모니터링

> Didit 공식 Python SDK 퀵스타트: 서버 API용 동기·비동기 타입 지원 클라이언트, webhook 검증, 인증 토큰 확인을 안내합니다.

Python용 공식 Didit 라이브러리입니다. Python 3.10 이상이 필요하며, 동기 클라이언트 `Didit`와 비동기 클라이언트 `AsyncDidit`를 제공합니다. 두 클라이언트는 같은 메서드를 가집니다. 모든 SDK가 공유하는 내용은 [서버 SDK 개요](https://docs.didit.me/ko/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/ko/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/ko/sessions-api/retrieve-session.md). 모든 기능 결과는 워크플로 노드마다 항목 하나씩을 담은 목록입니다.

```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]`. 이벤트와 서명 방식은 [Webhooks](https://docs.didit.me/ko/integration/webhooks.md)를 참조하십시오.

## 거래 스크리닝

결제, 출금 또는 암호화폐 송금을 [거래 모니터링](https://docs.didit.me/ko/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/ko/authentication/overview.md) 발급자가 서명한 액세스 토큰을 검사하며, 요청마다 Didit을 호출하지 않습니다. 또한 코드를 교환하고, 토큰을 갱신하며, 세션을 확인하고 폐기하고, 스텝업을 실행합니다.

> [!NOTE]
>
> 토큰 검증에서는 [서버에서 토큰 검증](https://docs.didit.me/ko/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/ko/api-reference/overview.md)의 서버 endpoint 페이지에는 각 작업에 대한 Python 샘플이 있습니다. 다만 아직 1.0.1 릴리스에 포함되지 않은 endpoint와 필드는 예외이며, 이는 [개요](https://docs.didit.me/ko/integration/server-sdks/overview.md)에 명시되어 있습니다.


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