From 3328da2d0205771a4a67ae82a5e650bd1d0992bc Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Thu, 28 May 2026 11:31:12 +0300 Subject: [PATCH 1/5] docs(idkit): document identity attestations --- world-id/idkit/credentials.mdx | 67 +++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/world-id/idkit/credentials.mdx b/world-id/idkit/credentials.mdx index 7c1d876..a866ded 100644 --- a/world-id/idkit/credentials.mdx +++ b/world-id/idkit/credentials.mdx @@ -4,7 +4,7 @@ title: "Configure Credentials" "twitter:image": "https://raw.githubusercontent.com/worldcoin/developer-docs/main/images/docs/docs-meta.png" --- -{/* cspell:ignore NFC liveness */} +{/* cspell:ignore NFC eID liveness */} A [Credential](https://docs.rs/world-id-primitives/latest/world_id_primitives/credential/struct.Credential.html) is a statement an issuer makes about a World ID holder. In IDKit, the credential you request determines what the user proves to your application. @@ -15,6 +15,7 @@ A [Credential](https://docs.rs/world-id-primitives/latest/world_id_primitives/cr | Proof of Human | The user is a unique human, backed by anonymous biometric verification by the Orb. | `proofOfHuman` | | Passport | The user holds a verified NFC passport credential. | `passport` | | Selfie Check | A low-assurance biometric credential using the device camera for liveness and facial similarity. | `selfieCheckLegacy` today. World ID 4.0 support is rolling out soon. | +| Identity Check | An attestation that a document-backed property about the user matches your requested attributes. | `identityCheck` with attributes like `minimum_age`, `nationality`, or `document_type`. | You can also add a liveness check to any preset with `require_user_presence`. @@ -24,7 +25,7 @@ You can also add a liveness check to any preset with `require_user_presence`. # SDK presets -This page focuses on preset helpers for common credential requests: `proofOfHuman`, `passport`, `selfieCheckLegacy`, and the legacy presets. +This page focuses on preset helpers for common credential requests: `proofOfHuman`, `passport`, `selfieCheckLegacy`, `identityCheck`, and the legacy presets. The snippets below use `rp_context` as if it was already generated and signed by your backend. See [Integrate IDKit](/world-id/idkit/integrate) for the full RP-signing flow. @@ -141,6 +142,68 @@ const preset = selfieCheckLegacy({ signal: "user-123" }); ``` +## Identity Check + +Identity Check is for attesting properties about a user from document-backed credentials. You can request attributes such as: + +| Attribute | Value type | +| --- | --- | +| `document_type` | `"passport"` or `"eid"` | +| `document_number` | `string` | +| `issuing_country` | ISO 3166-1 alpha-3 country code | +| `full_name` | `string` | +| `minimum_age` | `number` | +| `nationality` | ISO 3166-1 alpha-3 country code | + +Set `require_proof_of_humanity: true` when the identity attestation should also require Proof of Human. + + +```typescript title="JavaScript" +import { IDKit, identityCheck } from "@worldcoin/idkit-core"; + +const preset = identityCheck({ + attributes: [ + { type: "document_type", value: "passport" }, + { type: "minimum_age", value: 18 }, + ], + require_proof_of_humanity: true, +}); + +const request = await IDKit.request({ + app_id: "app_xxxxx", + action: "my-action", + rp_context, + allow_legacy_proofs: false, +}).preset(preset); +``` + +```tsx title="React" +import { IDKitRequestWidget, identityCheck } from "@worldcoin/idkit"; + +const preset = identityCheck({ + attributes: [ + { type: "document_type", value: "passport" }, + { type: "minimum_age", value: 18 }, + ], + require_proof_of_humanity: true, +}); + + { /* ... */ }} +/>; +``` + + +Successful Identity Check responses include `identity_attested` so your backend can distinguish whether the requested attributes matched. + ## User presence and liveness `require_user_presence` asks World App to perform an additional liveness step before completing the proof. This flag works with presets. From 8915910ef7b7628752b8fdeb384cff53ee871da4 Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Thu, 28 May 2026 11:54:46 +0300 Subject: [PATCH 2/5] docs(idkit): prevent credential table code wrapping --- world-id/idkit/credentials.mdx | 63 ++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/world-id/idkit/credentials.mdx b/world-id/idkit/credentials.mdx index a866ded..4203a28 100644 --- a/world-id/idkit/credentials.mdx +++ b/world-id/idkit/credentials.mdx @@ -249,17 +249,58 @@ If the user does not complete the liveness step, the request fails with `user_pr These presets only return World ID 3.0 proofs. Keep them for existing integrations or when you specifically need the older verification level. -| Preset | What it requests | -| --- | --- | -| `orbLegacy` | Orb verification. | -| `secureDocumentLegacy` | At least a Secure Document verification. Returns the user's highest legacy credential: Secure Document or Orb. | -| `documentLegacy` | At least a Document verification. Returns the user's highest legacy credential: Document, Secure Document, or Orb. | -| `deviceLegacy` | At least a Device verification. Returns the user's highest legacy credential: Device, Document, Secure Document, or Orb. | + + + + + + + + + + + + + + + + + + + + + + + + + +
PresetWhat it requests
orbLegacyOrb verification.
secureDocumentLegacyAt least a Secure Document verification. Returns the user's highest legacy credential: Secure Document or Orb.
documentLegacyAt least a Document verification. Returns the user's highest legacy credential: Document, Secure Document, or Orb.
deviceLegacyAt least a Device verification. Returns the user's highest legacy credential: Device, Document, Secure Document, or Orb.
## Common parameters -| Parameter | Where it is used | Description | -| --- | --- | --- | -| `signal` | Presets | Binds application context into the proof, such as a user ID or wallet address. Your backend should enforce the same value. | -| `allow_legacy_proofs` | Request config and widgets | Required for request flows. Set to `true` while accepting World ID 3.0 fallback proofs; set to `false` for World ID 4.0-only requests. | -| `require_user_presence` | Request config and widgets | Optional liveness step. Defaults to `false`. | + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterWhere it is usedDescription
signalPresetsBinds application context into the proof, such as a user ID or wallet address. Your backend should enforce the same value.
allow_legacy_proofsRequest config and widgetsRequired for request flows. Set to true while accepting World ID 3.0 fallback proofs; set to false for World ID 4.0-only requests.
require_user_presenceRequest config and widgetsOptional liveness step. Defaults to false.
From c0f4f0db6b51ebec138af5ed4b01a7880ce63e7c Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Thu, 28 May 2026 12:00:40 +0300 Subject: [PATCH 3/5] docs(idkit): prevent error code table wrapping --- world-id/idkit/error-codes.mdx | 58 +++++++++++++++++----------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/world-id/idkit/error-codes.mdx b/world-id/idkit/error-codes.mdx index a9f939b..aa3dda2 100644 --- a/world-id/idkit/error-codes.mdx +++ b/world-id/idkit/error-codes.mdx @@ -12,149 +12,149 @@ This page focuses on IDKit SDK and bridge error codes returned during request fl - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + From 8fd4714ccb87817ee63efdd9379087c3e3ce0fe3 Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Thu, 28 May 2026 13:10:16 +0300 Subject: [PATCH 4/5] update copy --- world-id/idkit/credentials.mdx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/world-id/idkit/credentials.mdx b/world-id/idkit/credentials.mdx index 4203a28..e360829 100644 --- a/world-id/idkit/credentials.mdx +++ b/world-id/idkit/credentials.mdx @@ -142,21 +142,20 @@ const preset = selfieCheckLegacy({ signal: "user-123" }); ``` -## Identity Check +## Identity Check (Preview) -Identity Check is for attesting properties about a user from document-backed credentials. You can request attributes such as: + +Identity Check lets your app ask the user to attest that document-backed attributes match your policy, without asking you to handle the underlying document data. Use it for eligibility checks such as minimum age, document type, issuing country, or nationality. You can request attributes such as: | Attribute | Value type | | --- | --- | -| `document_type` | `"passport"` or `"eid"` | +| `document_type` | `"passport"`, `"eid"` or `"mnc"` | | `document_number` | `string` | | `issuing_country` | ISO 3166-1 alpha-3 country code | | `full_name` | `string` | | `minimum_age` | `number` | | `nationality` | ISO 3166-1 alpha-3 country code | -Set `require_proof_of_humanity: true` when the identity attestation should also require Proof of Human. - ```typescript title="JavaScript" import { IDKit, identityCheck } from "@worldcoin/idkit-core"; @@ -166,7 +165,6 @@ const preset = identityCheck({ { type: "document_type", value: "passport" }, { type: "minimum_age", value: 18 }, ], - require_proof_of_humanity: true, }); const request = await IDKit.request({ @@ -185,7 +183,6 @@ const preset = identityCheck({ { type: "document_type", value: "passport" }, { type: "minimum_age", value: 18 }, ], - require_proof_of_humanity: true, }); ```typescript title="JavaScript" @@ -243,8 +242,6 @@ const preset = proofOfHuman({ signal: "user-123" }); ``` -If the user does not complete the liveness step, the request fails with `user_presence_failed`. - ## Other legacy presets These presets only return World ID 3.0 proofs. Keep them for existing integrations or when you specifically need the older verification level. From 2c7e47af65b0eb077c09af741da1d510bd7ad2aa Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Thu, 28 May 2026 13:12:07 +0300 Subject: [PATCH 5/5] disclaimer --- world-id/idkit/credentials.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/world-id/idkit/credentials.mdx b/world-id/idkit/credentials.mdx index e360829..b18ea07 100644 --- a/world-id/idkit/credentials.mdx +++ b/world-id/idkit/credentials.mdx @@ -144,6 +144,10 @@ const preset = selfieCheckLegacy({ signal: "user-123" }); ## Identity Check (Preview) + + Identity Check is currently in preview. If you're interested in using or learning more about Identity Check, please contact us. + + Identity Check lets your app ask the user to attest that document-backed attributes match your policy, without asking you to handle the underlying document data. Use it for eligibility checks such as minimum age, document type, issuing country, or nationality. You can request attributes such as:
CodeCode Meaning Typical action
user_rejecteduser_rejected User cancelled in World App. Treat as user cancellation, allow retry.
verification_rejectedverification_rejected Legacy rejection code (older bridge/app behavior). Handle same as user_rejected.
credential_unavailablecredential_unavailable Requested credential type is not available for that user. Offer fallback credential policy or explain requirement.
world_id_4_not_availableworld_id_4_not_available World ID 4.0 credential is not available for that user. Use a compatible fallback request or explain the World ID 4.0 requirement.
world_id_3_not_availableworld_id_3_not_available World ID 3.0 credential is not available for that user. Use a compatible fallback request or explain the World ID 3.0 requirement.
malformed_requestmalformed_request Payload or configuration is invalid. Check app_id, rp_context, and request shape.
invalid_networkinvalid_network Environment mismatch between app config and World App context. Align staging/production settings.
inclusion_proof_pendinginclusion_proof_pending Credential inclusion data is not ready yet. Retry later.
inclusion_proof_failedinclusion_proof_failed Inclusion proof retrieval failed. Retry; if repeated, treat as operational incident.
unexpected_responseunexpected_response Malformed or unsupported bridge/app response. Log diagnostics and retry once.
connection_failedconnection_failed Could not establish/maintain bridge communication. Check connectivity and bridge reachability.
max_verifications_reachedmax_verifications_reached Action already verified the maximum allowed number of times. Treat as terminal business-rule outcome.
failed_by_host_appfailed_by_host_app Host app callback failed while processing a successful proof. Fix host callback/backend logic and retry.
invalid_rp_signatureinvalid_rp_signature RP signature could not be verified. Check the RP signing key, nonce, timestamps, action, and signed message.
nullifier_replayednullifier_replayed Nullifier was already used for this action. Treat as an already-verified outcome; do not retry the same action as a new verification.
duplicate_nonceduplicate_nonce RP reused a signature nonce. Generate a fresh nonce and signed RP context for each request.
unknown_rpunknown_rp RP is not known to the registry. Check the registered RP ID and app configuration.
inactive_rpinactive_rp RP is registered but inactive. Reactivate or reconfigure the RP before retrying.
timestamp_too_oldtimestamp_too_old RP request timestamp is too old. Generate a new signed RP context with a current timestamp.
timestamp_too_far_in_futuretimestamp_too_far_in_future RP request timestamp is too far in the future. Fix server clock skew and generate a new signed RP context.
invalid_timestampinvalid_timestamp RP request timestamp is invalid. Check timestamp format and regenerate the signed RP context.
rp_signature_expiredrp_signature_expired RP signature has expired. Request a fresh RP signature before starting verification.
user_presence_faileduser_presence_failed Required user-presence check was not completed. Let the user retry the request.
identity_attributes_not_matchedidentity_attributes_not_matched User identity attributes did not match the requested constraints. Show an eligibility fallback or adjust the requested attribute constraints.
generic_errorgeneric_error Catch-all unknown failure. Log details and retry with backoff.
invalid_rp_id_formatinvalid_rp_id_format RP ID is malformed. Use the registered rp_... ID from your app configuration.
timeouttimeout Client-side polling timeout. Extend timeout or let the user retry.
cancelledcancelled Client-side cancellation (abort/task cancel/user close). Treat as neutral cancellation path.