Skip to main content

Protocol specification

Credential document (olpn-credential.json)

Per-credential records issued by a property and back-linked to the subject.

A credential document is the issuer's side of a credential claim. It names the subject the credential was issued to and describes the credential itself. The issuer publishes one document per credential, at a predictable path on its own domain.

Where it lives

https://{issuer-domain}/{username}/olpn-credential.json

Where {issuer-domain} is the domain that issued the credential and {username} is an issuer-assigned handle for the subject. The credential ID that the subject publishes (@{username}@{issuer-domain}) tells the resolver which document to fetch.

Shape

{
  "olpn_entity_id": "§:entity:subject.com",
  "olpn_credential": {
    "id": "@[email protected]",
    "title": "Active Member",
    "type": "Member",
    "description": "Active member in good standing.",
    "property": {
      "id": "§:property:bar.example.com",
      "name": "Example Bar Association",
      "url": "https://bar.example.com",
      "type": "Bar Association",
      "description": "State bar of example.",
      "ownership": [
        { "network_id": "§:entity:bar.example.com" }
      ]
    },
    "dataset": {
      "id": "§:dataset:bar.example.com/members",
      "name": "Active Members"
    },
    "profile_url": "https://bar.example.com/members/jane"
  }
}

Top-level fields

olpn_entity_id (string, required)

The network ID of the entity the credential was issued to. This is the back-link. The resolver matches this field against the network ID of the entity it is verifying. A mismatch means the credential is not for this entity and will not verify.

olpn_credential (object, required)

The credential body.

Credential object fields

The credential ID in @username@domain[/path] form. Should match the URL path this document is served at. See Identifiers for the format.

title (string, required for meaningful display)

Human-readable title. Shown on search results: "Active Member", "Founding Supporter", "Contributor", "Partner".

type (string, optional)

Free-form classification. Common values:

  • Employment — employed by the issuer
  • Member — member of the issuing organization
  • Publishing — contributor to the issuer's publication
  • Support — supporter or donor
  • Education — educational credential
  • Certification — professional certification

description (string, optional)

Free-form description of what the credential attests to.

A nested Property describing the issuing site. Same shape as a standalone property document, but embedded. This lets the resolver display issuer details without a separate fetch.

dataset (object, optional)

A Dataset reference grouping this credential with others issued by the same property. Has two fields:

  • id (string) — dataset ID, typically §:dataset:{issuer-domain}/{path}.
  • name (string) — human-readable name, e.g., "Active Members", "Founding Supporters".

profile_url (string, optional)

A URL to the subject's profile on the issuing site. For example, a firm's bio page for the attorney, or a publication's author page. Lets the resolver link from the verified credential to the issuer's public view of the subject.

Minimum viable document

{
  "olpn_entity_id": "§:entity:subject.com",
  "olpn_credential": {
    "title": "Member"
  }
}

The resolver will verify this credential as long as the entity's olpn.json also references the credential ID. The lack of property, dataset, and profile_url means the result page will have less context to display, but the verification itself succeeds.

Serving rules

  • Path: exactly /{username}/olpn-credential.json where {username} matches the username portion of the credential ID.
  • Content-Type: application/json.
  • HTTP status: 200.