For the complete documentation index, see llms.txt. This page is also available as Markdown.

Signing Authorities

Every credential is signed by a private key. A signing authority is a key that signs on your behalf — so send() can produce credentials issued by you without your server ever holding the key.

Why it exists

Two things want to sign credentials as you but shouldn't have your seed:

  • LearnCard itself, when you send from a template, use the Developer Portal, or run an embedded app. There's no code of yours in the loop to do the signing.

  • A separate service, when your organization runs its own signing infrastructure and wants LearnCard to call it rather than hand keys around.

A signing authority solves both. You register a signer — its endpoint, a name, and its DID — against your profile. From then on, when the network needs to issue something as you, it asks that signer.

Two kinds

Hosted

Your own

Who holds the key

LearnCard, tied to your profile

You, on a server you run

How you create it

One click in the Developer Portal, or createSigningAuthority()

Deploy a VC-API /issue endpoint

Then

registerSigningAuthority() + setPrimaryRegisteredSigningAuthority() — the Portal does both for you

Same two calls, with your endpoint

Choose it when

You'd rather not manage keys; you use templates or API tokens

Compliance or policy requires your keys to stay on your infrastructure

Almost everyone wants hosted. The setup walkthrough is Who Signs Your Credentials?

What the credential looks like

The credential's issuer is still you — your profile's DID. The proof is made by the signing authority's key, which your registration has authorized to sign for that DID. Verifiers resolve your DID, find the authority's key among its verification methods, and the signature checks out. Recipients see your name and logo, not the authority's.

How it's used

You can register several authorities; send() always uses the one marked primary. Auto-issued credentials from a consent contract name their authority explicitly in the contract.

If you pass a signedCredential to send() instead of a template, no signing authority is involved — you already signed it.

Last updated

Was this helpful?