From e11bd00b7a67d24388e66f6fbd6238942ebcbb7b Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Mon, 5 Oct 2026 17:57:54 +0300 Subject: [PATCH 1/2] docs(world-id): align marketing names across guides --- mini-apps/commands/verify.mdx | 2 +- openapi/developer-portal.json | 16 +++++++-------- snippets/idkit-response.mdx | 2 +- world-id/SKILL.md | 18 ++++++++--------- world-id/credentials/11.mdx | 2 +- world-id/credentials/9303.mdx | 4 ++-- world-id/idkit/credentials.mdx | 24 ++++++++++++----------- world-id/idkit/kotlin.mdx | 2 +- world-id/idkit/mini-apps.mdx | 4 ++-- world-id/idkit/session-proofs.mdx | 6 +++--- world-id/idkit/swift.mdx | 2 +- world-id/sandbox/sandbox-access.mdx | 4 ++-- world-id/sandbox/testing-selfie-check.mdx | 22 ++++++++++----------- world-id/yc.mdx | 4 ++-- 14 files changed, 57 insertions(+), 55 deletions(-) diff --git a/mini-apps/commands/verify.mdx b/mini-apps/commands/verify.mdx index f0a6032..f7397d4 100644 --- a/mini-apps/commands/verify.mdx +++ b/mini-apps/commands/verify.mdx @@ -7,4 +7,4 @@ description: "World ID verification has moved to IDKit." World ID has been unified into [IDKit](/world-id/idkit/mini-apps), so the same integration works in both mini apps and desktop. -If you are migrating from MiniKit 1.x, replace `MiniKit.verify(...)` or `MiniKit.commandsAsync.verify(...)` with IDKit. See [IDKit for Mini Apps](/world-id/idkit/mini-apps) for the Mini App integration shape, including Selfie Check. +If you are migrating from MiniKit 1.x, replace `MiniKit.verify(...)` or `MiniKit.commandsAsync.verify(...)` with IDKit. See [IDKit for Mini Apps](/world-id/idkit/mini-apps) for the Mini App integration shape, including Proof of Presence. diff --git a/openapi/developer-portal.json b/openapi/developer-portal.json index bc10a79..a1b0ae1 100644 --- a/openapi/developer-portal.json +++ b/openapi/developer-portal.json @@ -1152,7 +1152,7 @@ } }, "selfie_check_v4": { - "summary": "Selfie Check", + "summary": "Proof of Presence", "value": { "protocol_version": "4.0", "nonce": "0xabc123", @@ -1297,7 +1297,7 @@ "face", "selfie" ], - "description": "The legacy verification level. Use `selfie` for Selfie Check. The historical `face` value remains accepted for backward compatibility and behaves the same as `selfie`." + "description": "The legacy verification level. Use `selfie` for Proof of Presence. The historical `face` value remains accepted for backward compatibility and behaves the same as `selfie`." }, "action": { "type": "string", @@ -1674,7 +1674,7 @@ "IntegrityBundle": { "type": "object", "required": ["version", "signature_format", "timestamp", "signature", "jwt"], - "description": "World ID App integrity attestation. Selfie Check responses with `issuer_schema_id: 11` require version 2, which covers the disclosed `sybil_score`.", + "description": "World ID App integrity attestation. Proof of Presence responses with `issuer_schema_id: 11` require version 2, which covers the disclosed `sybil_score`.", "properties": { "version": { "type": "integer", @@ -1792,7 +1792,7 @@ "default": "production" }, "integrity_bundle": { - "description": "Required with version 2 when any response item is a Selfie Check credential (`issuer_schema_id: 11`).", + "description": "Required with version 2 when any response item is a Proof of Presence credential (`issuer_schema_id: 11`).", "allOf": [ { "$ref": "#/components/schemas/IntegrityBundle" @@ -1836,7 +1836,7 @@ "default": "production" }, "integrity_bundle": { - "description": "Required with version 2 when any response item is a Selfie Check credential (`issuer_schema_id: 11`).", + "description": "Required with version 2 when any response item is a Proof of Presence credential (`issuer_schema_id: 11`).", "allOf": [ { "$ref": "#/components/schemas/IntegrityBundle" @@ -1862,7 +1862,7 @@ "properties": { "identifier": { "type": "string", - "description": "Credential identifier returned by IDKit (for example, `orb` or `selfie`). Use `selfie` for Selfie Check; the historical `face` value remains accepted as a backward-compatible alias." + "description": "Credential identifier returned by IDKit (for example, `orb` or `selfie`). Use `selfie` for Proof of Presence; the historical `face` value remains accepted as a backward-compatible alias." }, "signal_hash": { "type": "string", @@ -1922,7 +1922,7 @@ "sybil_score": { "type": "integer", "minimum": 0, - "description": "Versioned Selfie Check risk signal represented as an integer. Required only when `issuer_schema_id` is 11." + "description": "Versioned Proof of Presence risk signal represented as an integer. Required only when `issuer_schema_id` is 11." } } }, @@ -1969,7 +1969,7 @@ "sybil_score": { "type": "integer", "minimum": 0, - "description": "Versioned Selfie Check risk signal represented as an integer. Required only when `issuer_schema_id` is 11." + "description": "Versioned Proof of Presence risk signal represented as an integer. Required only when `issuer_schema_id` is 11." } } }, diff --git a/snippets/idkit-response.mdx b/snippets/idkit-response.mdx index 1fc4feb..0998c63 100644 --- a/snippets/idkit-response.mdx +++ b/snippets/idkit-response.mdx @@ -36,7 +36,7 @@ } ``` -```json title="Selfie Check" +```json title="Proof of Presence" { "protocol_version": "4.0", "nonce": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", diff --git a/world-id/SKILL.md b/world-id/SKILL.md index 9004997..75ded03 100644 --- a/world-id/SKILL.md +++ b/world-id/SKILL.md @@ -1,7 +1,7 @@ --- name: world-id-integration description: | - Use this skill when adding, upgrading, debugging, or testing World ID verification with IDKit in a new or existing web or mobile app. Covers Proof of Human, passport/document, Selfie Check, and session/sign-in flows; Developer Portal app, RP, and action setup; server-side signing and proof verification; environment matching; nullifier replay protection; and launch testing. Trigger when the user asks to add World ID, verify humans, stop bots or multi-accounting, add Sybil resistance, or mentions IDKit, Orb, World ID proof flows, World App proof flows, @worldcoin/idkit, signing keys, rp_id, or app_id. + Use this skill when adding, upgrading, debugging, or testing World ID verification with IDKit in a new or existing web or mobile app. Covers Proof of Human, Proof of Attributes (passport/document), Proof of Presence, and session/sign-in flows; Developer Portal app, RP, and action setup; server-side signing and proof verification; environment matching; nullifier replay protection; and launch testing. Trigger when the user asks to add World ID, verify humans, stop bots or multi-accounting, add Sybil resistance, or mentions IDKit, Orb, World ID proof flows, World App proof flows, @worldcoin/idkit, signing keys, rp_id, or app_id. version: 0.1.0 metadata: author: worldcoin @@ -98,25 +98,25 @@ The credential decides what the user proves. Nail this down before scaffolding | Preset | What it proves | Use it for | |---|---|---| | **`proofOfHuman`** — Proof of Human (flagship) | The user is a unique person, biometrically verified at an Orb | Sybil resistance, airdrops, one-vote-per-human, gated signups. **The default if the user said "proof of human" or "verify a real human."** | -| **`passport`** — Passport | The user holds a valid government passport (NFC-verified) | Higher-assurance flows where you need document-grade identity (regulated apps, age-gating, KYC-adjacent). | -| **`selfieCheck`** — Selfie Check | A liveness and facial-similarity credential backed by a World ID 4.0 proof | Medium-assurance friction and bot deterrence without the full Orb requirement. Returns a verified `sybil_score` risk signal. | +| **`passport`** — Proof of Attributes (Passport) | The user holds a valid government passport (NFC-verified) | Higher-assurance flows where you need document-grade identity (regulated apps, age-gating, KYC-adjacent). | +| **`selfieCheck`** — Proof of Presence | A liveness and facial-similarity credential backed by a World ID 4.0 proof | Medium-assurance friction and bot deterrence without the full Orb requirement. Returns a verified `sybil_score` risk signal. | **DO NOT default to `proofOfHuman` if the user said "passport" or "verify their ID"** — that's `passport`. **DO NOT default to `proofOfHuman` if the user said "selfie" or "liveness"** — that's `selfieCheck`. When in doubt, ask one question. Other legacy presets exist (`documentLegacy`, `deviceLegacy`); reach for them only when the user asks specifically. For sign-in / session reuse across visits, use the v4 **session** flow (see `/world-id/idkit/session-proofs`). -### NFC Credential constraints +### Proof of Attributes (NFC) constraints -A user can have only one [NFC Credential](https://docs.world.org/world-id/credentials/9303) attached to their Authenticator at a time. A passport, MNC, and eID are NFC Credential types and must be treated as alternatives when composing constraints with `any()`, `all()`, or `enumerate()`. Do not require multiple NFC Credentials—for example, `all(passport(), mnc())` cannot be satisfied, and `enumerate()` must not create combinations that require more than one NFC Credential. +A user can have only one NFC credential for [Proof of Attributes](https://docs.world.org/world-id/credentials/9303) attached to their Authenticator at a time. A passport, MNC, and eID are NFC Credential types and must be treated as alternatives when composing constraints with `any()`, `all()`, or `enumerate()`. Do not require multiple NFC Credentials—for example, `all(passport(), mnc())` cannot be satisfied, and `enumerate()` must not create combinations that require more than one NFC Credential. -### Selfie Check +### Proof of Presence -For repeated Selfie Check verification, use `IDKit.createSession` followed by +For repeated Proof of Presence verification, use `IDKit.createSession` followed by `IDKit.proveSession` with `.preset(selfieCheck())`. Save the verified `session_id` against the application account and require that same session on later checks; enforce per-proof replay protection. -For a one-time uniqueness check, use the `selfieCheck` preset. Each Selfie Check +For a one-time uniqueness check, use the `selfieCheck` preset. Each Proof of Presence response includes a required integer `sybil_score`; forward the complete IDKit result unchanged so the Developer Portal can verify the proof and version 2 integrity signature before the app uses the score. @@ -151,7 +151,7 @@ per-proof replay protection. Test both creation and proving the saved session. 2. **Create or reuse the Portal resources.** Use the MCP when available. Reuse an existing app, RP, and action when they match the requested integration. For a new RP, capture `app_id`, `rp_id`, and `signing_key.private_key` from `configure_world_id`, create the action in the intended environment, and write the signing key to the prepared server-only secret store in the same step. The portal returns it exactly once. **Do not print, log, or return the private key to chat.** If the key is lost, explain that `get_world_id_signing_key` cannot recover it; rotation creates a new key and invalidates the old signer. 3. **Generate the RP signature in your backend.** *Why backend?* The signing key authenticates your app to the protocol. Leaking it lets anyone impersonate your app and forge proof requests. **CRITICAL: never sign on the client. Never expose `RP_SIGNING_KEY` as a `NEXT_PUBLIC_*` var. Never log it.** 4. **Open the IDKit widget on the client** with the signature your backend returned. The widget hands off to World ID, which produces a zero-knowledge proof. -5. **Verify the proof in your backend** by POSTing it **as-is** to `https://developer.world.org/api/v4/verify/{rp_id}`. *Why backend?* A client can return any JSON it wants. Only the World verifier — called from a trusted server — confirms the proof is real and tied to a unique credential. Verifying client-side defeats the entire point. **DO NOT mutate, re-encode, or trim the proof JSON before forwarding** — pass exactly what IDKit returned. For Selfie Check, IDKit returns `responses[].identifier: "selfie"`. Do not turn it into a hand-built `verification_level`; `face` is only a backward-compatible alias for legacy integrations. +5. **Verify the proof in your backend** by POSTing it **as-is** to `https://developer.world.org/api/v4/verify/{rp_id}`. *Why backend?* A client can return any JSON it wants. Only the World verifier — called from a trusted server — confirms the proof is real and tied to a unique credential. Verifying client-side defeats the entire point. **DO NOT mutate, re-encode, or trim the proof JSON before forwarding** — pass exactly what IDKit returned. For Proof of Presence, IDKit returns `responses[].identifier: "selfie"`. Do not turn it into a hand-built `verification_level`; `face` is only a backward-compatible alias for legacy integrations. 6. **Store the nullifier.** Every successful proof returns a `nullifier` — an RP-scoped, action-scoped, non-reversible identifier for that user. *Why store it?* Without uniqueness storage, a user can verify the same proof twice and double-claim a reward, vote, etc. Persist `(action, nullifier)` with a `UNIQUE` constraint and reject duplicates on insert. Column type: **`NUMERIC(78, 0)`** (256-bit field elements). The nullifier reveals nothing about the user — safe to store, but it's the *only* anti-replay mechanism, so it's required. ## Phase 5 — Match environments end-to-end diff --git a/world-id/credentials/11.mdx b/world-id/credentials/11.mdx index 26be43e..07e061a 100644 --- a/world-id/credentials/11.mdx +++ b/world-id/credentials/11.mdx @@ -142,5 +142,5 @@ Use the `selfieCheck` preset in IDKit to integrate Proof of Presence into your a See [Integrate IDKit](/world-id/idkit/integrate) for the complete integration flow. -Testing your integration? See [Testing Selfie Check in Sandbox](/world-id/sandbox/testing-selfie-check) +Testing your integration? See [Testing Proof of Presence in Sandbox](/world-id/sandbox/testing-selfie-check) for coverage, critical user journeys, and known limitations. diff --git a/world-id/credentials/9303.mdx b/world-id/credentials/9303.mdx index f55aa33..7f8ed49 100644 --- a/world-id/credentials/9303.mdx +++ b/world-id/credentials/9303.mdx @@ -51,13 +51,13 @@ import { CredentialHero } from "/snippets/credential-hero.jsx"; ## Introduction -Proof of Attributes is a document-backed credential, also called the NFC Credential in technical references. It represents a unique government-issued document. It supports passports and eIDs. Availability varies by country and continues to expand over time. An NFC Credential is **guaranteed to be issued to a single World ID per unique document**. In addition to ICAO-9303 compliant documents (such as passports or eIDs), the Japanese [My Number Card](https://en.wikipedia.org/wiki/My_Number_Card) (MNC) is also supported. The MNC flow uses different enrollment handling internally, but it issues the same credential. +Proof of Attributes is a document-backed credential, also called the NFC Credential in technical references. It represents a unique government-issued document. It supports passports and eIDs. Availability varies by country and continues to expand over time. This credential is **guaranteed to be issued to a single World ID per unique document**. In addition to ICAO-9303 compliant documents (such as passports or eIDs), the Japanese [My Number Card](https://en.wikipedia.org/wiki/My_Number_Card) (MNC) is also supported. The MNC flow uses different enrollment handling internally, but it issues the same credential. The World ID authenticator supports one NFC credential per user at a time. ## Use Cases -Use the NFC Credential when you need proof of a unique government document. This is useful for applications that need document-level Sybil resistance without requiring a proof of a unique human. +Use Proof of Attributes when you need proof of a unique government document. This is useful for applications that need document-level Sybil resistance without requiring a proof of a unique human. ## Credential Structure diff --git a/world-id/idkit/credentials.mdx b/world-id/idkit/credentials.mdx index b0501fe..623abb5 100644 --- a/world-id/idkit/credentials.mdx +++ b/world-id/idkit/credentials.mdx @@ -14,7 +14,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` | | Proof of Attributes (Passport) | The user holds a verified NFC passport credential. | `passport` | -| Proof of Presence (Selfie Check) | A medium-assurance biometric credential using the device camera for liveness and facial similarity. | `selfieCheck` | +| Proof of Presence | A medium-assurance biometric credential using the device camera for liveness and facial similarity. | `selfieCheck` | | Proof of Attributes (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`. @@ -70,9 +70,9 @@ const preset = proofOfHuman({ signal: "user-123" }); ## Proof of Attributes (Passport) -Use `passport` for the current World ID 4.0 Passport credential. The preset also includes legacy Document fallback for users without a World ID 4.0 proof. +Use the `passport` SDK preset to request Proof of Attributes backed by the current World ID 4.0 Passport credential. The preset also includes legacy Document fallback for users without a World ID 4.0 proof. - + ```typescript title="JavaScript" import { IDKit, passport } from "@worldcoin/idkit-core"; @@ -106,11 +106,13 @@ const preset = passport({ signal: "user-123" }); + -## Proof of Presence (Selfie Check) +## Proof of Presence -Use `selfieCheck()` with [session proofs](/world-id/idkit/session-proofs) to verify -users when they first arrive and when they return. Create a session once, save its +Request Proof of Presence with the `selfieCheck()` SDK preset and +[session proofs](/world-id/idkit/session-proofs) to verify users when they first +arrive and when they return. Create a session once, save its verified `session_id`, then prove that same session on later checks. Anyone with World ID App can complete the flow—no Orb or document credential is @@ -141,11 +143,11 @@ If you use `selfieCheckLegacy`, migrate to `selfieCheck` for World ID 4.0. ## Proof of Attributes (Identity Check, Preview) - Identity Check is currently in preview. To use it or learn more, contact us. + The `identityCheck` SDK preset for Proof of Attributes is currently in preview. To use it or learn more, contact us. -Identity Check lets your app ask the user to attest that document-backed attributes match your policy, without handling the underlying document data. Use it for eligibility checks such as minimum age, document type, issuing country, or nationality. Request attributes such as: +Use the `identityCheck` SDK preset for Proof of Attributes to ask the user to attest that document-backed attributes match your policy, without handling the underlying document data. Use it for eligibility checks such as minimum age, document type, issuing country, or nationality. Request attributes such as: | Attribute | Value type | | --- | --- | @@ -156,7 +158,7 @@ Identity Check lets your app ask the user to attest that document-backed attribu | `minimum_age` | `number` | | `nationality` | ISO 3166-1 alpha-3 country code | - + ```typescript title="JavaScript" import { IDKit, identityCheck } from "@worldcoin/idkit-core"; @@ -199,7 +201,7 @@ const preset = identityCheck({ ``` -Successful Identity Check responses include `identity_attested` so your backend can tell whether the requested attributes matched. +Successful `identityCheck` responses include `identity_attested` so your backend can tell whether the requested attributes matched. ## User presence and liveness @@ -268,7 +270,7 @@ These presets only return World ID 3.0 proofs. Use them for existing integration deviceLegacy - Deprecated. Keep deviceLegacy only for existing Device integrations. For new integrations, use Selfie Check. + Deprecated. Keep deviceLegacy only for existing Device integrations. For new integrations, use Proof of Presence. diff --git a/world-id/idkit/kotlin.mdx b/world-id/idkit/kotlin.mdx index bee812e..bc961e8 100644 --- a/world-id/idkit/kotlin.mdx +++ b/world-id/idkit/kotlin.mdx @@ -80,7 +80,7 @@ import com.worldcoin.idkit.orbLegacy val request = IDKit.request(config).preset(orbLegacy(signal = "user-123")) ``` -For a one-time Selfie Check, use `selfieCheck(signal)`. It requests World ID 4.0 and always +For a one-time Proof of Presence, use `selfieCheck(signal)`. It requests World ID 4.0 and always disables legacy fallback. See [Configure Credentials](/world-id/idkit/credentials#selfie-check) for response verification and repeated-check guidance. diff --git a/world-id/idkit/mini-apps.mdx b/world-id/idkit/mini-apps.mdx index b8166c3..7692675 100644 --- a/world-id/idkit/mini-apps.mdx +++ b/world-id/idkit/mini-apps.mdx @@ -6,7 +6,7 @@ title: "Mini Apps" {/* cspell:ignore idkit minikit rp_context app_id rp_id selfie sybil nullifier */} -IDKit is the verification layer for Mini Apps. MiniKit handles native Mini App commands such as wallet auth, payments, transactions, sharing, and permissions. World ID verification, including Selfie Check, is implemented with `@worldcoin/idkit`. +IDKit is the verification layer for Mini Apps. MiniKit handles native Mini App commands such as wallet auth, payments, transactions, sharing, and permissions. World ID verification, including Proof of Presence, is implemented with `@worldcoin/idkit`. Inside World App, IDKit uses the native World App transport — no QR code is shown. The same widget also works outside World App, where it falls back to the normal connect URL and QR experience. Your backend responsibilities do not change: sign each request server-side, verify the proof server-side, and store nullifiers for replay protection. @@ -40,7 +40,7 @@ The Mini-App-specific details: | Lower-friction liveness or bot deterrence | `selfieCheck` | | Passport-backed checks | `passport` | -For repeated Selfie Check verification of returning users, use +For repeated Proof of Presence verification of returning users, use [session proofs](/world-id/idkit/session-proofs) with the `selfieCheck()` preset. Check out this [page](/world-id/idkit/credentials) to learn about the different World ID credentials and which preset to use for each. diff --git a/world-id/idkit/session-proofs.mdx b/world-id/idkit/session-proofs.mdx index a8d9404..98b28a4 100644 --- a/world-id/idkit/session-proofs.mdx +++ b/world-id/idkit/session-proofs.mdx @@ -1,13 +1,13 @@ --- title: "Session proofs" -description: "Verify returning users with World ID, including repeated Selfie Check verification." +description: "Verify returning users with World ID, including repeated Proof of Presence verification." "og:image": "https://docs.world.org/images/docs/docs-meta.png" "twitter:image": "https://docs.world.org/images/docs/docs-meta.png" --- Use session proofs when the same user needs to verify again, such as when returning to your app or confirming a sensitive action. This is the recommended flow for -[Selfie Check](/world-id/credentials/11) integrations that need repeated verification. +[Proof of Presence](/world-id/credentials/11) integrations that need repeated verification. A uniqueness request allows each user to complete a particular action once. A session lets the user prove continuity across multiple checks: create it once, @@ -54,7 +54,7 @@ if (!completion.success) throw new Error(completion.error); // Save its session_id against the account only after verification succeeds. ``` -The `selfieCheck()` preset selects the Selfie Check credential. See +The `selfieCheck()` preset selects the Proof of Presence credential. See [Configure Credentials](/world-id/idkit/credentials) for credential options. Your backend must verify the complete result before saving its `session_id`. diff --git a/world-id/idkit/swift.mdx b/world-id/idkit/swift.mdx index 9053c1b..e79000c 100644 --- a/world-id/idkit/swift.mdx +++ b/world-id/idkit/swift.mdx @@ -57,7 +57,7 @@ let request = try IDKit.request(config: config).preset( ) ``` -For a one-time Selfie Check, use `selfieCheck(signal:)`. It requests World ID 4.0 and always +For a one-time Proof of Presence, use `selfieCheck(signal:)`. It requests World ID 4.0 and always disables legacy fallback. See [Configure Credentials](/world-id/idkit/credentials#selfie-check) for response verification and repeated-check guidance. diff --git a/world-id/sandbox/sandbox-access.mdx b/world-id/sandbox/sandbox-access.mdx index d7c3930..7ecb5d8 100644 --- a/world-id/sandbox/sandbox-access.mdx +++ b/world-id/sandbox/sandbox-access.mdx @@ -102,6 +102,6 @@ proof to your session over the bridge. ## Next step -Once you're installed and pointed at Sandbox, you're ready to run the Selfie Check -integration flows. See [Testing Selfie Check in Sandbox](/world-id/sandbox/testing-selfie-check) +Once you're installed and pointed at Sandbox, you're ready to run the Proof of Presence +integration flows. See [Testing Proof of Presence in Sandbox](/world-id/sandbox/testing-selfie-check) for coverage, critical user journeys, and known limitations. diff --git a/world-id/sandbox/testing-selfie-check.mdx b/world-id/sandbox/testing-selfie-check.mdx index c35ef71..4fdb1d6 100644 --- a/world-id/sandbox/testing-selfie-check.mdx +++ b/world-id/sandbox/testing-selfie-check.mdx @@ -1,13 +1,13 @@ --- -title: "Testing Selfie Check in Sandbox" -description: "Coverage, critical user journeys, and known limitations for testing your Selfie Check integration in Sandbox." +title: "Testing Proof of Presence in Sandbox" +description: "Coverage, critical user journeys, and known limitations for testing your Proof of Presence integration in Sandbox." "og:image": "https://raw.githubusercontent.com/worldcoin/developer-docs/main/images/docs/docs-meta.png" "twitter:image": "https://raw.githubusercontent.com/worldcoin/developer-docs/main/images/docs/docs-meta.png" --- {/* cspell:ignore idkit DoB reinstalls */} -Sandbox lets you run the full [Selfie Check](/world-id/credentials/11) relying-party +Sandbox lets you run the full [Proof of Presence](/world-id/credentials/11) relying-party journey end-to-end — from your surface, through IDKit, into the sandbox World ID app, and back — without touching production identities or real proofs. @@ -28,21 +28,21 @@ guide. Testing is organized by entry surface and user state, using the same [Hot, Cold, and Semi-cold states](/world-id/idkit/verification-flows) as the rest of World ID: -- **Hot** — the user already has World ID installed. If they're already Selfie Check - enrolled, they go straight to face match; if not, World ID walks them through - enrollment first, then match. (Selfie Check has no distinct Warm flow — enrollment +- **Hot** — the user already has World ID installed. If they've already enrolled + for Proof of Presence, they go straight to face match; if not, World ID walks them through + enrollment first, then match. (Proof of Presence has no distinct Warm flow — enrollment happens inline within Hot, same as [Verification Flows](/world-id/idkit/verification-flows) describes.) - **Cold** — a new user with no World ID app: the full funnel, including install, - account creation, date of birth, invite code (iOS), enrollment, and Selfie Check. + account creation, date of birth, invite code (iOS), enrollment, and Proof of Presence. - **Semi-cold** — an existing user without World ID on this device: reinstall and - account recovery, then Selfie Check. + account recovery, then Proof of Presence. | Entry surface | State | What it exercises | | --- | --- | --- | -| Native app | Hot | Same-device: validated user presents a face credential; deep link into World ID and back. | -| Native app | Cold | Install → create account → add date of birth → redeem invite code → enroll → complete Selfie Check. | -| Native app | Semi-cold | Existing user reinstalls and recovers their account on a fresh device, then completes Selfie Check. | +| Native app | Hot | Same-device: validated user presents a Proof of Presence credential; deep link into World ID and back. | +| Native app | Cold | Install → create account → add date of birth → redeem invite code → enroll → complete Proof of Presence. | +| Native app | Semi-cold | Existing user reinstalls and recovers their account on a fresh device, then completes Proof of Presence. | | Web app | Hot | Cross-device: start on web, complete on phone via QR scan, proof returns to the web session. | | Web app | Cold | Same cold funnel, cross-device via QR; proof returns to the originating web session. | | Web app | Semi-cold | Same semi-cold recovery, cross-device via QR. | diff --git a/world-id/yc.mdx b/world-id/yc.mdx index 743042d..5b22eef 100644 --- a/world-id/yc.mdx +++ b/world-id/yc.mdx @@ -21,7 +21,7 @@ World ID is a privacy-preserving trust layer for companies that need to know whe Require human presence when someone approves a payment, recovers an account, deploys software, or authorizes a high-risk transaction. - **Add Selfie Check** + **Add Proof of Presence** Distinguish people from agents, and make human approval an explicit boundary From edb7bdd7ebd1912b8e1685e93c4bcfc256c88c77 Mon Sep 17 00:00:00 2001 From: Takis Kakalis <80459599+Takaros999@users.noreply.github.com> Date: Mon, 5 Oct 2026 18:29:10 +0300 Subject: [PATCH 2/2] docs(world-id): preserve sdk offering names --- mini-apps/commands/verify.mdx | 2 +- openapi/developer-portal.json | 16 +++++----- snippets/idkit-response.mdx | 2 +- world-id/SKILL.md | 18 +++++------ world-id/credentials/11.mdx | 18 ++++++----- world-id/credentials/9303.mdx | 4 +-- world-id/idkit/credentials.mdx | 39 ++++++++++++----------- world-id/idkit/kotlin.mdx | 2 +- world-id/idkit/mini-apps.mdx | 4 +-- world-id/idkit/session-proofs.mdx | 6 ++-- world-id/idkit/swift.mdx | 2 +- world-id/sandbox/sandbox-access.mdx | 4 +-- world-id/sandbox/testing-selfie-check.mdx | 22 ++++++------- world-id/yc.mdx | 4 +-- 14 files changed, 73 insertions(+), 70 deletions(-) diff --git a/mini-apps/commands/verify.mdx b/mini-apps/commands/verify.mdx index f7397d4..f0a6032 100644 --- a/mini-apps/commands/verify.mdx +++ b/mini-apps/commands/verify.mdx @@ -7,4 +7,4 @@ description: "World ID verification has moved to IDKit." World ID has been unified into [IDKit](/world-id/idkit/mini-apps), so the same integration works in both mini apps and desktop. -If you are migrating from MiniKit 1.x, replace `MiniKit.verify(...)` or `MiniKit.commandsAsync.verify(...)` with IDKit. See [IDKit for Mini Apps](/world-id/idkit/mini-apps) for the Mini App integration shape, including Proof of Presence. +If you are migrating from MiniKit 1.x, replace `MiniKit.verify(...)` or `MiniKit.commandsAsync.verify(...)` with IDKit. See [IDKit for Mini Apps](/world-id/idkit/mini-apps) for the Mini App integration shape, including Selfie Check. diff --git a/openapi/developer-portal.json b/openapi/developer-portal.json index a1b0ae1..bc10a79 100644 --- a/openapi/developer-portal.json +++ b/openapi/developer-portal.json @@ -1152,7 +1152,7 @@ } }, "selfie_check_v4": { - "summary": "Proof of Presence", + "summary": "Selfie Check", "value": { "protocol_version": "4.0", "nonce": "0xabc123", @@ -1297,7 +1297,7 @@ "face", "selfie" ], - "description": "The legacy verification level. Use `selfie` for Proof of Presence. The historical `face` value remains accepted for backward compatibility and behaves the same as `selfie`." + "description": "The legacy verification level. Use `selfie` for Selfie Check. The historical `face` value remains accepted for backward compatibility and behaves the same as `selfie`." }, "action": { "type": "string", @@ -1674,7 +1674,7 @@ "IntegrityBundle": { "type": "object", "required": ["version", "signature_format", "timestamp", "signature", "jwt"], - "description": "World ID App integrity attestation. Proof of Presence responses with `issuer_schema_id: 11` require version 2, which covers the disclosed `sybil_score`.", + "description": "World ID App integrity attestation. Selfie Check responses with `issuer_schema_id: 11` require version 2, which covers the disclosed `sybil_score`.", "properties": { "version": { "type": "integer", @@ -1792,7 +1792,7 @@ "default": "production" }, "integrity_bundle": { - "description": "Required with version 2 when any response item is a Proof of Presence credential (`issuer_schema_id: 11`).", + "description": "Required with version 2 when any response item is a Selfie Check credential (`issuer_schema_id: 11`).", "allOf": [ { "$ref": "#/components/schemas/IntegrityBundle" @@ -1836,7 +1836,7 @@ "default": "production" }, "integrity_bundle": { - "description": "Required with version 2 when any response item is a Proof of Presence credential (`issuer_schema_id: 11`).", + "description": "Required with version 2 when any response item is a Selfie Check credential (`issuer_schema_id: 11`).", "allOf": [ { "$ref": "#/components/schemas/IntegrityBundle" @@ -1862,7 +1862,7 @@ "properties": { "identifier": { "type": "string", - "description": "Credential identifier returned by IDKit (for example, `orb` or `selfie`). Use `selfie` for Proof of Presence; the historical `face` value remains accepted as a backward-compatible alias." + "description": "Credential identifier returned by IDKit (for example, `orb` or `selfie`). Use `selfie` for Selfie Check; the historical `face` value remains accepted as a backward-compatible alias." }, "signal_hash": { "type": "string", @@ -1922,7 +1922,7 @@ "sybil_score": { "type": "integer", "minimum": 0, - "description": "Versioned Proof of Presence risk signal represented as an integer. Required only when `issuer_schema_id` is 11." + "description": "Versioned Selfie Check risk signal represented as an integer. Required only when `issuer_schema_id` is 11." } } }, @@ -1969,7 +1969,7 @@ "sybil_score": { "type": "integer", "minimum": 0, - "description": "Versioned Proof of Presence risk signal represented as an integer. Required only when `issuer_schema_id` is 11." + "description": "Versioned Selfie Check risk signal represented as an integer. Required only when `issuer_schema_id` is 11." } } }, diff --git a/snippets/idkit-response.mdx b/snippets/idkit-response.mdx index 0998c63..1fc4feb 100644 --- a/snippets/idkit-response.mdx +++ b/snippets/idkit-response.mdx @@ -36,7 +36,7 @@ } ``` -```json title="Proof of Presence" +```json title="Selfie Check" { "protocol_version": "4.0", "nonce": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", diff --git a/world-id/SKILL.md b/world-id/SKILL.md index 75ded03..9004997 100644 --- a/world-id/SKILL.md +++ b/world-id/SKILL.md @@ -1,7 +1,7 @@ --- name: world-id-integration description: | - Use this skill when adding, upgrading, debugging, or testing World ID verification with IDKit in a new or existing web or mobile app. Covers Proof of Human, Proof of Attributes (passport/document), Proof of Presence, and session/sign-in flows; Developer Portal app, RP, and action setup; server-side signing and proof verification; environment matching; nullifier replay protection; and launch testing. Trigger when the user asks to add World ID, verify humans, stop bots or multi-accounting, add Sybil resistance, or mentions IDKit, Orb, World ID proof flows, World App proof flows, @worldcoin/idkit, signing keys, rp_id, or app_id. + Use this skill when adding, upgrading, debugging, or testing World ID verification with IDKit in a new or existing web or mobile app. Covers Proof of Human, passport/document, Selfie Check, and session/sign-in flows; Developer Portal app, RP, and action setup; server-side signing and proof verification; environment matching; nullifier replay protection; and launch testing. Trigger when the user asks to add World ID, verify humans, stop bots or multi-accounting, add Sybil resistance, or mentions IDKit, Orb, World ID proof flows, World App proof flows, @worldcoin/idkit, signing keys, rp_id, or app_id. version: 0.1.0 metadata: author: worldcoin @@ -98,25 +98,25 @@ The credential decides what the user proves. Nail this down before scaffolding | Preset | What it proves | Use it for | |---|---|---| | **`proofOfHuman`** — Proof of Human (flagship) | The user is a unique person, biometrically verified at an Orb | Sybil resistance, airdrops, one-vote-per-human, gated signups. **The default if the user said "proof of human" or "verify a real human."** | -| **`passport`** — Proof of Attributes (Passport) | The user holds a valid government passport (NFC-verified) | Higher-assurance flows where you need document-grade identity (regulated apps, age-gating, KYC-adjacent). | -| **`selfieCheck`** — Proof of Presence | A liveness and facial-similarity credential backed by a World ID 4.0 proof | Medium-assurance friction and bot deterrence without the full Orb requirement. Returns a verified `sybil_score` risk signal. | +| **`passport`** — Passport | The user holds a valid government passport (NFC-verified) | Higher-assurance flows where you need document-grade identity (regulated apps, age-gating, KYC-adjacent). | +| **`selfieCheck`** — Selfie Check | A liveness and facial-similarity credential backed by a World ID 4.0 proof | Medium-assurance friction and bot deterrence without the full Orb requirement. Returns a verified `sybil_score` risk signal. | **DO NOT default to `proofOfHuman` if the user said "passport" or "verify their ID"** — that's `passport`. **DO NOT default to `proofOfHuman` if the user said "selfie" or "liveness"** — that's `selfieCheck`. When in doubt, ask one question. Other legacy presets exist (`documentLegacy`, `deviceLegacy`); reach for them only when the user asks specifically. For sign-in / session reuse across visits, use the v4 **session** flow (see `/world-id/idkit/session-proofs`). -### Proof of Attributes (NFC) constraints +### NFC Credential constraints -A user can have only one NFC credential for [Proof of Attributes](https://docs.world.org/world-id/credentials/9303) attached to their Authenticator at a time. A passport, MNC, and eID are NFC Credential types and must be treated as alternatives when composing constraints with `any()`, `all()`, or `enumerate()`. Do not require multiple NFC Credentials—for example, `all(passport(), mnc())` cannot be satisfied, and `enumerate()` must not create combinations that require more than one NFC Credential. +A user can have only one [NFC Credential](https://docs.world.org/world-id/credentials/9303) attached to their Authenticator at a time. A passport, MNC, and eID are NFC Credential types and must be treated as alternatives when composing constraints with `any()`, `all()`, or `enumerate()`. Do not require multiple NFC Credentials—for example, `all(passport(), mnc())` cannot be satisfied, and `enumerate()` must not create combinations that require more than one NFC Credential. -### Proof of Presence +### Selfie Check -For repeated Proof of Presence verification, use `IDKit.createSession` followed by +For repeated Selfie Check verification, use `IDKit.createSession` followed by `IDKit.proveSession` with `.preset(selfieCheck())`. Save the verified `session_id` against the application account and require that same session on later checks; enforce per-proof replay protection. -For a one-time uniqueness check, use the `selfieCheck` preset. Each Proof of Presence +For a one-time uniqueness check, use the `selfieCheck` preset. Each Selfie Check response includes a required integer `sybil_score`; forward the complete IDKit result unchanged so the Developer Portal can verify the proof and version 2 integrity signature before the app uses the score. @@ -151,7 +151,7 @@ per-proof replay protection. Test both creation and proving the saved session. 2. **Create or reuse the Portal resources.** Use the MCP when available. Reuse an existing app, RP, and action when they match the requested integration. For a new RP, capture `app_id`, `rp_id`, and `signing_key.private_key` from `configure_world_id`, create the action in the intended environment, and write the signing key to the prepared server-only secret store in the same step. The portal returns it exactly once. **Do not print, log, or return the private key to chat.** If the key is lost, explain that `get_world_id_signing_key` cannot recover it; rotation creates a new key and invalidates the old signer. 3. **Generate the RP signature in your backend.** *Why backend?* The signing key authenticates your app to the protocol. Leaking it lets anyone impersonate your app and forge proof requests. **CRITICAL: never sign on the client. Never expose `RP_SIGNING_KEY` as a `NEXT_PUBLIC_*` var. Never log it.** 4. **Open the IDKit widget on the client** with the signature your backend returned. The widget hands off to World ID, which produces a zero-knowledge proof. -5. **Verify the proof in your backend** by POSTing it **as-is** to `https://developer.world.org/api/v4/verify/{rp_id}`. *Why backend?* A client can return any JSON it wants. Only the World verifier — called from a trusted server — confirms the proof is real and tied to a unique credential. Verifying client-side defeats the entire point. **DO NOT mutate, re-encode, or trim the proof JSON before forwarding** — pass exactly what IDKit returned. For Proof of Presence, IDKit returns `responses[].identifier: "selfie"`. Do not turn it into a hand-built `verification_level`; `face` is only a backward-compatible alias for legacy integrations. +5. **Verify the proof in your backend** by POSTing it **as-is** to `https://developer.world.org/api/v4/verify/{rp_id}`. *Why backend?* A client can return any JSON it wants. Only the World verifier — called from a trusted server — confirms the proof is real and tied to a unique credential. Verifying client-side defeats the entire point. **DO NOT mutate, re-encode, or trim the proof JSON before forwarding** — pass exactly what IDKit returned. For Selfie Check, IDKit returns `responses[].identifier: "selfie"`. Do not turn it into a hand-built `verification_level`; `face` is only a backward-compatible alias for legacy integrations. 6. **Store the nullifier.** Every successful proof returns a `nullifier` — an RP-scoped, action-scoped, non-reversible identifier for that user. *Why store it?* Without uniqueness storage, a user can verify the same proof twice and double-claim a reward, vote, etc. Persist `(action, nullifier)` with a `UNIQUE` constraint and reject duplicates on insert. Column type: **`NUMERIC(78, 0)`** (256-bit field elements). The nullifier reveals nothing about the user — safe to store, but it's the *only* anti-replay mechanism, so it's required. ## Phase 5 — Match environments end-to-end diff --git a/world-id/credentials/11.mdx b/world-id/credentials/11.mdx index 07e061a..06b8b7a 100644 --- a/world-id/credentials/11.mdx +++ b/world-id/credentials/11.mdx @@ -42,7 +42,9 @@ import { CredentialHero } from "/snippets/credential-hero.jsx"; ## Introduction -Proof of Presence (previously Selfie Check) uses the user's mobile device camera for liveness and facial +Proof of Presence is the credential used by Selfie Check in IDKit. + +Selfie Check uses the user's mobile device camera for liveness and facial similarity checks. It adds friction against automated and repeated account creation without requiring a Proof of Human. Unlike high-assurance Orb verification, Proof of Presence does not provide a strict one-person-one-account guarantee and is @@ -62,7 +64,7 @@ other prerequisite credential is required. ## Uniqueness Risk Signal -Each Proof of Presence response includes a versioned `sybil_score` that +Each Selfie Check response includes a versioned `sybil_score` that can help an app assess the risk of repeated enrollment. It is a risk signal, not a uniqueness verdict, and should be considered alongside other evidence. The response also includes an `integrity_bundle` that lets the Developer Portal @@ -108,7 +110,7 @@ These standard-deviation bands should not be read as normal-distribution confide ## Choose your integration -Use **session proofs** if users need to complete Proof of Presence more than once—for +Use **session proofs** if users need to complete Selfie Check more than once—for example, when returning to your app or confirming a sensitive action. Create a session on their first successful verification, then prove that same session on subsequent checks. @@ -124,15 +126,15 @@ guarantee. ## How it works -Use the `selfieCheck` preset in IDKit to integrate Proof of Presence into your application. +Use the Selfie Check (`selfieCheck`) preset in IDKit to request this credential. See [Configure Credentials](/world-id/idkit/credentials#selfie-check) for the SDK integration. -* **On mobile (iOS/Android):** Use IDKit to generate a deep link and attach it to a "Verify" CTA. When the user taps it, they are redirected to World ID App to complete Proof of Presence. -* **On desktop:** Use IDKit to generate a QR code and display it to the user. When the user scans it with their mobile device camera, World ID App launches and guides them through Proof of Presence. +* **On mobile (iOS/Android):** Use IDKit to generate a deep link and attach it to a "Verify" CTA. When the user taps it, they are redirected to World ID App to complete Selfie Check. +* **On desktop:** Use IDKit to generate a QR code and display it to the user. When the user scans it with their mobile device camera, World ID App launches and guides them through Selfie Check. ## User Experience Flow 1. **Challenge:** The user initiates the flow on your app (Relying Party). -2. **Hand-off:** The user is redirected to World ID App. If they don't have World ID App installed, they are guided to download it and go straight into the Proof of Presence experience. +2. **Hand-off:** The user is redirected to World ID App. If they don't have World ID App installed, they are guided to download it and go straight into the Selfie Check experience. 3. **Enrollment/Auth:** * **New User:** Enrolls with a selfie and liveness check. * **Returning User:** Completes a short camera check to verify continuity. @@ -142,5 +144,5 @@ Use the `selfieCheck` preset in IDKit to integrate Proof of Presence into your a See [Integrate IDKit](/world-id/idkit/integrate) for the complete integration flow. -Testing your integration? See [Testing Proof of Presence in Sandbox](/world-id/sandbox/testing-selfie-check) +Testing your integration? See [Testing Selfie Check in Sandbox](/world-id/sandbox/testing-selfie-check) for coverage, critical user journeys, and known limitations. diff --git a/world-id/credentials/9303.mdx b/world-id/credentials/9303.mdx index 7f8ed49..f35b838 100644 --- a/world-id/credentials/9303.mdx +++ b/world-id/credentials/9303.mdx @@ -51,13 +51,13 @@ import { CredentialHero } from "/snippets/credential-hero.jsx"; ## Introduction -Proof of Attributes is a document-backed credential, also called the NFC Credential in technical references. It represents a unique government-issued document. It supports passports and eIDs. Availability varies by country and continues to expand over time. This credential is **guaranteed to be issued to a single World ID per unique document**. In addition to ICAO-9303 compliant documents (such as passports or eIDs), the Japanese [My Number Card](https://en.wikipedia.org/wiki/My_Number_Card) (MNC) is also supported. The MNC flow uses different enrollment handling internally, but it issues the same credential. +This NFC Credential is displayed as Proof of Attributes. It represents a unique government-issued document. It supports passports and eIDs. Availability varies by country and continues to expand over time. An NFC Credential is **guaranteed to be issued to a single World ID per unique document**. In addition to ICAO-9303 compliant documents (such as passports or eIDs), the Japanese [My Number Card](https://en.wikipedia.org/wiki/My_Number_Card) (MNC) is also supported. The MNC flow uses different enrollment handling internally, but it issues the same credential. The World ID authenticator supports one NFC credential per user at a time. ## Use Cases -Use Proof of Attributes when you need proof of a unique government document. This is useful for applications that need document-level Sybil resistance without requiring a proof of a unique human. +Use the NFC Credential when you need proof of a unique government document. This is useful for applications that need document-level Sybil resistance without requiring a proof of a unique human. ## Credential Structure diff --git a/world-id/idkit/credentials.mdx b/world-id/idkit/credentials.mdx index 623abb5..8784565 100644 --- a/world-id/idkit/credentials.mdx +++ b/world-id/idkit/credentials.mdx @@ -13,12 +13,14 @@ A [Credential](https://docs.rs/world-id-primitives/latest/world_id_primitives/cr | Offering | What it proves | Common SDK path | | --- | --- | --- | | Proof of Human | The user is a unique human, backed by anonymous biometric verification by the Orb. | `proofOfHuman` | -| Proof of Attributes (Passport) | The user holds a verified NFC passport credential. | `passport` | -| Proof of Presence | A medium-assurance biometric credential using the device camera for liveness and facial similarity. | `selfieCheck` | -| Proof of Attributes (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`. | +| Passport | The user holds a verified NFC passport credential. | `passport` | +| Selfie Check | A medium-assurance biometric credential using the device camera for liveness and facial similarity. | `selfieCheck` | +| 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`. +Credential cards use marketing labels such as Proof of Attributes and Proof of Presence. SDK presets retain their own names and behaviors; choose the preset that matches your integration. + If you have an existing legacy integration, see the [World ID 4.0 migration guide](/world-id/4-0-migration). @@ -66,13 +68,13 @@ const preset = proofOfHuman({ signal: "user-123" }); ``` - + -## Proof of Attributes (Passport) +## Passport -Use the `passport` SDK preset to request Proof of Attributes backed by the current World ID 4.0 Passport credential. The preset also includes legacy Document fallback for users without a World ID 4.0 proof. +Use `passport` for the current World ID 4.0 Passport credential. The preset also includes legacy Document fallback for users without a World ID 4.0 proof. - + ```typescript title="JavaScript" import { IDKit, passport } from "@worldcoin/idkit-core"; @@ -105,14 +107,13 @@ const preset = passport({ signal: "user-123" }); ``` - + -## Proof of Presence +## Selfie Check -Request Proof of Presence with the `selfieCheck()` SDK preset and -[session proofs](/world-id/idkit/session-proofs) to verify users when they first -arrive and when they return. Create a session once, save its +Use `selfieCheck()` with [session proofs](/world-id/idkit/session-proofs) to verify +users when they first arrive and when they return. Create a session once, save its verified `session_id`, then prove that same session on later checks. Anyone with World ID App can complete the flow—no Orb or document credential is @@ -138,16 +139,16 @@ see the [integration guide](/world-id/idkit/integrate). If you use `selfieCheckLegacy`, migrate to `selfieCheck` for World ID 4.0. - + -## Proof of Attributes (Identity Check, Preview) +## Identity Check (Preview) - The `identityCheck` SDK preset for Proof of Attributes is currently in preview. To use it or learn more, contact us. + Identity Check is currently in preview. To use it or learn more, contact us. -Use the `identityCheck` SDK preset for Proof of Attributes to ask the user to attest that document-backed attributes match your policy, without handling the underlying document data. Use it for eligibility checks such as minimum age, document type, issuing country, or nationality. Request attributes such as: +Identity Check lets your app ask the user to attest that document-backed attributes match your policy, without handling the underlying document data. Use it for eligibility checks such as minimum age, document type, issuing country, or nationality. Request attributes such as: | Attribute | Value type | | --- | --- | @@ -158,7 +159,7 @@ Use the `identityCheck` SDK preset for Proof of Attributes to ask the user to at | `minimum_age` | `number` | | `nationality` | ISO 3166-1 alpha-3 country code | - + ```typescript title="JavaScript" import { IDKit, identityCheck } from "@worldcoin/idkit-core"; @@ -201,7 +202,7 @@ const preset = identityCheck({ ``` -Successful `identityCheck` responses include `identity_attested` so your backend can tell whether the requested attributes matched. +Successful Identity Check responses include `identity_attested` so your backend can tell whether the requested attributes matched. ## User presence and liveness @@ -270,7 +271,7 @@ These presets only return World ID 3.0 proofs. Use them for existing integration deviceLegacy - Deprecated. Keep deviceLegacy only for existing Device integrations. For new integrations, use Proof of Presence. + Deprecated. Keep deviceLegacy only for existing Device integrations. For new integrations, use Selfie Check. diff --git a/world-id/idkit/kotlin.mdx b/world-id/idkit/kotlin.mdx index bc961e8..bee812e 100644 --- a/world-id/idkit/kotlin.mdx +++ b/world-id/idkit/kotlin.mdx @@ -80,7 +80,7 @@ import com.worldcoin.idkit.orbLegacy val request = IDKit.request(config).preset(orbLegacy(signal = "user-123")) ``` -For a one-time Proof of Presence, use `selfieCheck(signal)`. It requests World ID 4.0 and always +For a one-time Selfie Check, use `selfieCheck(signal)`. It requests World ID 4.0 and always disables legacy fallback. See [Configure Credentials](/world-id/idkit/credentials#selfie-check) for response verification and repeated-check guidance. diff --git a/world-id/idkit/mini-apps.mdx b/world-id/idkit/mini-apps.mdx index 7692675..b8166c3 100644 --- a/world-id/idkit/mini-apps.mdx +++ b/world-id/idkit/mini-apps.mdx @@ -6,7 +6,7 @@ title: "Mini Apps" {/* cspell:ignore idkit minikit rp_context app_id rp_id selfie sybil nullifier */} -IDKit is the verification layer for Mini Apps. MiniKit handles native Mini App commands such as wallet auth, payments, transactions, sharing, and permissions. World ID verification, including Proof of Presence, is implemented with `@worldcoin/idkit`. +IDKit is the verification layer for Mini Apps. MiniKit handles native Mini App commands such as wallet auth, payments, transactions, sharing, and permissions. World ID verification, including Selfie Check, is implemented with `@worldcoin/idkit`. Inside World App, IDKit uses the native World App transport — no QR code is shown. The same widget also works outside World App, where it falls back to the normal connect URL and QR experience. Your backend responsibilities do not change: sign each request server-side, verify the proof server-side, and store nullifiers for replay protection. @@ -40,7 +40,7 @@ The Mini-App-specific details: | Lower-friction liveness or bot deterrence | `selfieCheck` | | Passport-backed checks | `passport` | -For repeated Proof of Presence verification of returning users, use +For repeated Selfie Check verification of returning users, use [session proofs](/world-id/idkit/session-proofs) with the `selfieCheck()` preset. Check out this [page](/world-id/idkit/credentials) to learn about the different World ID credentials and which preset to use for each. diff --git a/world-id/idkit/session-proofs.mdx b/world-id/idkit/session-proofs.mdx index 98b28a4..a8d9404 100644 --- a/world-id/idkit/session-proofs.mdx +++ b/world-id/idkit/session-proofs.mdx @@ -1,13 +1,13 @@ --- title: "Session proofs" -description: "Verify returning users with World ID, including repeated Proof of Presence verification." +description: "Verify returning users with World ID, including repeated Selfie Check verification." "og:image": "https://docs.world.org/images/docs/docs-meta.png" "twitter:image": "https://docs.world.org/images/docs/docs-meta.png" --- Use session proofs when the same user needs to verify again, such as when returning to your app or confirming a sensitive action. This is the recommended flow for -[Proof of Presence](/world-id/credentials/11) integrations that need repeated verification. +[Selfie Check](/world-id/credentials/11) integrations that need repeated verification. A uniqueness request allows each user to complete a particular action once. A session lets the user prove continuity across multiple checks: create it once, @@ -54,7 +54,7 @@ if (!completion.success) throw new Error(completion.error); // Save its session_id against the account only after verification succeeds. ``` -The `selfieCheck()` preset selects the Proof of Presence credential. See +The `selfieCheck()` preset selects the Selfie Check credential. See [Configure Credentials](/world-id/idkit/credentials) for credential options. Your backend must verify the complete result before saving its `session_id`. diff --git a/world-id/idkit/swift.mdx b/world-id/idkit/swift.mdx index e79000c..9053c1b 100644 --- a/world-id/idkit/swift.mdx +++ b/world-id/idkit/swift.mdx @@ -57,7 +57,7 @@ let request = try IDKit.request(config: config).preset( ) ``` -For a one-time Proof of Presence, use `selfieCheck(signal:)`. It requests World ID 4.0 and always +For a one-time Selfie Check, use `selfieCheck(signal:)`. It requests World ID 4.0 and always disables legacy fallback. See [Configure Credentials](/world-id/idkit/credentials#selfie-check) for response verification and repeated-check guidance. diff --git a/world-id/sandbox/sandbox-access.mdx b/world-id/sandbox/sandbox-access.mdx index 7ecb5d8..d7c3930 100644 --- a/world-id/sandbox/sandbox-access.mdx +++ b/world-id/sandbox/sandbox-access.mdx @@ -102,6 +102,6 @@ proof to your session over the bridge. ## Next step -Once you're installed and pointed at Sandbox, you're ready to run the Proof of Presence -integration flows. See [Testing Proof of Presence in Sandbox](/world-id/sandbox/testing-selfie-check) +Once you're installed and pointed at Sandbox, you're ready to run the Selfie Check +integration flows. See [Testing Selfie Check in Sandbox](/world-id/sandbox/testing-selfie-check) for coverage, critical user journeys, and known limitations. diff --git a/world-id/sandbox/testing-selfie-check.mdx b/world-id/sandbox/testing-selfie-check.mdx index 4fdb1d6..c35ef71 100644 --- a/world-id/sandbox/testing-selfie-check.mdx +++ b/world-id/sandbox/testing-selfie-check.mdx @@ -1,13 +1,13 @@ --- -title: "Testing Proof of Presence in Sandbox" -description: "Coverage, critical user journeys, and known limitations for testing your Proof of Presence integration in Sandbox." +title: "Testing Selfie Check in Sandbox" +description: "Coverage, critical user journeys, and known limitations for testing your Selfie Check integration in Sandbox." "og:image": "https://raw.githubusercontent.com/worldcoin/developer-docs/main/images/docs/docs-meta.png" "twitter:image": "https://raw.githubusercontent.com/worldcoin/developer-docs/main/images/docs/docs-meta.png" --- {/* cspell:ignore idkit DoB reinstalls */} -Sandbox lets you run the full [Proof of Presence](/world-id/credentials/11) relying-party +Sandbox lets you run the full [Selfie Check](/world-id/credentials/11) relying-party journey end-to-end — from your surface, through IDKit, into the sandbox World ID app, and back — without touching production identities or real proofs. @@ -28,21 +28,21 @@ guide. Testing is organized by entry surface and user state, using the same [Hot, Cold, and Semi-cold states](/world-id/idkit/verification-flows) as the rest of World ID: -- **Hot** — the user already has World ID installed. If they've already enrolled - for Proof of Presence, they go straight to face match; if not, World ID walks them through - enrollment first, then match. (Proof of Presence has no distinct Warm flow — enrollment +- **Hot** — the user already has World ID installed. If they're already Selfie Check + enrolled, they go straight to face match; if not, World ID walks them through + enrollment first, then match. (Selfie Check has no distinct Warm flow — enrollment happens inline within Hot, same as [Verification Flows](/world-id/idkit/verification-flows) describes.) - **Cold** — a new user with no World ID app: the full funnel, including install, - account creation, date of birth, invite code (iOS), enrollment, and Proof of Presence. + account creation, date of birth, invite code (iOS), enrollment, and Selfie Check. - **Semi-cold** — an existing user without World ID on this device: reinstall and - account recovery, then Proof of Presence. + account recovery, then Selfie Check. | Entry surface | State | What it exercises | | --- | --- | --- | -| Native app | Hot | Same-device: validated user presents a Proof of Presence credential; deep link into World ID and back. | -| Native app | Cold | Install → create account → add date of birth → redeem invite code → enroll → complete Proof of Presence. | -| Native app | Semi-cold | Existing user reinstalls and recovers their account on a fresh device, then completes Proof of Presence. | +| Native app | Hot | Same-device: validated user presents a face credential; deep link into World ID and back. | +| Native app | Cold | Install → create account → add date of birth → redeem invite code → enroll → complete Selfie Check. | +| Native app | Semi-cold | Existing user reinstalls and recovers their account on a fresh device, then completes Selfie Check. | | Web app | Hot | Cross-device: start on web, complete on phone via QR scan, proof returns to the web session. | | Web app | Cold | Same cold funnel, cross-device via QR; proof returns to the originating web session. | | Web app | Semi-cold | Same semi-cold recovery, cross-device via QR. | diff --git a/world-id/yc.mdx b/world-id/yc.mdx index 5b22eef..743042d 100644 --- a/world-id/yc.mdx +++ b/world-id/yc.mdx @@ -21,7 +21,7 @@ World ID is a privacy-preserving trust layer for companies that need to know whe Require human presence when someone approves a payment, recovers an account, deploys software, or authorizes a high-risk transaction. - **Add Proof of Presence** + **Add Selfie Check** Distinguish people from agents, and make human approval an explicit boundary