openworkid.org / specification

The upstand.work Standard

A JSON-LD specification for portable, peer-verified professional identity. Defines five core concepts: Experience Record, Peer Verification, Human Proof, Portable Identity, and Extensions.

v0.1.0MIT LicenseW3C JSON-LD 1.1Schema.org compatible
Introduction

The upstand.work standard defines how professional identity is structured, verified, and transported between systems. It does not prescribe how data is stored or displayed — only how it is represented so that any platform, AI agent, or application can read and verify it consistently.

upstand.work is the reference implementation of this standard. Any platform may implement the standard independently. The schema is hosted at https://openworkid.org/v1 and versioned semantically.
Versioning & @context

Every document must declare a @context pointing to a specific version of the standard. Implementations must not silently upgrade to a newer version — version negotiation is explicit.

Minimal valid document
{
  "@context": "https://openworkid.org/v1",
  "@type": "ProfessionalIdentity",
  "id": "upstand.work/thomas-weber",
  "name": "Thomas Weber",
  "humanProof": { "verified": false },
  "experience": [],
  "verifications": [],
  "extensions": []
}
FieldTypeRequiredDescription
@contextURLrequiredMust point to a versioned schema URL. https://openworkid.org/v1
@typestringrequiredAlways "ProfessionalIdentity" at the root level.
idURIrequiredStable, permanent URI for this identity. Must not change once published.
namestringrequiredFull name of the professional. No length limit.
humanProofHumanProofrequiredSee \u00A73. Must be present even if verified: false.
experienceExperienceRecord[]requiredArray of experience records. May be empty. See §1.
verificationsPeerVerification[]requiredArray of peer verifications. May be empty. See §2.
extensionsExtension[]requiredProfession-specific extension blocks. May be empty. See §5.
visibility"public" | "unlisted" | "inactive"optionalControls indexing behavior. Default: "public".
createdAtISO 8601optionalTimestamp of initial profile creation.
updatedAtISO 8601optionalTimestamp of last modification to any field.
summarystringoptionalAI-generated or human-written summary. Max 500 characters. Used in SEO meta-description.
availableForWorkbooleanoptionalSignals active availability. Default: false.

01Experience RecordCore

An Experience Record captures a single professional experience as a structured narrative — not a job title and dates, but the context, challenge, contribution, measurable result, and what was learned. This format cannot be replicated by AI from a LinkedIn scrape because the substance must come from the professional.

Each Experience Record gets a stable, permanent URI of the form upstand.work/[username]/exp/[id]. This URI must never change once published — external references, MCP calls, and Verification references depend on it.
ExperienceRecord — full example
{
  "@type": "ExperienceRecord",
  "id": "upstand.work/thomas-weber/exp/001",

  // Where and when
  "organisation": "Continental AG",
  "role": "Senior Finance Controller",
  "startDate": "2019-03",
  "endDate": "2022-11",
  "isCurrent": false,
  "location": "Munich, Germany",
  "remote": false,

  // The narrative — five structured fields
  "context": "Automotive group, 23 manufacturing sites across 12 countries. No unified financial reporting existed — each site used local systems.",
  "challenge": "Build a consolidated real-time reporting framework in time for the next board cycle — 14 months originally planned.",
  "contribution": "Led a cross-functional team of 6. Designed the data model, negotiated system access across regions, ran parallel pilots in DE and CN to prove the concept before full rollout.",
  "result": "Delivered in 8 months — 6 months ahead of plan. System became the foundation for all board-level strategic decisions. Still in use three years later.",
  "learning": "Stakeholder alignment across cultures and time zones is the hardest part of any infrastructure project — not the technology.",

  // References to verifications of this record
  "verificationRefs": [
    "upstand.work/thomas-weber/ver/001",
    "upstand.work/thomas-weber/ver/002"
  ],

  // Writing style used
  "writingStyle": "direct",  // "direct" | "grounded" | "expert"

  "createdAt": "2026-04-01T10:32:00Z",
  "updatedAt": "2026-04-03T14:15:00Z"
}
FieldTypeRequiredDescription
idURIrequiredStable permanent URI. Format: [base]/exp/[id]. Never changes once set.
organisationstringrequiredName of the organisation or client. For freelance work, use client name or "Independent".
rolestringrequiredProfessional role or title during this experience.
startDateYYYY-MMrequiredMonth-level precision. Full ISO 8601 dates accepted but only month-year displayed.
endDateYYYY-MMoptionalOmit if isCurrent: true. Must not be present together with isCurrent: true.
isCurrentbooleanoptionalDefault: false.
contextstringrequiredSituational background. Where, what organisation, what was the starting state. Max 600 chars.
challengestringrequiredThe specific problem or challenge this experience addressed. Max 400 chars.
contributionstringrequiredWhat this person specifically did. First person. Max 600 chars.
resultstringrequiredMeasurable outcome. Quantified where possible. Max 400 chars.
learningstringoptionalWhat was learned. Differentiates this standard from a CV. Max 300 chars.
verificationRefsURI[]optionalReferences to PeerVerification objects that validate this specific record.
writingStyle"direct" | "grounded" | "expert"optionalWriting style variant used when this record was created.

