Overview
What digid does, how a verification flows through your app, and what your code gets back.
digid verifies Tanzanian identity on the phone or in the browser your customer already uses. It reads the NIDA ID card or a Tanzanian driving licence, matches a live selfie to the photo on the card with a liveness check, and captures fingerprints as NIDA-standard images. All of it runs on the device. Your app gets one JSON document back, and your backend decides what happens next.
What digid does
- Reads the card. NIDA ID card (citizen, resident and refugee) or Tanzanian driving licence, front and, if you ask for it, back. You get the NIN, names, sex, date of birth, card type and expiry, or the licence's number, dates, categories and place of residence.
- Checks the card. Every read comes with a list of checks (required fields present, NIN format, plausible dates, expiry, both sides agreeing) and one verdict:
pass,revieworfail. - Matches the face. A live selfie is compared with the photo printed on the card, with a liveness check, and returns
match,uncertainorno_match. - Captures fingerprints. NIDA-standard fingerprint images (WSQ, 500 ppi) with NIDA finger codes, ready for your backend to use. Fingerprints are in the Flutter SDK today.
How a verification flows
- Your app starts the digid SDK with your licence key. The key is checked on the device, offline.
- The SDK opens its screens (or yours): card, then selfie, then fingerprints, in that order, skipping the steps you leave out.
- The SDK hands your code the result and the
digid.kyc/1document. - Your app sends the document to your backend, over your own connection.
- Your backend checks it and decides: accept, send to a person for review, or refuse.
digid never sees the card, the face or the result. The cloud service only issues licences and receives usage counts. See Privacy and security.
What you get back
One JSON document per verification, digid.kyc/1:
{
"schema": "digid.kyc/1",
"created_at": "2026-10-29T18:40:00Z",
"licence": { "state": "licensed", "evaluation": false },
"subject": { "nin": "19900101111110000123", "given_names": "AMINA JUMA", "surname": "HASSAN",
"sex": "female", "date_of_birth": "1990-01-01", "card_type": "citizen" },
"document": { "type": "nida_id", "overall": "pass", "checks": [ … ] },
"face": { "verdict": "match", "liveness": { "passed": true } },
"fingerprints": [ { "code": "L2", "finger": "left_index", "format": "wsq", "ppi": 500, … } ],
"integrity": { … }
}
The values above are synthetic. Every field is described in the document reference, and Verify on your backend lists what to check before you trust it.
Platforms
| Platform | Package | Ready-made screens | Fingerprints |
|---|---|---|---|
| Flutter (Android and iOS) | digid |
Yes | Yes |
| Web (browser) | @digid/sdk |
Yes | No |
| Android (Kotlin) | tz.co.digid.sdk |
Build your own on the engine | No |
| iOS (Swift) | Swift package Digid |
Build your own on the engine | No |
Every SDK runs the same engine and returns the same result JSON. Card reading and face match run on all four.
Quick starts
Pick your platform. Each quick start adds the SDK, starts it with a licence, runs a verification and sends the result to your backend.
- Flutter: the full flow, with ready-made screens, in one call.
- Web: the same flow in the browser, mounted into a page element.
- Android: the engine with a CameraX analyzer, on your own screens.
- iOS: the engine with an AVFoundation adapter, on your own screens.
Before you buy
Without a licence key the SDK runs in evaluation mode: everything works, but results are watermarked, marked evaluation: true and never better than review. Create a free account to get the SDK, build your integration, and buy a licence when you go live. Prices are on the pricing page.