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

# Python : India DPDP

> La suite India DPDP dans le SDK Python : client.dpdp.scan / evaluate / emit / require / evidence / sessions / timers, plus l'audit système.

<Info>
  **Concept :** [Guide India DPDP](/concepts/india-dpdp) | **API :** [Vue d'ensemble India DPDP](/api-reference/dpdp-overview)
</Info>

Chaque point de terminaison DPDP est disponible comme méthode typée sur `client.dpdp`. Le sous-client est attaché automatiquement — construisez un `RailScoreClient` et atteignez `client.dpdp.*`. Le client async (`AsyncRAILClient`) expose les mêmes méthodes sur `await client.dpdp.*`.

```python theme={null}
from rail_score_sdk import RailScoreClient

client = RailScoreClient(api_key="YOUR_RAIL_API_KEY")
scan = client.dpdp.scan("Applicant PAN ABCDE1234F", pii_action="mask")
```

```mermaid theme={null}
flowchart TD
    S["client.dpdp.create_session(purpose=...)"] --> E["client.dpdp.emit([...])"]
    E --> SC["client.dpdp.scan(content, pii_action=...)"]
    SC --> EV{"client.dpdp.evaluate(action, context)"}
    EV -- "require_action" --> RQ["client.dpdp.require(session_id, workflow_step)"]
    EV -- "allow" --> OK["procéder"]
    E --> T["client.dpdp.list_timers(status='active')"]
    T --> EVD["client.dpdp.evidence(type, params)"]
```

## Scanner le contenu pour les PII indiens

Détectez Aadhaar (validé Verhoeff), PAN, UPI, mobile et plus, plus les signaux d'enfants (S.9) et la dérive d'objectif (S.4). Choisissez `detect`, `mask` ou `block`.

<CodeGroup>
  ```python Détecter theme={null}
  result = client.dpdp.scan(
      "Applicant PAN is ABCDE1234F and mobile 9876543210.",
      pii_action="detect",
      purpose="loan_advisory",
  )
  print(result.compliant, [p.type for p in result.pii_found])
  ```

  ```python Masquer theme={null}
  result = client.dpdp.scan(
      "Aadhaar 2341 5678 9012 on file.",
      pii_action="mask",
  )
  print(result.content_masked)
  ```
</CodeGroup>

## Gater une décision

`evaluate` retourne un verdict déterministe — `allow`, `block` ou `require_action` — pour l'action que vous êtes sur le point de prendre.

```python theme={null}
decision = client.dpdp.evaluate(
    action="make_decision",
    context={"user_id": "u_42", "purpose": "loan_advisory"},
    session_id="sess_1a2b3c",  # optionnel, lie la décision à une session
)

if decision.verdict == "require_action":
    print("Outstanding obligations:", decision.required_actions)
```

## Enregistrer les événements

`emit` écrit 1–50 événements de conformité et démarre automatiquement les minuteurs statutaires qu'ils déclenchent (par exemple, `dsr.received` démarre l'horloge de réponse).

```python theme={null}
client.dpdp.emit(
    [
        {"type": "notice.shown", "data": {"user_id": "u_42"}},
        {"type": "consent.granted", "data": {"user_id": "u_42", "purpose": "loan_advisory"}},
    ],
    session_id="sess_1a2b3c",
)
```

## Actions requises pour une étape de flux de travail

```python theme={null}
required = client.dpdp.require(
    session_id="sess_1a2b3c",
    workflow_step="data_processing",
)
for action in required.required_actions:
    print(action)
```

## Sessions

Une session enfile le parcours d'un seul sujet des données. `create_session` nécessite un `purpose` — le SDK lève `ValueError` immédiatement s'il est vide (il ne gaspillera pas un aller-retour).

```python theme={null}
session = client.dpdp.create_session(
    purpose="loan_advisory",
    entity_type="data_fiduciary",
)
fetched = client.dpdp.get_session(session.session_id)
print(fetched.state.consent_status)
```

## Minuteurs

Listez les minuteurs de délai réglementaires, filtrés par statut, type ou proximité.

```python theme={null}
timers = client.dpdp.list_timers(status="active", approaching_days=30)
print(timers.summary.total_active)
for t in timers.timers:
    print(t.type, t.days_remaining)
```

## Evidence (Pro+)

Assemblez un paquet de qualité audit à partir de la piste enregistrée de la session.

```python theme={null}
packet = client.dpdp.evidence(
    evidence_type="dsr_response",
    params={"session_id": "sess_1a2b3c", "request_id": "r_9"},
)
```

## Audit système

`dpdp_audit` exécute une évaluation de conformité en étapes d'une description de système, avec contexte spécifique à l'entité et notation d'exposition aux pénalités. Il enveloppe la vérification de conformité hébergée, donc il est **hébergé uniquement**.

```python theme={null}
from rail_score_sdk import DPDPHostedOnlyError

try:
    audit = client.dpdp.dpdp_audit(
        content="Our fintech processes Aadhaar for KYC; consent via checkbox.",
        entity_type="data_fiduciary",
        sector="finance",
    )
    print(audit.overall_label, audit.total_penalty_exposure_crore)
except DPDPHostedOnlyError:
    # Levé lorsqu'il pointe vers un agent self-hosted qui ne sert pas l'audit.
    print("dpdp_audit runs against the hosted API only.")
```

<Warning>
  `dpdp_audit` et la vérification de conformité sous-jacente sont disponibles sur l'API **hébergée** uniquement. Contre un agent RAIL self-hosted le SDK lève `DPDPHostedOnlyError` au lieu d'un 404/501 brut.
</Warning>

## Gestion des erreurs

Les méthodes DPDP lèvent les erreurs SDK standard (`AuthenticationError`, `RateLimitError`, `InsufficientTierError` pour `evidence` inférieur à Pro) plus des erreurs spécifiques à DPDP.

```python theme={null}
from rail_score_sdk import DPDPHostedOnlyError
from rail_score_sdk import AuthenticationError, RateLimitError

try:
    client.dpdp.scan("...", pii_action="block")
except AuthenticationError:
    print("Check your API key")
except RateLimitError:
    print("Slow down requests")
```

## Connexe

<CardGroup cols={2}>
  <Card title="Référence API DPDP" icon="shield-halved" href="/api-reference/dpdp-overview">
    Chaque point de terminaison, coûts en crédits et l'enveloppe de réponse.
  </Card>

  <Card title="Configuration" icon="gear" href="/sdk/python/configuration">
    Inspectez la politique, les capacités de plan et les dimensions de votre application.
  </Card>
</CardGroup>