02Peer VerificationCore · The Moat

A Peer Verification is a public statement by a named individual confirming a specific Experience Record. The verifier stakes their professional identity — name, role, organisation — on the confirmation. This is the property AI cannot fake: a real person acting publicly.

Mutual verifications (A verifies B and B verifies A) are valid but must be explicitly flagged via mutualFlag: true. Consuming applications must surface this to users.
PeerVerification — full example
{
  "@type": "PeerVerification",
  "id": "upstand.work/thomas-weber/ver/001",

  // Which experience this validates
  "experienceRef": "upstand.work/thomas-weber/exp/001",

  // The verifier — public, with skin in the game
  "verifier": {
    "name": "Maria Hoffmann",
    "role": "Chief Financial Officer",
    "organisation": "Continental AG",
    "emailDomain": "continental.com",  // domain only — never full email
    "emailDomainType": "corporate",  // "corporate" | "personal"
    "linkedinUrl": "https://linkedin.com/in/maria-hoffmann"  // optional
  },

  // The statement — text or one-click
  "statement": "Thomas led the project with a precision I rarely see. Deadline met, budget intact, under significant pressure.",
  "statementType": "text",  // "text" | "one-click"

  // Integrity signals
  "mutualFlag": false,  // true if verifier also has a profile verified by subject
  "withdrawnAt": null,  // ISO timestamp if withdrawn — null if active

  "issuedAt": "2026-04-05T09:14:00Z"
}
FieldTypeRequiredDescription
idURIrequiredStable permanent URI. Format: [base]/ver/[id].
experienceRefURIrequiredReference to the ExperienceRecord being verified. Must be a valid, existing record URI.
verifier.namestringrequiredFull name. Publicly visible.
verifier.rolestringrequiredRole at time of collaboration. Publicly visible.
verifier.organisationstringrequiredOrganisation at time of collaboration. Publicly visible.
verifier.emailDomainstringrequiredDomain only — never the full email address. Used as a trust signal.
verifier.emailDomainType"corporate" | "personal"requiredCorporate email domains carry higher weight. Must be derived from a validated lookup.
statementstringoptionalThe verifier's words. Max 500 chars. May be absent if statementType: "one-click".
statementType"text" | "one-click"required"one-click" verifications carry name and organisation but no text statement.
mutualFlagbooleanrequiredMust be true if the verified subject also has a verification from this verifier. Never omit.
withdrawnAtISO 8601 | nullrequirednull when active. Timestamp when withdrawn. Withdrawn verifications must be removed from public display.

03Human ProofCore

Human Proof is evidence that a real person controls this profile — not an AI agent or automated system. In the context of AI-generated credential inflation, this is a structural requirement of the standard.

!Human Proof does not guarantee identity in a legal sense. It guarantees that a human controls the profile. Implementations may layer additional identity verification on top of this standard.
HumanProof object
{
  "@type": "HumanProof",

  // Minimum viable proof: email-verified profile
  "verified": true,
  "method": "email-magic-link",
  // "email-magic-link" | "peer-verification-chain" | "document-verified"

  // Stronger proof: derived from active peer verifications
  "peerVerificationCount": 3,
  // Profiles with ≥1 verified peer carry inherently stronger human proof

  // Timestamp of last proof action
  "lastVerifiedAt": "2026-04-05T09:14:00Z",

  // Optional: document verification (future)
  "documentVerification": null
}
FieldTypeRequiredDescription
verifiedbooleanrequiredWhether human proof has been established. Must be false until at least one method is completed.
methodstringoptionalThe primary method used. Required if verified: true.
peerVerificationCountintegeroptionalNumber of active peer verifications. Serves as a secondary human proof signal. Automatically derived — do not set manually.
lastVerifiedAtISO 8601optionalWhen proof was last confirmed. Required if verified: true.

