One endpoint. One API key. Verified credential claims returned after token validation, with institutions staying fully in control of decisions.
Drop a PASSID verification field into your existing application form. It returns signed credential claims and verification metadata instead of self-reported data or redirects. The customer opens their PASSID app, taps Share, and reads out a one-time code. Claims land in your onVerified callback after verification.
Install @passidio/react and drop <PassidCodeVerification /> directly into your application form. It renders as a compact inline widget. Keep production API keys server-side and use the field to collect the applicant's one-time PASSID token.
The customer opens their PASSID app and taps Share. The app generates a one-time share code (e.g. KE8V-3TXY-Z72L). They read it out or paste it into the field on your page. No QR scan required, no app redirect — it works over the phone, in person, or fully remote.
After the customer submits the code and the token is verified, onVerified(result) fires with the verified claims object under result.verified_claims. A verification.completed webhook can also hit your backend server.
verification.completed fires on your serverPOST /v1/outcome to close the verification loopWhether you're verifying a token a customer already holds, or launching a Connect flow so the customer grants access themselves — both start in sandbox, both use the same key.
Customer presents a scoped PassID token. Your backend verifies it with a single POST — returns signed credential claims, freshness, revocation state, and audit metadata.
No PassID token required upfront. Customer clicks "Connect with PassID," approves, and you receive a connection_id. Most integrations complete in under a day.
Protect API routes, verify tokens, and assemble verified claim packages from your backend. Works with Express, Next.js App Router, Next.js Pages Router, or any Node.js server.
passidMiddleware — Express drop-in route guardwithPassid — Next.js App Router wrapperwithPassidPages — Next.js Pages Router wrapperPASSIDClient — verify tokens, assemble claim packages, report outcomesverifyWebhookSignature — HMAC-SHA256 webhook verificationAll endpoints require X-Institution-Key: <your-api-key> unless marked public. Base URL: https://api.passid.io
<PASSIDVerify /> on mount. Returns requestId, code (e.g. AB3X-7YQM), deepLink (passid://verify-request?r=…&i=…), and expiresAt. Body: { institutionName?, permissions?, ttlSeconds? } — TTL defaults to 600 s, max 3600 s.status: "pending" | "completed" | "declined" | "expired". When completed, response includes the full claims object and verifiedAt. Requires institution API key.410 if already expired, fulfilled, or declined.AB3X-7YQM or AB3X7YQM) to the same response as the public request endpoint. Used by the in-app manual code entry screen.Idempotency-Key header so retries do not double-verify. Response includes X-PASSID-API-Version: 1.{ token, outcome, productType?, amountUsd?, observationDays?, notes? }. Valid outcomes: repaid · no_default · delinquent · defaulted · fraud_confirmed · account_closed · other. The verification context at time of outcome reporting is captured automatically. One outcome per token per institution. Fires outcome.reported webhook.1.0.0), release date, and a full map of all endpoint paths. Use to confirm your integration is on the versioned surface.Idempotency-Key on the verify call to prevent duplicate webhooks.deny_reason string. Only fired when the request carries a valid institution API key.POST /v1/outcome. Payload includes the token, outcome type, product type, amount, and the verification context at time of outcome reporting. Use for audit trails and coverage improvement.X-PASSID-Signature: sha256=<hex>. Automatic retries on non-2xx: immediate - 30 s - 5 min - 30 min - 2 h (5 attempts total). Pending deliveries survive server restarts.Use your sandbox API key with the same endpoints. The sandbox returns deterministic results — identical API shape to production, isolated from live data.
client_id / client_secret pair scoped to sandbox only — safe test data, zero production access.POST /api/v1/bridge/verify · { "token": "PASSID-SANDBOX-..." }permissions[] arrayverified_credential_summaryFull standard claim set — all verified claims in one requestincome_verifiedBoolean + income band (e.g. $3,000–$4,000/mo)identity_verifiedIdentity verification booleansanctions_clearSanctions screening — OFAC · EU · UN watchlist clearpayment_reliabilityPayment behavior verified — derived from payment historysavings_consistencySavings behavior verified — derived from savings patternfraud_risklow / medium / high / not_assessed — currently returns not_assessed for every credential (no fraud-detection provider integrated yet)POST /api/v1/bridge/verify with the exact token string to test the same response shape used by production verification.verification.completed, verification.failed, and outcome.reported test events from your institution dashboard → API & Webhooks panel.connection_id unlock?"