> ## 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 de Atualização de Fluxos: Editar Fluxo KYC

> Atualize um fluxo KYC ou KYB da Didit por programação: renomeie, substitua funcionalidades ordenadas ou ajuste limiares. Pagamento por chamada, sem contratos.



Atualizar prompt da API de fluxos
        Copiar o prompt para a área de transferência



      
      

\<pre>

\`Update a simple Didit workflow through the Management API.

Endpoint:
PATCH https://verification.didit.me/v3/workflows/{settings_uuid}/

Authentication:
Use the x-api-key header with my Didit API key.

Requirements:
\- Use PATCH and include only the fields I want to change.
\- To rename the workflow, send workflow_label only.
\- To change workflow checks, send the full desired features array. This replaces the previous feature order and config.
\- Do not send workflow_graph, branches, actions, webhooks, or conditional logic.
\- Send features in the exact execution order.
\- Use uppercase feature values such as OCR, LIVENESS, FACE_MATCH, AML, QUESTIONNAIRE, EMAIL_VERIFICATION, PHONE_VERIFICATION, or PROOF_OF_ADDRESS.
\- Configure each feature with the fields from /management-api/workflows/feature-configs.
\- For an OCR feature, omit config.documents_allowed or send an empty object to allow every supported document type. Send config.documents_allowed only to restrict the allowed documents.
\- Keep dependency order valid. For example, put OCR before FACE_MATCH.
\- If the workflow includes QUESTIONNAIRE, use the latest questionnaire_id as config.questionnaire_uuid.

Example metadata update body:
\{
"workflow_label": "Premium KYC"
}

Example full feature replacement body:
\{
"features": [
\{
  "feature": "OCR",
  "config": {
    "documents_allowed": {
      "USA": {
        "DL": {
          "enabled": 1,
          "sides": 2
        }
      }
    }
  }
},
\{
  "feature": "AML",
  "config": {
    "aml_score_review_threshold": 70,
    "aml_score_approve_threshold": 30
  }
}
]
}

Build the API call, handle validation errors, and return the updated workflow response.`

\</pre>



      
      

Colar em

Utilize `PATCH` para atualizações parciais. Para alterar o nome de um fluxo, envie apenas `workflow_label`.```json theme={null}
{
  "workflow_label": "Premium KYC"
}
```Para alterar as verificações do fluxo, envie o array `features` completo que pretende. Isto substitui a ordem e a configuração das funcionalidades anteriores.```json theme={null}
{
  "features": [
    {
      "feature": "OCR",
      "config": {
        "documents_allowed": {
          "USA": {
            "DL": {
              "enabled": 1,
              "sides": 2
            }
          }
        }
      }
    },
    {
      "feature": "AML",
      "config": {
        "aml_score_review_threshold": 70,
        "aml_score_approve_threshold": 30
      }
    }
  ]
}
```A API v3 mantém os fluxos simples: um caminho linear e um passo final de estado. Não são aceites aqui ramificações, nós de ação nem nós de webhook.## Referência de configuração das funcionalidadesQuando envia `features` num `PATCH`, o array substitui a ordem e a configuração anteriores das funcionalidades. Inclua novamente toda a configuração obrigatória.O objeto `config` exato depende da funcionalidade. Consulte a lista completa de campos, valores predefinidos, definições obrigatórias, intervalos de valores e exemplos em [Configurações de funcionalidades do fluxo](https://docs.didit.me/pt/management-api/workflows/feature-configs.md).Para `OCR`, omita `config.documents_allowed`, envie `null` ou envie `{}` para permitir todos os tipos de documento suportados. Inclua-o apenas se quiser restringir o fluxo a países ou tipos de documento específicos. Para `QUESTIONNAIRE`, `config.questionnaire_uuid` é obrigatório.## Atualizar as definições do fluxoPode atualizar as definições ao nível da sessão sem tocar na lista de funcionalidades. Envie apenas os campos que pretende alterar.| Campo | Tipo | Descrição |
| - | - | - |
| `is_white_label_enabled` | booleano | Ativa a personalização em marca branca para as sessões criadas com este fluxo. |
| `is_desktop_allowed` | booleano | Permite que o fluxo de verificação seja executado em navegadores de computador. |
| `max_retry_attempts` | inteiro (0–10) | Número máximo de tentativas de repetição permitidas após uma verificação recusada. `0` bloqueia o utilizador após a primeira recusa. |
| `retry_window_days` | inteiro (1–365) ou `null` | Janela deslizante, em dias, usada para contar as tentativas de repetição (`null` = limite sem período de tempo). |
| `session_expiration_time` | inteiro (3600–2419200) | Segundos até uma sessão não concluída expirar. Mínimo de 1 hora, máximo de 4 semanas. |```json theme={null}
{
  "is_white_label_enabled": true,
  "is_desktop_allowed": true,
  "max_retry_attempts": 5,
  "retry_window_days": 14,
  "session_expiration_time": 86400
}
```Utilize o `uuid` do fluxo devolvido pelo endpoint de listagem, criação ou obtenção como `settings_uuid` neste URL.