04Portable IdentityCore

Portable Identity defines how a complete professional identity document is exported, imported, and transferred between platforms. Data sovereignty requires that the export format is open, human-readable, and machine-processable without vendor lock-in.

Export envelope — portableIdentity.json
{
  "@context": "https://openworkid.org/v1",
  "@type": "PortableIdentityExport",

  // Export metadata
  "exportedAt": "2026-04-10T08:00:00Z",
  "exportedBy": "upstand.work",
  "standardVersion": "0.1.0",
  "schemaUrl": "https://openworkid.org/v1",

  // The complete identity document
  "identity": {
    "@type": "ProfessionalIdentity",
    "id": "upstand.work/thomas-weber",
    "name": "Thomas Weber",
    "humanProof": { /* ... */ },
    "experience": [ /* all ExperienceRecord objects */ ],
    "verifications": [ /* all PeerVerification objects */ ],
    "extensions": [ /* all Extension objects */ ]
  },

  // Note on verifications portability
  "verificationPortabilityNote": "Peer verifications are included as historical records. The trust graph they form is anchored to the original platform. Importing platforms must re-request verifications to establish trust on their own domain."
}
Verifications in an export are historical records only. The trust graph is anchored to the platform where verifications were issued. An importing platform must re-request verifications to establish trust within its own domain.

05ExtensionsCore

Extensions are modular, profession-specific field sets that attach to a ProfessionalIdentity. The core schema is universal — extensions are what make a Psychotherapist's profile structurally different from a Software Engineer's. Each extension is independently versioned and adoptable.

Extension schema — software-engineer example
{
  "@type": "Extension",
  "extensionId": "openworkid.org/extensions/software-engineer",
  "extensionVersion": "1.0.0",

  // Extension-specific fields
  "fields": {
    "primaryLanguages": ["TypeScript", "Python", "Rust"],
    "frameworks": ["Next.js", "FastAPI"],
    "cloudProviders": ["AWS", "Vercel"],
    "openSourceContributions": [
      { "repo": "https://github.com/...", "role": "contributor" }
    ],
    "seniority": "senior",
    // "junior" | "mid" | "senior" | "principal" | "staff"
    "remotePreference": "remote-only"
    // "on-site" | "hybrid" | "remote-only" | "flexible"
  }
}
Extension schema — psychotherapist example
{
  "@type": "Extension",
  "extensionId": "openworkid.org/extensions/psychotherapist",
  "extensionVersion": "1.0.0",

  "fields": {
    "approbationStatus": "approbiert",
    "therapeuticApproach": ["VT", "Schema-Therapie", "EMDR"],
    // "VT" | "TP" | "AP" | "Systemisch" | "DBT" | "EMDR" | "Schema" | ...
    "setting": ["Einzeltherapie", "Gruppentherapie"],
    "targetGroups": ["Erwachsene", "Trauma"],
    "kassenzulassung": true,
    "languages": ["de", "en"],

    // Regulatory compliance flag — rendered as visible hint in UI
    "regulatoryNotice": "Als Psychotherapeut gelten besondere Datenschutz- und Werbebeschränkungen. Keine Patientenfälle — auch nicht anonymisiert — ohne ausdrückliche schriftliche Einwilligung."
  }
}
FieldTypeRequiredDescription
extensionIdURIrequiredCanonical URI of the extension definition. Must resolve to valid extension schema.
extensionVersionsemverrequiredVersion of the extension schema used. Implementations must not silently upgrade.
fieldsobjectrequiredExtension-specific fields as defined by the extension schema. Unrecognised fields must be preserved but may be ignored in display.
fields.regulatoryNoticestringoptionalIf present in an extension definition, this string must be displayed visibly in any profile editor for this profession. Not optional for implementations.

Complete Example

A complete, valid upstand.work standard document combining all five core concepts.

