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

# Modifier un questionnaire KYC : API de mise à jour

> Modifiez un questionnaire KYC Didit : renommez-le, remplacez les questions ordonnées, actualisez les libellés multilingues. Gestion par API, facturé à l'appel.



Prompt de l'API de mise à jour de questionnaire
        Copier le prompt dans le presse-papiers



      
      

\<pre>

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

Endpoint:
PATCH https://verification.didit.me/v3/questionnaires/{questionnaire_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 questionnaire, send title or description only.
\- To change questions, send the full desired form_elements array. This replaces the existing question list.
\- Do not send graph, branches, next, required_if, or conditional logic.
\- Keep languages consistent with the questionnaire. Include en labels for every form element.
\- Capture the questionnaire_id returned by the response because published updates may return a new version id.

Example metadata update body:
\{
"title": "Updated Customer Onboarding"
}

Example full question replacement body:
\{
"form_elements": [
\{
  "id": "occupation",
  "element_type": "short_text",
  "label": { "en": "What is your occupation?" },
  "is_required": true
},
\{
  "id": "source_of_funds",
  "element_type": "multiple_choice",
  "label": { "en": "Source of funds" },
  "options": [
    \{ "value": "employment", "label": { "en": "Employment" } },
    \{ "value": "business", "label": { "en": "Business" } }
  ]
}
]
}

