Didit Proof of Address API
Overview
Verifies address documents by submitting images or PDFs. Extracts address information, performs authenticity checks, name matching, geocoding, and returns structured data.
Key constraints:
- - Supported formats: JPG, JPEG, PNG, TIFF, PDF
- Maximum file size: 15MB
- Document must be within 90 days of issue date
- Full-color, all corners visible, no digital editing
- Must be different from the ID document used for ID verification
Capabilities: OCR extraction, intelligent document classification, name matching with identity documents, issue date validation, geocoding with lat/lng coordinates, language detection, multi-page support.
Accepted document types:
| Category | Examples |
|---|
| Utility Bill | Electricity, water, gas, internet, phone, combined utilities |
| Bank Statement |
Account statement, credit card, mortgage, loan |
| Government-Issued | Tax assessment, residency certificate, voter registration |
| Other PoA | Lease, rental agreement, insurance policy, employer letter |
API Reference: https://docs.didit.me/standalone-apis/proof-of-address
Feature Guide: https://docs.didit.me/core-technology/proof-of-address/overview
Authentication
All requests require x-api-key header. Get your key from Didit Business Console → API & Webhooks, or via programmatic registration (see below).
Getting Started (No Account Yet?)
If you don't have a Didit API key, create one in 2 API calls:
- 1. Register:
POST https://apx.didit.me/auth/v2/programmatic/register/ with INLINECODE2 - Check email for a 6-character OTP code
- Verify:
POST https://apx.didit.me/auth/v2/programmatic/verify-email/ with {"email": "you@gmail.com", "code": "A3K9F2"} → response includes INLINECODE5
To add credits: GET /v3/billing/balance/ to check, POST /v3/billing/top-up/ with {"amount_in_dollars": 50} for a Stripe checkout link.
See the didit-verification-management skill for full platform management (workflows, sessions, users, billing).
Endpoint
CODEBLOCK0
Headers
| Header | Value | Required |
|---|
| INLINECODE9 | Your API key | Yes |
| INLINECODE10 |
multipart/form-data |
Yes |
Request Parameters (multipart/form-data)
| Parameter | Type | Required | Default | Description |
|---|
| INLINECODE12 | file | Yes | — | PoA document (JPG/PNG/TIFF/PDF, max 15MB) |
| INLINECODE13 |
boolean | No |
true | Save in Business Console |
|
vendor_data | string | No | — | Your identifier for session tracking |
Example
CODEBLOCK1
CODEBLOCK2
Response (200 OK)
CODEBLOCK3
Status Values & Handling
| Status | Meaning | Action |
|---|
| INLINECODE16 | Address verified, document valid | Proceed with your flow |
| INLINECODE17 |
Document invalid or expired | Check
warnings for specific reason |
|
"In Review" | Needs manual review | Check for name mismatch or quality issues |
|
"Not Finished" | Processing incomplete | Wait or retry |
Error Responses
| Code | Meaning | Action |
|---|
| INLINECODE21 | Invalid request | Check file format, size, parameters |
| INLINECODE22 |
Invalid API key | Verify
x-api-key header |
|
403 | Insufficient credits | Top up at business.didit.me |
Response Field Reference
| Field | Type | Description |
|---|
| INLINECODE25 | string | INLINECODE26 , "Declined", "In Review", INLINECODE29 |
| INLINECODE30 |
string | ISO 3166-1 alpha-3 country code |
|
document_type | string |
"UTILITY_BILL",
"BANK_STATEMENT",
"GOVERNMENT_ISSUED_DOCUMENT",
"OTHER_POA_DOCUMENT",
"UNKNOWN" |
|
issuer | string | Issuing institution name |
|
issue_date | string |
YYYY-MM-DD |
|
document_language | string | Detected language code |
|
name_on_document | string | Extracted name |
|
poa_address | string | Raw extracted address |
|
poa_formatted_address | string | Formatted address |
|
poa_parsed_address | object |
{street_1, street_2, city, region, postal_code} |
|
poa_parsed_address.raw_results.geometry.location | object |
{lat, lng} geocoded coordinates |
|
document_file | string | Temporary URL (expires
60 min) |
|
warnings | array |
{risk, log_type, short_description, long_description} |
Warning Tags
Auto-Decline
| Tag | Description |
|---|
| INLINECODE51 | Document type not accepted for your app |
| INLINECODE52 |
Document older than 90 days |
|
INVALID_DOCUMENT_TYPE | Document cannot be processed |
|
MISSING_ADDRESS_INFORMATION | No valid address could be extracted |
Configurable (Decline / Review / Approve)
| Tag | Description |
|---|
| INLINECODE55 | Name doesn't match verified identity |
| INLINECODE56 |
Name doesn't match ID document |
|
POA_NAME_MISMATCH_BETWEEN_DOCUMENTS | Names differ between multiple PoA docs |
|
POOR_DOCUMENT_QUALITY | Insufficient image quality |
|
DOCUMENT_METADATA_MISMATCH | Digital signature/metadata indicates tampering |
|
SUSPECTED_DOCUMENT_MANIPULATION | Signs of document manipulation |
|
UNSUPPORTED_DOCUMENT_LANGUAGE | Document language not supported |
|
ADDRESS_MISMATCH_WITH_PROVIDED | Address doesn't match provided address |
|
UNABLE_TO_EXTRACT_ISSUE_DATE | Could not determine issue date |
|
ISSUER_NOT_IDENTIFIED | Could not identify issuing institution |
|
UNPARSABLE_OR_INVALID_ADDRESS | Address couldn't be parsed |
|
UNABLE_TO_VALIDATE_DOCUMENT_AGE | Could not determine document age |
|
FUTURE_ISSUE_DATE | Issue date is in the future |
Warning severity: error (→ Declined), warning (→ In Review), information (no effect).
Common Workflows
Basic Address Verification
CODEBLOCK4
Full KYC with Address
CODEBLOCK5
Utility Scripts
verify_address.py: Verify proof of address documents from the command line.
CODEBLOCK6
Didit 地址证明 API
概述
通过提交图片或PDF文件验证地址证明文件。提取地址信息,执行真实性检查、姓名匹配、地理编码,并返回结构化数据。
关键限制:
- - 支持的格式:JPG、JPEG、PNG、TIFF、PDF
- 最大文件大小:15MB
- 文件签发日期必须在 90天内
- 全彩色,所有边角可见,无数字编辑
- 必须与用于身份验证的身份证件不同
功能: OCR提取、智能文档分类、与身份证件姓名匹配、签发日期验证、含经纬度坐标的地理编码、语言检测、多页支持。
接受的文档类型:
| 类别 | 示例 |
|---|
| 公用事业账单 | 电费、水费、燃气费、网络费、电话费、综合公用事业费 |
| 银行对账单 |
账户对账单、信用卡、抵押贷款、贷款 |
| 政府签发 | 税务评估、居住证明、选民登记 |
| 其他地址证明 | 租赁合同、租房协议、保险单、雇主证明信 |
API 参考: https://docs.didit.me/standalone-apis/proof-of-address
功能指南: https://docs.didit.me/core-technology/proof-of-address/overview
身份验证
所有请求都需要 x-api-key 标头。从 Didit 业务控制台 → API 和 Webhooks 获取您的密钥,或通过编程方式注册(见下文)。
快速入门(还没有账户?)
如果您没有 Didit API 密钥,通过 2 个 API 调用创建一个:
- 1. 注册: POST https://apx.didit.me/auth/v2/programmatic/register/ 附带 {email: you@gmail.com, password: MyStr0ng!Pass}
- 检查邮箱 获取 6 位 OTP 验证码
- 验证: POST https://apx.didit.me/auth/v2/programmatic/verify-email/ 附带 {email: you@gmail.com, code: A3K9F2} → 响应包含 api_key
添加积分: GET /v3/billing/balance/ 检查余额,POST /v3/billing/top-up/ 附带 {amountindollars: 50} 获取 Stripe 结账链接。
完整平台管理(工作流、会话、用户、计费)请参阅 didit-verification-management 技能。
端点
POST https://verification.didit.me/v3/poa/
请求头
| 请求头 | 值 | 必需 |
|---|
| x-api-key | 您的 API 密钥 | 是 |
| Content-Type |
multipart/form-data |
是 |
请求参数(multipart/form-data)
| 参数 | 类型 | 必需 | 默认值 | 描述 |
|---|
| document | 文件 | 是 | — | 地址证明文件(JPG/PNG/TIFF/PDF,最大 15MB) |
| saveapirequest |
布尔值 | 否 | true | 保存在业务控制台中 |
| vendor_data | 字符串 | 否 | — | 用于会话跟踪的标识符 |
示例
python
import requests
response = requests.post(
https://verification.didit.me/v3/poa/,
headers={x-api-key: YOURAPIKEY},
files={document: (utility_bill.pdf, open(bill.pdf, rb), application/pdf)},
data={vendor_data: user-123},
)
print(response.json())
typescript
const formData = new FormData();
formData.append(document, documentFile);
const response = await fetch(https://verification.didit.me/v3/poa/, {
method: POST,
headers: { x-api-key: YOURAPIKEY },
body: formData,
});
响应(200 OK)
json
{
request_id: a1b2c3d4-...,
poa: {
status: Approved,
issuing_state: ESP,
documenttype: UTILITYBILL,
issuer: Endesa,
issue_date: 2025-01-15,
document_language: es,
nameondocument: Elena Martínez Sánchez,
poa_address: Calle Mayor 10, 28013 Madrid,
poaformattedaddress: Calle Mayor 10, 28013 Madrid, Spain,
poaparsedaddress: {
street_1: Calle Mayor 10,
city: Madrid,
region: Comunidad de Madrid,
postal_code: 28013,
raw_results: {
geometry: {location: {lat: 40.4168, lng: -3.7038}}
}
},
document_file: https://example.com/document.pdf,
warnings: []
},
created_at: 2025-05-01T13:11:07.977806Z
}
状态值及处理
| 状态 | 含义 | 操作 |
|---|
| Approved | 地址已验证,文件有效 | 继续您的流程 |
| Declined |
文件无效或已过期 | 检查 warnings 了解具体原因 |
| In Review | 需要人工审核 | 检查姓名不匹配或质量问题 |
| Not Finished | 处理未完成 | 等待或重试 |
错误响应
| 状态码 | 含义 | 操作 |
|---|
| 400 | 无效请求 | 检查文件格式、大小、参数 |
| 401 |
API 密钥无效 | 验证 x-api-key 请求头 |
| 403 | 积分不足 | 在 business.didit.me 充值 |
响应字段参考
| 字段 | 类型 | 描述 |
|---|
| status | 字符串 | Approved、Declined、In Review、Not Finished |
| issuing_state |
字符串 | ISO 3166-1 alpha-3 国家代码 |
| document
type | 字符串 | UTILITYBILL、BANK
STATEMENT、GOVERNMENTISSUED
DOCUMENT、OTHERPOA_DOCUMENT、UNKNOWN |
| issuer | 字符串 | 签发机构名称 |
| issue_date | 字符串 | YYYY-MM-DD |
| document_language | 字符串 | 检测到的语言代码 |
| name
ondocument | 字符串 | 提取的姓名 |
| poa_address | 字符串 | 原始提取的地址 |
| poa
formattedaddress | 字符串 | 格式化后的地址 |
| poa
parsedaddress | 对象 | {street
1, street2, city, region, postal_code} |
| poa
parsedaddress.raw_results.geometry.location | 对象 | {lat, lng} 地理编码坐标 |
| document_file | 字符串 | 临时 URL(
60 分钟后过期) |
| warnings | 数组 | {risk, log
type, shortdescription, long_description} |
警告标签
自动拒绝
| 标签 | 描述 |
|---|
| POADOCUMENTNOTSUPPORTEDFORAPPLICATION | 您的应用不接受该文档类型 |
| EXPIREDDOCUMENT |
文件超过 90 天 |
| INVALID
DOCUMENTTYPE | 无法处理该文档 |
| MISSING
ADDRESSINFORMATION | 无法提取有效地址 |
可配置(拒绝/审核/批准)
| 标签 | 描述 |
|---|
| NAMEMISMATCHWITHPROVIDED | 姓名与提供的身份信息不匹配 |
| NAMEMISMATCHIDVERIFICATION |
姓名与身份证件不匹配 |
| POA
NAMEMISMATCH
BETWEENDOCUMENTS | 多个地址证明文件之间的姓名不同 |
| POOR
DOCUMENTQUALITY | 图像质量不足 |
| DOCUMENT
METADATAMISMATCH | 数字签名/元数据表明被篡改 |
| SUSPECTED
DOCUMENTMANIPULATION | 有文档篡改迹象 |
| UNSUPPORTED
DOCUMENTLANGUAGE |