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. Issue a credential

Issue a credential

One request, one credential, and the wallets that render asynchronously.

POST/v1/credentials

Creates the credential and moves it to issued.

Request

curl -X POST https://api.nomi-tech.com/v1/credentials \
  -H "Authorization: Bearer nomi_sk_live_EXAMPLE" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order_example_12345" \
  -d '{
    "subjectId": "sub_…",
    "templateKey": "membership_platinum",
    "channels": ["apple_wallet", "google_wallet"],
    "expiresAt": "2027-01-31T23:59:59Z"
  }'
FieldRequiredWhat it does
subjectIdYesWho holds the credential.
templateKeyOne of the twoUses the latest published version of that template.
templateVersionIdOne of the twoPins a specific version. Takes precedence over templateKey.
channelsNoapple_wallet, google_wallet, or both. Defaults to apple_wallet.
expiresAtNoAn RFC 3339 instant. Overrides the template's validity rule.

The response

201 Created

{
  "id": "cred_…",
  "serial": "…",
  "state": "issued",
  "fields": { "tier": "Platinum", "member": "Alex Morgan", "since": "2021-03-04" },
  "subject": { "id": "sub_…", "externalId": "crm_example_001", "status": "active" },
  "channels": [
    { "channel": "apple_wallet",  "state": "pending", "installUrl": null },
    { "channel": "google_wallet", "state": "pending", "installUrl": null }
  ],
  "publicId": "…",
  "verificationUrl": "…",
  "issuedAt": "2026-09-20T15:04:11Z",
  "expiresAt": "2027-01-31T23:59:59Z"
}
The channels come back pending and that is correct: rendering a signed Apple pass and creating a Google Wallet object happen after the response. Watch the credential, or subscribe to credential.channel.provisioned, rather than polling in a tight loop.

Retrying safely

Send an Idempotency-Key and a retry replays the first response instead of issuing twice. A request that timed out on the way back is indistinguishable from one that never arrived — this is what makes retrying it the correct thing to do. See Errors.

Credential delivery

Getting it onto a phone.

Bulk issuance

A graduation, not a loop.

PreviousCreate a credentialNextCredential lifecycle

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 →

On this page

  • The response
  • Retrying safely
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.