curl -X POST 'https://verification.didit.me/v3/age-estimation/' \
-H 'x-api-key: YOUR_API_KEY' \
-F 'user_image=@./selfie.jpg' \
-F 'age_estimation_decline_threshold=18' \
-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.age_estimation.estimate(
user_image=open("user_image.jpg", "rb"),
face_liveness_score_decline_threshold=30.0,
age_estimation_decline_threshold=18,
rotate_image=False,
save_api_request=True,
vendor_data="user-123",
metadata={"flow": "age-gate"},
)
print(result)import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.ageEstimation.estimate({
user_image: await fileFromPath("user_image.jpg"),
face_liveness_score_decline_threshold: 30.0,
age_estimation_decline_threshold: 18,
rotate_image: false,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "age-gate" },
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.AgeEstimation.Estimate(ctx, didit.AgeEstimationEstimateParams{
UserImage: didit.FileFromPath("user_image.jpg"),
FaceLivenessScoreDeclineThreshold: didit.Float(30.0),
AgeEstimationDeclineThreshold: didit.Int(18),
RotateImage: didit.Bool(false),
SaveAPIRequest: didit.Bool(true),
VendorData: didit.String("user-123"),
Metadata: didit.Some(map[string]any{"flow": "age-gate"}),
})
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.AgeEstimationEstimateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.ageEstimation().estimate(AgeEstimationEstimateParams.builder()
.userImage(Path.of("user_image.jpg"))
.faceLivenessScoreDeclineThreshold(30.0)
.ageEstimationDeclineThreshold(18L)
.rotateImage(false)
.saveApiRequest(true)
.vendorData("user-123")
.metadata(Map.of("flow", "age-gate"))
.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->ageEstimation->estimate([
'user_image' => File::fromPath('user_image.jpg'),
'face_liveness_score_decline_threshold' => 30.0,
'age_estimation_decline_threshold' => 18,
'rotate_image' => false,
'save_api_request' => true,
'vendor_data' => 'user-123',
'metadata' => ['flow' => 'age-gate'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.age_estimation.estimate(
user_image: Pathname("user_image.jpg"),
face_liveness_score_decline_threshold: 30.0,
age_estimation_decline_threshold: 18,
rotate_image: false,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "age-gate" }
)
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.AgeEstimation.EstimateAsync(new AgeEstimationEstimateParams
{
UserImage = FileUpload.FromPath("user_image.jpg"),
FaceLivenessScoreDeclineThreshold = 30.0,
AgeEstimationDeclineThreshold = 18,
RotateImage = false,
SaveApiRequest = true,
VendorData = "user-123",
Metadata = new Dictionary<string, object> { ["flow"] = "age-gate" },
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"request_id": "0c40ba43-64ab-4e2e-b4b8-7d1f12f81bc1",
"age_estimation": {
"status": "Approved",
"method": "PASSIVE",
"score": 97.5,
"user_image": {
"entities": [
{
"age": 27.33,
"bbox": [
40,
40,
100,
100
],
"confidence": 0.7177750468254089,
"gender": "male"
}
],
"best_angle": 0
},
"age_estimation": 27.33,
"warnings": []
},
"vendor_data": "user-123",
"metadata": {
"flow": "age-gate"
},
"created_at": "2026-06-12T02:24:11.512941+00:00"
}年龄估算 API:基于自拍的年龄验证
Didit 提供 AI 年龄估算 API(POST /v3/age-estimation/),内置被动活体检测,无需证件,推理耗时低于 2 秒,按次付费。
curl -X POST 'https://verification.didit.me/v3/age-estimation/' \
-H 'x-api-key: YOUR_API_KEY' \
-F 'user_image=@./selfie.jpg' \
-F 'age_estimation_decline_threshold=18' \
-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.age_estimation.estimate(
user_image=open("user_image.jpg", "rb"),
face_liveness_score_decline_threshold=30.0,
age_estimation_decline_threshold=18,
rotate_image=False,
save_api_request=True,
vendor_data="user-123",
metadata={"flow": "age-gate"},
)
print(result)import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.ageEstimation.estimate({
user_image: await fileFromPath("user_image.jpg"),
face_liveness_score_decline_threshold: 30.0,
age_estimation_decline_threshold: 18,
rotate_image: false,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "age-gate" },
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.AgeEstimation.Estimate(ctx, didit.AgeEstimationEstimateParams{
UserImage: didit.FileFromPath("user_image.jpg"),
FaceLivenessScoreDeclineThreshold: didit.Float(30.0),
AgeEstimationDeclineThreshold: didit.Int(18),
RotateImage: didit.Bool(false),
SaveAPIRequest: didit.Bool(true),
VendorData: didit.String("user-123"),
Metadata: didit.Some(map[string]any{"flow": "age-gate"}),
})
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.AgeEstimationEstimateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.ageEstimation().estimate(AgeEstimationEstimateParams.builder()
.userImage(Path.of("user_image.jpg"))
.faceLivenessScoreDeclineThreshold(30.0)
.ageEstimationDeclineThreshold(18L)
.rotateImage(false)
.saveApiRequest(true)
.vendorData("user-123")
.metadata(Map.of("flow", "age-gate"))
.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->ageEstimation->estimate([
'user_image' => File::fromPath('user_image.jpg'),
'face_liveness_score_decline_threshold' => 30.0,
'age_estimation_decline_threshold' => 18,
'rotate_image' => false,
'save_api_request' => true,
'vendor_data' => 'user-123',
'metadata' => ['flow' => 'age-gate'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.age_estimation.estimate(
user_image: Pathname("user_image.jpg"),
face_liveness_score_decline_threshold: 30.0,
age_estimation_decline_threshold: 18,
rotate_image: false,
save_api_request: true,
vendor_data: "user-123",
metadata: { flow: "age-gate" }
)
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.AgeEstimation.EstimateAsync(new AgeEstimationEstimateParams
{
UserImage = FileUpload.FromPath("user_image.jpg"),
FaceLivenessScoreDeclineThreshold = 30.0,
AgeEstimationDeclineThreshold = 18,
RotateImage = false,
SaveApiRequest = true,
VendorData = "user-123",
Metadata = new Dictionary<string, object> { ["flow"] = "age-gate" },
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"request_id": "0c40ba43-64ab-4e2e-b4b8-7d1f12f81bc1",
"age_estimation": {
"status": "Approved",
"method": "PASSIVE",
"score": 97.5,
"user_image": {
"entities": [
{
"age": 27.33,
"bbox": [
40,
40,
100,
100
],
"confidence": 0.7177750468254089,
"gender": "male"
}
],
"best_angle": 0
},
"age_estimation": 27.33,
"warnings": []
},
"vendor_data": "user-123",
"metadata": {
"flow": "age-gate"
},
"created_at": "2026-06-12T02:24:11.512941+00:00"
}授权
您的应用 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(不支持 PDF)。最大上传大小:5 MB(较大文件将被拒绝并返回 400)。图像在处理前会自动压缩至约 0.3 MB,因此极高的分辨率并不会提高准确性。
活体阈值(0–100)。活体 score 达到或低于此值将添加 LOW_LIVENESS_SCORE 警告并予以拒绝。调高此值可实施更严格的防欺骗攻击策略;超出 0–100 范围的值将返回 400。
0 <= x <= 10030
可接受的最低估算年龄(周岁)。估算年龄低于该值将添加 AGE_BELOW_MINIMUM 警告并予以拒绝。设为 0 可禁用年龄检查(此时调用仅执行活体检测 + 年龄估算,不做出基于年龄的决策)。
0 <= x <= 10018
为 true 时,服务会按 90 度递增(0、90、180、270)尝试输入图像,并使用人脸检测效果最佳的方向,这对于缺少 EXIF 方向信息的移动端拍摄非常有用。会增加延迟,因此仅在您无法保证图像为正向时启用。
false
为 true(默认)时,将此次调用持久化为 API 类型的会话,在 Business Console 中可见,可使用返回的 request_id 通过 GET /v3/session/{sessionId}/decision/ 检索,通过 status.updated Webhook 发出通知,并将检测到的人脸添加到您应用的人脸索引中。为 false 时,不存储任何内容,且 request_id 仅为用于关联响应的临时 UUID。
true
可选的不透明字符串(您的内部用户 ID、邮箱、UUID 等),存储在持久化会话中并在响应中回显。可用于将 API 调用与您自己的记录相关联,并在稍后筛选会话。
"user-123"
与会话一同存储(当 save_api_request=true 时)并在响应中原样返回的可选 JSON 对象。在 multipart 请求中,请将其作为 JSON 编码的字符串字段发送(例如 metadata={"flow":"age-gate"}),它会被解析为对象。
{ "flow": "age-gate" }
响应
年龄估算和被动活体检测已完成。age_estimation.age_estimation 是模型预测的最大检测人脸年龄(以岁为单位,未检测到则为 null);age_estimation.score 是被动活体检测分数(0–100);仅当 warnings 为空时,status 才为 Approved。未成年或欺骗攻击的抓拍仍会返回 200 及 status: "Declined",请检查响应体,而不仅仅是 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)。