Internal adoption patterns

Connect DAJU without coupling your product to identity providers.

These templates create a DAJU Verify session, redirect to the hosted journey, and consume a minimal signed-event contract. Every example is sandbox-only, uses synthetic references, and keeps evidence inside DAJU.

Development boundaryThese examples do not claim production NIA, biometric, payment, or webhook transport readiness. Keep live applications disabled until the relevant provider and operational gates pass.

Four starting points

Choose the pattern closest to your flow.

Configure the workflow in the DAJU sandbox first. Its published version—not the calling application—controls checks and assurance.

01

Sandbox template

RentDirect

Assurance L2

A consent-first tenant onboarding pattern that keeps identity evidence inside DAJU.

Verification purpose
Confirm a prospective tenant controls the submitted contact channel and completes a Ghana identity-document journey before a tenancy application is reviewed.
Workflow and checks
  1. Purpose-specific consent
  2. Email or phone control
  3. Ghana identity document capture
  4. Sandbox document and identity checks
  5. Risk, trust, decision, and manual-review routing
Safe webhook events
verification.completedverification.review_requiredverification.retry_requiredverification.inconclusiveverification.failed
Retention boundary
Retain only the DAJU session ID, final status, decision timestamp, and your synthetic application reference. Apply the tenancy process retention schedule; do not copy identity images into RentDirect.

Complete repository sample: packages/sdk/examples/rentdirect.ts

TypeScript · server onlysandbox
import { createDajuClient } from "@daju/sdk";

const daju = createDajuClient({
  apiKey: process.env.DAJU_SANDBOX_API_KEY!,
});

const session = await daju.verificationSessions.create(
  {
    workflowId: process.env.DAJU_RENTDIRECT_WORKFLOW_ID!,
    externalReference: "rent-sandbox-demo-001",
    hostedReturnUrl: process.env.DAJU_HOSTED_RETURN_URL!,
  },
  {
    idempotencyKey: "rent-sandbox-demo-001-v1",
  },
);

// Redirect to DAJU. The configured return URL never carries outcome data.
return Response.redirect(session.hostedUrl, 303);
02

Sandbox template

Trellis

Assurance L2

An adult-only safeguarding workflow for tutor and guardian onboarding.

Verification purpose
Verify an adult tutor or guardian for platform safeguarding and account trust without placing a learner's personal data in the verification reference.
Workflow and checks
  1. Adult safeguarding consent
  2. Contact-channel control
  3. Ghana identity document capture
  4. Sandbox identity and duplicate-risk checks
  5. Decision with manual review for inconclusive outcomes
Safe webhook events
verification.completedverification.review_requiredverification.retry_requiredverification.inconclusiveverification.failed
Retention boundary
Store the session ID, final status, safeguarding decision date, and synthetic adult-account reference only. Keep learner data entirely outside the DAJU request and remove stale links under the safeguarding retention policy.

Complete repository sample: packages/sdk/examples/trellis.ts

TypeScript · server onlysandbox
import { createDajuClient } from "@daju/sdk";

const daju = createDajuClient({
  apiKey: process.env.DAJU_SANDBOX_API_KEY!,
});

const session = await daju.verificationSessions.create(
  {
    workflowId: process.env.DAJU_TRELLIS_WORKFLOW_ID!,
    externalReference: "trellis-adult-sandbox-demo-001",
    hostedReturnUrl: process.env.DAJU_HOSTED_RETURN_URL!,
  },
  {
    idempotencyKey: "trellis-adult-sandbox-demo-001-v1",
  },
);

// Redirect to DAJU. The configured return URL never carries outcome data.
return Response.redirect(session.hostedUrl, 303);
03

Sandbox template

Student Device Leasing

Assurance L3

A higher-assurance identity gate separated from affordability and lending decisions.

Verification purpose
Establish higher-assurance adult applicant identity before a device lease is approved, while leaving affordability and credit decisions in the leasing application.
Workflow and checks
  1. Lease identity-verification consent
  2. Verified contact channel
  3. Ghana identity document capture
  4. Sandbox liveness and face-match simulation
  5. Risk, trust, decision, and independent review routing