Build the API call, handle validation errors, and return the latest questionnaire_id from the response.`

\</pre>



      
      

Coller dans

Utilisez `PATCH` pour les mises à jour partielles. Pour renommer un questionnaire, envoyez uniquement `title` ou `description`.```json theme={null}
{
  "title": "Updated Customer Onboarding"
}
```Pour mettre à jour les questions, envoyez le tableau `form_elements` complet souhaité. Cela remplace la liste de questions précédente. Conservez les questions existantes que vous souhaitez toujours afficher.```json theme={null}
{
  "form_elements": [
    {
      "id": "occupation",
      "element_type": "short_text",
      "label": { "en": "What is your occupation?" },
      "is_required": true
    },
    {
      "id": "source_of_funds",
      "element_type": "multiple_choice",
      "label": { "en": "Source of funds" },
      "options": [
        { "value": "employment", "label": { "en": "Employment" } },
        { "value": "business", "label": { "en": "Business" } }
      ]
    }
  ]
}
```L'API v3 ne prend en charge que les questionnaires linéaires simples. Elle rejette `graph`, `branches`, `next` et les règles conditionnelles.La réponse inclut `questionnaire_id`. Lorsque vous mettez à jour un questionnaire `published`, l'API peut créer une nouvelle version. Récupérez le `questionnaire_id` renvoyé et utilisez-le dans les workflows, au lieu de supposer que l'identifiant présent dans l'URL correspond toujours à la dernière version.


## OpenAPI

````yaml fr/openapi-25.json PATCH /v3/questionnaires/{questionnaire_uuid}/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/questionnaires/{questionnaire_uuid}/:
    patch:
      tags:
        - Questionnaires
      summary: Mettre à jour le questionnaire
      description: >-
        Mettre à jour un questionnaire. La gestion des versions dépend du champ
        `status` envoyé et de l'état actuel de la version : (1) aucun `status`
        sur une version **publiée** → la version publiée est mise à jour sur
        place (mêmes `questionnaire_id` et `version`) ; (2) aucun `status` sur
        un **brouillon** → le brouillon est mis à jour et immédiatement publié ;
        (3) `status: "published"` sur une version **publiée** → une NOUVELLE
        version publiée est créée sous le même `questionnaire_group_id` (nouveau
        `questionnaire_id`, `version` + 1) et renvoyée, et tout brouillon
        existant dans le groupe est supprimé ; (4) `status: "draft"` conserve un
        brouillon comme brouillon (enregistrement automatique) mais est rejeté
        avec un code 400 sur une version publiée (`"Cannot revert a published
        version to draft."`).
      operationId: update_questionnaire
      parameters:
        - name: questionnaire_uuid
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: UUID par version du questionnaire à mettre à jour.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimpleQuestionnaireUpdateRequest'
            examples:
              Rename:
                summary: Renommer un questionnaire
                value:
                  title: Updated Customer Onboarding
              Replace questions:
                summary: Remplacer la liste complète et linéaire des questions
                value:
                  form_elements:
                    - id: occupation
                      element_type: short_text
                      label:
                        en: What is your occupation?
                      is_required: true
                    - id: source_of_funds
                      element_type: multiple_choice
                      label:
                        en: Source of funds
                      options:
                        - value: employment
                          label:
                            en: Employment
                        - value: business
                          label:
                            en: Business
      responses:
        '200':
          description: >-
            Questionnaire mis à jour. Le corps correspond au dernier état de la
            version résultante — la version mise à jour sur place, ou la version
            publiée nouvellement créée lorsque vous avez envoyé `status:
            "published"` sur une ligne publiée (dans ce cas, `questionnaire_id`
            et `version` diffèrent de ceux que vous avez modifiés).
            `questionnaire_id` dans la réponse est l'UUID par version ; utilisez
            `questionnaire_group_id` si vous avez besoin de l'identifiant de
            groupe stable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuestionnaireDetail'
        '400':
          description: >-
            Erreur de validation — `element_type` inconnu, traduction manquante,
            champs conditionnels/d'embranchement non pris en charge, `languages`
            ne contenant pas `en`, `default_language` absent de `languages`,
            option sans libellé, envoi d'un `graph` brut, ou `status: "draft"`
            sur une version publiée (`"Cannot revert a published version to
            draft."`). Le corps de la réponse est une erreur de validation DRF
            indexée par nom de champ.
        '403':
          description: Clé API manquante ou invalide.
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Aucun questionnaire avec ce `questionnaire_uuid` n'existe pour
            l'application authentifiée.
        '415':
          description: >-
            Type de média non pris en charge. Définissez `Content-Type:
            application/json`.
        '429':
          description: >-
            Limite de débit dépassée. Réessayez avec une temporisation
            exponentielle.
        '500':
          description: Erreur serveur inattendue. Peut être réessayé en toute sécurité.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl -X PATCH
            'https://verification.didit.me/v3/questionnaires/11111111-2222-3333-4444-555555555555/'
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"title": "Updated Customer Onboarding"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.questionnaires.update(
                "11111111-2222-3333-4444-555555555555",
                title="Updated Customer Onboarding",
            )
            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.questionnaires.update("11111111-2222-3333-4444-555555555555",
            {
              title: "Updated Customer Onboarding",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Questionnaires.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SimpleQuestionnaireUpdateRequest{\n\tTitle: didit.String(\"Updated Customer Onboarding\"),\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.SimpleQuestionnaireUpdateRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.questionnaires().update("11111111-2222-3333-4444-555555555555",
            SimpleQuestionnaireUpdateRequest.builder()
                    .title("Updated Customer Onboarding")
                    .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->questionnaires->update('11111111-2222-3333-4444-555555555555',
            [
                'title' => 'Updated Customer Onboarding',
            ]);

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

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

            result = didit.questionnaires.update(
              "11111111-2222-3333-4444-555555555555",
              title: "Updated Customer Onboarding"
            )
            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.Questionnaires.UpdateAsync("11111111-2222-3333-4444-555555555555",
            new SimpleQuestionnaireUpdateRequest

            {
                Title = "Updated Customer Onboarding",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SimpleQuestionnaireUpdateRequest:
      type: object
      description: >-
        Mettre à jour les métadonnées du questionnaire ou remplacer la liste
        linéaire complète `form_elements`.
      properties:
        title:
          type: string
        description:
          type: string
          nullable: true
        languages:
          type: array
          items:
            type: string
        default_language:
          type: string
        is_active:
          type: boolean
        status:
          type: string
          enum:
            - draft
            - published
        form_elements:
          type: array
          minItems: 1
          description: S'il est fourni, remplace la liste linéaire complète des questions.
          items:
            $ref: '#/components/schemas/SimpleQuestionnaireElement'
    QuestionnaireDetail:
      type: object
      description: >-
        Détails complets du questionnaire renvoyés par les endpoints GET, POST
        (création) et PATCH (mise à jour).
      properties:
        questionnaire_id:
          type: string
          format: uuid
          description: >-
            Identifiant unique du questionnaire. Utilisez cet identifiant pour
            faire référence au questionnaire depuis un workflow ou lors de
            requêtes ultérieures de mise à jour ou de suppression.
        title:
          type: string
        description:
          type: string
          nullable: true
        languages:
          type: array
          items:
            type: string
        default_language:
          type: string
        is_active:
          type: boolean
        is_simple_questionnaire:
          type: boolean
        graph:
          type: object
          description: >-
            Structure en graphe avec start_node et la table de correspondance
            des nœuds.
        sections:
          type: array
          description: Contenu du questionnaire regroupé en sections (dérivé du graphe).
          items:
            type: object
        questionnaire_group_id:
          type: string
          format: uuid
          description: >-
            Identifiant stable qui regroupe toutes les versions du même
            questionnaire.
        version:
          type: integer
        status:
          type: string
          enum:
            - draft
            - published
        published_at:
          type: string
          format: date-time
          nullable: true
        is_editable:
          type: boolean
          description: >-
            Vrai lorsque le questionnaire peut encore être modifié directement
            (versions brouillon).
    SimpleQuestionnaireElement:
      type: object
      required:
        - element_type
        - label
      properties:
        id:
          type: string
          description: >-
            Identifiant de question stable optionnel. S'il est omis, l'API
            génère `q1`, `q2`, etc. Utilisez des lettres minuscules, des
            chiffres et des traits de soulignement pour une meilleure
            lisibilité.
          example: source_of_funds
        element_type:
          type: string
          description: >-
            Type de question. L'API accepte ces valeurs en minuscules ainsi que
            leurs équivalents en majuscules.
          enum:
            - short_text
            - long_text
            - dropdown
            - single_choice
            - multiple_choice
            - number
            - image
            - file_upload
            - time
            - email
            - address
            - phone
            - country
            - date_picker
            - consent
            - section_header
            - separator
            - heading
            - paragraph
        label:
          type: object
          description: >-
            Libellé de la question par code de langue, par exemple `{ "en":
            "Source of funds" }`.
          additionalProperties:
            type: string
        description:
          type: object
          nullable: true
          additionalProperties:
            type: string
        placeholder:
          type: object
          nullable: true
          additionalProperties:
            type: string
        is_required:
          type: boolean
          default: false
        options:
          type: array
          description: >-
            À utiliser pour `dropdown`, `single_choice` et `multiple_choice`. Si
            `value` est omis, l'API en génère un à partir du libellé de
            l'option.
          items:
            type: object
            required:
              - label
            properties:
              value:
                type: string
              label:
                type: object
                additionalProperties:
                  type: string
        max_files:
          type: integer
          minimum: 1
          maximum: 5
          description: À utiliser avec `file_upload` ou `image`.
        validation:
          type: object
          nullable: true
          description: >-
            Validation de format optionnelle pour `short_text`, `long_text` ou
            `number`. Appliquée pendant que l'utilisateur remplit le champ (il
            ne peut pas continuer tant qu'elle n'est pas validée) et vérifiée de
            nouveau par l'API lors de l'envoi.
          properties:
            pattern:
              type: string
              description: >-
                Expression régulière (sous-ensemble ECMA-262) à laquelle la
                valeur doit correspondre entièrement. Pour `short_text` et
                `long_text`. N'ajoutez pas d'ancres ^/$ ; la valeur entière est
                mise en correspondance.
            min_length:
              type: integer
              minimum: 0
              description: Nombre minimum de caractères. Pour `short_text` et `long_text`.
            max_length:
              type: integer
              minimum: 0
              description: Nombre maximal de caractères. Pour `short_text` et `long_text`.
            min:
              type: number
              description: Valeur numérique minimale. Pour `number`.
            max:
              type: number
              description: Valeur numérique maximale. Pour `number`.
            error_message:
              type: object
              description: >-
                Message traduit affiché en cas d'échec de validation, indexé par
                code de langue.
              additionalProperties:
                type: string
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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