curl -X POST 'https://verification.didit.me/v3/workflows/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"workflow_label": "Standard KYC",
"features": [
{"feature": "OCR"},
{"feature": "LIVENESS", "config": {"face_liveness_method": "passive"}},
{"feature": "FACE_MATCH", "config": {"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60}}
]
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.workflows.create(
workflow_label="Standard KYC",
features=[{
"feature": "OCR",
"config": {"duplicated_user_action": "review"},
}, {
"feature": "LIVENESS",
"config": {"face_liveness_method": "passive"},
}, {
"feature": "FACE_MATCH",
"config": {"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60},
}],
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.workflows.create({
workflow_label: "Standard KYC",
features: [{
feature: "OCR",
config: { duplicated_user_action: "review" },
}, {
feature: "LIVENESS",
config: { face_liveness_method: "passive" },
}, {
feature: "FACE_MATCH",
config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },
}],
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.Workflows.Create(ctx, didit.SimpleWorkflowRequest{
WorkflowLabel: didit.String("Standard KYC"),
Features: []didit.SimpleWorkflowFeature{{
Feature: "OCR",
Config: didit.Some(map[string]any{"duplicated_user_action": "review"}),
}, {
Feature: "LIVENESS",
Config: didit.Some(map[string]any{"face_liveness_method": "passive"}),
}, {
Feature: "FACE_MATCH",
Config: didit.Some(map[string]any{"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60}),
}},
})
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.SimpleWorkflowFeature;
import me.didit.types.SimpleWorkflowRequest;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.workflows().create(SimpleWorkflowRequest.builder()
.workflowLabel("Standard KYC")
.features(List.of(
SimpleWorkflowFeature.builder()
.feature(SimpleWorkflowFeature.Feature.of("OCR"))
.config(Map.of("duplicated_user_action", "review"))
.build(),
SimpleWorkflowFeature.builder()
.feature(SimpleWorkflowFeature.Feature.of("LIVENESS"))
.config(Map.of("face_liveness_method", "passive"))
.build(),
SimpleWorkflowFeature.builder()
.feature(SimpleWorkflowFeature.Feature.of("FACE_MATCH"))
.config(Map.of("face_match_score_decline_threshold", 40, "face_match_score_review_threshold", 60))
.build()))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->workflows->create([
'workflow_label' => 'Standard KYC',
'features' => [[
'feature' => 'OCR',
'config' => ['duplicated_user_action' => 'review'],
], [
'feature' => 'LIVENESS',
'config' => ['face_liveness_method' => 'passive'],
], [
'feature' => 'FACE_MATCH',
'config' => ['face_match_score_decline_threshold' => 40, 'face_match_score_review_threshold' => 60],
]],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.workflows.create(
workflow_label: "Standard KYC",
features: [{
feature: "OCR",
config: { duplicated_user_action: "review" },
}, {
feature: "LIVENESS",
config: { face_liveness_method: "passive" },
}, {
feature: "FACE_MATCH",
config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },
}]
)
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.Workflows.CreateAsync(new SimpleWorkflowRequest
{
WorkflowLabel = "Standard KYC",
Features = new SimpleWorkflowFeature[]
{
new()
{
Feature = "OCR",
Config = new Dictionary<string, object> { ["duplicated_user_action"] = "review" },
},
new()
{
Feature = "LIVENESS",
Config = new Dictionary<string, object> { ["face_liveness_method"] = "passive" },
},
new()
{
Feature = "FACE_MATCH",
Config = new Dictionary<string, object> { ["face_match_score_decline_threshold"] = 40, ["face_match_score_review_threshold"] = 60 },
},
},
});
Console.WriteLine(JsonSerializer.Serialize(result));ワークフロー作成API:KYCフローを構築
Didit の認証ワークフローを、機能の順序を指定してプログラムで作成できます。KYC、KYB、AML、生体認証を1つのフローに統合。呼び出しごとの従量課金で、契約は不要です。
curl -X POST 'https://verification.didit.me/v3/workflows/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"workflow_label": "Standard KYC",
"features": [
{"feature": "OCR"},
{"feature": "LIVENESS", "config": {"face_liveness_method": "passive"}},
{"feature": "FACE_MATCH", "config": {"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60}}
]
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.workflows.create(
workflow_label="Standard KYC",
features=[{
"feature": "OCR",
"config": {"duplicated_user_action": "review"},
}, {
"feature": "LIVENESS",
"config": {"face_liveness_method": "passive"},
}, {
"feature": "FACE_MATCH",
"config": {"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60},
}],
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.workflows.create({
workflow_label: "Standard KYC",
features: [{
feature: "OCR",
config: { duplicated_user_action: "review" },
}, {
feature: "LIVENESS",
config: { face_liveness_method: "passive" },
}, {
feature: "FACE_MATCH",
config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },
}],
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.Workflows.Create(ctx, didit.SimpleWorkflowRequest{
WorkflowLabel: didit.String("Standard KYC"),
Features: []didit.SimpleWorkflowFeature{{
Feature: "OCR",
Config: didit.Some(map[string]any{"duplicated_user_action": "review"}),
}, {
Feature: "LIVENESS",
Config: didit.Some(map[string]any{"face_liveness_method": "passive"}),
}, {
Feature: "FACE_MATCH",
Config: didit.Some(map[string]any{"face_match_score_decline_threshold": 40, "face_match_score_review_threshold": 60}),
}},
})
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.SimpleWorkflowFeature;
import me.didit.types.SimpleWorkflowRequest;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.workflows().create(SimpleWorkflowRequest.builder()
.workflowLabel("Standard KYC")
.features(List.of(
SimpleWorkflowFeature.builder()
.feature(SimpleWorkflowFeature.Feature.of("OCR"))
.config(Map.of("duplicated_user_action", "review"))
.build(),
SimpleWorkflowFeature.builder()
.feature(SimpleWorkflowFeature.Feature.of("LIVENESS"))
.config(Map.of("face_liveness_method", "passive"))
.build(),
SimpleWorkflowFeature.builder()
.feature(SimpleWorkflowFeature.Feature.of("FACE_MATCH"))
.config(Map.of("face_match_score_decline_threshold", 40, "face_match_score_review_threshold", 60))
.build()))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->workflows->create([
'workflow_label' => 'Standard KYC',
'features' => [[
'feature' => 'OCR',
'config' => ['duplicated_user_action' => 'review'],
], [
'feature' => 'LIVENESS',
'config' => ['face_liveness_method' => 'passive'],
], [
'feature' => 'FACE_MATCH',
'config' => ['face_match_score_decline_threshold' => 40, 'face_match_score_review_threshold' => 60],
]],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.workflows.create(
workflow_label: "Standard KYC",
features: [{
feature: "OCR",
config: { duplicated_user_action: "review" },
}, {
feature: "LIVENESS",
config: { face_liveness_method: "passive" },
}, {
feature: "FACE_MATCH",
config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },
}]
)
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.Workflows.CreateAsync(new SimpleWorkflowRequest
{
WorkflowLabel = "Standard KYC",
Features = new SimpleWorkflowFeature[]
{
new()
{
Feature = "OCR",
Config = new Dictionary<string, object> { ["duplicated_user_action"] = "review" },
},
new()
{
Feature = "LIVENESS",
Config = new Dictionary<string, object> { ["face_liveness_method"] = "passive" },
},
new()
{
Feature = "FACE_MATCH",
Config = new Dictionary<string, object> { ["face_match_score_decline_threshold"] = 40, ["face_match_score_review_threshold"] = 60 },
},
},
});
Console.WriteLine(JsonSerializer.Serialize(result));features配列を送信してください。Diditはこれを内部でノードベースのワークフローに変換し、最終ステータスのステップを自動的に追加します。
このPOST /v3/workflows/エンドポイントで作成できるのは、フラットなfeaturesリストによるシンプルで直線的なワークフローのみです。分岐、条件付きルーティング、Document AI、却下・判定ノードを使う場合は、以下で説明するノードのグラフ形式を使用してください(コンソールのビジュアルビルダーとDidit MCPのワークフローツールもこの形式で動作しています)。
各機能が受け付けるすべてのconfigフィールドについては、ワークフロー機能の設定を参照してください。
基本的なKYCワークフロー
{
"workflow_label": "Standard KYC",
"features": [
{
"feature": "OCR",
"config": {
"documents_allowed": {
"USA": {
"DL": {
"enabled": 1,
"sides": 2
}
}
},
"duplicated_user_action": "REVIEW"
}
},
{
"feature": "LIVENESS",
"config": {
"face_liveness_method": "PASSIVE"
}
},
{
"feature": "FACE_MATCH"
}
]
}
アンケートワークフロー
まずPOST /v3/questionnaires/でアンケートを作成します。次に、返されたquestionnaire_idをquestionnaire_uuidとして使用します。
{
"workflow_label": "Source of Funds",
"features": [
{
"feature": "QUESTIONNAIRE",
"config": {
"questionnaire_uuid": "11111111-2222-3333-4444-555555555555",
"review_questionnaire_manually": true
}
}
]
}
FACE_MATCH、NFC、DATABASE_VALIDATION、またはユーザーのAMLチェックより前にOCRを配置してください。
機能設定リファレンス
features[]の各項目は次の形式です。
{
"feature": "OCR",
"label": "ID Verification",
"config": {}
}
configオブジェクトの正確な内容は機能によって異なります。フィールドの完全な一覧、デフォルト値、必須設定、値の範囲、例についてはワークフロー機能の設定を確認してください。
OCRでは、config.documents_allowedを省略するか、nullまたは{}を送信すると、サポートされているすべての書類タイプが許可されます。特定の国や書類タイプにワークフローを限定したい場合にのみ含めてください。QUESTIONNAIREでは、config.questionnaire_uuidが必須です。
オプションのワークフロー設定
ワークフローの作成時に以下のトップレベルフィールドを含めることで、セッションの動作を制御できます。いずれも任意で、省略した場合はワークフローのデフォルト値が使用されます。| フィールド | 型 | 説明 |
|---|---|---|
is_white_label_enabled | boolean | このワークフローで作成されたセッションで、ホワイトラベルのカスタマイズを有効にします。デフォルトはfalseです。 |
is_desktop_allowed | boolean | デスクトップブラウザでの認証フローの実行を許可します。デフォルトはfalseです。 |
max_retry_attempts | 整数(0–10) | 認証が却下された後に許可される再試行の最大回数です。0の場合、最初の却下でユーザーがブロックされます。デフォルトは3です。 |
retry_window_days | 整数(1–365)またはnull | 再試行回数のカウントに使用する、日数単位のローリング期間です(nullは全期間での上限)。デフォルトは7です。 |
session_expiration_time | 整数(3600–2419200) | 未完了のセッションが期限切れになるまでの秒数です。最小1時間、最大4週間です。デフォルトは604800(7日間)です。 |
response_attributes | オブジェクトまたはnull | 機能ごとに返されるフィールドを制限します。例: {"id_verifications": ["full_name", "document_number"], "face_matches": null}。nullまたはキーが存在しない場合は、すべてのフィールドが返されます。空のリストを指定すると、status、warnings、node_id、is_nfc_skipped、skip_reasonのみが返され、その他のフィールドはnullになります。 |
{
"workflow_label": "Standard KYC",
"is_white_label_enabled": true,
"is_desktop_allowed": true,
"max_retry_attempts": 5,
"retry_window_days": 14,
"session_expiration_time": 86400,
"features": [
{ "feature": "OCR" },
{ "feature": "LIVENESS" },
{ "feature": "FACE_MATCH" }
]
}
分岐とノードベースのワークフロー (グラフ)
直線的なfeaturesリストでは「XならばY」という条件を表現できません。条件分岐(ステータスに応じた却下、抽出したフィールドに基づくルーティング、一致結果に応じたステップの制御)、Document AIのリクエストステップ、または終端の却下/判定ノードを使う場合、Diditのワークフローはノードグラフを使用します。これはコンソールのビジュアルビルダーが生成するものと同じ構造です。
グラフの構造
グラフは{ start_node, nodes }です。nodesはノードIDからノードへのマップです。エッジは暗黙的に定義され、各ノードはnext(無条件)またはbranches[].goto(条件付き)、あるいはその両方で次のノードを指します。
| ノードタイプ | 構造 |
|---|---|
feature | { "node_type": "feature", "feature": "OCR", "config": {…}, "next": "<id>", "branches": [] } |
branch | { "node_type": "branch", "branches": [ { "id", "logic": "and"|"or", "rules": [<rule>], "goto": "<id>" } ], "next": "<fallback id>" } |
status(終端) | { "node_type": "status", "session_status": "Approved"|"Declined"|"In Review"|"Determine" } |
action | { "node_type": "action", "actions": [ { "type": "add_tag"|"add_review"|… } ], "next": "<id>" } |
webhook | { "node_type": "webhook", "config": { "url", "method" }, "branches": [], "next": "<id>" } |
start_nodeは機能ノードでなければなりません。分岐は順番に評価され、最初に一致したものが採用されます。空のrules: []はすべてに一致する「else」です(必ず最後に置いてください)。session_status: "Determine"は、各機能の結果を総合して自動的に判定します。
rules: []を持つ分岐で、どの条件にも一致しないセッションのルーティング先を指定します。分岐ノードのnextをフォールバックとして頼らないでください。単独のnextはビルダー上で曖昧なエッジとして表示され、見落としやすくなります。else分岐がなくnextを持つ分岐ノードを送信すると、APIがそのnextを明示的なelse分岐に変換します(つまり{ …, "branches": [<conditions>], "next": "liveness" }はbranches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]として保存されます)。明示性を保つため、else分岐は自分で作成してください。この変換はあくまで安全策であり、代わりになるものではありません。分岐ルールと演算子
各ルールは、フィールドと値を演算子で比較します:{ "field": "kyc.extra_fields.profession", "operator": "fuzzy_match", "value": "Software Engineer", "score": 80 }
- フィールドには、機能の結果(
kyc.status、aml.status、document_ai.status、face_match.scoreなど)または抽出された値(kyc.full_name、kyc.age、kyc.nationality、kyc.extra_fields.profession、Document AIのフィールドdocument_ai.<key>、expected_details.*)を指定します。分岐が読み取れるのは、その分岐に到達するすべての経路で対応する機能が実行済みのフィールドのみです。 - 演算子:
equals、not_equals、greater_than(_or_equals)、less_than(_or_equals)、contains、not_contains、in、not_in、is_empty、is_not_empty、regex、およびfuzzy_match(文字列フィールドのみ。0–100のscoreが必須で、これは類似度のしきい値です。例: 職業が”Software Engineer”と80%以上類似)。
NFCが実行されなかった理由で分岐する
NFCノードの後では、nfc.skip_reasonをequalsまたはinと組み合わせて使い、チップの読み取りが行われなかった理由に応じてセッションをルーティングします。このフィールドは次の7つの固定値を取ります:
USER_SKIPPEDDOCUMENT_WITHOUT_CHIPCHIP_CERTIFICATE_UNAVAILABLEDEVICE_WITHOUT_NFCINTEGRATION_WITHOUT_NFC_ACCESSMRZ_KEY_UNAVAILABLEJPKI_UNAVAILABLE
nfc.skip_reasonはnullになるため、スキップ理由に対するequalsルールもinルールも一致しません。
このフィールドは、ゲートによってスキップされたNFCノードでも値が決まります。これには、NFCのレポートや警告が存在しない場合や、allow_nfc_skipがfalseであっても書類またはデバイスのゲートによってNFCが実行されない場合が含まれます。そのため、nfc_verifications[]のエントリに頼らずにこれらのセッションをルーティングできます。
has_device_nfc_support: falseとなっている場合があります。そのため、古いWebセッションではINTEGRATION_WITHOUT_NFC_ACCESSではなくDEVICE_WITHOUT_NFCとして値が決まることがあります。equalsを、ゲートまたは対応状況によるスキップにinを使い、NFCが成功した場合には明示的なelseを使用しています。分岐はNFCノードの後に置かれ、すべての遷移先は前方の終端ノードを指しています:
{
"start_node": "ocr",
"nodes": {
"ocr": {
"node_type": "feature",
"feature": "OCR",
"next": "nfc"
},
"nfc": {
"node_type": "feature",
"feature": "NFC",
"config": { "allow_nfc_skip": false },
"next": "route_nfc"
},
"route_nfc": {
"node_type": "branch",
"branches": [
{
"id": "user_skipped",
"logic": "and",
"rules": [
{ "field": "nfc.skip_reason", "operator": "equals", "value": "USER_SKIPPED" }
],
"goto": "manual_review"
},
{
"id": "nfc_unavailable",
"logic": "and",
"rules": [
{
"field": "nfc.skip_reason",
"operator": "in",
"value": [
"DOCUMENT_WITHOUT_CHIP",
"CHIP_CERTIFICATE_UNAVAILABLE",
"DEVICE_WITHOUT_NFC",
"INTEGRATION_WITHOUT_NFC_ACCESS",
"MRZ_KEY_UNAVAILABLE",
"JPKI_UNAVAILABLE"
]
}
],
"goto": "manual_review"
},
{
"id": "else",
"logic": "and",
"rules": [],
"goto": "approved"
}
]
},
"manual_review": { "node_type": "status", "session_status": "In Review" },
"approved": { "node_type": "status", "session_status": "Approved" }
}
}
inを使用します。NFCが成功した場合(nfc.skip_reason: null)や、グラフがまだ認識していない将来の値に備えて、明示的なelse分岐を残しておいてください。
Document AI(例: 資金証明)
DOCUMENT_AI機能ノードは、1つ以上の書類をリクエストし、名前付きフィールドを抽出します:
{
"node_type": "feature",
"feature": "DOCUMENT_AI",
"label": "Proof of Funds",
"config": {
"document_ai_documents": [
{
"document_key": "proof_of_funds",
"title": "Proof of Funds",
"description": "Upload a recent bank statement.",
"fields": [
{
"key": "account_holder",
"name": "Account holder",
"instruction": "The full name of the account holder as printed on the statement.",
"type": "text",
"required": true,
"is_full_name": true
},
{
"key": "closing_balance",
"name": "Closing balance",
"instruction": "The closing balance amount.",
"type": "number",
"required": true
}
]
}
],
"document_ai_missing_required_fields_action": "REVIEW",
"document_ai_name_mismatch_action": "REVIEW"
},
"next": "final_decision"
}
document_ai.<key>となり、ステップの結果はdocument_ai.statusになります。
書類の名義人の氏名を保持するフィールドには"is_full_name": trueを設定します。抽出された値は検証済みの本人の氏名(OCR/本人確認で得た氏名、またはセッションの期待される詳細情報)と照合され、document_ai_name_match_score_thresholdを下回る不一致が生じた場合の処理はdocument_ai_name_mismatch_actionで決まります。このフラグは任意で、どのフィールドにも設定しない書類があっても構いません。また、設定できるのは書類1件につき最大1つのフィールドのみです。Document AIのすべての設定フィールドについては、ワークフロー機能の設定 → Document AIを参照してください。
エンドポイントとドラフトのライフサイクル
グラフの編集はアプリケーションごとに行い、コンソール/管理用エンドポイント(user-Bearerとread:workflows/write:workflows)を使用します。グラフを編集できるのはドラフトバージョンのみのため、ライフサイクルはドラフト作成 → グラフ設定 → 公開となります:
| メソッド | パス | 用途 |
|---|---|---|
GET | …/verification-settings/{settings_uuid}/workflow-graph/ | 現在のグラフとstatus/is_editable |
POST | …/application/{app}/workflow-graph/validate/ (ボディ{ "graph": … }) | ドライランでの検証 |
GET | …/application/{app}/workflow-graph/field-definitions/ | 分岐に使用できるフィールドと有効な演算子 |
POST | …/verification-settings/{settings_uuid}/create-draft/ | 公開済みバージョンから編集可能なドラフトを作成 |
PUT | …/verification-settings/{settings_uuid}/workflow-graph/ (ボディ{ "graph": … }) | グラフを保存 |
PATCH | …/verification-settings/{settings_uuid}/ (ボディ{ "status": "published" }) | ドラフトを公開 |
検証の警告
検証エンドポイントは{ "is_valid": true, "graph": …, "warnings": [] }を返します。警告は参考情報です。グラフは有効であり、警告があっても保存も公開もできます。各エントリには対象となる分岐ノードとアームが含まれるため、ビルダーは該当する条件を正確に示すことができます。
{
"type": "branch_outcome_contradiction",
"node_id": "after_ocr",
"branch_id": "b1",
"severity": "warning",
"message": "Branch 1 only matches sessions where ID Verification Status is Approved or In Review, but every path from it ends in the session outcome \"Declined\". Check the condition or the outcome.",
"params": { "branchNumber": 1, "field": "ID Verification Status", "allowed": "Approved or In Review", "outcome": "Declined" }
}
type | 意味 |
|---|---|
branch_outcome_contradiction | アームの条件と、そこから続くすべてのパスが到達する結果が矛盾しています。たとえば、kyc.status NOT EQUALS DeclinedがDeclinedの結果にルーティングされている場合です。結果はパスの数ステップ先にある場合もあります。 |
branch_condition_unreachable | このアームは決して一致しません。この分岐に到達するすべてのパスで、そのステータスフィールドが条件で除外される値にすでに限定されているためです。 |
else_branch_unreachable | elseアームは決して実行されません。他のアームが、この時点でフィールドが取り得るすべての値をすでにカバーしています。 |
400を返し、errorsおよびベストエフォートのwarningsリストを含みます。保存をブロックするのはerrorsのみです。
実践例: ソフトウェアエンジニアを資金証明にルーティングする
本人確認の後、結果が却下であればセッションを却下します。保有者の職業 ≈ “Software Engineer”(類似度≥80%)であれば、資金証明書類をリクエストします。その後、最終判定を行います。
{
"start_node": "ocr_1",
"nodes": {
"ocr_1": { "node_type": "feature", "feature": "OCR", "label": "ID Verification", "next": "after_ocr" },
"after_ocr": {
"node_type": "branch",
"label": "Route after ID verification",
"branches": [
{ "id": "declined", "logic": "or", "rules": [ { "field": "kyc.status", "operator": "equals", "value": "Declined" } ], "goto": "decline" },
{ "id": "software_engineer", "logic": "and", "rules": [ { "field": "kyc.extra_fields.profession", "operator": "fuzzy_match", "value": "Software Engineer", "score": 80 } ], "goto": "proof_of_funds" },
{ "id": "else", "logic": "and", "rules": [], "goto": "final_decision" }
]
},
"proof_of_funds": {
"node_type": "feature",
"feature": "DOCUMENT_AI",
"label": "Proof of Funds",
"config": {
"document_ai_documents": [
{ "document_key": "proof_of_funds", "title": "Proof of Funds", "description": "Upload a recent bank statement.",
"fields": [
{ "key": "account_holder", "name": "Account holder", "type": "text", "required": true },
{ "key": "closing_balance", "name": "Closing balance", "type": "number", "required": true }
] }
],
"document_ai_missing_required_fields_action": "REVIEW"
},
"next": "final_decision"
},
"final_decision": { "node_type": "status", "session_status": "Determine", "label": "Final decision" },
"decline": { "node_type": "status", "session_status": "Declined", "label": "Declined" }
}
}
session_status: "Determine"を使用します。これはセッションで実際に実行された機能に基づいて自動的に判定(承認、却下、レビュー中)します。そのため、どの分岐もdocument_ai.status(Document AIをスキップするパスには存在しません)を読み取ることなく、資金証明のパスとelseのパスの両方が正しく判定されます。分岐が読み取れるのは、その分岐に到達するすべてのパスで機能が実行されたフィールドのみである点に注意してください。
これを{ "graph": <above> }として…/workflow-graph/エンドポイントに送信します(先に検証してください)。新規ワークフローを一から作成するにはMCPのdidit_workflow_set_graphを使用し、既存のワークフローを変更するにはdidit_workflow_edit_graphを使用します(小規模な操作で、既存のノードと許可リストを保持します)。Didit MCPを参照してください。承認
お客様のアプリケーションのAPIキーです。Business ConsoleのDevelopers -> API keysで取得できます。プライマリキーはフルアクセス権を持ちます。名前付きキーにはスコープを設定できます。リソースごとのアクセス権(なし、読み取り、書き込み)、一部のワークフローまたは承認済みセッションへの限定、IPアドレスのリストへの限定、有効期限の設定です。401は、キーが誤っている、失効している、または期限切れであることを意味します。403は、キーが送信されていない、キーにこのリソースやアクションへのアクセス権がない、またはIPリスト外のアドレスからリクエストが送信されたことを意味します。セッションのルートでの404は、セッションがキーのワークフローまたはステータスの対象外であることを意味します。メディアへのアクセス権がないキーでは、画像、動画、PDFのURLがnullで返されます。セッションの書き込み権限がないキーでは、セッションのリンクとトークンがnullで返されます。詳細は次を参照してください: https://docs.didit.me/console/api-keys
ボディ
シンプルな直線型ワークフローを作成します。APIはこの機能リストを内部でノードベースのワークフローグラフに変換します。フィールドは厳格なホワイトリスト方式です。ここに記載されていないキー(workflow_typeを含む)は400で拒否されます。
実行順に並べた認証機能。APIは各項目を次の項目にリンクし、最後のステータスノードを1つ自動的に追加します。
1Show child attributes
Show child attributes
ワークフローの表示名です(最大50文字)。省略した場合のデフォルトは"ID Verification"です。ワークフローを区別できるよう、必ず設定してください。
50"Standard KYC"
このワークフローを新しいセッションのデフォルトに設定します。
このフィールドを省略すると、セッションですぐに使える公開済みのワークフローが作成されます。公開せずに保存したい場合にのみdraftを使用してください。
draft, published このワークフローで作成されたセッションのホワイトラベルカスタマイズを有効にします。
デスクトップブラウザでの認証フローの実行を許可します。
認証が却下された後に許可される最大再試行回数です。0の場合、最初の却下でユーザーはブロックされます。
0 <= x <= 10再試行回数のカウントに使用する日単位のローリングウィンドウ。nullの場合は期間無制限の上限が適用されます。
1 <= x <= 365セッション1件あたりのライブネス検知の最大送信回数です。デフォルトは3で、初回の試行1回と再試行2回です。機能レベルの設定で上書きされない限り、この値は生成されるライブネス検知および年齢推定のワークフローノードにもコピーされます。
1 <= x <= 3セッション1件あたりの顔照合の最大送信回数です。デフォルトは3で、初回の試行1回と再試行2回です。機能レベルの設定で上書きされない限り、この値は生成される顔照合のワークフローノードにもコピーされます。
1 <= x <= 3未完了のセッションが期限切れになるまでの秒数。最小1時間(3600)、最大4週間(2419200)。
3600 <= x <= 2419200レスポンス
ワークフローが作成されました。レスポンスボディは簡易的な一覧項目ではなく、ワークフローの完全な設定です。これはGET /v3/workflows/{settings_uuid}/が返すものと同じ、生のVerificationSettingsのシリアライズ結果(約190フィールド: すべての機能のオン・オフ、しきい値、アクション、生成されたworkflow_graph)です。後続のセッション作成呼び出しで参照できるよう、uuid(workflow_idとしても公開)を保存してください。注意: featuresは" + "で連結された文字列で、料金はJSONの数値です。
以下のフィールドには型が定義されています。このオブジェクトには、ワークフロー設定のその他すべての列(機能の切り替え、しきい値、警告アクション、許可される書類、コールバック)も追加プロパティとして含まれます。workflow_typeに該当しないフィールドはnullです。
バージョンごとの識別子(settings_uuid)です。ワークフローの各バージョンがそれぞれ固有の値を持ちます。
ワークフローのすべてのバージョンで共有される不変の識別子。これを使って作成したセッションでは、公開済みの最新バージョンが使用されます。
ワークフローの表示名。
ワークフローテンプレート。テンプレートなしで作成されたグラフワークフローではnullです。
kyc, kyb, adaptive_age_verification, biometric_authentication, address_verification, questionnaire_verification, email_verification, phone_verification, null アプリケーションのデフォルトのワークフローかどうか。
アーカイブ済みのワークフローでは新しいセッションを開始できません。
ワークフロー内のバージョン番号。
ドラフトバージョンは編集できます。公開済みバージョンは変更できず、新しいセッションで使用されます。
draft, published このバージョンが公開された日時。下書きの場合はnullです。
ワークフローにカスタムのworkflow_graphがない場合はtrueです。
draftバージョンの場合のみtrueです。
このワークフローでセッションを開始する公開URLです。
ワークフローのグラフ構造(ノードとエッジ)。シンプルなワークフローではnullです。
有効な機能を" + "で連結したものです。例: "OCR + LIVENESS"。
セッション1件あたりの料金。グラフ型ワークフローでは最も高い経路の料金です。
ワークフロー内で最も安い経路の料金。
ワークフロー内で最も高い経路の料金。
組織固有のアドオン料金です。設定されていない場合はnullです。
認証が却下された後に許可される再試行回数。
再試行が許可される日数。
未完了のセッションが期限切れになるまでの秒数。
ワークフローに紐づくアンケート、またはnullです。
KYBの主要人物に対する役割ごとの検証設定です。
現在署名に使用できる電子署名のレベル。signature_levelを設定する前に確認してください。kyc、kyb、グラフワークフローで返されます。
Show child attributes
Show child attributes
シンプルなKYCまたはKYBワークフローで銀行認証を実行するかどうかです。連絡先ステップ(および位置情報認証)の後、データベース検証、AML、IP分析の前に実行されます。銀行認証はまだ一般提供されていません。有効化されていない場合、オンにしようとしても拒否されます。
シンプルなKYCワークフローで位置情報認証を実行するかどうかです。連絡先ステップの後、銀行認証とデータベース検証の前に実行されます。企業(KYB)ワークフローでは実行できません。
シンプルなワークフローの位置情報検証設定で、GEOLOCATIONノードと同じキー(例: is_geolocation_geofencing_enabledやgeolocation_max_attempts)を受け付けます。不明なキーは破棄されます。すべてのキーは任意で、指定しないキーはデフォルト値のままとなるため、{}はすべてデフォルト値を意味します。
{}