👤🪪 面部和身份证件验证,用于 KYC
1 IC每次请求
试用演示
访问我们的 API 门户,使用您自己的图片测试面部和身份证件验证 KYC API。
试用演示!
入门
面部和身份证件验证 KYC 是一项由 AI 驱动的服务,它将自拍照与身份证照片进行比较,以验证 KYC(了解您的客户)目的的身份。
示例
该服务需要两个输入:
- 身份证照片(大图)
- 身份证件持有者的自拍照(小图)
然后,它会分析并确认两张照片是否显示的是同一个人。
功能和能力
核心功能
- 自拍照与身份证照片之间的面部匹配
- 高精度验证
- 0.1 秒内快速处理
- 处理后不保留数据(符合 GDPR)
支持的字段
- 图片格式:JPG、JPEG、PNG、GIF
- 图片尺寸:600 像素宽 x 400 像素高
- 最大文件大小:每个图片 10MB
示例
面部和身份证件验证 KYC 请求
图片预览


curl --location 'https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification' \
--header 'apikey: {{{YOUR API KEY}}}' \
--form 'file0=@"image1.png"' \
--form 'file1=@"image2.png"'
面部和身份证件验证 KYC 响应
{
"idcard": { "confidence": 66.872, "isSamePerson": "true" },
"selfie": { "confidence": 86.04, "isSamePerson": "true" },
"time_process": 0.824,
"total": { "confidence": 76.456, "isSamePerson": "true" }
}
API 端点
| 端点 | 方法 | 描述 | 费用 |
|---|---|---|---|
POST /v3/internal/ekyc/face-and-id-card-verification/v2旧版: /api/v2/ekyc | POST | 面部 + 身份证件验证 | 每次请求 1 IC |
POST /v3/store/ekyc/face-and-id-card-verification旧版: /face-verify-id2 | POST | 面部 + 身份证件验证 | 每次请求 1 IC |
POST /v3/store/ekyc/face-and-id-card-verification/front旧版: /thai-national-id-card/v3/front/kyc | POST | 面部和身份证件验证 KYC(正面) | 每页 1 IC |
POST /v3/store/ekyc/face-and-id-card-verification/back旧版: /thai-national-id-card/v3/back/kyc | POST | 面部和身份证件验证 KYC(背面) | 每页 1 IC |
API 参考
面部和身份证件验证端点
1. 面部 + 身份证件验证 (V2 API)
POST /v3/store/ekyc/face-and-id-card-verification/v2
使用 V2 API 端点验证自拍照是否与身份证照片匹配。
2. 面部 + 身份证件验证
POST /v3/store/ekyc/face-and-id-card-verification
验证自拍照是否与身份证照片匹配。
3. 面部和身份证件验证 KYC(正面)
POST /v3/store/ekyc/face-and-id-card-verification/kyc-front
处理泰国国民身份证件正面,用于 KYC 验证。
4. 面部和身份证件验证 KYC(背面)
POST /v3/store/ekyc/face-and-id-card-verification/kyc-back
处理泰国国民身份证件背面,用于 KYC 验证。
请求参数
| 名称 | 类型 | 位置 | 是否必填 | 描述 |
|---|---|---|---|---|
| apikey | String | header | 是 | API 认证密钥 |
| file0 | File | body | 是 | 身份证件图片文件 |
| file1 | File | body | 是 | 自拍照文件 |
响应
| 状态 | 描述 |
|---|---|
| 200 | 验证成功响应 |
API 错误消息
常见错误消息
| 状态码 | 状态消息 | 描述 |
|---|---|---|
| 404 | no route matched with those values. | 没有匹配到此 URL 的路由。请再次验证。 |
| 405 | the method is not allowed for the requested URL. | 请求的 URL 不允许使用此方法。 |
| 413 | file is too large, more than 10 MB. | 文件过大,超过 10MB。 |
| 415 | file extension is not allowed. | 此 URL 不允许使用此文件扩展名。 |
客户端特定错误消息
| 状态码 | 状态消息 | 描述 |
|---|---|---|
| 420 | parameter not found in request. [file0, file1] | 请求中未找到此参数。请在请求中输入参数。 |
| 421 | (face, id card, face on id card) not found in image. [file0, file1] | 在此图片中未找到身份证件或面部。 |
| 422 | face on (id card, selfie) not found in image. [file0, file1] | 在身份证件或自拍照中未找到面部。 |
| 441 | too many images. | 参数中的图片过多。 |
| 442 | image error, unsupported format. | 图片格式不支持。 |
| 461 | no file attached. | 未附加文件。 |
代码示例
Python
import requests
url = "https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification"
payload = {}
files=[
('file0',('{IMAGE FILE 1}',open('{IMAGE FILE PATH 1}','rb'),'image/png')),
('file1',('{IMAGE FILE 2}',open('{IMAGE FILE PATH 2}','rb'),'image/png'))
]
headers = {
'apikey': '{YOUR API KEY}'
}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)
JavaScript
const axios = require("axios")
const FormData = require("form-data")
const fs = require("fs")
let data = new FormData()
data.append("file0", fs.createReadStream("{IMAGE FILE PATH 1}"))
data.append("file1", fs.createReadStream("{IMAGE FILE PATH 2}"))
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification",
headers: {
apikey: "{YOUR API KEY}",
...data.getHeaders(),
},
data: data,
}
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data))
})
.catch((error) => {
console.log(error)
})
PHP
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('file0'=> new CURLFILE('{IMAGE FILE PATH 1}'),'file1'=> new CURLFILE('{IMAGE FILE PATH 2}')),
CURLOPT_HTTPHEADER => array(
'apikey: {YOUR API KEY}'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
Swift
let parameters = [
[
"key": "file0",
"src": "{IMAGE FILE PATH 1}",
"type": "file"
],
[
"key": "file1",
"src": "{IMAGE FILE PATH 2}",
"type": "file"
]] as [[String: Any]]
let boundary = "Boundary-\(UUID().uuidString)"
var body = Data()
var error: Error? = nil
for param in parameters {
if param["disabled"] != nil { continue }
let paramName = param["key"]!
body += Data("--\(boundary)\r\n".utf8)
body += Data("Content-Disposition:form-data; name=\"\(paramName)\"".utf8)
if param["contentType"] != nil {
body += Data("\r\nContent-Type: \(param["contentType"] as! String)".utf8)
}
let paramType = param["type"] as! String
if paramType == "text" {
let paramValue = param["value"] as! String
body += Data("\r\n\r\n\(paramValue)\r\n".utf8)
} else {
let paramSrc = param["src"] as! String
let fileURL = URL(fileURLWithPath: paramSrc)
if let fileContent = try? Data(contentsOf: fileURL) {
body += Data("; filename=\"\(paramSrc)\"\r\n".utf8)
body += Data("Content-Type: \"content-type header\"\r\n".utf8)
body += Data("\r\n".utf8)
body += fileContent
body += Data("\r\n".utf8)
}
}
}
body += Data("--\(boundary)--\r\n".utf8);
let postData = body
var request = URLRequest(url: URL(string: "https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification")!,timeoutInterval: Double.infinity)
request.addValue("{YOUR API KEY}", forHTTPHeaderField: "apikey")
request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = postData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
return
}
print(String(data: data, encoding: .utf8)!)
}
task.resume()
Kotlin
val client = OkHttpClient()
val mediaType = "text/plain".toMediaType()
val body = MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file0","{IMAGE FILE 1}",
File("{IMAGE FILE PATH 1}").asRequestBody("application/octet-stream".toMediaType()))
.addFormDataPart("file1","{IMAGE FILE 2}",
File("{IMAGE FILE PATH 2}").asRequestBody("application/octet-stream".toMediaType()))
.build()
val request = Request.Builder()
.url("https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification")
.post(body)
.addHeader("apikey", "{YOUR API KEY}")
.build()
val response = client.newCall(request).execute()
Java
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file0","{IMAGE FILE 1}",
RequestBody.create(MediaType.parse("application/octet-stream"),
new File("{IMAGE FILE PATH 1}")))
.addFormDataPart("file1","{IMAGE FILE 2}",
RequestBody.create(MediaType.parse("application/octet-stream"),
new File("{IMAGE FILE PATH 2}")))
.build();
Request request = new Request.Builder()
.url("https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification")
.method("POST", body)
.addHeader("apikey", "{YOUR API KEY}")
.build();
Response response = client.newCall(request).execute();
Dart
var headers = {
'apikey': '{YOUR API KEY}'
};
var request = http.MultipartRequest('POST', Uri.parse('https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification'));
request.files.add(await http.MultipartFile.fromPath('file0', '{IMAGE FILE PATH 1}'));
request.files.add(await http.MultipartFile.fromPath('file1', '{IMAGE FILE PATH 2}'));
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
print(await response.stream.bytesToString());
}
else {
print(response.reasonPhrase);
}
准确性和性能
- 误拒率 (FRR < 3%)
- 误放率 (FAR < 0.1%)
代码示例
Curl
curl -X POST https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification \
-H "apikey: YOUR_API_KEY" \
-F "file=@/path/to/face.jpg"
Python
import requests
url = "https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification"
files = {"file": ("("/path/to/face.jpg", "rb"))}
headers = {"apikey": "YOUR_API_KEY"}
response = requests.post(url, headers=headers, files=files)
print(response.json())
JavaScript
const axios = require("axios");
const FormData = require("form-data");
const fs = require("fs");
let data = new FormData();
data.append("file", fs.createReadStream("/path/to/face.jpg"));
let config = {
method: "post",
url: "https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification",
headers: {
apikey: "YOUR_API_KEY",
...data.getHeaders(),
},
data: data,
};
axios(config)
.then((response) => console.log(response.data))
.catch((error) => console.log(error));
PHP
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => array(
'file'=> new CURLFILE('/path/to/face.jpg')
),
CURLOPT_HTTPHEADER => array(
'apikey: YOUR_API_KEY'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
Swift
import Foundation
let url = URL(string: "https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("YOUR_API_KEY", forHTTPHeaderField: "apikey")
let boundary = "Boundary-\(UUID().uuidString)"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
var body = Data()
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"file\"; filename=\"file.jpg\"\r\n".data(using: .utf8)!)
body.append("Content-Type: image/jpeg\r\n\r\n".data(using: .utf8)!)
if let fileData = try? Data(contentsOf: URL(fileURLWithPath: "/path/to/face.jpg")) {
body.append(fileData)
}
body.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
request.httpBody = body
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
print(String(data: data, encoding: .utf8)!)
}
}
task.resume()
Kotlin
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.asRequestBody
import java.io.File
val client = OkHttpClient()
val file = File("/path/to/face.jpg")
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.name, file.asRequestBody("image/jpeg".toMediaTypeOrNull()))
.build()
val request = Request.Builder()
.url("https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification")
.addHeader("apikey", "YOUR_API_KEY")
.post(requestBody)
.build()
client.newCall(request).execute().use { response ->
println(response.body?.string())
}
Java
import okhttp3.*;
import java.io.File;
OkHttpClient client = new OkHttpClient();
File file = new File("/path/to/face.jpg");
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(),
RequestBody.create(MediaType.parse("image/jpeg"), file))
.build();
Request request = new Request.Builder()
.url("https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification")
.addHeader("apikey", "YOUR_API_KEY")
.post(requestBody)
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.body().string());
}
Dart
import 'package:http/http.dart' as http;
var request = http.MultipartRequest(
'POST',
Uri.parse('https://api.iapp.co.th/v3/store/ekyc/face-and-id-card-verification')
);
request.files.add(await http.MultipartFile.fromPath(
'file',
'/path/to/face.jpg'
));
request.headers.addAll({
'apikey': 'YOUR_API_KEY'
});
var response = await request.send();
var responseBody = await response.stream.bytesToString();
print(responseBody);
定价
| 操作 | 生产路径 | 旧版路径 | IC 费用 | 单位 | 本地部署 |
|---|---|---|---|---|---|
| 面部 + 身份证件验证 (V2 API) | /v3/store/ekyc/face-and-id-card-verification/v2 | /api/v2/ekyc | 1 IC | 每次请求 | 联系我们 |
| 面部 + 身份证件验 证 | /v3/store/ekyc/face-and-id-card-verification | /face-verify-id2 | 1 IC | 每次请求 | |
| 面部和身份证件验证 KYC(正面) | /v3/store/ekyc/face-and-id-card-verification/kyc-front | /thai-national-id-card/v3/front/kyc | 1 IC | 每页 | |
| 面部和身份证件验证 KYC(背面) | /v3/store/ekyc/face-and-id-card-verification/kyc-back | /thai-national-id-card/v3/back/kyc | 1 IC | 每页 |