Aadhaar OVSE (Offline Verification)
8 endpoints · Core API
What is it?
Aadhaar OVSE (Offline Verification Seeking Entity) enables privacy-first identity verification using UIDAI's official Aadhaar App. Your end-users authenticate via face scan in the Aadhaar App and consent to share verified identity details. The full Aadhaar number is never collected or stored — at most the last 4 digits, and only when you explicitly request aadhaar_last_4. SignCare holds the UIDAI OVSE license, so you don't need your own registration.
Quick Start (3 Steps)
Step 1: Create verification request
POST /api/v1/aadhaar-ovse/init
Pass the claims you need as a simple array of names and the channel:
{
"claims": ["name", "dob", "gender", "photo", "address", "pincode", "masked_mobile"],
"channel": "web",
"language": "english",
"face_auth": true,
"webhook_url": "https://yourapp.com/webhook"
}
Response: txnId, intentJwt, requestUrl (for web channel), expiresAt
Step 2: Redirect your user
- Web-to-App (
channel: "web"): Redirect user's browser to the returnedrequestUrl. Aadhaar App opens on their phone. - Cross-Device QR (
channel: "qr"): CallPOST /qr-intentwith thetxnId, then render the returnedqrPayloadas a QR code. - App-to-App (
channel: "app"): Use theintentJwtto launch Aadhaar App via Android Intent or iOS URL scheme.
User authenticates via face scan and consents to share their details.
Step 3: Receive verified claims
- Webhook (recommended): We POST verified claims to your
webhookUrlautomatically. - Polling (fallback):
GET /api/v1/aadhaar-ovse/result/{txnId}— returnspending: trueuntil done.
Available Claims
Pass any of these values in the claims array:
Identity: name, local_name, photo, dob, gender, age_above_18, age_above_50, age_above_60, age_above_75, nri_status, care_of, enrolment_number, enrolment_date, credential_date
Address: address, regional_address, building, locality, street, landmark, vtc, sub_district, district, state, pincode, po_name
Contact: mobile, masked_mobile, email, masked_email
Aadhaar: aadhaar_last_4 — the last 4 digits of the Aadhaar number (UIDAI request field 42). This is the only Aadhaar-number-derived field OVSE returns; the full number is never shared.
Common combinations:
- Basic KYC:
["name", "dob", "photo", "address", "pincode"] - Full KYC:
["name", "dob", "gender", "photo", "address", "pincode", "masked_mobile"] - Age verification only:
["age_above_18"] - Address verification:
["name", "address", "state", "district", "pincode"]
Languages
Pass language name or code: english (default), hindi, marathi, gujarati, tamil, telugu, bengali, kannada, malayalam, punjabi, urdu, assamese, oriya, nepali, or code 1-23
Webhook Payload
POSTed to your webhookUrl as JSON:
{
"success": true,
"data": {
"txnId": "94f63917-...",
"verificationPassed": true,
"verifiedClaims": {
"residentName": "RAM KUMAR",
"dob": "1990-01-15",
"gender": "M",
"address": "123, MG Road, Pune",
"pincode": "411001"
},
"verifiedAt": "2026-04-13T10:18:30Z"
}
}
Choosing the Right Channel
The channel you pass to /init should match how your end-users encounter your product, not how your backend works.
web — your user is on a mobile browser
Best when your product is a mobile web app (fintech KYC form, loan application, signup flow, embedded iframe).
- You call
/initwithchannel: "web". - We return
requestUrl— open it in the user's mobile browser (redirect, popup, or new tab). - Our verify page detects the platform and fires the right deep link:
intent://...on Android,pehchaan://...on iOS. - Aadhaar Pehchaan opens, user does face auth, you get a webhook.
Don't use this for desktop browsers — desktop users have no Pehchaan app to launch. Use qr instead.
qr — your user is at a counter, kiosk, or desktop
Best for physical venues, branches, hotel reception, retail counter, conference desks, or any desktop-screen flow.
- You call
/initwithchannel: "qr". - We return
requestUrl— render it as a QR code on your screen using any QR library. - The QR follows UIDAI's spec format (
https://maadhaar.com/getIntent?value=...) so it works two ways:- End-user opens their phone camera → scans → Pehchaan opens automatically.
- End-user opens Aadhaar Pehchaan → taps "Scan QR" inside the app → reads the same QR.
- Either path lands on the same
txnIdand you get a webhook.
Multi-guest variant: if you need one persistent QR for many guests (hotel weekend sign, conference welcome banner), use Event QR Mode — /events instead of /init. One QR, unlimited fresh transactions.
app — your user is inside your native mobile app
Best when you have your own Android or iOS app that needs to verify the user mid-flow (banking onboarding, wallet KYC, driver verification).
- You call
/initwithchannel: "app", plus yourapp_id(Android package id) andapp_signature(Base64 SHA-256 of your signing cert). - Android: we return
aadhaarAppUri— anintent:URI your Android code fires viastartActivity(). - iOS: use the
intentJwtfrom the response and open the URL scheme yourself:UIApplication.shared.open(URL(string: "pehchaan://in.gov.uidai.pehchaan?req=\(intentJwt)")!) - Pehchaan opens directly inside your app, returns the user when verification finishes.
Channel cheat sheet
| Your product | Channel | What you render | End user does |
|---|---|---|---|
| Mobile web app | web | nothing — just redirect | Phone browser → Pehchaan opens automatically |
| Branch / kiosk / desktop site | qr | a QR image | Phone camera or Pehchaan in-app scan |
| Hotel / event with many guests | Event QR | one persistent QR | Each guest scans the same QR |
| Native Android app | app | nothing — fire intent | Pehchaan opens inside your app |
| Native iOS app | app | nothing — open URL scheme | Pehchaan opens inside your app |
Trial Center vs Production
The "Running Trial on Aadhaar OVSE" screen inside the SignCare portal is a developer sandbox. It exists to help you:
- Pick claims and a channel, then see exactly what
/initreturns. - Test your webhook URL end-to-end with a real verification.
- Inspect the
verifiedClaimsJSON shape so you know what fields to map. - Try Event QR mode with a live registrations dashboard before printing anything.
The trial center is not for your end users. Your real users never see the SignCare portal. In production, your own backend calls this External API directly with your X-API-KEY and X-API-APP-ID headers, and you render the verify URL or QR inside your product. The trial center just lets you verify the wiring before writing integration code.
Trial center transactions debit credits exactly like production — keep that in mind while testing.
Event QR Mode — One QR for Many Guests
Use Event QR when you need to verify many people at a venue without knowing who's coming. You print one QR code — each guest scans it and gets their own fresh Aadhaar verification.
Best for: hotel check-in, conference registration, branch walk-in, exhibitions, field operations.
Event QR Quick Start (3 steps)
Step 1: Create an event
POST /api/v1/aadhaar-ovse/events
{
"name": "Hotel ABC Conference — March 5",
"claims": ["name", "dob", "photo", "masked_mobile"],
"language": "english",
"max_guests": 200,
"expires_at": "2026-03-06T23:59:59Z",
"webhook_url": "https://yourapp.com/webhooks/event-guests"
}
Response: event_id, qr_url (print this as a QR code)
Step 2: Print the QR and display at venue. Guests scan with phone camera → Aadhaar App opens automatically → face auth → consent.
Step 3: Receive a webhook per verified guest. Same payload shape as single verification.
Optionally poll GET /events/{eventId}/registrations for a live guest list.
Event management endpoints
GET /events/{eventId}— check status, registration count, capacityGET /events/{eventId}/registrations?page=1&page_size=50— live guest list with verified claimsPATCH /events/{eventId}— disable, raise cap, or extend expiry mid-event
Event QR — Key points
- 1 credit per verified guest — same rate as single
/init - Abandoned scans (guest walks away before face auth) consume 1 credit but don't count toward
max_guests max_guestscaps successful verifications only, not total scans- When credits run out, the QR gracefully shows "event unavailable" — no hard failure
- Disable an event instantly:
PATCH /events/{id}with{ "is_active": false }
Error Codes
- 400 — Unknown claims / invalid channel: check the claims list above
- 401 — Unauthorized: check X-API-KEY and X-API-APP-ID headers
- 402 — Insufficient credits: purchase more via SignCare portal
- 404 — Transaction or event not found
- 409 — Event at capacity (max_guests reached)
- 410 — Transaction expired (15 min window) or event expired
Benefits
- No OVSE license needed — use SignCare's
- No full Aadhaar number collected — privacy by design (last 4 digits available on request)
- UIDAI digitally signed data (SD-JWT) — tamper-proof
- Face biometric authentication — prevents impersonation
- 3 API calls to verify an identity — simple integration
- Event QR mode — one QR for unlimited guests — hospitality, conference, branch walk-in
Step 1: Create an OVSE verification request. Specify which Aadhaar claims you need (name, DOB, address, etc.) and the invocation channel (web/qr/app). Returns a transaction ID, intent JWT, and request URL to redirect your end-user.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
- Content-Typestringrequiredapplication/json
Body parameters
application/json- claimsarray<string>requiredRequired. List of Aadhaar claims you want to verify, at least one. Use the plain claim names below (case-insensitive); an unknown name is rejected with 400. Available claims: "name", "dob", "gender", "photo", "address", "pincode", "state", "district", "mobile", "masked_mobile", "email", "masked_email", "age_above_18", "age_above_50", "age_above_60", "age_above_75", "care_of", "vtc", "locality", "building", "street", "landmark", "sub_district", "po_name", "regional_address", "local_name", "nri_status", "enrolment_number", "enrolment_date", "credential_date", "aadhaar_last_4" "aadhaar_last_4" returns the last 4 digits of the Aadhaar number (UIDAI request field 42). It is the only Aadhaar-number-derived field available; the full number is never shared.nullable
- request_idstringoptionalOptional. Your own request ID for tracking; a new one is generated when omitted.nullable
- channelstringoptionalOptional. Invocation method: "web" (browser redirect), "qr" (QR code for kiosk/desktop), "app" (mobile app direct launch). Lowercase only; any other value is rejected with 400. Default: "web".nullable
- languagestringoptionalOptional. Language for claims, as a name (case-insensitive) such as "english" (default), "hindi", "marathi", "gujarati", "tamil", "telugu", "bengali", "kannada", "malayalam", "punjabi", "urdu", "assamese", "oriya", or a code from "1" to "23" sent as a string. An unrecognised value falls back to english.nullable
- face_authbooleanoptionalOptional. Boolean. Require face authentication. Default: true (recommended for security).
- webhook_urlstringoptionalOptional. Your webhook URL where SignCare will POST the verified claims once the user completes verification. When omitted, the webhook URL saved for your app is used if one is configured; otherwise poll the result endpoint.nullable
- app_idstringoptionalOptional. App-to-App only: Android package id of the calling app. Used when channel is "app"; ignored for other channels.nullable
- app_signaturestringoptionalOptional. App-to-App only: Base64 SHA-256 of the calling app's signing certificate. Used when channel is "app"; ignored for other channels.nullable
- include_qr_base64booleanoptionalPer-request override for the company-level "Include QR as base64 in API response" toggle. Omit to use the saved company setting.nullable
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
6 fields
- txnIdstringoptionalNo description.nullable
- requestUrlstringoptionalNo description.nullable
- intentJwtstringoptionalNo description.nullable
- aadhaarAppUristringoptionalNo description.nullable
- expiresAtstring (date-time)optionalNo description.
- qrBase64stringoptionalBase64 PNG of the QR (data URI). Populated when the consumer has IncludeQrBase64 = true and the channel produced a URL (web or qr — not app).nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
Step 1b (QR only): Generate a QR code payload for cross-device verification. Call this after /init with channel 'qr'. Render the returned payload as a QR code — user scans it with their phone to open Aadhaar App.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
- Content-Typestringrequiredapplication/json
Body parameters
application/json- txn_idstringrequiredRequired. Transaction ID (`txn_id`) returned by /init. It must belong to your company and not be expired.nullable
- include_qr_base64booleanoptionalOptional. Boolean. Per-request override for the company-level "Include QR as base64 in API response" setting. Omit to use the saved company setting.nullable
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
3 fields
- txnIdstringoptionalNo description.nullable
- qrPayloadstringoptionalNo description.nullable
- qrBase64stringoptionalBase64 PNG of the QR (data URI). Only populated when the consumer has IncludeQrBase64 = true.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
App-to-App courier endpoint. For channel "app", UIDAI Aadhaar Pehchaan returns the SD-JWT credential to the calling Android app via Intent extras instead of POSTing to the registered callback URL. The calling app must forward the credential here so SignCare's backend can verify the SD-JWT signature and disclosures, store the verified claims, and (if configured) fire the consumer's webhook. Returns the verified-claims payload directly — no polling required for App-to-App.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
- Content-Typestringrequiredapplication/json
Body parameters
application/json- txn_idstringrequiredRequired. Transaction ID (`txn_id`) returned by /init for the "app" channel.nullable
- credentialstringrequiredRequired. SD-JWT credential returned by the Aadhaar app through the Android Intent extras (format: a.b.c~d1~d2). It must belong to the given transaction.nullable
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
6 fields
- txnIdstringoptionalNo description.nullable
- pendingbooleanoptionalNo description.
- verificationPassedbooleanoptionalNo description.
- verifiedClaimsobjectoptionalNo description.nullable
- verifiedAtstring (date-time)optionalNo description.nullable
- messagestringoptionalNo description.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
Step 3: Poll for verification result. Returns pending status while user hasn't completed verification, or the verified claims once done. Use this as a fallback if you prefer polling over webhooks.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
Path parameters
- txnIdstringrequiredRequired. The txn_id returned by /init.
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
6 fields
- txnIdstringoptionalNo description.nullable
- pendingbooleanoptionalNo description.
- verificationPassedbooleanoptionalNo description.
- verifiedClaimsobjectoptionalNo description.nullable
- verifiedAtstring (date-time)optionalNo description.nullable
- messagestringoptionalNo description.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
[Event QR Mode] Create a stable event QR code for multi-guest Aadhaar verification. Use this when you need to verify many users at once — hotel check-ins, conference registrations, branch walk-ins, kiosks. Instead of calling /init for each person, you create ONE event, print its QR URL, and each guest scans to get their own fresh Aadhaar verification. Flow: 1. Call this endpoint → receive event_id and qr_url. 2. Encode qr_url as a QR code (any QR generator works) and print/display at your venue. 3. Guests scan with Android phone camera → Aadhaar Pehchaan app opens → face auth → consent. 4. You receive one webhook POST per successful guest (same payload as /init webhooks). 5. Optionally poll GET /events/{event_id}/registrations for a live guest list. Credits: each successful guest registration debits one Aadhaar OVSE credit, same as /init.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
- Content-Typestringrequiredapplication/json
Body parameters
application/json- namestringrequiredRequired. Display name shown on the guest's verify page (e.g. "Hotel ABC Conference").nullable
- claimsarray<string>requiredRequired. Aadhaar claims to request from each guest, at least one. Same claim names as /init (case-insensitive), for example "name", "dob", "gender", "photo", "address", "pincode", "state", "district", "mobile", "masked_mobile", "email", "masked_email", "age_above_18", "aadhaar_last_4". An unknown name is rejected with 400.nullable
- languagestringoptionalOptional. Language for claims, as a name such as "english" (default), "hindi", "marathi", or a code from "1" to "23" sent as a string. An unrecognised value falls back to english.nullable
- webhook_urlstringoptionalOptional. URL that receives one POST per successful guest registration. When omitted, the webhook URL saved for your app is used if one is configured.nullable
- max_guestsinteger (int32)optionalOptional. Maximum successful registrations; integer greater than 0. Omit for unlimited (capped by wallet balance).nullable
- expires_atstring (date-time)optionalOptional. ISO 8601 UTC date-time; scans are rejected after this time. Must be in the future. Omit for no expiry.nullable
- logo_urlstringoptionalOptional. Your brand logo URL shown on the guest's verify page.nullable
- entity_namestringoptionalOptional. Your entity name shown on the guest's verify page (e.g. "Hotel ABC").nullable
- include_qr_base64booleanoptionalOptional. Boolean. Per-request override for the company-level "Include QR as base64 in API response" setting. Omit to use the saved company setting.nullable
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
11 fields
- eventIdstringoptionalNo description.nullable
- namestringoptionalNo description.nullable
- qrUrlstringoptionalNo description.nullable
- isActivebooleanoptionalNo description.
- maxGuestsinteger (int32)optionalNo description.nullable
- registrationCountinteger (int32)optionalNo description.
- expiresAtstring (date-time)optionalNo description.nullable
- logoUrlstringoptionalNo description.nullable
- entityNamestringoptionalNo description.nullable
- createdAtstring (date-time)optionalNo description.nullable
- qrBase64stringoptionalBase64 PNG of the event QR (data URI). Only populated when the consumer has IncludeQrBase64 = true.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
[Event QR Mode] Get event details — name, status, registration count, cap, expiry. Use this to check how many guests have registered so far, whether the event is still active, and whether it has hit its max_guests cap. Useful for a live event dashboard. Returns the same qr_url from creation — you can regenerate the QR at any time from it.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
Path parameters
- eventIdstringrequiredRequired. The event_id returned when the event was created.
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
11 fields
- eventIdstringoptionalNo description.nullable
- namestringoptionalNo description.nullable
- qrUrlstringoptionalNo description.nullable
- isActivebooleanoptionalNo description.
- maxGuestsinteger (int32)optionalNo description.nullable
- registrationCountinteger (int32)optionalNo description.
- expiresAtstring (date-time)optionalNo description.nullable
- logoUrlstringoptionalNo description.nullable
- entityNamestringoptionalNo description.nullable
- createdAtstring (date-time)optionalNo description.nullable
- qrBase64stringoptionalBase64 PNG of the event QR (data URI). Only populated when the consumer has IncludeQrBase64 = true.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
[Event QR Mode] Update an in-flight event — disable it, raise the cap, or extend the window. Common operations: - Immediately stop accepting new scans: { "is_active": false } - Let in more guests than originally planned: { "max_guests": 250 } - Event running late, extend by 2 hours: { "expires_at": "2026-03-05T22:00:00Z" } - Replace webhook for future registrations: { "webhook_url": "https://..." } Only send the fields you want to change — omitted fields are left unchanged. Note: max_guests must be greater than 0 and expires_at must be a future time.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
- Content-Typestringrequiredapplication/json
Path parameters
- eventIdstringrequiredRequired. The event_id returned when the event was created.
Body parameters
application/json- is_activebooleanoptionalOptional. Set to false to immediately stop accepting new registrations, or true to resume.nullable
- max_guestsinteger (int32)optionalOptional. New guest cap; integer greater than 0.nullable
- expires_atstring (date-time)optionalOptional. New expiry as an ISO 8601 UTC date-time. Must be in the future.nullable
- webhook_urlstringoptionalOptional. New webhook URL for future registrations.nullable
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
11 fields
- eventIdstringoptionalNo description.nullable
- namestringoptionalNo description.nullable
- qrUrlstringoptionalNo description.nullable
- isActivebooleanoptionalNo description.
- maxGuestsinteger (int32)optionalNo description.nullable
- registrationCountinteger (int32)optionalNo description.
- expiresAtstring (date-time)optionalNo description.nullable
- logoUrlstringoptionalNo description.nullable
- entityNamestringoptionalNo description.nullable
- createdAtstring (date-time)optionalNo description.nullable
- qrBase64stringoptionalBase64 PNG of the event QR (data URI). Only populated when the consumer has IncludeQrBase64 = true.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
[Event QR Mode] Paginated list of guests who have verified at this event. Each item includes the guest's txn_id, verification status, and their disclosed Aadhaar claims (name, DOB, photo, address, etc. — whatever you requested at event creation). Results are ordered newest-first (most recent registrations appear first). Use page + page_size to paginate. Both are optional query parameters: page defaults to 1 (minimum 1); page_size defaults to 50 and is limited to 1-200 (values outside that range are adjusted, not rejected). Only guests whose verification was successfully completed are included (verification_passed: true). Abandoned scans (user walked away before completing face auth) do not appear here.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
Path parameters
- eventIdstringrequiredRequired. The event_id returned when the event was created.
Query parameters
- pageinteger (int32)optionalOptional. Page number, starting at 1. Default 1.default 1
- page_sizeinteger (int32)optionalOptional. Items per page, 1 to 200. Default 50.default 50
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
5 fields
- eventIdstringoptionalNo description.nullable
- totalinteger (int32)optionalNo description.
- pageinteger (int32)optionalNo description.
- pageSizeinteger (int32)optionalNo description.
- itemsarray<object>optionalNo description.nullable
Each item: 4 fields
- txnIdstringoptionalNo description.nullable
- verificationPassedbooleanoptionalNo description.
- verifiedClaimsobjectoptionalNo description.nullable
- registeredAtstring (date-time)optionalNo description.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500