KYC China
Single endpoint, smart fan-out
Products
Data sources & residency
Cost & rate limits
Client ID in x-client-id header.
Client Secret in x-client-secret header.
All fields are optional. The endpoint runs every sub-check whose required
fields are present (see the Sub-check eligibility table above). At least
one sub-check must be eligible — otherwise a 400 is returned.
Full legal name in Chinese characters (simplified). Must match the name on the resident ID card exactly. Latin pinyin transliterations are not accepted by the upstream.
Enables: identity-document checks, mobile-cross checks, bank checks, criminal records.
张三18-digit Chinese Resident Identity Card number (居民身份证号码).
The 18th character may be X for older IDs.
Enables: identity-document checks, mobile-cross checks, bank checks, fraud, criminal records.
110101199001011234Pattern: ^[0-9]{17}[0-9Xx]$ID card issue date in YYYYMMDD format (no separators). Found on the
back of the physical card under 签发日期.
Pair with idExpiryDate to upgrade identity.two-factor to the stronger
identity.four-factor check that also validates the on-file dates.
20180501Pattern: ^[0-9]{8}$ID card expiry date in YYYYMMDD format, or the literal string 长期
when the card has no expiry (issued to citizens 46+ in some cases).
Found on the back of the physical card under 有效期限.
20281231Base64-encoded facial photo. Do not include the data:image/...;base64,
prefix — only the raw base64 payload.
Recommended: clear front-facing photo, no occlusions, JPEG/PNG, ≤2 MB.
Enables identity.image, which compares the photo against the MPS face
on file for the supplied name + ID. Requires name and idNumber.
iVBORw0KGgoAAAANSUhEUgAA...11-digit mainland China mobile number. No country code, no +86,
no spaces. First two digits must be 13-19.
Enables: mobile lookups, mobile-cross identity checks, fraud screening,
bank four-factor. Mobile alone is enough to run mobile/risk lookups
without any identity fields.
13800138000Pattern: ^1[3-9][0-9]{9}$Bank card number — debit or credit. Digits only, no spaces. Enables
bank.two-factor (with name), bank.three-factor (also with idNumber),
or bank.four-factor (also with mobile).
6222021234567890123Restrict the request to a specific set of products from the KYC
Mainland China catalogue. Product numbers are strings (e.g. "1",
"8.3"). When omitted or empty, every eligible sub-check runs
(smart-selection rules apply). When supplied, only the listed
products fire — and each runs independently, bypassing the default
supersession rules between products 1/3, 11/12, and the
bank variants. Selecting multiple bank products runs each one and
reports it in its own bank2f / bank3f / bank4f field.
Supported values: "1", "2", "3", "4", "8.1", "8.2.1", "8.3", "11", "12", "15", "17", "24", "25", "27". See the Selecting which
products to run section above for the product-number → sub-check
mapping.
Any other value returns a 400 with requestId and a message
distinguishing unimplemented (catalogued but no upstream yet —
5, 6, 7, 8.2.2, 9.1, 9.2.1, 9.2.2, 9.3, 10, 13, 14, 16, 18–23, 26, 28–35) from unknown (outside the catalogue entirely).
["1","8.3","25"]HTTPS URL to receive a webhook POST when the report is ready.
When provided, the completed report (same payload as a 200 response from /kyc/cn/poll)
is delivered to this URL.
Polling remains available as a fallback.
^https://.+KYC verification request initiated. Use the returned token with /kyc/cn/poll to fetch the result.
JWT token encoding the request — pass it to /kyc/cn/poll until a 200 response
is returned (typically within 10-30 seconds for a full KYC fan-out).
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Stable identifier for this request. Returned on both 200 and 400
responses for tracing/support. Prefixed KYC_ followed by 12
random characters.
KYC_a1b2c3d4e5f6Returned in two cases:
- No sub-checks were eligible with the provided fields (e.g. supplying only
facePhotowithoutnameandidNumber, or an empty request body). runcontains a product number that is not in the supported set (1, 2, 3, 4, 8, 11, 12, 15, 17, 24, 25, 27).
The body always contains { "message": "...", "requestId": "KYC_..." } —
the requestId is logged in the tracker so support can correlate the
rejection with the originating call.
Internal failure invoking the upstream verification service before any sub-check
could run. Per-check failures during fan-out do not produce a 502 — they
appear in summary.errored or summary.unavailable inside a successful 200 response.
Client ID in x-client-id header.
Client Secret in x-client-secret header.
JWT token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8UPattern: ^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$KYC China result. Categories are present only when at least one of their sub-checks ran.
Presigned URL to download a PDF version of this report. Valid for 7 days. The underlying object is deleted after 30 days by bucket lifecycle rule.
https://kyc-bucket-ap-east-1-staging-canary.s3.ap-east-1.amazonaws.com/kyc/abc123.pdf?X-Amz-...Suggested filename for the PDF download.
kyc-cn-abc123.pdfResult of the 2-factor bank check (name + card, product 8.1).
Present only when the 2FV variant ran.
Result of the 3-factor bank check (name + card + ID, product 8.2.1).
Present only when the 3FV variant ran.
Result of the 4-factor bank check (name + card + ID + mobile, product
8.3). Present only when the 4FV variant ran.
KYC verification still processing — keep polling every 2-3 seconds.
Invalid or expired token.
Last updated

