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

# Actualitzar estat de sessió: API d'aprovació i rebuig

> Aprova, rebutja o posa en revisió una sessió amb PATCH /v3/session/{id}/update-status/. Per a KYC i KYB. Didit: preus per ús, sense mínims mensuals.



Indicació per actualitzar l'estat de la sessió
        Copia el prompt al porta-retalls



      
      

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



      
      

Enganxa a

## Suport de KYC i KYBAquest endpoint funciona de la mateixa manera per a les sessions de **Verificació d'usuaris (KYC)** i de **Verificació d'empreses (KYB)**. Didit resol el `session_id` amb tots dos tipus de sessió; la validació de les transicions d'estat és la mateixa per a tots dos (s'aplica el mateix enum d'estats a tots dos).La resposta només inclou el `session_id`.
Llegeix el `session_kind` de [Retrieve Session](https://docs.didit.me/ca/sessions-api/retrieve-session.md) quan la lògica posterior necessiti distingir el tipus de sessió.## Transicions permesesPots passar una sessió a `Approved`, `Declined` o `Resubmitted`.
Qualsevol altre `new_status`, incloent `In Review`, retorna `400`.
L'estat actual de la sessió ha de ser un dels següents: `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned` o `Resubmitted`; en cas contrari, l'API retorna `400`.Establir `Approved` o `Declined` en una sessió que ja té aquest estat no fa res: l'API retorna `200`, no canvia res, no envia cap webhook i no envia cap correu electrònic.
Establir `Resubmitted` en una sessió que ja és `Resubmitted` retorna `400` (`The new status is the same as the current status.`).Un reenviament en què `nodes_to_resubmit` contingui només funcionalitats exclusives del backend (`AML`, `DATABASE_VALIDATION`, `IP_ANALYSIS`) s'executa automàticament i torna la sessió a un estat decidit, sense cap interacció de l'usuari.
Repetir un reenviament d'aquest tipus en un termini de 30 segons retorna `429 Too Many Requests` amb una capçalera `Retry-After`, ja que una repetició immediata no pot produir un resultat diferent.
No reenviïs automàticament des d'un gestor de webhooks cada cop que rebis un estat `In Review`: revisa primer la troballa o canvia abans les dades subjacents.## Previsualitza primer el correu electrònicAmb `send_email: true`, `Approved` i `Declined` envien a la persona el seu correu electrònic amb la decisió, i `Resubmitted` li envia un enllaç nou amb els motius.
Pots veure aquest correu electrònic abans de canviar res:1) Crida [Preview Decision Email](https://docs.didit.me/ca/sessions-api/preview-decision-email.md) per a `Approved` o `Declined`, o [Preview Resubmission Email](https://docs.didit.me/ca/sessions-api/preview-resubmission.md) per a `Resubmitted`.
2) Comprova el `subject` i el `html` generats, el `recipient`, i `will_be_sent` / `not_sent_reason`.
3) Crida aquest endpoint amb el mateix `new_status` (i, en el cas d'una reenviada, el mateix `nodes_to_resubmit`), `send_email: true`, `email_address` amb el valor de `recipient`, el `email_language` que has previsualitzat, i `email_preview_token` amb el valor de `preview_token`.Cap de les dues previsualitzacions canvia la sessió ni envia res.
L'actualització envia aleshores exactament el correu electrònic que has previsualitzat.
El justificant caduca als 15 minuts.
Si el destinatari, l'idioma, l'estat de la sessió, el remitent o el correu electrònic han canviat des de la previsualització, l'actualització retorna `409` abans de canviar res; torna a previsualitzar i confirma amb el nou justificant.
Enviar `email_preview_token` sense `send_email: true` retorna `400`.
El pas de previsualització és opcional: les integracions existents poden seguir cridant aquest endpoint sense ell.## Exemples> [tab] Aprovar una sessió de Verificació d'usuaris (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] Rebutjar una sessió de Verificació d'empreses (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] Sol·licitar un reenviament
>
> ```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] Aprovar i enviar el correu electrònic previsualitzat
>
> ```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"
>   }'
> ```## PermísRequereix el privilegi `write:sessions`. El mateix privilegi cobreix els dos tipus.## Relacionats- [Verification statuses](https://docs.didit.me/ca/integration/verification-statuses.md): referència de la màquina d'estats.
- [Retrieve session](https://docs.didit.me/ca/sessions-api/retrieve-session.md): obté la decisió després d'actualitzar.
- [Sessions overview](https://docs.didit.me/ca/sessions-api/overview.md): distinció entre tipus de sessió.
- [Preview Decision Email](https://docs.didit.me/ca/sessions-api/preview-decision-email.md): veu el correu electrònic d'aprovació o rebuig abans d'enviar-lo.
- [Preview Resubmission Email](https://docs.didit.me/ca/sessions-api/preview-resubmission.md): veu el correu electrònic de reenviament abans d'enviar-lo.


## OpenAPI

````yaml ca/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 verificació d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/update-status/:
    patch:
      tags:
        - Sessions
      summary: Aprova, declina o sol·licita reenviament per a una sessió de verificació
      description: >-
        Sobreescriu manualment la decisió final d'una sessió de verificació KYC
        o KYB. Estableix `new_status` a `Approved` o `Declined` per registrar
        una decisió manual, o a `Resubmitted` per reiniciar passos concrets de
        la verificació i permetre que l'usuari els torni a fer a través del
        mateix URL de verificació. L'endpoint accepta tant ID de sessió d'usuari
        (KYC) com d'empresa (KYB).


        Crida'l quan una sessió hagi assolit un estat revisable: l'estat actual
        ha de ser `Approved`, `Declined`, `In Review`, `Kyc Expired`,
        `Abandoned` o `Resubmitted`. Les sessions que encara estan a `Not
        Started`, `In Progress` o `Awaiting User`, o que han finalitzat com a
        `Expired`, retornen `400`. La teva clau d'API necessita el permís
        `write:sessions` (una clau d'API amb abast restringit necessita accés
        d'escriptura a decisions). La comprovació d'estat apte s'executa abans
        de la validació del cos, de manera que una sessió no apta retorna
        l'error `Wrong Current Status` fins i tot si el payload també és
        invàlid.


        Per a `Resubmitted`, passa `nodes_to_resubmit` per triar quins passos
        del flux de treball ha de tornar a fer l'usuari, o omet-lo per
        seleccionar automàticament els intents de funcionalitats existents que
        estiguin en un estat en què es poden tornar a presentar (`Declined`, `In
        Review`, `Not Finished`, `Expired`). Les funcionalitats que mai no s'han
        intentat no se seleccionen automàticament: enumera-les explícitament a
        `nodes_to_resubmit`, o la sol·licitud retornarà `400` si cap intent
        registrat necessita resubmissió. Els resultats anteriors dels passos
        seleccionats es mouen a l'historial de la resubmissió (retornat per Get
        Decision amb `include=resubmissions`), els passos es reordenen per
        coincidir amb el graf del flux de treball, la finestra de caducitat de
        la sessió es reinicia i l'URL de verificació original es pot tornar a
        utilitzar. Els passos exclusius de backend (`AML`,
        `DATABASE_VALIDATION`, `IP_ANALYSIS`) a l'inici de la llista s'executen
        immediatament sense interacció de l'usuari; si tots els passos reenviats
        són exclusius de backend, la sessió es finalitza de nou dins de la
        mateixa sol·licitud. `KYB_REGISTRY` i `KYB_KEY_PEOPLE` no es poden
        reenviar directament: reenvia en el seu lloc les sessions KYC filles
        rellevants i la sessió d'empresa principal es recalcularà
        automàticament.


        Cada crida que canvia l'estat activa el
        [webhook](/ca/integration/webhooks) `status.updated` un cop aplicat el
        canvi i afegeix una entrada d'activitat (amb l'atribució de l'actor i el
        teu `comment`) a les `reviews` de la sessió, visible a [Get
        Decision](#get-/v3/session/-sessionId-/decision/) i a la cronologia
        d'activitat de la consola. Les dades agregades del perfil d'usuari
        vinculades al `vendor_data` de la sessió també s'actualitzen. Rebutjar
        desactiva el monitoratge AML continu per a la sessió; tornar a aprovar
        el reactiva (des de `Resubmitted`, `Declined` o `Kyc Expired`) quan el
        flux de treball té el monitoratge activat. Aprovar o rebutjar un KYC
        fill que pertanyi a una comprovació de persones clau de KYB recalcula
        l'estat de la sessió d'empresa principal. Estableix `send_email: true`
        (amb `email_address`) per notificar l'usuari: un avís d'estat per a
        `Approved`/`Declined`, o un correu electrònic de resubmissió que conté
        l'enllaç de verificació i els motius pas per pas per a `Resubmitted`.
        Per comprovar el correu electrònic prèviament, fes-ne una vista prèvia
        amb [Preview Decision Email](/ca/sessions-api/preview-decision-email)
        (`Approved`, `Declined`) o [Preview Resubmission
        Email](/ca/sessions-api/preview-resubmission) (`Resubmitted`) i passa el
        seu `preview_token` com a `email_preview_token`: l'actualització enviarà
        llavors exactament el correu previsualitzat, o retornarà `409` abans de
        canviar res si el correu o la sessió han canviat des de la vista prèvia
        o si el justificant té més de 15 minuts.


        Repetir `Approved` o `Declined` en una sessió que ja té aquest estat no
        canvia res i retorna `200`: cap webhook, cap entrada d'activitat i cap
        correu electrònic. Repetir `Resubmitted` retorna `400` (`The new status
        is the same as the current status.`). Les credencials absents o no
        vàlides i la manca de permisos retornen `403`; una clau d'API amb abast
        restringit caducada retorna `401`.
      operationId: patch_v3_session_update_status
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            UUID de la sessió de verificació que s'ha d'actualitzar. Accepta
            tant IDs de sessió d'usuari (KYC) com d'empresa (KYB); el servei
            resol l'ID entre tots dos tipus de sessió.
          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: >-
                    Estat de destinació. `Approved` i `Declined` registren una
                    decisió manual definitiva (cadascuna també pot revocar
                    l'altra). `Resubmitted` neteja els passos seleccionats i
                    torna a enviar la sessió a l'usuari. Qualsevol altre valor
                    retorna `400`.
                  enum:
                    - Approved
                    - Declined
                    - Resubmitted
                  example: Approved
                comment:
                  type: string
                  description: >-
                    Motiu de text lliure del canvi, desat al registre de revisió
                    de la sessió i retornat a la matriu `reviews` d'[Obtenir la
                    decisió](#get-/v3/session/-sessionId-/decision/). Per
                    exemple, `Duplicated user`.
                  example: All checks passed manual review
                nodes_to_resubmit:
                  type: array
                  description: >-
                    Passos del flux de treball que l'usuari ha de refer. Només
                    s'hi actua quan `new_status` és `Resubmitted`. Per a
                    `Approved`/`Declined`, es continua validant l'esquema de les
                    entrades (un valor de `feature` no vàlid retorna `400`),
                    però les entrades vàlides segons l'esquema s'ignoren
                    semànticament. Si s'omet, el servidor selecciona
                    automàticament els intents existents d'OCR, prova de vida,
                    coincidència facial, comprovant de domicili, telèfon, correu
                    electrònic, AML, validació en bases de dades i qüestionari
                    l'estat dels quals sigui `Declined`, `In Review`, `Not
                    Finished` o `Expired` (els intents d'NFC, anàlisi d'IP,
                    estimació d'edat, cerca facial i documents de KYB mai no se
                    seleccionen automàticament; els intents facials que no són
                    de coincidència facial se seleccionen com a `LIVENESS`); les
                    funcionalitats que l'usuari mai no ha intentat (cap intent
                    registrat) NO se seleccionen, de manera que una sessió amb
                    zero intents retorna `400` ("No features found that need
                    resubmission") encara que no s'hagi aprovat res; passa
                    `nodes_to_resubmit` explícitament en aquest cas. Els passos
                    s'executen en l'ordre del graf del flux de treball,
                    independentment de l'ordre en què els enviïs.
                    `KYB_REGISTRY`, `KYB_KEY_PEOPLE` i l'àlies `KYB` es rebutgen
                    amb `400`; aquestes comprovacions pare es tornen a calcular
                    a partir de les seves sessions de KYC filles.
                  items:
                    type: object
                    required:
                      - node_id
                      - feature
                    properties:
                      node_id:
                        type: string
                        description: >-
                          Identificador del node tal com apareix a la definició
                          del flux de treball de la sessió (per exemple
                          `feature_ocr`, `feature_liveness`).
                        example: feature_ocr
                      feature:
                        type: string
                        description: >-
                          Tipus de funcionalitat del node. Els àlies
                          `ID_VERIFICATION`, `POA`, `PHONE` i `EMAIL` es
                          normalitzen al servidor a `OCR`, `PROOF_OF_ADDRESS`,
                          `PHONE_VERIFICATION` i `EMAIL_VERIFICATION`.
                          `KYB_REGISTRY`, `KYB_KEY_PEOPLE` i `KYB` superen la
                          validació de l'esquema, però sempre es rebutgen amb
                          l'error de regla de negoci `400` mostrat als 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: >-
                    Indica si s'ha d'enviar un correu electrònic a l'usuari
                    sobre el canvi. Requereix `email_address`. Per a
                    `Approved`/`Declined`, l'usuari rep un avís d'estat; per a
                    `Resubmitted`, el correu electrònic inclou l'enllaç de
                    verificació i els motius de reenviament per a cada pas.
                  default: false
                  example: false
                email_address:
                  type: string
                  format: email
                  description: >-
                    Destinatari del correu electrònic de notificació.
                    **Obligatori quan `send_email` és `true`**; si s'omet, es
                    retorna `400`.
                  example: user@example.com
                email_language:
                  type: string
                  description: >-
                    Idioma per al correu electrònic de notificació. Accepta
                    qualsevol cadena a nivell d'esquema; els codis no admesos
                    tornen silenciosament a l'anglès (`en`).
                  default: en
                  example: en
                email_preview_token:
                  type: string
                  writeOnly: true
                  minLength: 1
                  maxLength: 512
                  description: >-
                    Rebut opcional de [Preview Decision
                    Email](/ca/sessions-api/preview-decision-email) (per a
                    `Approved` i `Declined`) o de [Preview Resubmission
                    Email](/ca/sessions-api/preview-resubmission) (per a
                    `Resubmitted`): el seu `preview_token`. Només és vàlid amb
                    `send_email: true`; sense aquest, la sol·licitud retorna
                    `400`. El destinatari, l'idioma, l'estat de la sessió, el
                    remitent i el correu electrònic (i, per a un reenviament,
                    els passos seleccionats) encara han de coincidir amb la
                    previsualització, i el rebut caduca al cap de 15 minuts. En
                    cas contrari, la sol·licitud retorna `409` abans que la
                    sessió canviï o s'enviï un correu electrònic. Les
                    integracions existents poden ometre aquest camp.
            examples:
              Approve Session:
                summary: Aprova una sessió després de la revisió manual
                value:
                  new_status: Approved
                  comment: All checks passed manual review
              Decline Session:
                summary: Rebutjar una sessió
                value:
                  new_status: Declined
                  comment: Suspected fraud
              Resubmit Specific Steps:
                summary: >-
                  Sol·licitar el reenviament dels passos escollits, amb correu
                  electrònic
                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: >-
                  Sol·licitar reenviament (autoselecciona els passos no
                  aprovats)
                value:
                  new_status: Resubmitted
              Approve With Previewed Email:
                summary: >-
                  Aprova i envia el correu electrònic retornat per 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: >-
            Estat actualitzat. La resposta només conté el `session_id`; obtén la
            sessió actualitzada mitjançant [Get
            Decision](#get-/v3/session/-sessionId-/decision/). El webhook
            `status.updated` s'activa un cop aplicat el canvi. Repetir
            `Approved` o `Declined` retorna el mateix cos i no canvia res.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: UUID de la sessió actualitzada.
              examples:
                Updated:
                  summary: Retornat per a Aprovada, Rebutjada i Reenviada per igual
                  value:
                    session_id: 3472fb7c-8f7c-4d1a-9cf4-cf3d74ce1a60
        '400':
          description: >-
            Error de validació. Els errors de camp arriben com a `{"<field>":
            ["<message>"]}` (alguns rebuigs de regles de negoci utilitzen un
            valor de cadena en el seu lloc: `{"nodes_to_resubmit":
            "<message>"}`), els errors entre estats com a `{"detail":
            "<message>"}` i l'error del mateix estat com a array JSON simple.
          content:
            application/json:
              examples:
                Wrong Current Status:
                  summary: La sessió no es troba en un estat actualitzable
                  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 és un estat de sessió real, però no és cap dels
                    estats Approved/Declined/Resubmitted
                  value:
                    new_status:
                      - >-
                        You can only update the status to 'Approved',
                        'Declined', or 'Resubmitted'.
                Missing new_status:
                  summary: S'ha omès un camp obligatori
                  value:
                    new_status:
                      - This field is required.
                Same Status:
                  summary: Reenviament sol·licitat en una sessió que ja s'ha reenviat
                  value:
                    - The new status is the same as the current status.
                Email Address Required:
                  summary: send_email true sense email_address
                  value:
                    email_address:
                      - Email address is required when send_email is true.
                Non-resubmittable Feature:
                  summary: El reenviament té com a objectiu una verificació pare de 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 selecció automàtica no ha trobat funcionalitats no
                    aprovades
                  value:
                    nodes_to_resubmit: >-
                      No features found that need resubmission. All features are
                      already approved.
                Invalid Feature Choice:
                  summary: Funcionalitat desconeguda a 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 no és un valor de StatusChoices vàlid
                  value:
                    new_status:
                      - '"Bogus" is not a valid choice.'
                Preview Receipt Without Email:
                  summary: 'S''ha enviat email_preview_token sense send_email: true'
                  value:
                    email_preview_token:
                      - A preview receipt is only valid when the email is sent.
        '401':
          description: La clau d'API amb abast ha caducat.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: Clau d'API amb abast que ha superat la data de caducitat
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Falten les credencials o els permisos són insuficients, o el
            `session_id` pertany a una altra aplicació.
          content:
            application/json:
              examples:
                Invalid Credentials:
                  summary: Falta l'x-api-key o no és vàlid
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Missing Privilege:
                  summary: La clau d'API no té write:sessions
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            No existeix cap sessió de KYC o KYB amb aquest `session_id` (les
            sessions eliminades també retornen `404`).
          content:
            application/json:
              examples:
                Not Found:
                  summary: session_id desconegut
                  value:
                    detail: Not found.
        '409':
          description: >-
            La previsualització del correu electrònic ha canviat o ha caducat.
            Genera una nova previsualització abans de confirmar; no s'aplica cap
            canvi a la sessió ni es fa cap lliurament de correu electrònic.
          content:
            application/json:
              examples:
                Preview Changed:
                  summary: El rebut ja no coincideix o té més de 15 minuts
                  value:
                    detail: >-
                      This email preview changed or expired. Preview the message
                      again before confirming.
        '429':
          description: >-
            S'ha repetit un reenviament destinat únicament a funcionalitats de
            backend (AML, DATABASE_VALIDATION, IP_ANALYSIS) dins de la finestra
            d'espera de 30 segons; una repetició immediata no pot canviar el
            resultat. Espera i torna-ho a provar després de l'interval indicat a
            `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 clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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