Launch on 01/01/2027Licenses available from 01/01/2027
PreviewThis page documents the release that launches on 01/01/2027. Packages, images and sign-up open then, and details may change before it.
Docs / Get started / Your first ceremony

Your first ceremony

Ready
TL;DR

Drive the whole ceremony from your own backend in about thirty lines: create an opaque user, issue a challenge over an exact action, await the signed result on a stream, and verify it. The same four moves you ran from the CLI in the Quickstart — now in your code.

Who this is for: a backend engineer wiring Ydentifi into a server. You will finish with the full create→challenge→await→verify path in your language of choice. Every call is server-to-server over mutual TLS; the client certificate identifies your relying party, so you never send who-you-are in a body.

Before you start
  • A running deployment — the local one from the Quickstart is perfect.
  • An SDK for your language (or call the gRPC API directly), and your relying-party mTLS client certificate.
  • At least one enrolled device for the user — ydfi seed demo prints QR codes you can scan.

The four moves, in code#

Every call maps onto one move of the ceremony. Read these four, then copy the complete program below.

1
Create — CreateUser

Mint an opaque identity for the user. The request is empty; your mTLS certificate says which RP you are.

2
Challenge — IssueAuthChallenge

Ask for proof over the exact action, at the tier you require. You get back a challenge_id and a QR-encodable URL.

3
Await — AwaitChallenge

Block until the challenge reaches a terminal state — the SDK holds the stream open for you and returns the deployment-verified verdict. No polling, no webhooks.

4
Verify

On APPROVED, verify the device’s signature over the canonical payload, then let the action proceed. The decision stays yours.

⚠ Critical gotcha

Create one opaque user per real individual and keep that mapping for their lifetime. Minting a second identity for the same person fragments their devices and history across unrelated tokens and silently weakens every guarantee — de-duplicate on your side before calling CreateUser. See CreateUser in the API reference.

The whole ceremony#

End to end, in your language — each snippet’s first line shows how to install that SDK, once the packages are published at launch. Pick a tab:

// install:  go get github.com/ydentifi/go

// 0. Connect over mutual TLS — your client cert identifies your RP.
client, err := ydentifi.New(
    ydentifi.WithServerAddr("ydentifi.acme.internal:443"),
    ydentifi.WithCertFiles("rp.crt", "rp.key"), // your RP client cert
    ydentifi.WithCAFile("ca.crt"),              // your deployment root CA
)
if err != nil { /* handle */ }
defer client.Close()

// 1. Create an opaque user. Do this ONCE per real person and keep the
//    opaque_id -> person mapping on your side (see the gotcha below).
opaqueID, err := client.CreateUser(ctx)
if err != nil { /* handle */ }

// 2. Issue a challenge over the EXACT action, at the tier you require.
ch, err := client.IssueAuthChallenge(ctx, ydentifi.IssueAuthChallengeRequest{
    OpaqueID:    opaqueID,
    TTLSeconds:  120,
    Context:     []byte("Approve €4,200 transfer to ···· 8842"),
    MinStrength: ydentifi.AuthStrengthBiometric, // required — no implicit default
})
if err != nil { /* handle */ }
// Render ch.QREncoded as a QR, or push it to the enrolled device.

// 3. Block until the challenge is terminal — the SDK holds the stream open
//    and returns the deployment-verified verdict. No polling, no webhook.
result, err := client.AwaitChallenge(ctx, ch.ChallengeID)
if err != nil { /* handle */ }
switch result.Status {
case ydentifi.ChallengeStatusApproved:
    proceed() // 4. the deployment already verified the signature + strength
case ydentifi.ChallengeStatusDenied:
    reject(result.DenialReason)
case ydentifi.ChallengeStatusExpired:
    // issue a fresh challenge
}
ⓘ Where these come from

Each snippet uses the published SDK API — every backend SDK ships the same calls as runnable programs in its examples/ directory. See the API reference for each call’s full request, response, and typed errors.

Where to go next#

  • Integrate: step-up — drop this in front of one high-stakes action, leaving the rest of your login untouched.
  • Integrate: full — make Ydentifi your second factor across the product.
  • Factors & levels — choose the right level per action.
  • API reference — every RPC, request and response, with runnable examples.
Opens on 01/01/2027

Available at launch

Until then, you can try the whole ceremony on your own phone.