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

# API para atualizar status da sessão: aprovar e recusar

> PATCH /v3/session/{id}/update-status/ da Didit aprova, recusa ou coloca sessões em revisão. KYC e KYB, pague por uso, sem mínimo mensal.



Prompt para atualizar o status da sessão
        Copiar o prompt para a área de transferência



      
      

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



      
      

Colar em

## Suporte a KYC e KYBEste endpoint funciona da mesma forma para sessões de **Verificação de Usuário (KYC)** e de **Verificação de Empresas (KYB)**. A Didit localiza o `session_id` em ambos os tipos de sessão; a validação das transições de status é a mesma para ambos (o mesmo enum de status vale para os dois).A resposta traz apenas o `session_id`.
Leia `session_kind` em [Recuperar sessão](https://docs.didit.me/pt-br/sessions-api/retrieve-session.md) quando sua lógica subsequente precisar considerar o tipo.## Transições permitidasVocê pode mover uma sessão para `Approved`, `Declined` ou `Resubmitted`.
Qualquer outro `new_status`, incluindo `In Review`, retorna `400`.
O status atual da sessão precisa ser `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned` ou `Resubmitted`; caso contrário, a API retorna `400`.Definir `Approved` ou `Declined` em uma sessão que já tem esse status não tem efeito: a API retorna `200` e não altera nada, não dispara nenhum webhook e não envia nenhum e-mail.
Definir `Resubmitted` em uma sessão que já está como `Resubmitted` retorna `400` (`The new status is the same as the current status.`).Um reenvio cujo `nodes_to_resubmit` contém apenas recursos exclusivos do backend (`AML`, `DATABASE_VALIDATION`, `IP_ANALYSIS`) é executado automaticamente e devolve a sessão a um status que já recebeu uma decisão, sem nenhuma interação do usuário.
Repetir um reenvio desse tipo em até 30 segundos retorna `429 Too Many Requests` com um cabeçalho `Retry-After`, já que uma repetição imediata não pode produzir um resultado diferente.
Não faça reenvios automáticos a partir de um handler de webhook sempre que receber um status `In Review`: primeiro analise o achado ou altere os dados subjacentes.## Visualize o e-mail antesCom `send_email: true`, `Approved` e `Declined` enviam à pessoa o e-mail com a decisão, e `Resubmitted` envia a ela um novo link com os motivos.
Você pode ver esse e-mail antes de alterar qualquer coisa:1) Chame [Visualizar e-mail de decisão](https://docs.didit.me/pt-br/sessions-api/preview-decision-email.md) para `Approved` ou `Declined`, ou [Visualizar e-mail de reenvio](https://docs.didit.me/pt-br/sessions-api/preview-resubmission.md) para `Resubmitted`.
2) Confira o `subject` e o `html` renderizados, o `recipient` e `will_be_sent` / `not_sent_reason`.
3) Chame este endpoint com o mesmo `new_status` (e, no caso de um reenvio, o mesmo `nodes_to_resubmit`), `send_email: true`, `email_address` definido como `recipient`, o `email_language` que você visualizou e `email_preview_token` definido como `preview_token`.Nenhuma das visualizações altera a sessão ou envia algo.
A atualização então envia exatamente o e-mail que você visualizou.
O recibo expira após 15 minutos.
Se o destinatário, o idioma, o status da sessão, o remetente ou o e-mail tiverem mudado desde a visualização, a atualização retorna `409` antes de qualquer alteração; visualize novamente e confirme com o novo comprovante.
Enviar `email_preview_token` sem `send_email: true` retorna `400`.
A etapa de visualização é opcional: integrações existentes podem continuar chamando este endpoint sem ela.## Exemplos> [tab] Aprovar uma sessão de Verificação de Usuário (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] Recusar uma sessão de Verificação de Empresas (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] Solicitar reenvio
>
> ```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 e enviar o e-mail pré-visualizado
>
> ```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"
>   }'
> ```## PermissãoRequer o privilégio `write:sessions`. O mesmo privilégio abrange os dois tipos.## Relacionados- [Status de verificação](https://docs.didit.me/pt-br/integration/verification-statuses.md): referência da máquina de estados.
- [Recuperar sessão](https://docs.didit.me/pt-br/sessions-api/retrieve-session.md): obtenha a decisão após a atualização.
- [Visão geral das sessões](https://docs.didit.me/pt-br/sessions-api/overview.md): distinção entre os tipos.
- [Visualizar e-mail de decisão](https://docs.didit.me/pt-br/sessions-api/preview-decision-email.md): veja o e-mail de aprovação ou recusa antes de enviá-lo.
- [Visualizar e-mail de reenvio](https://docs.didit.me/pt-br/sessions-api/preview-resubmission.md): veja o e-mail de reenvio antes de enviá-lo.


## OpenAPI

````yaml pt-br/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 verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/update-status/:
    patch:
      tags:
        - Sessions
      summary: Aprovar, recusar ou solicitar reenvio de uma sessão de verificação
      description: >-
        Substitui manualmente a decisão final de uma sessão de verificação KYC
        ou KYB. Defina `new_status` como `Approved` ou `Declined` para registrar
        uma decisão manual, ou como `Resubmitted` para limpar etapas de
        verificação específicas e permitir que o usuário as refaça pela mesma
        URL de verificação. O endpoint aceita IDs de sessão tanto de usuário
        (KYC) quanto de empresa (KYB).


        Chame-o depois que a sessão chegar a um estado revisável: o status atual
        deve ser `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned`
        ou `Resubmitted`. Sessões que ainda estão em `Not Started`, `In
        Progress` ou `Awaiting User`, ou que terminaram como `Expired`, retornam
        `400`. Sua chave de API precisa da permissão `write:sessions` (uma chave
        de API com escopo precisa de acesso de escrita a decisões). A
        verificação de estado elegível é executada antes da validação do corpo,
        então uma sessão não elegível retorna o erro `Wrong Current Status`
        mesmo quando o payload também é inválido.


        Para `Resubmitted`, envie `nodes_to_resubmit` para escolher quais etapas
        do fluxo de verificação (workflow) o usuário deve refazer, ou omita-o
        para selecionar automaticamente as tentativas de recursos existentes em
        um estado que permite reenvio (`Declined`, `In Review`, `Not Finished`,
        `Expired`). Recursos nunca tentados não são selecionados
        automaticamente: liste-os explicitamente em `nodes_to_resubmit`, caso
        contrário a requisição retorna `400` quando nenhuma tentativa registrada
        precisa de reenvio. Os resultados anteriores das etapas selecionadas
        passam para o histórico do reenvio (retornado por Get Decision com
        `include=resubmissions`), as etapas são reordenadas de acordo com o
        grafo do fluxo, a janela de expiração da sessão é reiniciada e a URL de
        verificação original volta a poder ser usada. Etapas exclusivas do
        backend (`AML`, `DATABASE_VALIDATION`, `IP_ANALYSIS`) no início da lista
        são executadas imediatamente, sem interação do usuário; se todas as
        etapas reenviadas forem exclusivas do backend, a sessão é finalizada
        novamente na mesma requisição. `KYB_REGISTRY` e `KYB_KEY_PEOPLE` não
        podem ser reenviadas diretamente: reenvie as sessões KYC filhas
        correspondentes e a sessão de empresa principal é recalculada
        automaticamente.


        Toda chamada que altera o status dispara o
        [webhook](/pt-br/integration/webhooks) `status.updated` assim que a
        alteração é confirmada e adiciona uma entrada de atividade (com a
        atribuição do autor e o seu `comment`) aos `reviews` da sessão, visível
        em [Get Decision](#get-/v3/session/-sessionId-/decision/) e na linha do
        tempo de atividades do console. Os agregados do perfil do usuário
        vinculados ao `vendor_data` da sessão também são atualizados. Recusar
        desativa o monitoramento AML contínuo da sessão; aprovar novamente o
        reativa (a partir de `Resubmitted`, `Declined` ou `Kyc Expired`) quando
        o fluxo tem o monitoramento ativado. Aprovar ou recusar uma sessão KYC
        filha que pertence a uma verificação de pessoas-chave de KYB recalcula o
        status da sessão de empresa principal. Defina `send_email: true` (com
        `email_address`) para notificar o usuário: um aviso de status para
        `Approved`/`Declined`, ou um e-mail de reenvio com o link de verificação
        e os motivos por etapa para `Resubmitted`. Para conferir o e-mail antes,
        visualize-o com [Preview Decision
        Email](/pt-br/sessions-api/preview-decision-email) (`Approved`,
        `Declined`) ou [Preview Resubmission
        Email](/pt-br/sessions-api/preview-resubmission) (`Resubmitted`) e envie
        o `preview_token` retornado como `email_preview_token`: a atualização
        então envia exatamente o e-mail visualizado, ou retorna `409` antes de
        alterar qualquer coisa quando o e-mail ou a sessão mudou desde a
        visualização ou quando o comprovante tem mais de 15 minutos.


        Repetir `Approved` ou `Declined` em uma sessão que já tem esse status
        não altera nada e retorna `200`: nenhum webhook, nenhuma entrada de
        atividade e nenhum e-mail. Repetir `Resubmitted` retorna `400` (`The new
        status is the same as the current status.`). Credenciais ausentes ou
        inválidas e permissões ausentes retornam `403`; uma chave de API com
        escopo expirada retorna `401`.
      operationId: patch_v3_session_update_status
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            UUID da sessão de verificação a ser atualizada. Aceita IDs de sessão
            tanto de usuário (KYC) quanto de empresa (KYB): o serviço resolve o
            ID entre os dois tipos de sessão.
          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: >-
                    Status de destino. `Approved` e `Declined` registram uma
                    decisão manual final (cada um também pode reverter o outro).
                    `Resubmitted` limpa as etapas selecionadas e devolve a
                    sessão ao usuário. Qualquer outro valor retorna `400`.
                  enum:
                    - Approved
                    - Declined
                    - Resubmitted
                  example: Approved
                comment:
                  type: string
                  description: >-
                    Motivo da alteração em texto livre, armazenado no histórico
                    de revisão da sessão e retornado no array `reviews` de [Get
                    Decision](#get-/v3/session/-sessionId-/decision/). Por
                    exemplo, `Duplicated user`.
                  example: All checks passed manual review
                nodes_to_resubmit:
                  type: array
                  description: >-
                    Etapas do fluxo que o usuário precisa refazer. Só é
                    considerado quando `new_status` é `Resubmitted`. Para
                    `Approved`/`Declined`, as entradas continuam sendo validadas
                    pelo schema (um valor de `feature` inválido retorna `400`),
                    mas as entradas válidas no schema são ignoradas
                    semanticamente. Se omitido, o servidor seleciona
                    automaticamente as tentativas existentes de OCR, prova de
                    vida, correspondência facial, comprovante de endereço,
                    telefone, e-mail, AML, validação de banco de dados e
                    questionário cujo status seja `Declined`, `In Review`, `Not
                    Finished` ou `Expired` (tentativas de NFC, análise de IP,
                    estimativa de idade, busca facial e documentos KYB nunca são
                    selecionadas automaticamente; tentativas faciais que não
                    sejam de correspondência facial são selecionadas como
                    `LIVENESS`). Recursos que o usuário nunca tentou (sem
                    tentativa registrada) NÃO são selecionados, portanto uma
                    sessão sem nenhuma tentativa retorna `400` ("No features
                    found that need resubmission") mesmo que nada tenha sido
                    aprovado; nesse caso, envie `nodes_to_resubmit`
                    explicitamente. As etapas são executadas na ordem do grafo
                    do fluxo, independentemente da ordem em que você as enviar.
                    `KYB_REGISTRY`, `KYB_KEY_PEOPLE` e o alias `KYB` são
                    rejeitados com `400`: essas verificações-pai são
                    recalculadas a partir das sessões KYC filhas.
                  items:
                    type: object
                    required:
                      - node_id
                      - feature
                    properties:
                      node_id:
                        type: string
                        description: >-
                          Identificador do nó conforme aparece na definição do
                          fluxo de verificação (workflow) da sessão (por
                          exemplo, `feature_ocr`, `feature_liveness`).
                        example: feature_ocr
                      feature:
                        type: string
                        description: >-
                          Tipo de recurso do nó. Os aliases `ID_VERIFICATION`,
                          `POA`, `PHONE` e `EMAIL` são normalizados no servidor
                          para `OCR`, `PROOF_OF_ADDRESS`, `PHONE_VERIFICATION` e
                          `EMAIL_VERIFICATION`. `KYB_REGISTRY`, `KYB_KEY_PEOPLE`
                          e `KYB` passam na validação do schema, mas são sempre
                          rejeitados com o `400` de regra de negócio mostrado
                          nos exemplos.
                        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: >-
                    Se o usuário deve receber um e-mail sobre a alteração.
                    Requer `email_address`. Para `Approved`/`Declined`, o
                    usuário recebe uma notificação de status; para
                    `Resubmitted`, o e-mail inclui o link de verificação e os
                    motivos de reenvio de cada etapa.
                  default: false
                  example: false
                email_address:
                  type: string
                  format: email
                  description: >-
                    Destinatário do e-mail de notificação. **Obrigatório quando
                    `send_email` é `true`** — omiti-lo retorna `400`.
                  example: user@example.com
                email_language:
                  type: string
                  description: >-
                    Idioma do e-mail de notificação. Aceita qualquer string no
                    nível do schema; códigos não suportados passam a usar inglês
                    (`en`) sem aviso.
                  default: en
                  example: en
                email_preview_token:
                  type: string
                  writeOnly: true
                  minLength: 1
                  maxLength: 512
                  description: >-
                    Recibo opcional de [Preview Decision
                    Email](/pt-br/sessions-api/preview-decision-email) (para
                    `Approved` e `Declined`) ou de [Preview Resubmission
                    Email](/pt-br/sessions-api/preview-resubmission) (para
                    `Resubmitted`): seu `preview_token`. Válido apenas com
                    `send_email: true`; sem isso, a requisição retorna `400`. O
                    destinatário, o idioma, o status da sessão, o remetente e o
                    e-mail (e, no caso de um reenvio, as etapas selecionadas)
                    ainda devem corresponder à pré-visualização, e o recibo
                    expira após 15 minutos. Caso contrário, a requisição retorna
                    `409` antes que a sessão seja alterada ou que um e-mail seja
                    enviado. Integrações existentes podem omitir este campo.
            examples:
              Approve Session:
                summary: Aprovar uma sessão após revisão manual
                value:
                  new_status: Approved
                  comment: All checks passed manual review
              Decline Session:
                summary: Recusar uma sessão
                value:
                  new_status: Declined
                  comment: Suspected fraud
              Resubmit Specific Steps:
                summary: Solicitar reenvio das etapas escolhidas, com 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: >-
                  Solicitar reenvio (seleciona automaticamente as etapas não
                  aprovadas)
                value:
                  new_status: Resubmitted
              Approve With Previewed Email:
                summary: Aprovar e enviar o e-mail retornado por 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: >-
            Status atualizado. A resposta contém apenas o `session_id`; obtenha
            a sessão atualizada via [Get
            Decision](#get-/v3/session/-sessionId-/decision/). O webhook
            `status.updated` é disparado assim que a alteração é confirmada.
            Repetir `Approved` ou `Declined` retorna o mesmo corpo e não altera
            nada.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: UUID da sessão atualizada.
              examples:
                Updated:
                  summary: Retornado igualmente para Aprovado, Recusado e Reenviado
                  value:
                    session_id: 3472fb7c-8f7c-4d1a-9cf4-cf3d74ce1a60
        '400':
          description: >-
            Erro de validação. Os erros de campo chegam como `{"<field>":
            ["<message>"]}` (algumas rejeições por regra de negócio usam uma
            string como valor: `{"nodes_to_resubmit": "<message>"}`), os erros
            entre estados como `{"detail": "<message>"}` e o erro de mesmo
            status como um array JSON simples.
          content:
            application/json:
              examples:
                Wrong Current Status:
                  summary: A sessão não está em um estado atualizável
                  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 é um status de sessão real, mas não é
                    Approved/Declined/Resubmitted
                  value:
                    new_status:
                      - >-
                        You can only update the status to 'Approved',
                        'Declined', or 'Resubmitted'.
                Missing new_status:
                  summary: Campo obrigatório omitido
                  value:
                    new_status:
                      - This field is required.
                Same Status:
                  summary: Reenvio solicitado em uma sessão que já está em Resubmitted
                  value:
                    - The new status is the same as the current status.
                Email Address Required:
                  summary: send_email true sem email_address
                  value:
                    email_address:
                      - Email address is required when send_email is true.
                Non-resubmittable Feature:
                  summary: O reenvio tem como alvo uma verificação pai 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: A seleção automática não encontrou recursos não aprovados
                  value:
                    nodes_to_resubmit: >-
                      No features found that need resubmission. All features are
                      already approved.
                Invalid Feature Choice:
                  summary: Recurso desconhecido em 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ão é um valor válido de StatusChoices
                  value:
                    new_status:
                      - '"Bogus" is not a valid choice.'
                Preview Receipt Without Email:
                  summary: 'email_preview_token enviado sem send_email: true'
                  value:
                    email_preview_token:
                      - A preview receipt is only valid when the email is sent.
        '401':
          description: A chave de API com escopo expirou.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: Chave de API com escopo após a data de validade
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Credenciais ausentes ou permissões insuficientes, ou um `session_id`
            que pertence a outra aplicação.
          content:
            application/json:
              examples:
                Invalid Credentials:
                  summary: x-api-key ausente ou inválido
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Missing Privilege:
                  summary: A chave de API não tem write:sessions
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Não existe nenhuma sessão de KYC ou KYB com este `session_id`
            (sessões excluídas também retornam `404`).
          content:
            application/json:
              examples:
                Not Found:
                  summary: session_id desconhecido
                  value:
                    detail: Not found.
        '409':
          description: >-
            A pré-visualização do e-mail mudou ou expirou. Gere uma nova
            pré-visualização antes de confirmar; nenhuma alteração na sessão nem
            entrega de e-mail acontece.
          content:
            application/json:
              examples:
                Preview Changed:
                  summary: O comprovante não corresponde mais ou tem mais de 15 minutos
                  value:
                    detail: >-
                      This email preview changed or expired. Preview the message
                      again before confirming.
        '429':
          description: >-
            Um reenvio direcionado apenas a recursos exclusivos do backend (AML,
            DATABASE_VALIDATION, IP_ANALYSIS) foi repetido dentro da janela de
            espera de 30 segundos; uma repetição imediata não pode alterar o
            resultado. Aguarde e tente novamente após o intervalo indicado em
            `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: >-
        Chave de API da sua aplicação, em Developers -> API keys no Business
        Console. A chave principal tem acesso total. Uma chave nomeada pode ter
        escopo restrito: nenhum acesso, leitura ou escrita por recurso, limitada
        a alguns fluxos ou a sessões aprovadas, a uma lista de endereços IP e a
        uma data de validade. 401 significa que a chave está errada, revogada ou
        expirada; 403 significa que nenhuma chave foi enviada, que a chave não
        tem acesso a este recurso ou ação, ou que a requisição veio de um
        endereço fora da sua lista de IPs; 404 em uma rota de sessão significa
        que a sessão está fora dos fluxos ou status da chave. Uma chave sem
        acesso a mídia recebe URLs de imagem, vídeo e PDF como null, e uma chave
        sem permissão de escrita em sessões recebe links e tokens de sessão como
        null. Consulte https://docs.didit.me/console/api-keys.

````

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