curl -X POST 'https://verification.didit.me/v3/questionnaires/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"title": "Customer Onboarding",
"default_language": "en",
"languages": ["en"],
"form_elements": [
{
"id": "occupation",
"element_type": "short_text",
"label": {"en": "What is your occupation?"},
"is_required": true
}
]
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.questionnaires.create(
title="Customer Onboarding",
description="Additional information needed for verification",
languages=["en"],
default_language="en",
is_active=True,
form_elements=[{
"id": "occupation",
"element_type": "short_text",
"label": {"en": "What is your occupation?"},
"placeholder": {"en": "Software engineer"},
"is_required": True,
}, {
"id": "source_of_funds",
"element_type": "multiple_choice",
"label": {"en": "Source of funds"},
"is_required": True,
"options": [{
"value": "employment",
"label": {"en": "Employment"},
}, {
"value": "business",
"label": {"en": "Business"},
}, {
"value": "investments",
"label": {"en": "Investments"},
}, {
"value": "other",
"label": {"en": "Other"},
}],
}],
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.questionnaires.create({
title: "Customer Onboarding",
description: "Additional information needed for verification",
languages: ["en"],
default_language: "en",
is_active: true,
form_elements: [{
id: "occupation",
element_type: "short_text",
label: { en: "What is your occupation?" },
placeholder: { en: "Software engineer" },
is_required: true,
}, {
id: "source_of_funds",
element_type: "multiple_choice",
label: { en: "Source of funds" },
is_required: true,
options: [{
value: "employment",
label: { en: "Employment" },
}, {
value: "business",
label: { en: "Business" },
}, {
value: "investments",
label: { en: "Investments" },
}, {
value: "other",
label: { en: "Other" },
}],
}],
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.Questionnaires.Create(ctx, didit.SimpleQuestionnaireRequest{
Title: "Customer Onboarding",
Description: didit.String("Additional information needed for verification"),
Languages: []string{"en"},
DefaultLanguage: didit.String("en"),
IsActive: didit.Bool(true),
FormElements: []didit.SimpleQuestionnaireElement{{
ID: didit.String("occupation"),
ElementType: "short_text",
Label: map[string]string{"en": "What is your occupation?"},
Placeholder: didit.Some(map[string]string{"en": "Software engineer"}),
IsRequired: didit.Bool(true),
}, {
ID: didit.String("source_of_funds"),
ElementType: "multiple_choice",
Label: map[string]string{"en": "Source of funds"},
IsRequired: didit.Bool(true),
Options: didit.Some([]didit.SimpleQuestionnaireElementOptions{{
Value: didit.String("employment"),
Label: map[string]string{"en": "Employment"},
}, {
Value: didit.String("business"),
Label: map[string]string{"en": "Business"},
}, {
Value: didit.String("investments"),
Label: map[string]string{"en": "Investments"},
}, {
Value: didit.String("other"),
Label: map[string]string{"en": "Other"},
}}),
}},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.util.List;
import java.util.Map;
import me.didit.Didit;
import me.didit.types.SimpleQuestionnaireElement;
import me.didit.types.SimpleQuestionnaireRequest;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.questionnaires().create(SimpleQuestionnaireRequest.builder()
.title("Customer Onboarding")
.description("Additional information needed for verification")
.languages(List.of("en"))
.defaultLanguage("en")
.isActive(true)
.formElements(List.of(
SimpleQuestionnaireElement.builder()
.id("occupation")
.elementType(SimpleQuestionnaireElement.ElementType.of("short_text"))
.label(Map.of("en", "What is your occupation?"))
.placeholder(Map.of("en", "Software engineer"))
.isRequired(true)
.build(),
SimpleQuestionnaireElement.builder()
.id("source_of_funds")
.elementType(SimpleQuestionnaireElement.ElementType.of("multiple_choice"))
.label(Map.of("en", "Source of funds"))
.isRequired(true)
.options(List.of(
SimpleQuestionnaireElement.Options.builder()
.value("employment")
.label(Map.of("en", "Employment"))
.build(),
SimpleQuestionnaireElement.Options.builder()
.value("business")
.label(Map.of("en", "Business"))
.build(),
SimpleQuestionnaireElement.Options.builder()
.value("investments")
.label(Map.of("en", "Investments"))
.build(),
SimpleQuestionnaireElement.Options.builder()
.value("other")
.label(Map.of("en", "Other"))
.build()))
.build()))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->questionnaires->create([
'title' => 'Customer Onboarding',
'description' => 'Additional information needed for verification',
'languages' => ['en'],
'default_language' => 'en',
'is_active' => true,
'form_elements' => [[
'id' => 'occupation',
'element_type' => 'short_text',
'label' => ['en' => 'What is your occupation?'],
'placeholder' => ['en' => 'Software engineer'],
'is_required' => true,
], [
'id' => 'source_of_funds',
'element_type' => 'multiple_choice',
'label' => ['en' => 'Source of funds'],
'is_required' => true,
'options' => [[
'value' => 'employment',
'label' => ['en' => 'Employment'],
], [
'value' => 'business',
'label' => ['en' => 'Business'],
], [
'value' => 'investments',
'label' => ['en' => 'Investments'],
], [
'value' => 'other',
'label' => ['en' => 'Other'],
]],
]],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.questionnaires.create(
title: "Customer Onboarding",
description: "Additional information needed for verification",
languages: ["en"],
default_language: "en",
is_active: true,
form_elements: [{
id: "occupation",
element_type: "short_text",
label: { en: "What is your occupation?" },
placeholder: { en: "Software engineer" },
is_required: true,
}, {
id: "source_of_funds",
element_type: "multiple_choice",
label: { en: "Source of funds" },
is_required: true,
options: [{
value: "employment",
label: { en: "Employment" },
}, {
value: "business",
label: { en: "Business" },
}, {
value: "investments",
label: { en: "Investments" },
}, {
value: "other",
label: { en: "Other" },
}],
}]
)
puts result.to_husing System;
using System.Collections.Generic;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.Questionnaires.CreateAsync(new SimpleQuestionnaireRequest
{
Title = "Customer Onboarding",
Description = "Additional information needed for verification",
Languages = new string[] { "en" },
DefaultLanguage = "en",
IsActive = true,
FormElements = new SimpleQuestionnaireElement[]
{
new()
{
Id = "occupation",
ElementType = "short_text",
Label = new Dictionary<string, string> { ["en"] = "What is your occupation?" },
Placeholder = new Dictionary<string, string> { ["en"] = "Software engineer" },
IsRequired = true,
},
new()
{
Id = "source_of_funds",
ElementType = "multiple_choice",
Label = new Dictionary<string, string> { ["en"] = "Source of funds" },
IsRequired = true,
Options = new SimpleQuestionnaireElementOptions[]
{
new()
{
Value = "employment",
Label = new Dictionary<string, string> { ["en"] = "Employment" },
},
new()
{
Value = "business",
Label = new Dictionary<string, string> { ["en"] = "Business" },
},
new()
{
Value = "investments",
Label = new Dictionary<string, string> { ["en"] = "Investments" },
},
new()
{
Value = "other",
Label = new Dictionary<string, string> { ["en"] = "Other" },
},
},
},
},
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"questionnaire_id": "11111111-2222-3333-4444-555555555555",
"title": "Customer Onboarding",
"description": "Additional information needed for verification",
"languages": [
"en"
],
"default_language": "en",
"is_active": true,
"is_simple_questionnaire": true,
"graph": {
"start_node": "occupation",
"nodes": {
"occupation": {
"element_type": "SHORT_TEXT",
"is_required": true,
"title": {
"en": "What is your occupation?"
},
"next": "source_of_funds"
},
"source_of_funds": {
"element_type": "MULTIPLE_CHOICE",
"is_required": true,
"title": {
"en": "Source of funds"
},
"choices": [
{
"value": "employment",
"label": {
"en": "Employment"
}
},
{
"value": "business",
"label": {
"en": "Business"
}
}
],
"next": null
}
}
},
"sections": [],
"questionnaire_group_id": "11111111-2222-3333-4444-555555555555",
"version": 1,
"status": "published",
"published_at": "2026-04-23T10:00:00Z",
"is_editable": false
}创建问卷 API:自定义 KYC 表单
通过 Didit 以编程方式创建自定义 KYC 与合规问卷,支持有序问题、选项及 54 种语言翻译。按次计费。
curl -X POST 'https://verification.didit.me/v3/questionnaires/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"title": "Customer Onboarding",
"default_language": "en",
"languages": ["en"],
"form_elements": [
{
"id": "occupation",
"element_type": "short_text",
"label": {"en": "What is your occupation?"},
"is_required": true
}
]
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.questionnaires.create(
title="Customer Onboarding",
description="Additional information needed for verification",
languages=["en"],
default_language="en",
is_active=True,
form_elements=[{
"id": "occupation",
"element_type": "short_text",
"label": {"en": "What is your occupation?"},
"placeholder": {"en": "Software engineer"},
"is_required": True,
}, {
"id": "source_of_funds",
"element_type": "multiple_choice",
"label": {"en": "Source of funds"},
"is_required": True,
"options": [{
"value": "employment",
"label": {"en": "Employment"},
}, {
"value": "business",
"label": {"en": "Business"},
}, {
"value": "investments",
"label": {"en": "Investments"},
}, {
"value": "other",
"label": {"en": "Other"},
}],
}],
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.questionnaires.create({
title: "Customer Onboarding",
description: "Additional information needed for verification",
languages: ["en"],
default_language: "en",
is_active: true,
form_elements: [{
id: "occupation",
element_type: "short_text",
label: { en: "What is your occupation?" },
placeholder: { en: "Software engineer" },
is_required: true,
}, {
id: "source_of_funds",
element_type: "multiple_choice",
label: { en: "Source of funds" },
is_required: true,
options: [{
value: "employment",
label: { en: "Employment" },
}, {
value: "business",
label: { en: "Business" },
}, {
value: "investments",
label: { en: "Investments" },
}, {
value: "other",
label: { en: "Other" },
}],
}],
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.Questionnaires.Create(ctx, didit.SimpleQuestionnaireRequest{
Title: "Customer Onboarding",
Description: didit.String("Additional information needed for verification"),
Languages: []string{"en"},
DefaultLanguage: didit.String("en"),
IsActive: didit.Bool(true),
FormElements: []didit.SimpleQuestionnaireElement{{
ID: didit.String("occupation"),
ElementType: "short_text",
Label: map[string]string{"en": "What is your occupation?"},
Placeholder: didit.Some(map[string]string{"en": "Software engineer"}),
IsRequired: didit.Bool(true),
}, {
ID: didit.String("source_of_funds"),
ElementType: "multiple_choice",
Label: map[string]string{"en": "Source of funds"},
IsRequired: didit.Bool(true),
Options: didit.Some([]didit.SimpleQuestionnaireElementOptions{{
Value: didit.String("employment"),
Label: map[string]string{"en": "Employment"},
}, {
Value: didit.String("business"),
Label: map[string]string{"en": "Business"},
}, {
Value: didit.String("investments"),
Label: map[string]string{"en": "Investments"},
}, {
Value: didit.String("other"),
Label: map[string]string{"en": "Other"},
}}),
}},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.util.List;
import java.util.Map;
import me.didit.Didit;
import me.didit.types.SimpleQuestionnaireElement;
import me.didit.types.SimpleQuestionnaireRequest;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.questionnaires().create(SimpleQuestionnaireRequest.builder()
.title("Customer Onboarding")
.description("Additional information needed for verification")
.languages(List.of("en"))
.defaultLanguage("en")
.isActive(true)
.formElements(List.of(
SimpleQuestionnaireElement.builder()
.id("occupation")
.elementType(SimpleQuestionnaireElement.ElementType.of("short_text"))
.label(Map.of("en", "What is your occupation?"))
.placeholder(Map.of("en", "Software engineer"))
.isRequired(true)
.build(),
SimpleQuestionnaireElement.builder()
.id("source_of_funds")
.elementType(SimpleQuestionnaireElement.ElementType.of("multiple_choice"))
.label(Map.of("en", "Source of funds"))
.isRequired(true)
.options(List.of(
SimpleQuestionnaireElement.Options.builder()
.value("employment")
.label(Map.of("en", "Employment"))
.build(),
SimpleQuestionnaireElement.Options.builder()
.value("business")
.label(Map.of("en", "Business"))
.build(),
SimpleQuestionnaireElement.Options.builder()
.value("investments")
.label(Map.of("en", "Investments"))
.build(),
SimpleQuestionnaireElement.Options.builder()
.value("other")
.label(Map.of("en", "Other"))
.build()))
.build()))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->questionnaires->create([
'title' => 'Customer Onboarding',
'description' => 'Additional information needed for verification',
'languages' => ['en'],
'default_language' => 'en',
'is_active' => true,
'form_elements' => [[
'id' => 'occupation',
'element_type' => 'short_text',
'label' => ['en' => 'What is your occupation?'],
'placeholder' => ['en' => 'Software engineer'],
'is_required' => true,
], [
'id' => 'source_of_funds',
'element_type' => 'multiple_choice',
'label' => ['en' => 'Source of funds'],
'is_required' => true,
'options' => [[
'value' => 'employment',
'label' => ['en' => 'Employment'],
], [
'value' => 'business',
'label' => ['en' => 'Business'],
], [
'value' => 'investments',
'label' => ['en' => 'Investments'],
], [
'value' => 'other',
'label' => ['en' => 'Other'],
]],
]],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.questionnaires.create(
title: "Customer Onboarding",
description: "Additional information needed for verification",
languages: ["en"],
default_language: "en",
is_active: true,
form_elements: [{
id: "occupation",
element_type: "short_text",
label: { en: "What is your occupation?" },
placeholder: { en: "Software engineer" },
is_required: true,
}, {
id: "source_of_funds",
element_type: "multiple_choice",
label: { en: "Source of funds" },
is_required: true,
options: [{
value: "employment",
label: { en: "Employment" },
}, {
value: "business",
label: { en: "Business" },
}, {
value: "investments",
label: { en: "Investments" },
}, {
value: "other",
label: { en: "Other" },
}],
}]
)
puts result.to_husing System;
using System.Collections.Generic;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.Questionnaires.CreateAsync(new SimpleQuestionnaireRequest
{
Title = "Customer Onboarding",
Description = "Additional information needed for verification",
Languages = new string[] { "en" },
DefaultLanguage = "en",
IsActive = true,
FormElements = new SimpleQuestionnaireElement[]
{
new()
{
Id = "occupation",
ElementType = "short_text",
Label = new Dictionary<string, string> { ["en"] = "What is your occupation?" },
Placeholder = new Dictionary<string, string> { ["en"] = "Software engineer" },
IsRequired = true,
},
new()
{
Id = "source_of_funds",
ElementType = "multiple_choice",
Label = new Dictionary<string, string> { ["en"] = "Source of funds" },
IsRequired = true,
Options = new SimpleQuestionnaireElementOptions[]
{
new()
{
Value = "employment",
Label = new Dictionary<string, string> { ["en"] = "Employment" },
},
new()
{
Value = "business",
Label = new Dictionary<string, string> { ["en"] = "Business" },
},
new()
{
Value = "investments",
Label = new Dictionary<string, string> { ["en"] = "Investments" },
},
new()
{
Value = "other",
Label = new Dictionary<string, string> { ["en"] = "Other" },
},
},
},
},
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"questionnaire_id": "11111111-2222-3333-4444-555555555555",
"title": "Customer Onboarding",
"description": "Additional information needed for verification",
"languages": [
"en"
],
"default_language": "en",
"is_active": true,
"is_simple_questionnaire": true,
"graph": {
"start_node": "occupation",
"nodes": {
"occupation": {
"element_type": "SHORT_TEXT",
"is_required": true,
"title": {
"en": "What is your occupation?"
},
"next": "source_of_funds"
},
"source_of_funds": {
"element_type": "MULTIPLE_CHOICE",
"is_required": true,
"title": {
"en": "Source of funds"
},
"choices": [
{
"value": "employment",
"label": {
"en": "Employment"
}
},
{
"value": "business",
"label": {
"en": "Business"
}
}
],
"next": null
}
}
},
"sections": [],
"questionnaire_group_id": "11111111-2222-3333-4444-555555555555",
"version": 1,
"status": "published",
"published_at": "2026-04-23T10:00:00Z",
"is_editable": false
}form_elements 数组。Didit 会为您构建内部问卷图谱。
该 API 仅支持简单的线性问卷。请勿发送 graph、branches、next 或条件规则。
必填字段
title是内部问卷名称。languages必须包含en。form_elements必须至少包含一个问题。- 每个表单元素都需要
element_type和已翻译的label。
description,作为其帮助文本。除 separator 外,所有元素类型都支持该字段,并会在问卷报告中以该条目的 description 返回。
元素类型
请使用小写值,例如short_text、multiple_choice、email、file_upload 或 date_picker。大写枚举值(例如 SHORT_TEXT)也可以使用。
对于 dropdown、single_choice 和 multiple_choice,请添加 options。如果省略选项的 value,Didit 会根据标签自动生成。
{
"title": "Customer Onboarding",
"languages": ["en"],
"default_language": "en",
"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" },
"is_required": true,
"options": [
{ "value": "employment", "label": { "en": "Employment" } },
{ "value": "business", "label": { "en": "Business" } },
{ "value": "investments", "label": { "en": "Investments" } }
]
}
]
}
字段验证
为short_text、long_text 或 number 元素添加可选的 validation 对象,即可对用户的回答强制执行格式。这对于有严格格式要求的标识符很有用,例如税号、国民身份证号或卡号。用户填写字段时即会进行验证(未通过验证时用户无法继续),提交时 API 还会再次强制执行。
| 字段 | 适用于 | 说明 |
|---|---|---|
pattern | short_text、long_text | 值必须完整匹配的正则表达式。请使用可移植的 ECMA-262 子集,不要添加 ^/$ 锚点(整个值都会被匹配)。 |
min_length | short_text、long_text | 最少字符数。 |
max_length | short_text、long_text | 最多字符数。 |
min | number | 最小数值。 |
max | number | 最大数值。 |
error_message | 以上所有字段 | 值未通过验证时显示的已翻译消息。省略时使用通用消息。 |
{
"title": "Customer Onboarding",
"languages": ["en"],
"default_language": "en",
"form_elements": [
{
"id": "tax_id",
"element_type": "short_text",
"label": { "en": "Tax ID" },
"is_required": true,
"validation": {
"pattern": "[A-Z]{2}[0-9]{9}",
"min_length": 11,
"max_length": 11,
"error_message": { "en": "Enter a valid Tax ID (2 letters followed by 9 digits)." }
}
}
]
}
questionnaire_id。请妥善保存,因为将问卷添加到工作流时,需要将其用作 questionnaire_uuid。授权
您的应用 API 密钥,可在 Business Console 的“开发者 -> API 密钥”中获取。主密钥拥有完整访问权限。指定名称的密钥可设置作用域:针对每个资源设为无权限、只读或读写,限定于特定工作流或已通过的会话、限定于 IP 地址列表,以及设置到期日期。401 表示密钥错误、已撤销或已过期;403 表示未发送密钥、密钥无权访问该资源或操作,或请求来自其 IP 列表之外的地址;在会话路由上返回 404 表示该会话不在该密钥允许的工作流或状态范围内。没有媒体访问权限的密钥获取到的图片、视频和 PDF URL 将为 null;没有会话写入权限的密钥获取到的会话链接和 token 将为 null。请参阅 https://docs.didit.me/console/api-keys。
请求体
创建简单的线性问卷。API 会在内部将 form_elements 转换为内部问卷图谱。
问卷的内部名称。
每个标签中包含的语言。必须包含 en。
["en"]
用户应该看到的严格顺序的问题。不支持分支和条件字段。
1Show child attributes
Show child attributes
默认语言。必须包含在 languages 中。
"en"
省略此字段可创建已发布且可用于工作流的问卷。
draft, published 响应
问卷已创建。响应包含 questionnaire_id — 请保存该 ID,以便在工作流或将来的更新/删除调用中引用此问卷。
从 GET、POST(创建)和 PATCH(更新)endpoint 返回的完整问卷详情。
问卷的唯一标识符。在工作流中引用该问卷或在后续更新/删除请求中使用此 ID。
包含 start_node 和 nodes 映射的图谱结构。
分组到各节中的问卷内容(源自图谱)。
用于将同一问卷的所有版本分组的稳定标识符。
draft, published 当问卷仍可就地编辑(草稿版本)时为 true。