curl -X POST 'https://verification.didit.me/v3/id-verification/' \
-H 'x-api-key: YOUR_API_KEY' \
-F 'front_image=@./id_front.jpg' \
-F 'back_image=@./id_back.jpg' \
-F 'perform_document_liveness=true' \
-F 'save_api_request=true' \
-F 'vendor_data=user-123'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.id_verification.verify(
front_image=open("front_image.jpg", "rb"),
back_image=open("back_image.jpg", "rb"),
perform_document_liveness=True,
save_api_request=True,
vendor_data="user-123",
metadata={"flow": "onboarding"},
)
print(result)import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.idVerification.verify({
front_image: await fileFromPath("front_image.jpg"),
back_image: await fileFromPath("back_image.jpg"),
perform_document_liveness: true,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "onboarding" },
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{
FrontImage: didit.FileFromPath("front_image.jpg"),
BackImage: didit.Some(didit.FileFromPath("back_image.jpg")),
PerformDocumentLiveness: didit.Bool(true),
SaveAPIRequest: didit.Bool(true),
VendorData: didit.String("user-123"),
Metadata: didit.Some(map[string]any{"flow": "onboarding"}),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.nio.file.Path;
import java.util.Map;
import me.didit.Didit;
import me.didit.types.IdVerificationVerifyParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.idVerification().verify(IdVerificationVerifyParams.builder()
.frontImage(Path.of("front_image.jpg"))
.backImage(Path.of("back_image.jpg"))
.performDocumentLiveness(true)
.saveApiRequest(true)
.vendorData("user-123")
.metadata(Map.of("flow", "onboarding"))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
use Didit\File;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->idVerification->verify([
'front_image' => File::fromPath('front_image.jpg'),
'back_image' => File::fromPath('back_image.jpg'),
'perform_document_liveness' => true,
'save_api_request' => true,
'vendor_data' => 'user-123',
'metadata' => ['flow' => 'onboarding'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.id_verification.verify(
front_image: Pathname("front_image.jpg"),
back_image: Pathname("back_image.jpg"),
perform_document_liveness: true,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "onboarding" }
)
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.IdVerification.VerifyAsync(new IdVerificationVerifyParams
{
FrontImage = FileUpload.FromPath("front_image.jpg"),
BackImage = FileUpload.FromPath("back_image.jpg"),
PerformDocumentLiveness = true,
SaveApiRequest = true,
VendorData = "user-123",
Metadata = new Dictionary<string, object> { ["flow"] = "onboarding" },
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"request_id": "11d219ed-d59c-4b1d-8d65-9b933f12d5b8",
"id_verification": {
"status": "Approved",
"document_type": "Identity Card",
"document_subtype": "ID_CARD_GENERIC",
"document_number": "CBX164224",
"personal_number": "20446581H",
"portrait_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-portrait_image-8c2f.jpg?signature=...",
"front_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-front_image-4a1e.jpg?signature=...",
"back_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-back_image-77b0.jpg?signature=...",
"front_image_camera_front": null,
"back_image_camera_front": null,
"front_image_camera_front_face_match_score": null,
"back_image_camera_front_face_match_score": null,
"front_image_quality_score": {
"focus_score": 78,
"brightness_score": 83.2,
"brightness_issue": "ok",
"is_document_fully_visible": true,
"resolution_score": 40.7,
"overall_score": 70.2
},
"back_image_quality_score": {
"focus_score": 100,
"brightness_score": 95.6,
"brightness_issue": "ok",
"is_document_fully_visible": true,
"resolution_score": 43,
"overall_score": 84.4
},
"date_of_birth": "1980-01-13",
"age": 46,
"expiration_date": "2032-03-31",
"date_of_issue": "2022-03-31",
"issuing_state": "ESP",
"issuing_state_name": "Spain",
"first_name": "Julio Francisco",
"last_name": "Fores Sena",
"full_name": "Julio Francisco Fores Sena",
"gender": "M",
"address": "Brda. Urb. El Cardonal 0052 52 Po3 B,Taco,San Cristobal De La Laguna,Santa Cruz De Tenerife",
"formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
"place_of_birth": "Valencia, Valencia",
"marital_status": "UNKNOWN",
"nationality": "ESP",
"extra_fields": {
"first_surname": "Fores",
"second_surname": "Sena"
},
"mrz": {
"surname": "FORES SENA",
"name": "JULIO FRANCISCO",
"country": "ESP",
"nationality": "ESP",
"birth_date": "800113",
"expiry_date": "320331",
"sex": "M",
"document_type": "ID",
"document_number": "CBX164224",
"optional_data": "20446581H",
"optional_data_2": "",
"birth_date_hash": "9",
"expiry_date_hash": "8",
"document_number_hash": "3",
"final_hash": "3",
"personal_number": "20446581H",
"warnings": [],
"errors": [],
"mrz_type": "TD1",
"mrz_string": "IDESPCBX164224320446581H<<<<<<\n8001139M3203318ESP<<<<<<<<<<<3\nFORES<SENA<<JULIO<FRANCISCO<<<",
"mrz_key": "CBX164224380011393203318"
},
"parsed_address": {
"street_1": "Avenida el Cardonal 52",
"street_2": "b",
"city": "La Laguna",
"region": "Canarias",
"country": "ES",
"postal_code": "38108",
"address_type": "Avenida",
"formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
"raw_results": {
"address_components": [
{
"long_name": "b",
"short_name": "b",
"types": [
"subpremise"
]
},
{
"long_name": "52",
"short_name": "52",
"types": [
"street_number"
]
},
{
"long_name": "Avenida el Cardonal",
"short_name": "Av. el Cardonal",
"types": [
"route"
]
},
{
"long_name": "La Laguna",
"short_name": "La Laguna",
"types": [
"locality",
"political"
]
},
{
"long_name": "Spain",
"short_name": "ES",
"types": [
"country",
"political"
]
},
{
"long_name": "38108",
"short_name": "38108",
"types": [
"postal_code"
]
}
],
"formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
"geometry": {
"location": {
"lat": 28.4501161,
"lng": -16.3004407
},
"location_type": "ROOFTOP"
},
"types": [
"street_address",
"subpremise"
]
},
"document_location": {
"latitude": 28.4501161,
"longitude": -16.3004407
},
"label": "Spain Identity Card Address",
"is_verified": true,
"category": "Residential"
},
"warnings": [],
"barcodes": []
},
"vendor_data": "user-123",
"metadata": {
"flow": "onboarding"
},
"created_at": "2026-06-12T02:21:56.013573+00:00"
}本人確認書類認証API:書類OCRと真正性チェック
Diditの本人確認書類認証APIは220+の国と14,000+種類の書類に対応。真正性チェック、OCR、MRZ読み取り、sub-2sの推論、従量課金、契約不要。
curl -X POST 'https://verification.didit.me/v3/id-verification/' \
-H 'x-api-key: YOUR_API_KEY' \
-F 'front_image=@./id_front.jpg' \
-F 'back_image=@./id_back.jpg' \
-F 'perform_document_liveness=true' \
-F 'save_api_request=true' \
-F 'vendor_data=user-123'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.id_verification.verify(
front_image=open("front_image.jpg", "rb"),
back_image=open("back_image.jpg", "rb"),
perform_document_liveness=True,
save_api_request=True,
vendor_data="user-123",
metadata={"flow": "onboarding"},
)
print(result)import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.idVerification.verify({
front_image: await fileFromPath("front_image.jpg"),
back_image: await fileFromPath("back_image.jpg"),
perform_document_liveness: true,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "onboarding" },
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{
FrontImage: didit.FileFromPath("front_image.jpg"),
BackImage: didit.Some(didit.FileFromPath("back_image.jpg")),
PerformDocumentLiveness: didit.Bool(true),
SaveAPIRequest: didit.Bool(true),
VendorData: didit.String("user-123"),
Metadata: didit.Some(map[string]any{"flow": "onboarding"}),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.nio.file.Path;
import java.util.Map;
import me.didit.Didit;
import me.didit.types.IdVerificationVerifyParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.idVerification().verify(IdVerificationVerifyParams.builder()
.frontImage(Path.of("front_image.jpg"))
.backImage(Path.of("back_image.jpg"))
.performDocumentLiveness(true)
.saveApiRequest(true)
.vendorData("user-123")
.metadata(Map.of("flow", "onboarding"))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
use Didit\File;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->idVerification->verify([
'front_image' => File::fromPath('front_image.jpg'),
'back_image' => File::fromPath('back_image.jpg'),
'perform_document_liveness' => true,
'save_api_request' => true,
'vendor_data' => 'user-123',
'metadata' => ['flow' => 'onboarding'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.id_verification.verify(
front_image: Pathname("front_image.jpg"),
back_image: Pathname("back_image.jpg"),
perform_document_liveness: true,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "onboarding" }
)
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.IdVerification.VerifyAsync(new IdVerificationVerifyParams
{
FrontImage = FileUpload.FromPath("front_image.jpg"),
BackImage = FileUpload.FromPath("back_image.jpg"),
PerformDocumentLiveness = true,
SaveApiRequest = true,
VendorData = "user-123",
Metadata = new Dictionary<string, object> { ["flow"] = "onboarding" },
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"request_id": "11d219ed-d59c-4b1d-8d65-9b933f12d5b8",
"id_verification": {
"status": "Approved",
"document_type": "Identity Card",
"document_subtype": "ID_CARD_GENERIC",
"document_number": "CBX164224",
"personal_number": "20446581H",
"portrait_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-portrait_image-8c2f.jpg?signature=...",
"front_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-front_image-4a1e.jpg?signature=...",
"back_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-back_image-77b0.jpg?signature=...",
"front_image_camera_front": null,
"back_image_camera_front": null,
"front_image_camera_front_face_match_score": null,
"back_image_camera_front_face_match_score": null,
"front_image_quality_score": {
"focus_score": 78,
"brightness_score": 83.2,
"brightness_issue": "ok",
"is_document_fully_visible": true,
"resolution_score": 40.7,
"overall_score": 70.2
},
"back_image_quality_score": {
"focus_score": 100,
"brightness_score": 95.6,
"brightness_issue": "ok",
"is_document_fully_visible": true,
"resolution_score": 43,
"overall_score": 84.4
},
"date_of_birth": "1980-01-13",
"age": 46,
"expiration_date": "2032-03-31",
"date_of_issue": "2022-03-31",
"issuing_state": "ESP",
"issuing_state_name": "Spain",
"first_name": "Julio Francisco",
"last_name": "Fores Sena",
"full_name": "Julio Francisco Fores Sena",
"gender": "M",
"address": "Brda. Urb. El Cardonal 0052 52 Po3 B,Taco,San Cristobal De La Laguna,Santa Cruz De Tenerife",
"formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
"place_of_birth": "Valencia, Valencia",
"marital_status": "UNKNOWN",
"nationality": "ESP",
"extra_fields": {
"first_surname": "Fores",
"second_surname": "Sena"
},
"mrz": {
"surname": "FORES SENA",
"name": "JULIO FRANCISCO",
"country": "ESP",
"nationality": "ESP",
"birth_date": "800113",
"expiry_date": "320331",
"sex": "M",
"document_type": "ID",
"document_number": "CBX164224",
"optional_data": "20446581H",
"optional_data_2": "",
"birth_date_hash": "9",
"expiry_date_hash": "8",
"document_number_hash": "3",
"final_hash": "3",
"personal_number": "20446581H",
"warnings": [],
"errors": [],
"mrz_type": "TD1",
"mrz_string": "IDESPCBX164224320446581H<<<<<<\n8001139M3203318ESP<<<<<<<<<<<3\nFORES<SENA<<JULIO<FRANCISCO<<<",
"mrz_key": "CBX164224380011393203318"
},
"parsed_address": {
"street_1": "Avenida el Cardonal 52",
"street_2": "b",
"city": "La Laguna",
"region": "Canarias",
"country": "ES",
"postal_code": "38108",
"address_type": "Avenida",
"formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
"raw_results": {
"address_components": [
{
"long_name": "b",
"short_name": "b",
"types": [
"subpremise"
]
},
{
"long_name": "52",
"short_name": "52",
"types": [
"street_number"
]
},
{
"long_name": "Avenida el Cardonal",
"short_name": "Av. el Cardonal",
"types": [
"route"
]
},
{
"long_name": "La Laguna",
"short_name": "La Laguna",
"types": [
"locality",
"political"
]
},
{
"long_name": "Spain",
"short_name": "ES",
"types": [
"country",
"political"
]
},
{
"long_name": "38108",
"short_name": "38108",
"types": [
"postal_code"
]
}
],
"formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
"geometry": {
"location": {
"lat": 28.4501161,
"lng": -16.3004407
},
"location_type": "ROOFTOP"
},
"types": [
"street_address",
"subpremise"
]
},
"document_location": {
"latitude": 28.4501161,
"longitude": -16.3004407
},
"label": "Spain Identity Card Address",
"is_verified": true,
"category": "Residential"
},
"warnings": [],
"barcodes": []
},
"vendor_data": "user-123",
"metadata": {
"flow": "onboarding"
},
"created_at": "2026-06-12T02:21:56.013573+00:00"
}承認
お客様のアプリケーションのAPIキーです。Business ConsoleのDevelopers -> API keysで取得できます。プライマリキーはフルアクセス権を持ちます。名前付きキーにはスコープを設定できます。リソースごとのアクセス権(なし、読み取り、書き込み)、一部のワークフローまたは承認済みセッションへの限定、IPアドレスのリストへの限定、有効期限の設定です。401は、キーが誤っている、失効している、または期限切れであることを意味します。403は、キーが送信されていない、キーにこのリソースやアクションへのアクセス権がない、またはIPリスト外のアドレスからリクエストが送信されたことを意味します。セッションのルートでの404は、セッションがキーのワークフローまたはステータスの対象外であることを意味します。メディアへのアクセス権がないキーでは、画像、動画、PDFのURLがnullで返されます。セッションの書き込み権限がないキーでは、セッションのリンクとトークンがnullで返されます。詳細は次を参照してください: https://docs.didit.me/console/api-keys
ボディ
本人確認書類の表面。使用可能な拡張子: tiff、jpg、jpeg、png、webp、pdf。最大アップロードサイズ: 10 MB(これを超えるファイルは400で拒否されます)。PDFはOCRの前に画像にレンダリングされます。暗号化されたPDFにはfront_image_passwordが必要です。画像は自動的に約0.5 MBに圧縮され、EXIFの向き情報が適用されます。書類の四隅がすべて写った、トリミングしていない撮影画像をそのままアップロードしてください。
front_imageが暗号化されたPDFの場合に復号するためのパスワード。暗号化されたPDFをパスワードなし(または誤ったパスワード)で送信すると400が返ります。
書類の裏面。書類に裏面がある場合は必ず送信してください(多くのIDカードは裏面にMRZやバーコードがあります。省略するとレスポンスのMRZおよび裏面のフィールドが空になるだけで、このエンドポイントはMRZ欠落の警告を出しません)。形式とサイズの制限はfront_imageと同じです。省略した場合、レスポンスのback_imageと裏面のフィールドはnullになります。
back_imageが暗号化されたPDFの場合に復号するためのパスワード。
両方の画像に対してプレゼンテーション不正のスクリーニングを行います。対象は、画面のリプレイ(SCREEN_CAPTURE_DETECTED)、印刷されたコピー(PRINTED_COPY_DETECTED)、顔写真の改ざん(PORTRAIT_MANIPULATION_DETECTED)です。いずれかが検出されると自動的に却下されます。デフォルトで有効です。不正スクリーニングをスキップしてレイテンシを短縮するにはfalseに設定します。有効な状態でプロバイダーが使用可能なスコアを返さない場合、レスポンスはApprovedではなく、DOCUMENT_LIVENESS_NOT_COMPUTED警告付きのIn Reviewになります。
true
受け付けられ、検証もされます(1〜120)が、このエンドポイントでは現在適用されていません。このフィールドによってMINIMUM_AGE_NOT_MET警告が生成されることはありません。返されたdate_of_birth/ageをもとに年齢ルールを適用するか、年齢制限を設定した認証セッションのワークフローを使用してください。
1 <= x <= 120有効期限を読み取れない場合の処理です(EXPIRATION_DATE_NOT_DETECTED)。多くの本人確認書類には有効期限が印字されていないため、デフォルトはNO_ACTIONです。注意:有効期限が検出され、かつ期限を過ぎている場合は、この設定に関係なく常に却下されます(DOCUMENT_EXPIRED)。
NO_ACTION, DECLINE 抽出したMRZがチェックディジット検証に失敗した場合(MRZ_VALIDATION_FAILED)の対応です。このエンドポイントでは、MRZがなくても警告は発生しません。MRZを持つ書類にのみ関係します。このエンドポイントではREVIEWはサポートされておらず、400が返されます。
NO_ACTION, DECLINE 抽出データの内部に矛盾がある場合の処理です。DATA_INCONSISTENT、MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME(視覚ゾーンとMRZが一致しない)、またはDOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTSが該当します。
NO_ACTION, DECLINE 撮影画像上で重要な印字フィールド(ID番号、氏名、生年月日、有効期限)が物理的に覆われていた場合の処理です(CRITICAL_FIELD_OCCLUSION_DETECTED)。このエンドポイントの他の書類完全性リスクと同様、デフォルトでは却下されます。レポートの照合対象となる番号が覆われている状態は、まさに墨消しされた書類の特徴だからです。いずれの場合も、覆われたフィールドから読み取られた値は抽出結果から除外されるため、通常は対応する*_NOT_DETECTED警告も併せて出力されます。このエンドポイントではREVIEWはサポートされておらず、400を返します。
NO_ACTION, DECLINE 番号が、発行機関がその書類タイプで使用する形式と一致しない場合の処理です(DOCUMENT_NUMBER_FORMAT_MISMATCH、PERSONAL_NUMBER_FORMAT_MISMATCH)。デフォルトはNO_ACTIONで、ステータスを変更せずに警告を報告します。このエンドポイントではREVIEWはサポートされておらず、400を返します。
NO_ACTION, DECLINE ラテン文字と非ラテン文字(アラビア文字、キリル文字、CJKなど)の両方が印字された書類で、氏名・住所フィールドに使用する優先文字体系。latinは翻字済みまたはラテン文字の値を返し、non_latinは元の文字体系を優先します。
latin, non_latin true(デフォルト)の場合、呼び出しはAPIタイプのセッションとして保存されます。このセッションはBusiness Consoleに表示され、返されたrequest_idを使ってGET /v3/session/{sessionId}/decision/で取得でき、status.updatedWebhookで通知され、書類画像はメディアURLとして返されます。falseの場合、何も保存されず、request_idは一時的なUUIDになり、画像はbase64形式のJPEG文字列としてインラインで返されます。
true
任意の不透明な文字列(社内のユーザーID、メールアドレス、UUIDなど)です。保存されたセッションに格納され、レスポンスでそのまま返されます。API呼び出しを自社の記録と関連付けたり、後でセッションを絞り込んだりするために使用します。
"user-123"
セッションとともに保存され(save_api_request=trueの場合)、レスポンスでそのまま返される任意のJSONオブジェクトです。マルチパートリクエストでは、JSONエンコードされた文字列フィールドとして送信してください(例: metadata={"flow":"onboarding"})。オブジェクトとして解析されます。
{ "flow": "onboarding" }
レスポンス
書類が処理されました。id_verification.statusはApproved、Declined、In Reviewのいずれかで、検出されたすべての問題はid_verification.warningsに個別に列挙されます。In Reviewは、リクエストされた書類ライブネスチェックで有効な結果が得られなかった場合(DOCUMENT_LIVENESS_NOT_COMPUTED)に返されます。問題のある書類でもstatus: "Declined"とともに200が返されるため、HTTPコードだけでなくボディを確認してください。save_api_request=trueの場合、request_idは永続化されたセッションIDで、画像フィールドは有効期間の短いメディアURLになります。save_api_request=falseの場合はインラインのbase64 JPEG文字列になります。
save_api_request=trueの場合は保存されたセッションID(GET /v3/session/{sessionId}/decision/で使用可能)、それ以外の場合は一時的な相関UUIDです。
Show child attributes
Show child attributes
送信したvendor_dataのエコー、またはnull。
送信したmetadataオブジェクトのエコー、またはnull。
レスポンスが生成された日時を示すISO 8601タイムスタンプ(UTC)。