Independent concept prototype for Build What Moves India · Not a Government of India service · All data is demo data.

For departments · integration guide (concept)

Add the national sign-in in an afternoon.

One block of markup, one OpenID Connect callback, one line that declares how sure you need to be for each action. Your own login stays exactly where it is — and comes back on its own if the hub is ever busy.

It looks like yours, because it is yours

The maker of this prototype, Sambit Swarup, chose the design language your portal already runs over a custom look. So the button, the consent screen and the account are your own contracts with six classes added, built from your own tokens. Your citizens see the chrome they already trust; your team pastes markup instead of running a redesign; accessibility comes with it.

Quickstart — six steps to “Meri Pehchaan Ready”

  1. Register your service. Name, logo, redirect URIs, back-channel logout URI, and the scopes you will ask for. That name and logo are what the citizen sees on the consent screen — they are the contract.
  2. Get sandbox keys. A client id and secret that work only against this sandbox. Nothing here touches a live system.
  3. Drop the button in. First in your form's action area, alone, full width. Your existing form goes under “Other ways to sign in” — collapsed, never removed.
  4. Point your callback at the hub. Standard authorization-code + PKCE. Verify the id_token against the published JWKS. Read acr.
  5. Declare assurance per action. Viewing is Shabda, filing is Anumaan, signing is Pratyaksh. Ask for step-up in place; never send the citizen away.
  6. Pass conformance, go live. The checklist at the bottom of this page is the badge. The sandbox faults are the exam.

The button kit

Verb only, one language at a time, the Pehchaan Chakra on the left. Twelve languages switch with the page. Never “Login with”, never “Powered by”, never a provider's name on it.

Default · degraded (the hub is busy; your own login is shown below it)

<button class="ux4g-btn-meripehchaan ux4g-btn-lg ux4g-w-100" type="button" data-action="portal-signin">
  <svg class="ux4g-btn-icon" aria-hidden="true"><use href="/design/mark/pehchaan-chakra.svg#mark"/></svg>
  <span data-verb="signin" lang="en">Sign in</span>
</button>

The OpenID Connect contract — read live from the hub

This table is not typed in. It is /.well-known/openid-configuration, fetched by this page when you opened it.

OpenID Connect discovery values
FieldValue
issuerfetching…
// Node (Hono) — the callback your portal already has, pointed at the hub
const tokens = await fetch(discovery.token_endpoint, { method: "POST",
  body: new URLSearchParams({ grant_type: "authorization_code", code, redirect_uri,
    client_id, client_secret, code_verifier }) }).then(r => r.json());
const { payload } = await jwtVerify(tokens.id_token, JWKS, { issuer, audience: client_id });
// payload.acr → "mp:shabda" | "mp:anumaan" | "mp:pratyaksh"; payload.mp_adhikrit → roles
session.create({ sub: payload.sub, name: payload.name, acr: payload.acr, sid: payload.sid });

Assurance per action

Send acr_values for what the action needs, not for what the portal wants in general. The hub steps up in place; the citizen never leaves your page.

Minimum assurance tier per action
ActionMinimum tierProven by
View status, track an applicationशब्दShabdaSomething you know or hold — mobile OTP
File, apply, submit a formअनुमानAnumaanRecords — OTP to the registered number plus a linked account
Cancel, withdraw, revise money in motion; signप्रत्यक्षPratyakshThe person — passkey or phone approval with number matching
Act for someone elseअधिकृतAdhikritPratyaksh plus a registered role and a grant approved by the citizen

The request parameters, by their published names

Meri Pehchaan 1.0's Requester specification v2.3 (September 2023, on API Setu) already defines these. The hub honours every one under the same name, so a portal integrated with 1.0 sends what it sends today. Live rail

Authorize parameters honoured by the hub
ParameterValuesWhat the citizen sees
purposekyc · verification · compliance · availing_services · educationalprinted on the consent screen
consent_valid_tillUNIX seconds; the citizen may shorten itprinted, and shortened by the citizen
req_doctypePANCR, DRVLC, UNCRD …only those documents appear on the consent screen
acrpan · aadhaar · driving_licence, or mp:shabda · mp:anumaan · mp:pratyaksha minimum tier for the sign-in; the token says which was reached
amrspace-separated methods, with dl_flow=signupsign-up hint
pla · plsignup · ulsignupYPIN-less and username-less flows
dl_flow · verified_mobilesignup · a mobile you already verifiedthe hub skips the code you already sent

What 2.0 adds to the token, and 1.0 does not carry: acr, amr, sid, nonce, auth_time; discovery and JWKS; back-channel logout. Proposed

Every consent receipt is written in the API Setu consent-artefact schema (consentId, dataConsumer, dataProvider, purpose, user, data, permission, signature) and every NSSO Consent API operation has an alias under its published name. Spec files are public at cf-media.api-setu.in/specfiles/. Live rail

Sandbox — break it before a citizen does

These switches change the live hub behind this site. Turn one on, then walk the sign-in. hub_down is the exam: your portal must show its own login and keep every open session.

Walk the sign-in now

Hub status as your portal sees it: checking…

Three ways to join, matched to how your portal is run

“Meri Pehchaan Ready” — the checklist behind the badge

A concept badge, awarded by nobody. The list is the point; the reference architecture, adapter tiers and migration waves are in the repository's docs/03.