nomiDocumentation
SupportBack to site
  • Getting started

    • Introduction
    • What is Nomi?
    • Quick start
    • Concepts
    • Authentication
  • Credentials

    • Create a credential
    • Issue a credential
    • Credential lifecycle
    • Revoke a credential
    • Verify a credential
    • QR verification
  • Distribution

    • Apple Wallet
    • Google Wallet
    • Email
    • Credential delivery
    • Bulk issuance
  • API

    • API overview
    • Authentication
    • Credentials API
    • Recipients
    • Verification
    • Revocation
    • Webhooks
    • Errors
  • Integrations

    • Moodle
    • WordPress
    • REST API
    • Webhooks
  • Security

    • Authentication
    • API keys
    • Webhook security
    • Data protection
    • Best practices
  • Resources

    • FAQ
    • Glossary
    • Changelog
  1. Documentation
  2. /
  3. Credentials
  4. /
  5. QR verification

QR verification

What the QR code carries, who can read it, and what happens offline.

Two different squares get called “the QR code”, and they do different jobs.

  • The barcode on the pass. Defined by the template's barcode block — qr, code128, pdf417 or aztec — and carrying whatever source names, usually the serial. This is what a scanner at a door reads, and it works with the phone offline because the pass is on the device.
  • The QR on a certificate or a public page. Carries the credential's verification URL. Anyone who scans it lands on the public page, with no app and no account.

Reading one in your own system

Send whatever the scanner produced to POST /v1/verify as code. It accepts the serial, the public code and the full verification URL, so your scanner does not have to know which of the three it just read.

A scanner, in the browser or on a handheld

const res = await fetch("https://api.nomi-tech.com/v1/verify", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.NOMI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ code: scanned, location: "North gate" }),
});

const { valid, reason, subject } = await res.json();
if (!valid) reject(reason);        // "revoked", "expired", "suspended"…
else admit(subject.displayName);
Never put an API key in a browser or a handheld app. Call your own service, and let it hold the key and call Nomi — the pattern in Best practices.

Apple Wallet

How the pass gets there.

Best practices

Where the key lives.

PreviousVerify a credentialNextApple Wallet

Still stuck?

If this page did not answer it, the Help Center has the operational side of the same question — and a person reads what you send.

Go to the Help Center →
nomi

Digital credential infrastructure. Create, issue and manage credentials from the systems you already use.

Operated by

Country and currency

Platform

  • How it works
  • Templates
  • Lifecycle
  • Developers
  • Pricing
  • FAQ
  • Nomi Academic

Credentials

  • Memberships
  • Employee IDs
  • Student IDs
  • Events & loyalty

Developers

  • Documentation
  • Quick start
  • API reference
  • Webhooks
  • Integrations

Support

  • Help Center
  • Apple & Google Wallet
  • Verification
  • Contact support

Company

  • Request a demo
  • Talk to Nomi
  • Legal
  • Codingraph
PrivacyTermsCookiesSecurityContact

© 2026 Codingraph S.A. All rights reserved.

Nomi is a registered trademark used by Codingraph S.A. under licence.

Billed in USD

Apple Wallet and Google Wallet are trademarks of their respective owners.