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

# Mettre à jour le statut de session : approuver ou refuser

> Approuvez, refusez ou passez une session en examen avec l'API Didit (PATCH /v3/session/{id}/update-status/). KYC et KYB. Sans minimum mensuel.



Prompt de mise à jour du statut de session
        Copier le prompt dans le presse-papiers



      
      

\<pre>

\`Manually approve, decline, or re-open a Didit verification session.

Endpoint:
PATCH https://verification.didit.me/v3/session/{session_id}/update-status/

Authentication:
Use the x-api-key header with your Didit API key (or a user-auth token). Privilege: write:sessions.

Path parameter:
\- session_id (UUID) — KYC or KYB; Didit resolves it against both session types.

Request body:
\- new_status (string, required) — One of "Approved", "Declined", "Resubmitted". Any other value is rejected.
\- comment (string, optional) — Free-text note saved on the audit trail (visible in the Console review log).
\- nodes_to_resubmit (array, required when new_status="Resubmitted") — Which feature steps the user must redo. Each entry: { "node_id": "feature_poa_1", "feature": "POA" }. KYB-only nodes "KYB_REGISTRY" and "KYB_KEY_PEOPLE" cannot be resubmitted directly (the parent recomputes from child KYCs).
\- send_email (boolean, optional, default false): if true, email the person. "Approved" and "Declined" send their decision email; "Resubmitted" sends a fresh hosted link with the reasons.
\- email_address (string, required when send_email=true).
\- email_language (string, optional, default "en") — ISO 639-1.
\- email_preview_token (string, optional): the preview_token from Preview Decision Email ("Approved", "Declined") or Preview Resubmission Email ("Resubmitted"). Only valid with send_email=true; without it the request returns 400 { "email_preview_token": ["A preview receipt is only valid when the email is sent."] }. The update then sends exactly the previewed email, or returns 409 before changing anything if the email or the session changed since the preview.

Optional preview step (all three statuses):
1\. Preview the email. Neither call changes the session or sends anything.
\- Approved or Declined: POST https://verification.didit.me/v3/session/{session_id}/decision-email-preview/ with { "new_status": "Approved", "email_language": "en" } (see /sessions-api/preview-decision-email).
\- Resubmitted: POST https://verification.didit.me/v3/session/{session_id}/resubmission-preview/ with { "nodes_to_resubmit": [...], "email_language": "en" } (see /sessions-api/preview-resubmission). email_address is optional there; without it the email goes to the person's own address.
2\. Check subject, html, recipient, will_be_sent and not_sent_reason in the response.
3\. Confirm here with the same new_status (and the same nodes_to_resubmit for Resubmitted), send_email=true, email_address=<recipient>, email_language=<the language you previewed>, email_preview_token=<preview_token>.
The receipt expires after 15 minutes.

Allowed transitions:
Current status must be one of: Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted. Otherwise the API returns 400 { "detail": "Only sessions with status Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted can be updated. Current status: ..." }.
Setting "Approved" or "Declined" on a session that already has that status is a no-op: 200, nothing changes, and no webhook or email goes out. Setting "Resubmitted" on a session that is already Resubmitted returns 400 ["The new status is the same as the current status."].

curl example — approve after manual review:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Approved",
"comment": "Cleared after compliance review."
}'

curl example: approve and send the email you previewed:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Approved",
"send_email": true,
"email_address": "<recipient from the preview>",
"email_language": "en",
"email_preview_token": "<preview_token from the preview>"
}'

curl example — request resubmission of the proof-of-address step:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Resubmitted",
"nodes_to_resubmit": [{ "node_id": "feature_poa_1", "feature": "POA" }],
"comment": "Please upload a clearer proof of address",
"send_email": true,
"email_address": "user@example.com"
}'

Response: { "session_id": "<uuid>" } only. Fetch the refreshed session with GET /v3/session/{session_id}/decision/.

Side effects:
\- Fires a status.updated webhook (plus user.status.updated or business.status.updated alias).
\- Writes an entry to the Console review trail with the actor and your comment.
\- "Approved" or "Declined" with send_email=true emails the decision to email_address. Preview Decision Email tells you beforehand whether it will be sent (for example, not to the contact_details address of a session created without contact_details.send_notification_emails=true).
\- "Resubmitted" sends the user back to the steps in nodes_to_resubmit, resets the session expiration window, and (if send_email=true) emails the user a fresh link. What those steps returned before stays readable: the decision endpoint returns it with include=resubmissions (see Retrieve Session).

Failure modes:
\- 400: invalid new_status (only "Approved", "Declined" and "Resubmitted" are accepted), current status not allowed, nothing to resubmit, send_email=true without email_address, or email_preview_token without send_email=true. Field errors look like { "<field>": ["..."] }.
\- 401: the scoped API key has expired.
\- 403: { "detail": "..." } when credentials are missing or invalid, the caller lacks write:sessions (a scoped API key needs decisions write), or the session belongs to another application.
\- 404: { "detail": "Not found." } when no session with this session_id exists.
\- 409: { "detail": "This email preview changed or expired. Preview the message again before confirming." } when email_preview_token no longer matches the email or the session, or is older than 15 minutes. Nothing changed and no email was sent: preview again.
\- 429 - { "detail": "..." } when a resubmit that only targets backend-only features (AML, DATABASE_VALIDATION, IP_ANALYSIS) repeats within 30 seconds of the previous resubmit. Those features re-run automatically with no user interaction, so an immediate repeat cannot change the outcome; honor the Retry-After header instead of retrying in a loop (e.g. from a webhook handler).

Idempotency:
Repeating "Approved" or "Declined" returns 200 and changes nothing. Repeating "Resubmitted" returns 400.

Next step:
After updating, call GET /v3/session/{session_id}/decision/ to fetch the refreshed payload — see /sessions-api/retrieve-session.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Coller dans

## Prise en charge KYC et KYBCet endpoint fonctionne de la même manière pour les sessions de **Vérification des utilisateurs (KYC)** et de **Vérification d'entreprise (KYB)**. Didit résout le `session_id` pour les deux types de session. La validation des transitions de statut est identique pour les deux, car la même énumération de statuts s'applique aux deux.La réponse ne contient que le `session_id`.
Lisez `session_kind` depuis [Récupérer la session](https://docs.didit.me/fr/sessions-api/retrieve-session.md) lorsque votre logique en aval doit distinguer le type de session.## Transitions autoriséesVous pouvez faire passer une session à `Approved`, `Declined` ou `Resubmitted`.
Tout autre `new_status`, y compris `In Review`, renvoie `400`.
Le statut actuel de la session doit être l'un des suivants : `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned` ou `Resubmitted`. Sinon, l'API renvoie `400`.Définir `Approved` ou `Declined` sur une session qui a déjà ce statut est sans effet : l'API renvoie `200`, ne modifie rien, ne déclenche aucun webhook et n'envoie aucun e-mail.
Définir `Resubmitted` sur une session déjà `Resubmitted` renvoie `400` (`The new status is the same as the current status.`).Une nouvelle soumission dont `nodes_to_resubmit` ne contient que des fonctionnalités exclusivement backend (`AML`, `DATABASE_VALIDATION`, `IP_ANALYSIS`) s'exécute automatiquement et renvoie la session à un statut de décision, sans aucune interaction de l'utilisateur.
Répéter une telle soumission dans les 30 secondes renvoie `429 Too Many Requests` avec un en-tête `Retry-After`, car une répétition immédiate ne peut pas produire un résultat différent.
Ne relancez pas automatiquement une soumission depuis un gestionnaire de webhook chaque fois que vous recevez un statut `In Review` : examinez d'abord le constat ou modifiez les données sous-jacentes.## Prévisualiser l'e-mail d'abordAvec `send_email: true`, `Approved` et `Declined` envoient à la personne son e-mail de décision, et `Resubmitted` lui envoie un nouveau lien accompagné des motifs.
Vous pouvez consulter cet e-mail avant de modifier quoi que ce soit :1) Appelez [Prévisualiser l'e-mail de décision](https://docs.didit.me/fr/sessions-api/preview-decision-email.md) pour `Approved` ou `Declined`, ou [Prévisualiser l'e-mail de nouvelle soumission](https://docs.didit.me/fr/sessions-api/preview-resubmission.md) pour `Resubmitted`.
2) Vérifiez le `subject` et le `html` rendus, le `recipient`, ainsi que `will_be_sent` / `not_sent_reason`.
3) Appelez cet endpoint avec le même `new_status` (et, pour une nouvelle soumission, les mêmes `nodes_to_resubmit`), `send_email: true`, `email_address` défini sur `recipient`, la valeur `email_language` que vous avez prévisualisée, et `email_preview_token` défini sur `preview_token`.Ni l'une ni l'autre des prévisualisations ne modifie la session ni n'envoie quoi que ce soit.
La mise à jour envoie alors exactement l'e-mail que vous avez prévisualisé.
Le reçu expire au bout de 15 minutes.
Si le destinataire, la langue, le statut de la session, l'expéditeur ou l'e-mail ont changé depuis la prévisualisation, la mise à jour renvoie `409` avant toute modification. Relancez la prévisualisation et confirmez avec le nouveau reçu.
Envoyer `email_preview_token` sans `send_email: true` renvoie `400`.
L'étape de prévisualisation est facultative : les intégrations existantes peuvent continuer d'appeler ce point de terminaison sans elle.## Exemples> [tab] Approuver une session de Vérification des utilisateurs (KYC)
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "comment": "Cleared after manual review by compliance team"
>   }'
> ```> [tab] Refuser une session de Vérification d'entreprise (KYB)
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/bs-01HJX1.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Declined",
>     "comment": "Sanctioned subsidiary detected in ownership chain"
>   }'
> ```> [tab] Demander une nouvelle soumission
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Resubmitted",
>     "nodes_to_resubmit": [
>       { "node_id": "feature_poa_1", "feature": "POA" }
>     ],
>     "comment": "Please upload a clearer proof of address",
>     "send_email": true,
>     "email_address": "user@example.com"
>   }'
> ```> [tab] Approuver et envoyer l'e-mail prévisualisé
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "send_email": true,
>     "email_address": "user@example.com",
>     "email_language": "en",
>     "email_preview_token": "PREVIEW_TOKEN_FROM_THE_PREVIEW"
>   }'
> ```## AutorisationNécessite le privilège `write:sessions`. Le même privilège couvre les deux types de session.## Ressources associées- [Statuts de vérification](https://docs.didit.me/fr/integration/verification-statuses.md) : référence de la machine à états des statuts.
- [Récupérer la session](https://docs.didit.me/fr/sessions-api/retrieve-session.md) : récupérez la décision après la mise à jour.
- [Vue d'ensemble des sessions](https://docs.didit.me/fr/sessions-api/overview.md) : distinction entre les types de session.
- [Prévisualiser l'e-mail de décision](https://docs.didit.me/fr/sessions-api/preview-decision-email.md) : consultez l'e-mail Approved ou Declined avant de l'envoyer.
- [Prévisualiser l'e-mail de nouvelle soumission](https://docs.didit.me/fr/sessions-api/preview-resubmission.md) : consultez l'e-mail de nouvelle soumission avant de l'envoyer.


## OpenAPI

````yaml fr/openapi-25.json PATCH /v3/session/{sessionId}/update-status/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/update-status/:
    patch:
      tags:
        - Sessions
      summary: >-
        Approuver, refuser ou demander une nouvelle soumission pour une session
        de vérification
      description: "Remplacez manuellement la décision finale d'une session de vérification KYC ou KYB. Définissez `new_status` sur `Approved` ou `Declined` pour consigner une décision manuelle, ou sur `Resubmitted` pour effacer des étapes de vérification spécifiques et permettre à l'utilisateur de les refaire via la même URL de vérification. L'endpoint accepte aussi bien les identifiants de session d'utilisateurs (KYC) que d'entreprises (KYB).\n\nAppelez-le dès qu'une session a atteint un état examinable\_: le statut actuel doit être `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned` ou `Resubmitted`. Les sessions toujours `Not Started`, `In Progress` ou `Awaiting User`, ou qui se sont terminées par `Expired`, renvoient `400`. Votre clé API doit disposer de l'autorisation `write:sessions` (une clé API restreinte nécessite un accès en écriture aux décisions). La vérification de l'état d'éligibilité s'exécute avant la validation du corps de requête\_; une session inéligible renvoie donc l'erreur `Wrong Current Status` même lorsque le payload est également invalide.\n\nPour `Resubmitted`, transmettez `nodes_to_resubmit` pour choisir les étapes du workflow que l'utilisateur doit refaire, ou omettez-le pour sélectionner automatiquement les tentatives existantes des fonctionnalités dans un état pouvant être soumis à nouveau (`Declined`, `In Review`, `Not Finished`, `Expired`). Les fonctionnalités jamais tentées ne sont pas sélectionnées automatiquement\_: indiquez-les explicitement dans `nodes_to_resubmit`, sinon la requête renvoie `400` lorsqu'aucune tentative enregistrée ne nécessite de nouvelle soumission. Les résultats précédents des étapes sélectionnées sont déplacés vers l'historique de la nouvelle soumission (renvoyé par Get Decision avec `include=resubmissions`), les étapes sont réordonnées pour correspondre au graphe du workflow, la fenêtre d'expiration de la session redémarre et l'URL de vérification d'origine redevient utilisable. Les étapes exécutées uniquement côté backend (`AML`, `DATABASE_VALIDATION`, `IP_ANALYSIS`) en tête de liste s'exécutent immédiatement sans intervention de l'utilisateur\_; si toutes les étapes soumises à nouveau sont uniquement côté backend, la session est finalisée à nouveau au sein de la même requête. `KYB_REGISTRY` et `KYB_KEY_PEOPLE` ne peuvent pas être soumis à nouveau directement\_: soumettez plutôt à nouveau les sessions KYC enfants concernées, et la session d'entreprise parente est recalculée automatiquement.\n\nChaque appel modifiant le statut déclenche le [webhook](/fr/integration/webhooks) `status.updated` une fois la modification validée et ajoute une entrée d'activité (avec attribution de l'intervenant et votre `comment`) aux `reviews` de la session, visible dans [Get Decision](#get-/v3/session/-sessionId-/decision/) et dans la chronologie d'activité de la console. Les agrégats de profil utilisateur associés aux `vendor_data` de la session sont également mis à jour. Un refus désactive la surveillance AML continue pour la session\_; une nouvelle approbation la réactive (depuis `Resubmitted`, `Declined` ou `Kyc Expired`) lorsque la surveillance est activée dans le workflow. Approuver ou refuser un KYC enfant faisant partie d'une vérification des personnes clés d'un KYB recalcule le statut de la session d'entreprise parente. Définissez `send_email: true` (avec `email_address`) pour avertir l'utilisateur\_: un avis de statut pour `Approved`/`Declined`, ou un e-mail de nouvelle soumission contenant le lien de vérification et les motifs par étape pour `Resubmitted`. Pour vérifier l'e-mail au préalable, prévisualisez-le avec [Preview Decision Email](/fr/sessions-api/preview-decision-email) (`Approved`, `Declined`) ou [Preview Resubmission Email](/fr/sessions-api/preview-resubmission) (`Resubmitted`) et transmettez son `preview_token` dans `email_preview_token`\_: la mise à jour envoie alors exactement l'e-mail prévisualisé, ou renvoie `409` avant toute modification si l'e-mail ou la session a changé depuis la prévisualisation ou si le reçu date de plus de 15 minutes.\n\nRépéter `Approved` ou `Declined` sur une session ayant déjà ce statut ne modifie rien et renvoie `200`\_: aucun webhook, aucune entrée d'activité et aucun e-mail. Répéter `Resubmitted` renvoie `400` (`The new status is the same as the current status.`). Des identifiants manquants ou invalides et des autorisations manquantes renvoient `403`\_; une clé API restreinte expirée renvoie `401`."
      operationId: patch_v3_session_update_status
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            UUID de la session de vérification à mettre à jour. Accepte les
            identifiants de session d'utilisateur (KYC) et d'entreprise (KYB) —
            le service résout l'identifiant pour les deux types de session.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - new_status
              properties:
                new_status:
                  type: string
                  description: >-
                    Statut cible. `Approved` et `Declined` enregistrent une
                    décision manuelle définitive (chacun pouvant également
                    annuler l'autre). `Resubmitted` efface les étapes
                    sélectionnées et renvoie la session à l'utilisateur. Toute
                    autre valeur renvoie `400`.
                  enum:
                    - Approved
                    - Declined
                    - Resubmitted
                  example: Approved
                comment:
                  type: string
                  description: >-
                    Motif en texte libre du changement, stocké dans l'historique
                    d'examen de la session et renvoyé dans le tableau `reviews`
                    de [Get Decision](#get-/v3/session/-sessionId-/decision/).
                    Par exemple `Duplicated user`.
                  example: All checks passed manual review
                nodes_to_resubmit:
                  type: array
                  description: >-
                    Étapes du workflow que l'utilisateur doit recommencer.
                    Prises en compte uniquement lorsque `new_status` est
                    `Resubmitted`. Pour `Approved`/`Declined`, les entrées font
                    toujours l'objet d'une validation de schéma (une valeur
                    `feature` non valide renvoie `400`), mais les entrées
                    valides selon le schéma sont sémantiquement ignorées. En cas
                    d'omission, le serveur sélectionne automatiquement les
                    tentatives existantes d'OCR, de détection du vivant, de
                    correspondance faciale, de justificatif de domicile, de
                    téléphone, d'e-mail, d'AML, de validation en base de données
                    et de questionnaire dont le statut est `Declined`, `In
                    Review`, `Not Finished` ou `Expired` (les tentatives de NFC,
                    d'analyse de l'IP, d'estimation de l'âge, de recherche
                    faciale et de documents KYB ne sont jamais sélectionnées
                    automatiquement ; les tentatives faciales hors
                    correspondance faciale sont sélectionnées en tant que
                    `LIVENESS`) — les fonctionnalités que l'utilisateur n'a
                    jamais tentées (aucune tentative enregistrée) ne sont PAS
                    sélectionnées, de sorte qu'une session avec zéro tentative
                    renvoie `400` (« No features found that need resubmission »)
                    même si rien n'a été approuvé ; transmettez explicitement
                    `nodes_to_resubmit` dans ce cas. Les étapes sont exécutées
                    dans l'ordre du graphe du workflow, quel que soit l'ordre
                    dans lequel vous les envoyez. `KYB_REGISTRY`,
                    `KYB_KEY_PEOPLE` et l'alias `KYB` sont rejetés avec un code
                    `400` — ces vérifications parentes sont recalculées à partir
                    de leurs sessions KYC enfants.
                  items:
                    type: object
                    required:
                      - node_id
                      - feature
                    properties:
                      node_id:
                        type: string
                        description: >-
                          Identifiant du nœud tel qu'il apparaît dans la
                          définition du workflow de la session (par exemple
                          `feature_ocr`, `feature_liveness`).
                        example: feature_ocr
                      feature:
                        type: string
                        description: >-
                          Type de fonctionnalité du nœud. Les alias
                          `ID_VERIFICATION`, `POA`, `PHONE` et `EMAIL` sont
                          normalisés côté serveur en `OCR`, `PROOF_OF_ADDRESS`,
                          `PHONE_VERIFICATION` et `EMAIL_VERIFICATION`.
                          `KYB_REGISTRY`, `KYB_KEY_PEOPLE` et `KYB` passent la
                          validation du schéma mais sont toujours rejetés avec
                          l'erreur de règle métier `400` montrée dans les
                          exemples.
                        enum:
                          - OCR
                          - OCR_BACK
                          - NFC
                          - AML
                          - FACE
                          - LIVENESS
                          - FACE_MATCH
                          - IP_ANALYSIS
                          - AGE_ESTIMATION
                          - PROOF_OF_ADDRESS
                          - PHONE_VERIFICATION
                          - EMAIL_VERIFICATION
                          - FACE_SEARCH
                          - DATABASE_VALIDATION
                          - QUESTIONNAIRE
                          - DOCUMENT_AI
                          - KYB_DOCUMENTS
                          - ID_VERIFICATION
                          - POA
                          - PHONE
                          - EMAIL
                          - KYB_REGISTRY
                          - KYB_KEY_PEOPLE
                          - KYB
                          - GEOLOCATION
                        example: OCR
                send_email:
                  type: boolean
                  description: >-
                    Indique s'il faut envoyer un e-mail à l'utilisateur
                    concernant le changement. Nécessite `email_address`. Pour
                    `Approved`/`Declined`, l'utilisateur reçoit une notification
                    de statut ; pour `Resubmitted`, l'e-mail comprend le lien de
                    vérification et les motifs de resoumission par étape.
                  default: false
                  example: false
                email_address:
                  type: string
                  format: email
                  description: >-
                    Destinataire de l'e-mail de notification. **Requis lorsque
                    `send_email` est `true`** — l'omettre renvoie `400`.
                  example: user@example.com
                email_language:
                  type: string
                  description: >-
                    Langue de l'e-mail de notification. Accepte n'importe quelle
                    chaîne au niveau du schéma ; les codes non pris en charge
                    basculent silencieusement sur l'anglais (`en`).
                  default: en
                  example: en
                email_preview_token:
                  type: string
                  writeOnly: true
                  minLength: 1
                  maxLength: 512
                  description: >-
                    Reçu optionnel issu de [Preview Decision
                    Email](/fr/sessions-api/preview-decision-email) (pour
                    `Approved` et `Declined`) ou de [Preview Resubmission
                    Email](/fr/sessions-api/preview-resubmission) (pour
                    `Resubmitted`) : son `preview_token`. Valide uniquement avec
                    `send_email: true` ; sans cela, la requête renvoie `400`. Le
                    destinataire, la langue, le statut de la session,
                    l'expéditeur et l'e-mail (et, pour une nouvelle soumission,
                    les étapes sélectionnées) doivent toujours correspondre à
                    l'aperçu, et le reçu expire après 15 minutes. Dans le cas
                    contraire, la requête renvoie `409` avant que la session ne
                    soit modifiée ou qu'un e-mail ne soit envoyé. Les
                    intégrations existantes peuvent omettre ce champ.
            examples:
              Approve Session:
                summary: Approuver une session après examen manuel
                value:
                  new_status: Approved
                  comment: All checks passed manual review
              Decline Session:
                summary: Refuser une session
                value:
                  new_status: Declined
                  comment: Suspected fraud
              Resubmit Specific Steps:
                summary: >-
                  Demander une nouvelle soumission pour les étapes choisies, par
                  e-mail
                value:
                  new_status: Resubmitted
                  nodes_to_resubmit:
                    - node_id: feature_ocr
                      feature: OCR
                    - node_id: feature_liveness
                      feature: LIVENESS
                  send_email: true
                  email_address: user@example.com
                  email_language: en
              Resubmit Auto-select:
                summary: >-
                  Demander une nouvelle soumission (sélectionne automatiquement
                  les étapes non approuvées)
                value:
                  new_status: Resubmitted
              Approve With Previewed Email:
                summary: >-
                  Approuver et envoyer l'e-mail renvoyé par Preview Decision
                  Email
                value:
                  new_status: Approved
                  send_email: true
                  email_address: person@example.com
                  email_language: en
                  email_preview_token: >-
                    eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000
      responses:
        '200':
          description: >-
            Statut mis à jour. La réponse contient uniquement le `session_id` ;
            récupérez la session mise à jour via [Get
            Decision](#get-/v3/session/-sessionId-/decision/). Le webhook
            `status.updated` se déclenche dès que la modification est
            enregistrée. Répéter `Approved` ou `Declined` renvoie le même corps
            et ne modifie rien.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: UUID de la session mise à jour.
              examples:
                Updated:
                  summary: Renvoyé indifféremment pour Approuvé, Refusé et Resoumis
                  value:
                    session_id: 3472fb7c-8f7c-4d1a-9cf4-cf3d74ce1a60
        '400':
          description: >-
            Erreur de validation. Les erreurs de champ sont renvoyées sous la
            forme `{"<field>": ["<message>"]}` (certains refus liés aux règles
            métier utilisent plutôt une chaîne : `{"nodes_to_resubmit":
            "<message>"}`), les erreurs de transition d'état sous la forme
            `{"detail": "<message>"}`, et l'erreur d'état identique sous la
            forme d'un tableau JSON simple.
          content:
            application/json:
              examples:
                Wrong Current Status:
                  summary: La session n'est pas dans un état modifiable
                  value:
                    detail: >-
                      Only sessions with status Approved, Declined, In Review,
                      Kyc Expired, Abandoned, Resubmitted can be updated.
                      Current status: In Progress
                Invalid Status Value:
                  summary: >-
                    new_status est un statut de session réel mais ne fait pas
                    partie de Approved/Declined/Resubmitted
                  value:
                    new_status:
                      - >-
                        You can only update the status to 'Approved',
                        'Declined', or 'Resubmitted'.
                Missing new_status:
                  summary: Champ obligatoire omis
                  value:
                    new_status:
                      - This field is required.
                Same Status:
                  summary: Resoumission demandée sur une session qui est déjà resoumise
                  value:
                    - The new status is the same as the current status.
                Email Address Required:
                  summary: send_email true sans email_address
                  value:
                    email_address:
                      - Email address is required when send_email is true.
                Non-resubmittable Feature:
                  summary: La resoumission cible une vérification parente KYB
                  value:
                    nodes_to_resubmit: >-
                      The following features cannot be resubmitted directly:
                      KYB_REGISTRY. Resubmit the relevant child KYC sessions
                      instead; the parent will recompute automatically.
                Nothing To Resubmit:
                  summary: >-
                    La sélection automatique n'a trouvé aucune fonctionnalité
                    non approuvée
                  value:
                    nodes_to_resubmit: >-
                      No features found that need resubmission. All features are
                      already approved.
                Invalid Feature Choice:
                  summary: Fonctionnalité inconnue dans nodes_to_resubmit
                  value:
                    nodes_to_resubmit:
                      - feature:
                          - >-
                            "BOGUS" is not a valid choice. Valid choices are:
                            OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH,
                            IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS,
                            PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH,
                            DATABASE_VALIDATION, QUESTIONNAIRE, KYB_REGISTRY,
                            KYB_DOCUMENTS, KYB_KEY_PEOPLE, ID_VERIFICATION, POA,
                            PHONE, EMAIL, KYB
                Invalid Status Value (not a status at all):
                  summary: new_status n'est pas une valeur StatusChoices valide
                  value:
                    new_status:
                      - '"Bogus" is not a valid choice.'
                Preview Receipt Without Email:
                  summary: 'email_preview_token envoyé sans send_email: true'
                  value:
                    email_preview_token:
                      - A preview receipt is only valid when the email is sent.
        '401':
          description: La clé API restreinte a expiré.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: Clé API restreinte ayant dépassé sa date d'expiration
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Identifiants manquants ou autorisations insuffisantes, ou un
            `session_id` qui appartient à une autre application.
          content:
            application/json:
              examples:
                Invalid Credentials:
                  summary: x-api-key manquant ou invalide
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Missing Privilege:
                  summary: La clé API ne dispose pas de l'autorisation write:sessions
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Aucune session KYC ou KYB avec ce `session_id` n'existe (les
            sessions supprimées renvoient également `404`).
          content:
            application/json:
              examples:
                Not Found:
                  summary: session_id inconnu
                  value:
                    detail: Not found.
        '409':
          description: >-
            L'aperçu de l'e-mail a changé ou a expiré. Générez un nouvel aperçu
            avant de confirmer ; aucune modification de session ni livraison
            d'e-mail n'a lieu.
          content:
            application/json:
              examples:
                Preview Changed:
                  summary: Le reçu ne correspond plus ou a plus de 15 minutes
                  value:
                    detail: >-
                      This email preview changed or expired. Preview the message
                      again before confirming.
        '429':
          description: >-
            Une nouvelle soumission ciblant uniquement des fonctionnalités
            exclusivement backend (AML, DATABASE_VALIDATION, IP_ANALYSIS) a été
            répétée pendant la période de temporisation de 30 secondes ; une
            répétition immédiate ne peut pas modifier le résultat. Réduisez la
            cadence et réessayez après l'intervalle indiqué dans `Retry-After`.
          content:
            application/json:
              examples:
                Backend-only resubmit throttled:
                  value:
                    detail: >-
                      This session was already resubmitted for backend-only
                      features within the last 30 seconds; repeating it cannot
                      change the outcome. Wait before resubmitting again.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X PATCH \
              https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-status/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "new_status": "Approved",
                "comment": "All checks passed manual review"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.update_status(
                "11111111-2222-3333-4444-555555555555",
                new_status="Approved",
                comment="All checks passed manual review",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const result = await
            didit.sessions.updateStatus("11111111-2222-3333-4444-555555555555",
            {
              new_status: "Approved",
              comment: "All checks passed manual review",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateStatusParams{\n\tNewStatus: \"Approved\",\n\tComment:   didit.String(\"All checks passed manual review\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.SessionsUpdateStatusParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().updateStatus("11111111-2222-3333-4444-555555555555",
            SessionsUpdateStatusParams.builder()
                    .newStatus(SessionsUpdateStatusParams.NewStatus.of("Approved"))
                    .comment("All checks passed manual review")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $result =
            $didit->sessions->updateStatus('11111111-2222-3333-4444-555555555555',
            [
                'new_status' => 'Approved',
                'comment' => 'All checks passed manual review',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.sessions.update_status(
              "11111111-2222-3333-4444-555555555555",
              new_status: "Approved",
              comment: "All checks passed manual review"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await
            client.Sessions.UpdateStatusAsync("11111111-2222-3333-4444-555555555555",
            new SessionsUpdateStatusParams

            {
                NewStatus = "Approved",
                Comment = "All checks passed manual review",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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