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

# Update Questionnaire API: Edit Formulir KYC

> Edit kuesioner KYC Didit: ganti nama, ganti pertanyaan berurutan, perbarui label multi-bahasa. Kelola formulir kepatuhan lewat API, bayar per panggilan.



Perbarui Prompt API Kuesioner
        Salin prompt ke papan klip



      
      

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



      
      

Tempel ke

Gunakan `PATCH` untuk pembaruan parsial. Untuk mengganti nama kuesioner, kirim hanya `title` atau `description`.```json theme={null}
{
  "title": "Updated Customer Onboarding"
}
```Untuk memperbarui pertanyaan, kirim seluruh array `form_elements` yang diinginkan. Array ini menggantikan daftar pertanyaan sebelumnya. Sertakan kembali pertanyaan yang sudah ada dan masih ingin Anda tampilkan.```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" } }
      ]
    }
  ]
}
```API v3 hanya mendukung kuesioner linear sederhana. API akan menolak `graph`, `branches`, `next`, dan aturan bersyarat.Respons menyertakan `questionnaire_id`. Saat Anda memperbarui kuesioner dengan status `published`, API mungkin membuat versi baru. Simpan `questionnaire_id` yang dikembalikan dan gunakan di alur kerja, jangan berasumsi bahwa id di URL masih merupakan versi terbaru.


## OpenAPI

