Tenant Admin

Creating your first credential config

Pick a format, define claims, attach a signing key, and start issuing.

A credential configuration is the template for everything you’ll issue: which format the credential takes on the wire, what claims it carries, which key signs it, and how it’s rendered as a PDF. This page walks through creating one end to end.

Prerequisites

Before you start you need:

  • An active tenant (see Onboarding).
  • Signing turned on (see Configuring a signer) — the recommended Cyfher-managed option sets this up for you, or connect your own backend — with at least one signing key under Keys.

The portal dashboard will surface both of these as next steps until they’re done.

Step 1 — Pick a preset (or start from scratch)

Navigate to Configurations in the portal sidebar and click New Configuration. You’ll land on a preset picker.

Preset picker modal — categorised starting points for new configurations

Presets are starting points filtered by category (Diploma, License, ID, Membership, Open Badge, etc.). They pre-fill the format, claims schema, certificate template, and category. You can edit anything afterwards. If none fit, choose Start from scratch.

Step 2 — Choose a format

Cyfher supports four credential formats. Pick based on what the verifier on the other end expects:

  • SD-JWT VC (RFC 9901) — selective disclosure JWT. Sensible default for most use cases; let holders share only specific claims.
  • W3C VC (VC-JWT) — W3C Verifiable Credentials Data Model 2.0 in JWT form. For verifiers that explicitly require W3C.
  • mdoc (ISO 18013-5) — mobile document format. Required for mobile driver’s licences and government ID interop.
  • Open Badge 3.0 — for educational badges, micro-credentials, and CLR (Comprehensive Learner Records).

You can change format later by creating a new config, but you cannot retroactively change the format of credentials already issued.

Step 3 — Attach a signing key

Pick a signing key from the dropdown. The dropdown is filtered to keys whose algorithm is valid for the chosen format (e.g. mdoc requires ES256; Open Badge supports EdDSA). Each key references the signer config that backs it.

Step 4 — Define the claims

The claims template is JSON describing the credential’s payload. Variables wrapped in {{ }} are substituted at issuance time from the recipient data. Example:

{
  "given_name": "{{given_name}}",
  "family_name": "{{family_name}}",
  "qualification": "Bachelor of Science",
  "awarded_at": "{{awarded_at}}"
}

The claims schema is a JSON Schema that Cyfher validates incoming claim data against before issuance. Strict by default — unknown fields are rejected. Both fields are pre-filled when you start from a preset.

For mdoc configs, the claims form adds a Namespace field instead — ISO 18013-5 groups data elements under a namespace, and every claim you define is issued into the one you enter here. It’s pre-filled with the standard org.iso.18013.5.1 namespace, which suits most documents. The Mobile Driving Licence preset (under the Identity category) starts you off with this pre-filled.

For external claim sources (webhooks that resolve claim data from your system of record at issuance time), see the Claims source tab on the config form.

Step 5 — Branding and PDF certificate (optional)

  • Display name, description, logo, colors — show up in the wallet when the credential is offered and stored.
  • Certificate template — Typst source that renders a PDF certificate. Cyfher renders entirely in-process (no browser, no Chromium). Template data is exposed via sys.inputs.data.*. Leave blank if you don’t need a PDF.

Reserved sys.inputs.data.* keys

If the config is linked to an achievement, Cyfher populates sys.inputs.data with a fixed set of platform-reserved keys before your own certificate_data is merged on top. Each key is only present when the underlying value is non-blank, so always read them with safe access and a default, e.g. sys.inputs.data.at("achievement_name", default: "").

Key Meaning
achievement_name The linked achievement’s name
achievement_type Humanized achievement type label (e.g. “Diploma”, “Certificate”)
criteria_narrative Free-text narrative from the achievement’s criteria
field_of_study The achievement’s field of study
specialization The achievement’s specialization within that field
credits Credits available for the achievement, as a number
achievement_image URL of the achievement’s image, if one is uploaded
recipient_name The recipient’s name, from the recipient_name (or name) claim on the issuance request

The built-in default template (used when a linked achievement has no custom template) already renders these keys — see it for a worked example of safe access.

Step 6 — Save and activate

Click Save. The configuration is created in draft state. From the configurations list, click Activate on the row. Active configurations can be issued against; inactive ones cannot.

Configurations list showing active credential configurations with format and status columns

What’s next

Once active you have two paths to actually issue credentials:

  • API issuance — the Distributions flow (distribution → batch → offers → commit → distribute) issues credentials programmatically. Even a single credential is a one-row batch. See Issuing a credential.
  • Bulk distribution — for cohorts, upload a CSV. See Bulk distribution.