curl -X POST 'https://verification.didit.me/v3/passive-liveness/' \
-H 'x-api-key: YOUR_API_KEY' \
-F 'user_image=@./selfie.jpg' \
-F 'face_liveness_score_decline_threshold=30' \
-F 'save_api_request=true' \
-F 'vendor_data=user-123'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.passive_liveness.check(
user_image=open("user_image.jpg", "rb"),
face_liveness_score_decline_threshold=30.0,
rotate_image=False,
save_api_request=True,
vendor_data="user-123",
metadata={"flow": "withdrawal"},
)
print(result)import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.passiveLiveness.check({
user_image: await fileFromPath("user_image.jpg"),
face_liveness_score_decline_threshold: 30.0,
rotate_image: false,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "withdrawal" },
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.PassiveLiveness.Check(ctx, didit.PassiveLivenessCheckParams{
UserImage: didit.FileFromPath("user_image.jpg"),
FaceLivenessScoreDeclineThreshold: didit.Float(30.0),
RotateImage: didit.Bool(false),
SaveAPIRequest: didit.Bool(true),
VendorData: didit.String("user-123"),
Metadata: didit.Some(map[string]any{"flow": "withdrawal"}),
})
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.PassiveLivenessCheckParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.passiveLiveness().check(PassiveLivenessCheckParams.builder()
.userImage(Path.of("user_image.jpg"))
.faceLivenessScoreDeclineThreshold(30.0)
.rotateImage(false)
.saveApiRequest(true)
.vendorData("user-123")
.metadata(Map.of("flow", "withdrawal"))
.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->passiveLiveness->check([
'user_image' => File::fromPath('user_image.jpg'),
'face_liveness_score_decline_threshold' => 30.0,
'rotate_image' => false,
'save_api_request' => true,
'vendor_data' => 'user-123',
'metadata' => ['flow' => 'withdrawal'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.passive_liveness.check(
user_image: Pathname("user_image.jpg"),
face_liveness_score_decline_threshold: 30.0,
rotate_image: false,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "withdrawal" }
)
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.PassiveLiveness.CheckAsync(new PassiveLivenessCheckParams
{
UserImage = FileUpload.FromPath("user_image.jpg"),
FaceLivenessScoreDeclineThreshold = 30.0,
RotateImage = false,
SaveApiRequest = true,
VendorData = "user-123",
Metadata = new Dictionary<string, object> { ["flow"] = "withdrawal" },
});
Console.WriteLine(JsonSerializer.Serialize(result));Passive Liveness API:深度伪造检测
Didit 可通过单张图片检测面具、打印照片、重放攻击和深度伪造。完全被动、推理耗时低于 2 秒、按次计费,无月度最低消费。
curl -X POST 'https://verification.didit.me/v3/passive-liveness/' \
-H 'x-api-key: YOUR_API_KEY' \
-F 'user_image=@./selfie.jpg' \
-F 'face_liveness_score_decline_threshold=30' \
-F 'save_api_request=true' \
-F 'vendor_data=user-123'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.passive_liveness.check(
user_image=open("user_image.jpg", "rb"),
face_liveness_score_decline_threshold=30.0,
rotate_image=False,
save_api_request=True,
vendor_data="user-123",
metadata={"flow": "withdrawal"},
)
print(result)import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.passiveLiveness.check({
user_image: await fileFromPath("user_image.jpg"),
face_liveness_score_decline_threshold: 30.0,
rotate_image: false,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "withdrawal" },
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.PassiveLiveness.Check(ctx, didit.PassiveLivenessCheckParams{
UserImage: didit.FileFromPath("user_image.jpg"),
FaceLivenessScoreDeclineThreshold: didit.Float(30.0),
RotateImage: didit.Bool(false),
SaveAPIRequest: didit.Bool(true),
VendorData: didit.String("user-123"),
Metadata: didit.Some(map[string]any{"flow": "withdrawal"}),
})
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.PassiveLivenessCheckParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.passiveLiveness().check(PassiveLivenessCheckParams.builder()
.userImage(Path.of("user_image.jpg"))
.faceLivenessScoreDeclineThreshold(30.0)
.rotateImage(false)
.saveApiRequest(true)
.vendorData("user-123")
.metadata(Map.of("flow", "withdrawal"))
.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->passiveLiveness->check([
'user_image' => File::fromPath('user_image.jpg'),
'face_liveness_score_decline_threshold' => 30.0,
'rotate_image' => false,
'save_api_request' => true,
'vendor_data' => 'user-123',
'metadata' => ['flow' => 'withdrawal'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.passive_liveness.check(
user_image: Pathname("user_image.jpg"),
face_liveness_score_decline_threshold: 30.0,
rotate_image: false,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "withdrawal" }
)
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.PassiveLiveness.CheckAsync(new PassiveLivenessCheckParams
{
UserImage = FileUpload.FromPath("user_image.jpg"),
FaceLivenessScoreDeclineThreshold = 30.0,
RotateImage = false,
SaveApiRequest = true,
VendorData = "user-123",
Metadata = new Dictionary<string, object> { ["flow"] = "withdrawal" },
});
Console.WriteLine(JsonSerializer.Serialize(result));授权
您的应用 API 密钥,可在 Business Console 的“开发者 -> API 密钥”中获取。主密钥拥有完整访问权限。指定名称的密钥可设置作用域:针对每个资源设为无权限、只读或读写,限定于特定工作流或已通过的会话、限定于 IP 地址列表,以及设置到期日期。401 表示密钥错误、已撤销或已过期;403 表示未发送密钥、密钥无权访问该资源或操作,或请求来自其 IP 列表之外的地址;在会话路由上返回 404 表示该会话不在该密钥允许的工作流或状态范围内。没有媒体访问权限的密钥获取到的图片、视频和 PDF URL 将为 null;没有会话写入权限的密钥获取到的会话链接和 token 将为 null。请参阅 https://docs.didit.me/console/api-keys。
请求体
正面人脸图像(例如自拍照)。允许的文件扩展名:tiff、jpg、jpeg、png、webp。最大上传大小:5 MB(超出限制的文件将被拒绝并返回 400)。图像在处理前会自动压缩至约 0.5 MB,因此极高的分辨率并不会提高准确度。图像应仅包含一个拍摄主体。若存在多张人脸,将评估最大的人脸并添加 MULTIPLE_FACES_DETECTED 警告。
活体评分阈值(0–100)。计算得出的分数达到或低于此值将发出 LOW_LIVENESS_SCORE 警告,并将 status 设为 Declined。默认值为 30;调高此值可实施更严格的防欺骗攻击策略。超出 0–100 范围的值将返回 400。
0 <= x <= 10030
为 true 时,服务会尝试按 90 度旋转输入内容的各个方向,并使用人脸检测效果最佳的方向。在缺少 EXIF 方向信息时非常有用。会增加延迟。
false
为 true(默认)时,将此次调用持久化为 API 类型会话,存储人脸图像,发出 status.updated Webhook,并将检测到的人脸录入到您的人脸搜索索引中。为 false 时,该调用为单次执行,不存储任何内容,也不录入人脸。黑名单和重复筛查在两种情况下都会运行。
true
可选的不透明标识符(您的用户 ID、邮箱、UUID 等),存储在持久化会话中并予以回显。还用于在重复人脸检查中排除具有相同 vendor_data 的先前会话,从而避免在重新验证同一用户时触发 DUPLICATED_FACE。
"user-123"
与会话一同存储(当 save_api_request=true 时)并原样返回的可选 JSON 对象。在 multipart 请求中,请将其作为 JSON 编码的字符串字段发送,它将被解析为对象。
{ "flow": "withdrawal" }
响应
静默活体检测已完成。liveness.score 是模型对图像显示为活人的置信度(0–100);除非触发了 error 严重级别的警告,否则 status 为 Approved。欺骗攻击或处于黑名单的人脸仍会返回 200,请检查 liveness.status 和 liveness.warnings,而不仅仅是 HTTP 状态码。当 save_api_request=true 时,request_id 为持久化的会话 ID。
当 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),例如 2026-06-12T01:04:42.763237+00:00。