thomas-weber.upstandwork.json — complete document
{
  "@context": "https://openworkid.org/v1",
  "@type": "ProfessionalIdentity",
  "id": "upstand.work/thomas-weber",
  "name": "Thomas Weber",
  "summary": "Senior Finance Controller with 20 years in automotive. Built the reporting infrastructure Continental still runs on. Now available as a freelance consultant.",
  "visibility": "public",
  "availableForWork": true,
  "createdAt": "2026-04-01T10:32:00Z",
  "updatedAt": "2026-04-10T14:00:00Z",

  "humanProof": {
    "@type": "HumanProof",
    "verified": true,
    "method": "email-magic-link",
    "peerVerificationCount": 3,
    "lastVerifiedAt": "2026-04-05T09:14:00Z"
  },

  "experience": [
    {
      "@type": "ExperienceRecord",
      "id": "upstand.work/thomas-weber/exp/001",
      "organisation": "Continental AG",
      "role": "Senior Finance Controller",
      "startDate": "2019-03",
      "endDate": "2022-11",
      "isCurrent": false,
      "context": "Automotive group, 23 sites across 12 countries. No unified financial reporting.",
      "challenge": "Build consolidated real-time reporting in time for next board cycle.",
      "contribution": "Led cross-functional team of 6. Designed data model, negotiated access across regions, ran parallel pilots in DE and CN.",
      "result": "Delivered in 8 months — 6 ahead of plan. Foundation for all board-level decisions. Still in use.",
      "learning": "Stakeholder alignment across cultures is harder than the technology.",
      "writingStyle": "direct",
      "verificationRefs": [
        "upstand.work/thomas-weber/ver/001",
        "upstand.work/thomas-weber/ver/002"
      ]
    }
  ],

  "verifications": [
    {
      "@type": "PeerVerification",
      "id": "upstand.work/thomas-weber/ver/001",
      "experienceRef": "upstand.work/thomas-weber/exp/001",
      "verifier": {
        "name": "Maria Hoffmann",
        "role": "Chief Financial Officer",
        "organisation": "Continental AG",
        "emailDomain": "continental.com",
        "emailDomainType": "corporate"
      },
      "statement": "Thomas led the project with a precision I rarely see. On time, on budget, under pressure.",
      "statementType": "text",
      "mutualFlag": false,
      "withdrawnAt": null,
      "issuedAt": "2026-04-05T09:14:00Z"
    },
    {
      "@type": "PeerVerification",
      "id": "upstand.work/thomas-weber/ver/002",
      "experienceRef": "upstand.work/thomas-weber/exp/001",
      "verifier": {
        "name": "Stefan Berger",
        "role": "VP Finance",
        "organisation": "BMW Group",
        "emailDomain": "bmw.com",
        "emailDomainType": "corporate"
      },
      "statement": null,
      "statementType": "one-click",
      "mutualFlag": false,
      "withdrawnAt": null,
      "issuedAt": "2026-04-06T11:02:00Z"
    }
  ],

  "extensions": [
    {
      "@type": "Extension",
      "extensionId": "openworkid.org/extensions/finance-controller",
      "extensionVersion": "1.0.0",
      "fields": {
        "specialisations": ["FP&A", "Reporting", "Business Intelligence"],
        "systems": ["SAP", "Power BI", "Cognos"],
        "industries": ["Automotive", "Manufacturing"],
        "rateRange": { "min": 900, "max": 1200, "currency": "EUR", "unit": "day" }
      }
    }
  ]
}

Stable URI Requirements

All objects in the standard are identified by stable, permanent URIs. These URIs are referenced by external systems, AI agents, and other profiles. They must never change once published.

URI structure
// Profile root
upstand.work/[username]

// Experience Records
upstand.work/[username]/exp/001
upstand.work/[username]/exp/002

// Peer Verifications
upstand.work/[username]/ver/001
upstand.work/[username]/ver/002

// Extensions
openworkid.org/extensions/[slug]
openworkid.org/extensions/[slug]@1.0.0  // versioned reference
!Username changes are permitted once. When a username changes, the old URI must redirect (HTTP 301) for a minimum of 6 months. After that, the old URI may return 410 Gone. External references that relied on the old URI are not guaranteed to update.


License & Governance

The upstand.work standard is published under the MIT License. No permission is required to implement it. The governance model transitions in three phases as adoption grows.

PhaseTriggerControl
Phase 1 — NowActiveupstand.work controls the schema. All changes via public GitHub PRs. MIT License. Transparent changelog.
Phase 2 — Steering Group3–5 external platforms adoptGitHub Organization with RFC process. No formal foundation yet. All adopters have voice.
Phase 3 — FoundationStandard is establishedNeutral foundation owns the standard. Self-funded by Verified Employer Program revenue. No single company controls it.