Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.world.org/llms.txt

Use this file to discover all available pages before exploring further.

Use IDKit for native iOS/macOS integrations backed by the same Rust core as other SDKs.

Requirements

  • iOS 15+ / macOS 12+
  • Xcode 16+

Install

Use Swift Package Manager with the published idkit-swift repository:
.package(url: "https://github.com/worldcoin/idkit-swift.git", from: "<version>")

Request flow

import IDKit

let rpContext = try RpContext(
  rpId: "rp_xxxxx",
  nonce: backend.nonce,
  createdAt: backend.createdAt,
  expiresAt: backend.expiresAt,
  signature: backend.sig
)

let config = IDKitRequestConfig(
  appId: "app_xxxxx",
  action: "my-action",
  rpContext: rpContext,
  allowLegacyProofs: true,
  returnTo: "myapp://verify-done", // Optional: mobile deep-link callback URL
  environment: .production
)

let request = try IDKit.request(config: config).preset(orbLegacy(signal: "user-123"))
let connectURL = request.connectorURL
let requestID = request.requestID

Presets

import IDKit

let request = try IDKit.request(config: config).preset(
  orbLegacy(signal: "user-123")
)

Polling API

  • pollStatusOnce() async -> IDKitStatus
  • pollUntilCompletion(options:) async -> IDKitCompletionResult
  • IDKitPollOptions(pollIntervalMs:timeoutMs:)
let completion = await request.pollUntilCompletion(
  options: IDKitPollOptions(pollIntervalMs: 2_000, timeoutMs: 120_000)
)

switch completion {
case .success(let result):
  print(result)
case .failure(let error):
  print(error)
}

Invite-code mode

Use presetWithInviteCode(_:) on the builder to return an IDKitInviteCodeRequest instead of IDKitRequest. The polling surface is identical. See Invite-code mode for when to use it.
let request = try IDKit.request(config: config)
  .presetWithInviteCode(selfieCheckLegacy(signal: "user-123"))

let connectorURL = request.connectorURL  // URL with &c=<code>&a=<app_id>
let expiresAt = request.expiresAt        // Date
let completion = await request.pollUntilCompletion()

Migrating from QR / connect-URL

// Before — QR / connect-URL flow
let request = try IDKit.request(config: config)
  .preset(orbLegacy(signal: "user-123"))

let connectURL = request.connectorURL        // render as QR
let completion = await request.pollUntilCompletion()
// After — invite-code mode
let request = try IDKit.request(config: config)
  .presetWithInviteCode(selfieCheckLegacy(signal: "user-123"))

let connectorURL = request.connectorURL      // display to user (URL with code embedded)
let expiresAt = request.expiresAt            // drive a countdown
let completion = await request.pollUntilCompletion()
The config object is unchanged. The connectorURL now includes &c=<code>&a=<app_id> params; use it alongside expiresAt in your UI. Polling, proof verification, and nullifier storage stay the same. IDKitInviteCodeRequest exposes:
  • connectorURL: URL
  • expiresAt: Date
  • requestID: String
  • pollStatusOnce() async -> IDKitStatus
  • pollUntilCompletion(options:) async -> IDKitCompletionResult