````yaml id/openapi-25.json PATCH /v3/questionnaires/{questionnaire_uuid}/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API Verifikasi Identitas. Lakukan autentikasi dengan header x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/questionnaires/{questionnaire_uuid}/:
    patch:
      tags:
        - Questionnaires
      summary: Perbarui kuesioner
      description: >-
        Perbarui kuesioner. Pembuatan versi bergantung pada kolom `status` yang
        Anda kirim dan status versi saat ini: (1) tanpa `status` pada versi
        **diterbitkan** → versi diterbitkan diperbarui di tempat
        (`questionnaire_id` sama, `version` sama); (2) tanpa `status` pada
        **draf** → draf diperbarui dan langsung diterbitkan; (3) `status:
        "published"` pada versi **diterbitkan** → versi diterbitkan BARU dibuat
        di bawah `questionnaire_group_id` yang sama (`questionnaire_id` baru,
        `version` + 1) dan dikembalikan, serta draf yang ada dalam grup akan
        dihapus; (4) `status: "draft"` mempertahankan draf sebagai draf (simpan
        otomatis) tetapi ditolak dengan 400 pada versi yang telah diterbitkan
        (`"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 per versi dari kuesioner yang akan diperbarui.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimpleQuestionnaireUpdateRequest'
            examples:
              Rename:
                summary: Ubah nama kuesioner
                value:
                  title: Updated Customer Onboarding
              Replace questions:
                summary: Ganti seluruh daftar pertanyaan linier
                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: >-
            Kuesioner diperbarui. Isinya adalah status terbaru dari versi yang
            dihasilkan — versi yang diperbarui langsung di tempat, atau versi
            terpublikasi yang baru dibuat saat Anda mengirim `status:
            "published"` pada baris yang sudah dipublikasikan (dalam kasus
            tersebut `questionnaire_id` dan `version` berbeda dari yang Anda
            perbarui). `questionnaire_id` dalam respons adalah UUID per versi;
            gunakan `questionnaire_group_id` jika Anda memerlukan
            pengidentifikasi grup yang stabil.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuestionnaireDetail'
        '400':
          description: >-
            Kesalahan validasi — `element_type` tidak dikenal, terjemahan tidak
            ada, kolom percabangan/bersyarat tidak didukung, `languages` tidak
            memiliki `en`, `default_language` tidak ada di `languages`, opsi
            tanpa label, mengirim `graph` mentah, atau `status: "draft"` pada
            versi yang dipublikasikan (`"Cannot revert a published version to
            draft."`). Isi respons berupa kesalahan validasi DRF dengan kunci
            berupa nama kolom.
        '403':
          description: Kunci API tidak ada atau tidak valid.
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Tidak ada kuesioner dengan `questionnaire_uuid` ini untuk aplikasi
            yang diautentikasi.
        '415':
          description: 'Tipe media tidak didukung. Atur `Content-Type: application/json`.'
        '429':
          description: Batas laju terlampaui. Coba lagi dengan backoff eksponensial.
        '500':
          description: Terjadi kesalahan server tak terduga. Aman untuk dicoba lagi.
      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: >-
        Perbarui metadata kuesioner atau ganti seluruh daftar `form_elements`
        linear.
      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: Jika diberikan, ini menggantikan seluruh daftar pertanyaan linear.
          items:
            $ref: '#/components/schemas/SimpleQuestionnaireElement'
    QuestionnaireDetail:
      type: object
      description: >-
        Detail kuesioner lengkap yang dikembalikan dari endpoint GET, POST
        (buat), dan PATCH (perbarui).
      properties:
        questionnaire_id:
          type: string
          format: uuid
          description: >-
            Pengenal unik kuesioner. Gunakan id ini saat mereferensikan
            kuesioner dari alur kerja atau dalam permintaan
            pembaruan/penghapusan berikutnya.
        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: Struktur graf dengan start_node dan peta node.
        sections:
          type: array
          description: >-
            Konten kuesioner yang dikelompokkan ke dalam bagian-bagian (berasal
            dari graf).
          items:
            type: object
        questionnaire_group_id:
          type: string
          format: uuid
          description: >-
            Pengidentifikasi stabil yang mengelompokkan semua versi dari
            kuesioner yang sama.
        version:
          type: integer
        status:
          type: string
          enum:
            - draft
            - published
        published_at:
          type: string
          format: date-time
          nullable: true
        is_editable:
          type: boolean
          description: >-
            True saat kuesioner masih dapat diedit langsung di tempat (versi
            draf).
    SimpleQuestionnaireElement:
      type: object
      required:
        - element_type
        - label
      properties:
        id:
          type: string
          description: >-
            ID pertanyaan stabil opsional. Jika diabaikan, API akan menghasilkan
            `q1`, `q2`, dll. Gunakan huruf kecil, angka, dan garis bawah demi
            keterbacaan.
          example: source_of_funds
        element_type:
          type: string
          description: >-
            Tipe pertanyaan. API menerima nilai huruf kecil ini beserta nilai
            huruf besar yang setara.
          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: >-
            Label pertanyaan berdasarkan kode bahasa, misalnya `{ "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: >-
            Gunakan untuk `dropdown`, `single_choice`, dan `multiple_choice`.
            Jika `value` dihilangkan, API akan membuatnya dari label opsi.
          items:
            type: object
            required:
              - label
            properties:
              value:
                type: string
              label:
                type: object
                additionalProperties:
                  type: string
        max_files:
          type: integer
          minimum: 1
          maximum: 5
          description: Gunakan dengan `file_upload` atau `image`.
        validation:
          type: object
          nullable: true
          description: >-
            Validasi format opsional untuk `short_text`, `long_text`, atau
            `number`. Diberlakukan saat pengguna mengisi kolom (mereka tidak
            dapat melanjutkan hingga lolos) dan diperiksa ulang oleh API saat
            pengiriman.
          properties:
            pattern:
              type: string
              description: >-
                Ekspresi reguler (subset ECMA-262) yang harus dicocokkan
                sepenuhnya oleh nilai tersebut. Untuk `short_text` dan
                `long_text`. Jangan tambahkan jangkar ^/$; seluruh nilai akan
                dicocokkan.
            min_length:
              type: integer
              minimum: 0
              description: Jumlah karakter minimum. Untuk `short_text` dan `long_text`.
            max_length:
              type: integer
              minimum: 0
              description: Jumlah karakter maksimum. Untuk `short_text` dan `long_text`.
            min:
              type: number
              description: Nilai numerik minimum. Untuk `number`.
            max:
              type: number
              description: Nilai numerik maksimum. Untuk `number`.
            error_message:
              type: object
              description: >-
                Pesan terjemahan yang ditampilkan saat validasi gagal, diberi
                kunci berdasarkan kode bahasa.
              additionalProperties:
                type: string
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Kunci API aplikasi Anda, dari Developers -> API keys di Business
        Console. Kunci utama memiliki akses penuh. Kunci bernama dapat diberi
        cakupan: none, read, atau write per sumber daya, dibatasi pada beberapa
        alur kerja atau pada sesi yang disetujui, pada daftar alamat IP, dan
        pada tanggal kedaluwarsa. 401 berarti kuncinya salah, dicabut, atau
        kedaluwarsa; 403 berarti tidak ada kunci yang dikirimkan, kunci tidak
        memiliki akses ke sumber daya atau tindakan ini, atau permintaan datang
        dari alamat di luar daftar IP-nya; 404 pada rute sesi berarti sesi
        berada di luar alur kerja atau status kunci tersebut. Kunci tanpa akses
        media menerima URL gambar, video, dan PDF sebagai null, dan kunci tanpa
        izin tulis sesi menerima tautan sesi dan token sebagai null. Lihat
        https://docs.didit.me/console/api-keys.

````

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