Skip to main content
The Kotlin SDK is currently under active development. Expect minor API evolution while the SDK hardens.

Install

The package is published as com.worldcoin:idkit to GitHub Packages.
dependencyResolutionManagement {
    repositories {
        mavenCentral()
        maven {
            url = uri("https://maven.pkg.github.com/worldcoin/idkit")
            credentials {
                username = System.getenv("GITHUB_ACTOR")
                password = System.getenv("GITHUB_TOKEN") // requires read:packages
            }
        }
    }
}

dependencies {
    implementation("com.worldcoin:idkit:<version>")
}

Request flow

import com.worldcoin.idkit.IDKit
import com.worldcoin.idkit.IDKitPollOptions
import com.worldcoin.idkit.IDKitCompletionResult
import com.worldcoin.idkit.orbLegacy
import uniffi.idkit_core.Environment
import uniffi.idkit_core.RpContext

val rpContext = RpContext(
  rpId = "rp_xxxxx",
  nonce = backend.nonce,
  createdAt = backend.createdAt.toULong(),
  expiresAt = backend.expiresAt.toULong(),
  signature = backend.sig,
)

val config = IDKitRequestConfig(
  appId = "app_xxxxx",
  action = "my-action",
  rpContext = rpContext,
  actionDescription = "Verify user",
  bridgeUrl = null,
  allowLegacyProofs = true,
  overrideConnectBaseUrl = null,
  environment = Environment.PRODUCTION,
)

val request = IDKit.request(config).preset(orbLegacy(signal = "user-123"))
val connectorURI = request.connectorURI
val completion = request.pollUntilCompletion(
  options = IDKitPollOptions(pollIntervalMs = 2_000u, timeoutMs = 120_000u)
)

if (completion is IDKitCompletionResult.Success) {
  val result = completion.result
}

Presets

import com.worldcoin.idkit.IDKit
import com.worldcoin.idkit.orbLegacy

val request = IDKit.request(config).preset(orbLegacy(signal = "user-123"))

Polling patterns

  • pollStatusOnce() for manual loops
  • pollUntilCompletion(options) for blocking until terminal state
  • statusFlow(pollInterval) extension for coroutine-driven updates
import com.worldcoin.idkit.IDKitStatus
import com.worldcoin.idkit.statusFlow
import kotlinx.coroutines.flow.collectLatest
import kotlin.time.Duration.Companion.seconds

request.statusFlow(2.seconds).collectLatest { status ->
  when (status) {
    IDKitStatus.WaitingForConnection -> Unit
    IDKitStatus.AwaitingConfirmation -> Unit
    is IDKitStatus.Confirmed -> println(status.result)
    is IDKitStatus.Failed -> println(status.error)
  }
}