TfP Docs

ExternalIdentity schema

Generated from the canonical schema schemas/external-identity.schema.json by scripts/generate-schema-docs.mjs — do not edit this page by hand.

A link from a TfP User to an identity in a system outside TfP — most importantly ORCID, plus personal links like a website or GitHub profile. Connects the User to outside ecosystems while the TfP User remains the canonical identity inside the platform. Not an authentication method: signing in is AuthIdentity's job.

Schema version: 1.0.0 · $id: https://tokensforprogress.org/schemas/external-identity.schema.json

Fields

id

Type: string · Required: yes · Mutable: no · Pattern: ^ext_[0-9a-z]{10,32}$

Stable opaque identifier for this link.

Example: "ext_01jf90cc3orcd"

user_id

Type: string · Required: yes · Mutable: no · Pattern: ^usr_[0-9a-z]{10,32}$

The User this external identity belongs to.

Example: "usr_01jf8xw3tempo"

kind

Type: orcid | website | github | other · Required: yes · Mutable: no

What kind of external identity this is. orcid links a researcher identity; website/github/other are display links.

Example: "orcid"

value

Type: string · Required: yes · Mutable: no

The external identifier or URL: the ORCID iD (e.g. 0000-0002-1825-0097) for kind orcid, otherwise a URL. To change it, remove the link and add a new one.

Example: "0000-0002-1825-0097"

verified

Type: boolean · Required: yes · Mutable: yes

Whether TfP has verified the link — for ORCID, via ORCID's own OAuth flow. Display links may remain unverified.

Example: true

created_at

Type: string · Required: yes · Mutable: no

RFC 3339 UTC timestamp when the link was added.

Example: "2026-08-31T15:04:11Z"

JSON Schema source

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://tokensforprogress.org/schemas/external-identity.schema.json",
  "title": "ExternalIdentity",
  "description": "A link from a TfP User to an identity in a system outside TfP — most importantly ORCID, plus personal links like a website or GitHub profile. Connects the User to outside ecosystems while the TfP User remains the canonical identity inside the platform. Not an authentication method: signing in is AuthIdentity's job.",
  "x-tfp-version": "1.0.0",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "user_id",
    "kind",
    "value",
    "verified",
    "created_at"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^ext_[0-9a-z]{10,32}$",
      "x-mutable": false,
      "description": "Stable opaque identifier for this link.",
      "examples": [
        "ext_01jf90cc3orcd"
      ]
    },
    "user_id": {
      "type": "string",
      "pattern": "^usr_[0-9a-z]{10,32}$",
      "x-mutable": false,
      "description": "The User this external identity belongs to.",
      "examples": [
        "usr_01jf8xw3tempo"
      ]
    },
    "kind": {
      "type": "string",
      "enum": [
        "orcid",
        "website",
        "github",
        "other"
      ],
      "x-mutable": false,
      "description": "What kind of external identity this is. `orcid` links a researcher identity; `website`/`github`/`other` are display links.",
      "examples": [
        "orcid"
      ]
    },
    "value": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500,
      "x-mutable": false,
      "description": "The external identifier or URL: the ORCID iD (e.g. `0000-0002-1825-0097`) for kind `orcid`, otherwise a URL. To change it, remove the link and add a new one.",
      "examples": [
        "0000-0002-1825-0097"
      ]
    },
    "verified": {
      "type": "boolean",
      "x-mutable": true,
      "description": "Whether TfP has verified the link — for ORCID, via ORCID's own OAuth flow. Display links may remain unverified.",
      "examples": [
        true
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "x-mutable": false,
      "description": "RFC 3339 UTC timestamp when the link was added.",
      "examples": [
        "2026-08-31T15:04:11Z"
      ]
    }
  }
}