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

# Atualizar dados de IA de documentos na API

> Corrija os campos extraídos pela Didit de um documento de IA ou defina o respetivo estado de revisão numa sessão de verificação KYC ou KYB.



Prompt da API de atualização de dados do Document AI
        Copiar o prompt para a área de transferência



      
      

\<pre>

\`Correct the extracted data of a Document AI document, or set its review status, on a Didit verification session through the API.

Endpoint:
PATCH https://verification.didit.me/v3/document-ai/{session_id}/documents/{document_uuid}/

Authentication:
Send my Didit API key in the x-api-key header. A scoped key needs decisions: write.

Goal:
\- Fix a value Document AI misread, or approve or decline a document the workflow sent to review.

Request body (JSON, both fields optional):
\- extracted_data: a JSON object of field keys to new values. Merged key by key: sent keys replace the stored values (a null value clears one), keys I leave out keep their values. Do not send extracted_data itself as null (400); leave it out instead.
\- status: "Approved", "Declined", "In Review" or "Not Finished".

Behavior:
\- Works for user (KYC) and business (KYB) session IDs.
\- {document_uuid} is document_ai_documents[].items[].uuid from GET /v3/session/{session_id}/decision/, and the document must belong to that session.
\- The document status feeds the Document AI result of its workflow node in the decision. The session status is not recomputed.
\- Every successful call, even one that changes nothing, sends a data.updated webhook with trigger "manual_review".

Example call:
curl -X PATCH "https://verification.didit.me/v3/document-ai/11111111-2222-3333-4444-555555555555/documents/44444444-5555-6666-7777-888888888888/" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"extracted_data": {"invoice_number": "INV-2026-0042"}, "status": "Approved"}'

What to read from the response:
\- extracted_data: all extracted fields after the merge.
\- status: the document's review status.
\- file_url: the storage path of the file, not a download link. Read the presigned file_url from the session decision to download it.

Failure modes:
\- 400: status is not one of the allowed values, or extracted_data is null (checked before the document is looked up).
\- 401: the API key has expired.
\- 403: missing key (a wrong, revoked or expired key gets 401), a key of another application, a scoped key without decisions: write, or a request from outside the key's IP allowlist.
\- 404: the session does not exist, was deleted, or is outside a scoped key's limits, or the document does not belong to the session.

Side effects: updates the document and sends a data.updated webhook.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

Colar em

As chaves dos campos são as que configurou para o documento no fluxo. Consulte o [Document AI](https://docs.didit.me/pt/core-technology/document-ai/overview.md) para saber como os documentos e os campos são configurados, e o [relatório do Document AI](https://docs.didit.me/pt/core-technology/document-ai/report-document-ai.md) para saber onde o resultado aparece na decisão da sessão.


## OpenAPI

````yaml pt/openapi-25.json PATCH /v3/document-ai/{sessionId}/documents/{documentUuid}/
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/document-ai/{sessionId}/documents/{documentUuid}/:
    patch:
      tags:
        - Sessions
      summary: Atualizar um documento do Document AI
      description: >-
        Corrija os campos que o Document AI extraiu de um documento carregado,
        defina o respetivo estado de revisão, ou ambos, numa sessão de KYC ou
        KYB. `extracted_data` deve ser um objeto JSON e é combinado chave a
        chave: uma chave que envie substitui o valor guardado (uma chave enviada
        como `null` é guardada como `null`) e as chaves omitidas mantêm os seus
        valores. O estado do documento alimenta o resultado de Document AI do
        respetivo nó de fluxo na decisão da sessão; o estado da sessão em si não
        é recalculado. Cada chamada bem-sucedida, incluindo uma que não altere
        nada, envia um [webhook](https://docs.didit.me/pt/integration/webhooks)
        `data.updated` com o acionador `manual_review`. Uma chave de API com
        âmbito necessita de `decisions: write`; consulte [Document
        AI](https://docs.didit.me/pt/core-technology/document-ai/overview).
      operationId: patch_v3_document_ai_document
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID da sessão de verificação (o `session_id` retornado por `POST
            /v3/session/`). Aceita IDs de sessão de Verificação de utilizadores
            (KYC) e de Verificação de empresas (KYB): o servidor resolve o ID em
            ambos os tipos de sessão. Deve ser um UUID bem formatado; um valor
            mal formatado não corresponde à rota e retorna um `404` em HTML.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: documentUuid
          in: path
          required: true
          description: >-
            UUID do documento de Document AI
            (`document_ai_documents[].items[].uuid` em `GET
            /v3/session/{sessionId}/decision/`). Tem de pertencer à sessão
            indicada no caminho.
          schema:
            type: string
            format: uuid
            example: 44444444-5555-6666-7777-888888888888
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                extracted_data:
                  type: object
                  additionalProperties: true
                  description: >-
                    Chaves dos campos (as chaves que configurou para o
                    documento) e os respetivos valores corrigidos. Tem de ser um
                    objeto JSON; é intercalado chave a chave nos dados
                    armazenados. Omita este campo em vez de enviar `null`, o que
                    devolve `400`.
                  example:
                    invoice_number: INV-2026-0042
                status:
                  type: string
                  enum:
                    - Approved
                    - Declined
                    - In Review
                    - Not Finished
                  description: Novo estado de revisão do documento.
                  example: Approved
            example:
              extracted_data:
                invoice_number: INV-2026-0042
              status: Approved
      responses:
        '200':
          description: Documento atualizado. Devolve o documento após a intercalação.
          content:
            application/json:
              schema:
                type: object
                required:
                  - uuid
                  - document_key
                  - original_filename
                  - file_url
                  - status
                  - extracted_data
                properties:
                  uuid:
                    type: string
                    format: uuid
                    description: Identificador do documento.
                  document_key:
                    type: string
                    description: >-
                      O documento configurado a que este carregamento
                      corresponde.
                  original_filename:
                    type: string
                    nullable: true
                    description: Nome do ficheiro com o qual o documento foi carregado.
                  file_url:
                    type: string
                    nullable: true
                    description: >-
                      Caminho de armazenamento do ficheiro carregado. Não é uma
                      ligação de transferência: leia o `file_url` pré-assinado a
                      partir da decisão da sessão para transferir o ficheiro.
                  status:
                    type: string
                    enum:
                      - Not Finished
                      - Approved
                      - Declined
                      - In Review
                      - Resub Requested
                    description: Estado de revisão do documento.
                  extracted_data:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: >-
                      Todos os campos extraídos após a união, indexados pela
                      chave do campo.
              example:
                uuid: 44444444-5555-6666-7777-888888888888
                document_key: invoice
                original_filename: invoice-2026-09.pdf
                file_url: >-
                  document_ai/11111111-2222-3333-4444-555555555555-66666666-7777-8888-9999-000000000000.pdf
                status: Approved
                extracted_data:
                  invoice_number: INV-2026-0042
                  total_amount: 1250
                  issue_date: '2026-09-01'
        '400':
          description: >-
            Erro de validação, verificado antes da consulta do documento:
            `status` não é um dos valores permitidos ou `extracted_data` foi
            enviado como `null`.
          content:
            application/json:
              examples:
                Invalid status:
                  summary: status não consta do enum
                  value:
                    status:
                      - '"Rejected" is not a valid choice.'
                Null extracted_data:
                  summary: extracted_data é null
                  value:
                    extracted_data:
                      - This field may not be null.
        '401':
          description: >-
            A chave de API com âmbito expirou. Este é o único caso que devolve
            `401`: uma chave em falta, inválida ou revogada devolve `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensagem de erro legível.
              examples:
                Expired key:
                  summary: A data de validade da chave já passou
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Falha de autenticação ou autorização. Uma chave em falta devolve
            `403`, assim como uma chave de outra aplicação, uma chave com âmbito
            restrito sem a permissão que este endpoint requer e um pedido
            proveniente de fora da lista de IPs permitidos da chave; uma chave
            incorreta, revogada ou expirada devolve `401`. Distinga-as através
            de `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensagem de erro legível.
              examples:
                Missing or invalid credentials:
                  summary: Sem cabeçalho x-api-key ou a chave falhou a validação
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: >-
                    Uma chave válida que pertence a uma aplicação diferente da
                    sessão
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without decisions write:
                  summary: 'Chave com âmbito não tem decisions: write'
                  value:
                    detail: This API key has no write access to decisions.
                IP not allowed:
                  summary: >-
                    Pedido proveniente de fora da lista de permissões de IP da
                    chave
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            A sessão não existe, foi eliminada ou está fora dos limites de uma
            chave com âmbito restrito, ou nenhum documento atual com este UUID
            lhe pertence. A pesquisa da sessão é executada antes da verificação
            de credenciais, pelo que um `sessionId` desconhecido devolve `404`
            mesmo sem uma chave válida.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensagem de erro legível.
              examples:
                Unknown session:
                  summary: Não existe nenhuma sessão com este ID ou foi eliminada
                  value:
                    detail: Not found.
                Outside key limits:
                  summary: >-
                    A sessão está fora dos limites de uma chave com âmbito
                    restrito (também devolvido para uma sessão eliminada há
                    momentos)
                  value:
                    detail: Session not found.
                Unknown document:
                  summary: documentUuid não pertence à sessão
                  value:
                    detail: Document AI document not found.
        '429':
          description: >-
            Limite de pedidos excedido: 300 pedidos de escrita (POST, PATCH,
            DELETE) por minuto por chave de API. Aguarde `Retry-After` segundos
            antes de tentar novamente; os cabeçalhos `X-RateLimit-*` mostram o
            orçamento.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensagem de erro legível.
              examples:
                Rate limited:
                  summary: Orçamento esgotado para o minuto atual
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
          headers:
            Retry-After:
              description: Segundos a aguardar antes de tentar novamente.
              schema:
                type: integer
                minimum: 1
                example: 30
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X PATCH
            'https://verification.didit.me/v3/document-ai/11111111-2222-3333-4444-555555555555/documents/44444444-5555-6666-7777-888888888888/'
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"extracted_data": {"invoice_number": "INV-2026-0042"}, "status": "Approved"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.update_document_ai_data(
                "11111111-2222-3333-4444-555555555555",
                "44444444-5555-6666-7777-888888888888",
                extracted_data={"invoice_number": "INV-2026-0042"},
                status="Approved",
            )
            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.updateDocumentAiData(
              "11111111-2222-3333-4444-555555555555",
              "44444444-5555-6666-7777-888888888888",
              {
                extracted_data: { invoice_number: "INV-2026-0042" },
                status: "Approved",
              },
            );
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateDocumentAiData(ctx, \"11111111-2222-3333-4444-555555555555\", \"44444444-5555-6666-7777-888888888888\", didit.SessionsUpdateDocumentAiDataParams{\n\tExtractedData: didit.Some(map[string]any{\"invoice_number\": \"INV-2026-0042\"}),\n\tStatus:        didit.Some(didit.SessionsUpdateDocumentAiDataParamsStatus(\"Approved\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.SessionsUpdateDocumentAiDataParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().updateDocumentAiData("11111111-2222-3333-4444-555555555555",
            "44444444-5555-6666-7777-888888888888",
            SessionsUpdateDocumentAiDataParams.builder()
                    .extractedData(Map.of("invoice_number", "INV-2026-0042"))
                    .status(SessionsUpdateDocumentAiDataParams.Status.of("Approved"))
                    .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->updateDocumentAiData('11111111-2222-3333-4444-555555555555',
            '44444444-5555-6666-7777-888888888888', [
                'extracted_data' => ['invoice_number' => 'INV-2026-0042'],
                'status' => 'Approved',
            ]);

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

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

            result = didit.sessions.update_document_ai_data(
              "11111111-2222-3333-4444-555555555555",
              "44444444-5555-6666-7777-888888888888",
              extracted_data: { invoice_number: "INV-2026-0042" },
              status: "Approved"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await
            client.Sessions.UpdateDocumentAiDataAsync("11111111-2222-3333-4444-555555555555",
            "44444444-5555-6666-7777-888888888888", new
            SessionsUpdateDocumentAiDataParams

            {
                ExtractedData = new Dictionary<string, object> { ["invoice_number"] = "INV-2026-0042" },
                Status = new SessionsUpdateDocumentAiDataParamsStatus("Approved"),
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        A chave de API da sua aplicação, a partir de Programadores -> Chaves de
        API na Business Console. A chave principal tem acesso total. Uma chave
        nomeada pode ter o âmbito definido: nenhum, 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á
        incorreta, 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 o
        pedido veio de um endereço fora da sua lista de IP; 404 numa rota de
        sessão significa que a sessão está fora dos fluxos ou estados da chave.
        Uma chave sem acesso a multimédia recebe URLs de imagens, vídeos e PDFs
        como nulos, e uma chave sem permissão de escrita em sessões recebe
        ligações de sessão e tokens como nulos. Consulte
        https://docs.didit.me/console/api-keys.

````

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