Safe webhook events
verification.completedverification.review_requiredverification.retry_requiredverification.inconclusiveverification.failed
Retention boundary
Retain the verification session ID, assurance target, final status, and synthetic lease reference. Do not retain DAJU evidence in the leasing system and do not treat identity verification as a credit decision.

Complete repository sample: packages/sdk/examples/student-device-leasing.ts

TypeScript · server onlysandbox
import { createDajuClient } from "@daju/sdk";

const daju = createDajuClient({
  apiKey: process.env.DAJU_SANDBOX_API_KEY!,
});

const session = await daju.verificationSessions.create(
  {
    workflowId: process.env.DAJU_DEVICE_LEASING_WORKFLOW_ID!,
    externalReference: "device-lease-sandbox-demo-001",
    hostedReturnUrl: process.env.DAJU_HOSTED_RETURN_URL!,
  },
  {
    idempotencyKey: "device-lease-sandbox-demo-001-v1",
  },
);

// Redirect to DAJU. The configured return URL never carries outcome data.
return Response.redirect(session.hostedUrl, 303);
04

Sandbox template

NELLA Support

Assurance L1

A lightweight support step-up pattern for sensitive account actions.

Verification purpose
Step up a support interaction with contact-channel verification before a sensitive account-recovery or profile-change request proceeds.
Workflow and checks
  1. Account-support consent
  2. Email or phone control
  3. Policy decision
  4. Manual review when the contact check is inconclusive
Safe webhook events
verification.completedverification.review_requiredverification.retry_requiredverification.inconclusiveverification.failed
Retention boundary
Keep the session ID, synthetic support-case reference, event ID, and final status for the support audit period. Do not place ticket text, account secrets, health data, or identity values in DAJU references.

Complete repository sample: packages/sdk/examples/nella-support.ts

TypeScript · server onlysandbox
import { createDajuClient } from "@daju/sdk";

const daju = createDajuClient({
  apiKey: process.env.DAJU_SANDBOX_API_KEY!,
});

const session = await daju.verificationSessions.create(
  {
    workflowId: process.env.DAJU_NELLA_SUPPORT_WORKFLOW_ID!,
    externalReference: "nella-case-sandbox-demo-001",
    hostedReturnUrl: process.env.DAJU_HOSTED_RETURN_URL!,
  },
  {
    idempotencyKey: "nella-case-sandbox-demo-001-v1",
  },
);

// Redirect to DAJU. The configured return URL never carries outcome data.
return Response.redirect(session.hostedUrl, 303);

Shared contract

One safe shape across all four products.

Send only a synthetic product-side reference. Persist the returned DAJU session ID and correlation ID. Redirect the subject to the one-time hosted URL. If you select a hosted return URL, it must exactly match the application allowlist; DAJU never appends tokens or outcome data. Accept only signed events that your endpoint explicitly allowlists.

  1. 1. CreateCall the TypeScript SDK from a server route with an idempotency key and, optionally, an allowlisted HTTPS hosted return URL.
  2. 2. RedirectTreat the hosted URL as secret bearer material and never log it. Treat navigation back as navigation only, never proof of an outcome.
  3. 3. VerifyValidate timestamp and HMAC signature before parsing an event.
  4. 4. MinimizeStore status and references only; retrieve detail from DAJU when authorized.

Outcome handling

Keep retry and review states distinct.

A signed event reports the current verification outcome. Apply the product-side state change and event receipt in one transaction, and make that transaction idempotent by event ID.

  1. Completed or failedTreat verification.completed and verification.failed as terminal outcomes.
  2. Retry requiredverification.retry_required means the subject can make another attempt; do not treat it as approval or final rejection.
  3. Inconclusiveverification.inconclusive means the automated journey could not establish an outcome; keep the product action blocked pending your documented policy.
  4. Review requiredverification.review_required routes the session to manual review and is not a completed verification.

Start in the sandbox

Use the API contract, then adapt the product-side state change.

The templates deliberately leave product database writes to each product. DAJU remains the source of truth for verification evidence and decisions.

Read the API quick startOpenAPI 3.1 JSON