## OpenAPI

````yaml pt/openapi-25.json PATCH /v3/workflows/{settings_uuid}/
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/workflows/{settings_uuid}/:
    patch:
      tags:
        - Workflows
      summary: Atualizar fluxo
      description: >-
        Atualizar um fluxo. O controlo de versões depende do campo `status` que
        enviar e do estado atual da versão: (1) sem `status` numa versão
        **publicada** → a versão publicada é atualizada diretamente (mesmo
        `uuid`, mesma `version`); (2) sem `status` num **rascunho** → o rascunho
        é atualizado e publicado imediatamente; (3) `status: "published"` numa
        versão **publicada** → uma NOVA versão publicada é criada sob o mesmo
        `workflow_id` (novo `uuid`, `version` + 1) e devolvida, e qualquer
        rascunho existente no grupo é eliminado; (4) `status: "draft"` mantém um
        rascunho como rascunho (gravação automática), mas é rejeitado com 400
        numa versão publicada (`"Cannot revert a published version to draft."`).
        O corpo aceita a mesma lista estrita de campos permitidos que a criação
        — chaves desconhecidas são rejeitadas com 400.
      operationId: update_workflow
      parameters:
        - name: settings_uuid
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: UUID por versão do fluxo a atualizar.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimpleWorkflowUpdateRequest'
            examples:
              Replace features:
                summary: Envie a ordem completa pretendida das funcionalidades
                value:
                  features:
                    - feature: OCR
                    - feature: AML
              Rename:
                summary: Renomear um fluxo
                value:
                  workflow_label: Premium KYC
              Set as default:
                summary: Definir este fluxo como o predefinido da aplicação
                value:
                  is_default: true
              Update config:
                summary: Alterar configuração da funcionalidade
                value:
                  features:
                    - feature: OCR
                    - feature: LIVENESS
                      config:
                        face_liveness_method: passive
              Publish a draft:
                summary: Promover um rascunho para publicado
                value:
                  status: published
      responses:
        '200':
          description: >-
            Fluxo atualizado. O corpo é a configuração COMPLETA da versão
            resultante (mesmo formato bruto `VerificationSettings` que `GET
            /v3/workflows/{settings_uuid}/`). Quando a atualização cria uma nova
            versão (`status: "published"` enviado numa linha publicada), o
            `uuid` e a `version` devolvidos diferem dos que alterou — utilize o
            `uuid` devolvido para chamadas subsequentes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowDetail'
        '400':
          description: >-
            Erro de validação — uma chave de nível superior fora da lista de
            permissões aceite, uma funcionalidade desconhecida, ordenação
            inválida, limiar fora do intervalo, referência a um questionário
            inexistente, uma funcionalidade `SIGNATURE` que entraria em produção
            sem documento para assinar, uma nova funcionalidade `SIGNATURE` com
            `signature_level: "aes"` quando Advanced (AES) não está disponível
            (`aes_not_available`, consulte `signature_availability` no fluxo; um
            passo que já armazene `aes` mantém-no), ou `status: "draft"` enviado
            para uma versão publicada (`"Cannot revert a published version to
            draft."`). O corpo da resposta é um erro de validação do DRF
            indexado pelo nome do campo.
        '403':
          description: Chave de API em falta ou inválida.
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Não existe nenhum fluxo com este `settings_uuid` para a aplicação
            autenticada.
        '415':
          description: >-
            Tipo de conteúdo não suportado. Defina `Content-Type:
            application/json`.
        '429':
          description: Limite de pedidos excedido. Tente novamente com recuo exponencial.
        '500':
          description: Erro de servidor inesperado. Pode tentar novamente em segurança.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl -X PATCH
            'https://verification.didit.me/v3/workflows/a1b2c3d4-5678-90ab-cdef-111111111111/'
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"workflow_label": "Premium KYC"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.workflows.update(
                "11111111-2222-3333-4444-555555555555",
                features=[{
                    "feature": "OCR",
                }, {
                    "feature": "AML",
                }],
            )
            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.workflows.update("11111111-2222-3333-4444-555555555555", {
              features: [{
                feature: "OCR",
              }, {
                feature: "AML",
              }],
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Workflows.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SimpleWorkflowUpdateRequest{\n\tFeatures: didit.Some([]didit.SimpleWorkflowFeature{{\n\t\tFeature: \"OCR\",\n\t}, {\n\t\tFeature: \"AML\",\n\t}}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.List;

            import me.didit.Didit;

            import me.didit.types.SimpleWorkflowFeature;

            import me.didit.types.SimpleWorkflowUpdateRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.workflows().update("11111111-2222-3333-4444-555555555555",
            SimpleWorkflowUpdateRequest.builder()
                    .features(List.of(
                            SimpleWorkflowFeature.builder()
                                    .feature(SimpleWorkflowFeature.Feature.of("OCR"))
                                    .build(),
                            SimpleWorkflowFeature.builder()
                                    .feature(SimpleWorkflowFeature.Feature.of("AML"))
                                    .build()))
                    .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->workflows->update('11111111-2222-3333-4444-555555555555', [
                'features' => [[
                    'feature' => 'OCR',
                ], [
                    'feature' => 'AML',
                ]],
            ]);

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

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

            result = didit.workflows.update(
              "11111111-2222-3333-4444-555555555555",
              features: [{
                feature: "OCR",
              }, {
                feature: "AML",
              }]
            )
            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.Workflows.UpdateAsync("11111111-2222-3333-4444-555555555555",
            new SimpleWorkflowUpdateRequest

            {
                Features = new SimpleWorkflowFeature[]
                {
                    new()
                    {
                        Feature = "OCR",
                    },
                    new()
                    {
                        Feature = "AML",
                    },
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SimpleWorkflowUpdateRequest:
      type: object
      description: >-
        Atualizar os metadados do fluxo ou substituir a lista linear completa de
        funcionalidades. Lista de permissões ESTRITA de campos: qualquer chave
        não listada aqui é rejeitada com um 400.
      properties:
        workflow_label:
          type: string
          maxLength: 50
          description: Nome de apresentação do fluxo (máx. 50 carateres).
        is_default:
          type: boolean
          description: Defina este fluxo como o padrão para novas sessões.
        status:
          type: string
          enum:
            - draft
            - published
          description: >-
            Controla o versionamento. Omita para atualizar a versão atual no
            local (os rascunhos são publicados automaticamente). `published`
            numa versão já publicada cria e devolve uma NOVA versão. `draft` só
            é válido enquanto a versão ainda for um rascunho.
        features:
          type: array
          minItems: 1
          description: >-
            Se fornecido, substitui toda a ordem e configuração das
            funcionalidades.
          items:
            $ref: '#/components/schemas/SimpleWorkflowFeature'
        is_white_label_enabled:
          type: boolean
          description: >-
            Ativar a personalização em marca branca para sessões criadas com
            este fluxo.
        is_desktop_allowed:
          type: boolean
          description: >-
            Permitir que o fluxo de verificação seja executado em navegadores de
            computador.
        max_retry_attempts:
          type: integer
          minimum: 0
          maximum: 10
          description: >-
            Número máximo de novas tentativas permitidas após uma verificação
            recusada. `0` bloqueia o utilizador após a primeira recusa.
        retry_window_days:
          type: integer
          minimum: 1
          maximum: 365
          nullable: true
          description: >-
            Janela móvel em dias utilizada para contar tentativas. `null` aplica
            um limite histórico total.
        face_liveness_max_attempts:
          type: integer
          minimum: 1
          maximum: 3
          description: >-
            Número máximo de envios de prova de vida por sessão. Este valor
            também é copiado para os nós do fluxo de prova de vida e de
            estimativa de idade gerados, a menos que a configuração ao nível da
            funcionalidade o substitua.
        face_match_max_attempts:
          type: integer
          minimum: 1
          maximum: 3
          description: >-
            Número máximo de envios de correspondência facial por sessão. Este
            valor também é copiado para os nós do fluxo de correspondência
            facial gerados, a menos que a configuração ao nível da
            funcionalidade o substitua.
        session_expiration_time:
          type: integer
          minimum: 3600
          maximum: 2419200
          description: >-
            Segundos até uma sessão inacabada expirar. Mínimo de 1 hora (3600),
            máximo de 4 semanas (2419200).
    WorkflowDetail:
      type: object
      description: >-
        Os campos abaixo são tipados; o objeto também contém todas as outras
        colunas da configuração do fluxo (comutadores de funcionalidades,
        limiares, ações de aviso, documentos permitidos, callbacks) como
        propriedades adicionais. Os campos que não se aplicam ao `workflow_type`
        são `null`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Identificador por versão (`settings_uuid`). Cada versão de um fluxo
            tem o seu próprio.
        workflow_id:
          type: string
          format: uuid
          description: >-
            Identificador estável partilhado por todas as versões do fluxo. As
            sessões criadas com ele utilizam a versão publicada mais recente.
        workflow_label:
          type: string
          description: Nome de apresentação do fluxo.
        workflow_type:
          type: string
          nullable: true
          enum:
            - kyc
            - kyb
            - adaptive_age_verification
            - biometric_authentication
            - address_verification
            - questionnaire_verification
            - email_verification
            - phone_verification
            - null
          description: Modelo de fluxo. `null` para fluxos em grafo criados sem um modelo.
        is_default:
          type: boolean
          description: Se este é o fluxo predefinido da aplicação.
        is_archived:
          type: boolean
          description: Os fluxos arquivados não podem iniciar novas sessões.
        version:
          type: integer
          description: Número da versão dentro do fluxo.
        status:
          type: string
          enum:
            - draft
            - published
          description: >-
            As versões de rascunho são editáveis; as versões publicadas são
            imutáveis e utilizadas para novas sessões.
        published_at:
          type: string
          format: date-time
          nullable: true
          description: Quando esta versão foi publicada. `null` para rascunhos.
        is_simple_workflow:
          type: boolean
          description: '`true` quando o fluxo não tem um `workflow_graph` personalizado.'
        is_editable:
          type: boolean
          description: '`true` apenas para versões `draft`.'
        workflow_url:
          type: string
          format: uri
          description: URL público que inicia uma sessão com este fluxo.
        workflow_graph:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            Estrutura em grafo do fluxo (nós e arestas). `null` para fluxos
            simples.
        features:
          type: string
          description: >-
            Funcionalidades ativadas unidas por `" + "`, por exemplo `"OCR +
            LIVENESS"`.
        total_price:
          type: number
          nullable: true
          description: Preço por sessão; para fluxos em grafo, o caminho mais caro.
        min_price:
          type: number
          nullable: true
          description: Preço do caminho mais económico ao longo do fluxo.
        max_price:
          type: number
          nullable: true
          description: Preço do caminho mais caro ao longo do fluxo.
        special_add_on_prices:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            Preços de suplementos específicos da organização, ou `null` quando
            nenhum estiver definido.
        max_retry_attempts:
          type: integer
          description: Tentativas permitidas após uma verificação recusada.
        retry_window_days:
          type: integer
          nullable: true
          description: Dias durante os quais as tentativas adicionais são permitidas.
        session_expiration_time:
          type: integer
          description: Segundos até uma sessão inacabada expirar.
        questionnaire:
          type: object
          nullable: true
          additionalProperties: true
          description: O questionário associado ao fluxo, ou `null`.
        kyb_role_settings:
          type: array
          items:
            type: object
            additionalProperties: true
          description: Definições de verificação por função para pessoas-chave de KYB.
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        signature_availability:
          type: object
          description: >-
            Quais os níveis de Assinatura eletrónica que podem assinar neste
            momento. Verifique antes de definir `signature_level`. Devolvido em
            fluxos de `kyc`, `kyb` e de grafo.
          properties:
            simple:
              type: boolean
              description: Simple está sempre disponível.
            aes:
              type: boolean
              description: >-
                Se o nível Avançado (AES) pode assinar agora. Enquanto for
                `false`, guardar um novo passo com `signature_level: "aes"` é
                recusado com `aes_not_available`.
            qes:
              type: boolean
              description: >-
                Se o nível Qualificado (QES) pode assinar agora. É `false` até
                que um fornecedor qualificado esteja associado.
        is_bank_verification_enabled:
          type: boolean
          description: >-
            Se um fluxo simples de KYC ou KYB executa a verificação bancária. É
            executada após os passos de contacto (e a verificação de
            localização) e antes da validação de base de dados, AML e análise de
            IP. A verificação bancária ainda não está disponível de forma geral:
            a sua ativação é recusada onde não estiver ativada.
        bank_verification_config:
          type: object
          additionalProperties: true
          description: >-
            Definições de verificação bancária de um fluxo simples, com as
            mesmas chaves que um nó `BANK_VERIFICATION` aceita (por exemplo,
            `bank_countries` e `bank_method_order`). Chaves desconhecidas são
            ignoradas. Todas as chaves são opcionais e uma chave ausente mantém
            o seu valor predefinido, pelo que `{}` significa todas as
            predefinições. Consulte [Definições de verificação
            bancária](/pt/management-api/workflows/feature-configs#verificação-bancária).
          example: {}
        is_geolocation_enabled:
          type: boolean
          description: >-
            Se um fluxo simples de KYC executa a verificação de localização. É
            executada após os passos de contacto e antes da verificação bancária
            e da validação de base de dados. Os fluxos de empresas (KYB) não a
            podem executar.
        geolocation_config:
          type: object
          additionalProperties: true
          description: >-
            Definições de verificação de localização de um fluxo simples, com as
            mesmas chaves que um nó `GEOLOCATION` aceita (por exemplo
            `is_geolocation_geofencing_enabled` e `geolocation_max_attempts`).
            As chaves desconhecidas são ignoradas. Todas as chaves são opcionais
            e uma chave ausente mantém o seu valor padrão, pelo que `{}`
            significa todos os valores padrão.
          example: {}
      additionalProperties: true
    SimpleWorkflowFeature:
      type: object
      required:
        - feature
      properties:
        feature:
          type: string
          description: >-
            Funcionalidade a executar. Utilize os valores em maiúsculas aqui
            apresentados.
          enum:
            - OCR
            - NFC
            - LIVENESS
            - FACE_MATCH
            - PROOF_OF_ADDRESS
            - QUESTIONNAIRE
            - DOCUMENT_AI
            - PHONE_VERIFICATION
            - EMAIL_VERIFICATION
            - DATABASE_VALIDATION
            - AML
            - IP_ANALYSIS
            - AGE_ESTIMATION
            - KYB_REGISTRY
            - KYB_DOCUMENTS
            - KYB_KEY_PEOPLE
            - SIGNATURE
        config:
          type: object
          description: >-
            Definições específicas da funcionalidade. Para `QUESTIONNAIRE`,
            inclua `questionnaire_uuid` com o `questionnaire_id` devolvido pelo
            endpoint de criação de questionários. Para `SIGNATURE`, um fluxo que
            passa a produção precisa de um documento para assinar: defina
            `signature_documents_source` como `session` ou `both` para que cada
            sessão possa fornecer o seu próprio, ou envie `status: "draft"` e
            adicione os documentos antes de publicar. `signature_level: "aes"` é
            recusado com `aes_not_available` enquanto
            `signature_availability.aes` for `false` no fluxo. Para `OCR`,
            `methods` seleciona quais os métodos de Verificação de identidade
            que cada país pode utilizar (captura de documentos, consulta sem
            documento junto de uma fonte governamental ou de outra autoridade, e
            carteiras de identidade digital); omita-o e todos os países
            utilizarão apenas a captura de documentos. Para `SIGNATURE`,
            consulte [Definições de Assinatura
            eletrónica](/pt/management-api/workflows/feature-configs#assinatura-eletrónica):
            `signature_level` aceita `simple` (a predefinição; não é necessária
            verificação de identidade, e-mail ou telefone) e `aes` de momento, e
            os documentos do fluxo e respetivos campos são geridos na consola,
            pelo que, através da API, envie documentos e campos por sessão com
            `signature_documents_source: "session"`.
          additionalProperties: true
        label:
          type: string
          description: Etiqueta interna opcional para este nó do fluxo.
  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.