Open Talent Protocol
A machine-first, vendor-neutral JSON standard for professional profiles — designed for humans, agents, and the agentic talent marketplaces of tomorrow.
Why Open Talent Protocol?
Existing resume formats — PDF, Word, LinkedIn exports — were designed for humans reading documents. As autonomous hiring agents and career assistants become real, we need a format that software can reason over reliably.
Open Talent Protocol (OTP) is that format. It encodes the things that matter to agents: structured preferences for matching, verification and provenance for trust, and privacy controls so candidates decide what to share and with whom.
| Goal | What it means in practice |
|---|---|
| Machine-first | JSON is the canonical format. PDF/HTML rendering is out of scope and done by separate tooling. |
| Candidate-controlled | The visibility section is first-class. Candidates decide what to share, with whom, and when. |
| Agent-ready | preferences, verification, and impact are structured fields agents can act on — not prose to be parsed. |
| Vendor-neutral | MIT licensed. No required registry, platform, or identity provider. |
| Interoperable | Clearly mappable to JSON Resume, HR-XML, and schema.org vocabularies. |
Quick start
Validate a document
The validator CLI checks any JSON file against the schema and prints readable errors.
# Install and build the validator git clone https://github.com/neogene-ai/open-talent-protocol.git cd open-talent-protocol/tools/validator-cli npm install && npm run build # Validate one of the example documents node dist/index.js ../../examples/developer-junior.json ✓ Valid Open Talent Protocol document
Minimal valid document
Only meta and identity are required. Everything else is optional.
{
"meta": {
"schemaVersion": "0.1",
"language": "en",
"source": "user"
},
"identity": {
"fullName": "Ada Lovelace",
"contact": {
"email": "[email protected]",
"location": { "city": "London", "country": "GB" }
}
}
}
Schema reference
The full schema is a JSON Schema (draft 2020-12) document at
schema/opentalent-protocol.schema.json.
Below, each section is documented with its fields, types, and intent.
meta and identity are required at the top level.
All other sections are optional, so you can start minimal and add richness incrementally.
Document-level metadata describing the schema version, language, and provenance of the document itself.
| Property | Type | Req. | Description |
|---|---|---|---|
| schemaVersion | string | yes | Must be "0.1". Used by parsers to select the correct validation rules. |
| language | string | no | BCP 47 language tag of the document's primary language. Default: "en". |
| lastUpdated | date-time | no | ISO 8601 timestamp of the last modification. |
| source | string | no | System or actor that last wrote this document. Examples: "user", "import:jsonresume", "agent". |
| dataController | string | no | Legal data controller responsible for this document (GDPR Art. 4(7) hook). May be a name, URI, or platform-assigned ID. |
| subjectId | string | no | Stable, portable identifier for the human subject. Not necessarily an email; may be a DID or platform ID. Enables de-duplication and agent ownership. |
Core personal and contact information. The only required property within identity is fullName.
| Property | Type | Req. | Description |
|---|---|---|---|
| fullName | string | yes | Legal full name. |
| preferredName | string | no | Name the person prefers to be called (first name or nickname). |
| pronouns | string | no | Preferred pronouns, free-form. Examples: "she/her", "they/them". |
| contact | object | no | Contains email, phone, location (city / region / country / postalCode), and timezone (IANA name). |
| profiles | array | no | Online profiles. Each item: network (e.g. "github"), url, optional username. |
| workAuthorization | object | no | Contains description (free text), authorizedCountries (ISO 3166-1 alpha-2 array), and requiresSponsorship (boolean). |
A short professional summary written in first or third person. Plain text only — no markup.
Agents may use this as context in a system prompt but should not rely on it for structured matching;
use preferences and skills for that.
Chronological work history array, most recent first. Each entry represents one position.
| Property | Type | Req. | Description |
|---|---|---|---|
| organization | string | yes | Employer or client name. |
| role | string | yes | Job title or role name. |
| startDate | date | yes | ISO 8601 date (YYYY-MM-DD). |
| endDate | date | no | Omit if current; use current: true instead. |
| current | boolean | no | Set to true for current position. |
| employmentType | enum | no |
One of:
full-timepart-timecontract
freelanceinternshipvolunteerother
|
| highlights | string[] | no | Bullet-point accomplishments. Plain text. |
| impact | array | no | Quantified impact objects. Each: metric, value (string), optional period. Designed for agent-driven ranking. |
| tags | string[] | no | Free-form domain or technology tags for search and matching. |
| verification | object | no | See verification object. |
Formal education history. Each entry requires institution and degree.
| Property | Type | Req. | Description |
|---|---|---|---|
| institution | string | yes | Name of the institution. |
| degree | string | yes | Degree type, e.g. "Bachelor of Science", "Ausbildung". |
| field | string | no | Field or major of study. |
| startDate / endDate | date | no | ISO 8601 dates. |
| grade | string | no | Final grade in the institution's own notation. |
| highlights | string[] | no | Thesis, clubs, awards, relevant courses. |
| verification | object | no | See verification object. |
Normalized skill inventory. Designed to be machine-matchable across profiles —
use canonical names ("TypeScript" not "TS") and consistent levels.
| Property | Type | Req. | Description |
|---|---|---|---|
| name | string | yes | Canonical skill name. |
| level | enum | no |
beginnerintermediateadvancedexpert
|
| category | string | no | E.g. "programming language", "framework", "soft skill", "clinical". |
| lastUsed | date | no | When this skill was last actively used. |
| yearsOfExperience | number | no | Approximate years of practical experience. |
| verification | object | no | See verification object. |
Selected personal, open-source, or professional projects that demonstrate skills.
| Property | Type | Req. | Description |
|---|---|---|---|
| name | string | yes | Project name. |
| description | string | no | What the project does and why it matters. Plain text. |
| role | string | no | The person's role in the project. |
| technologies | string[] | no | Technologies or tools used. |
| links | array | no | Each item: label (e.g. "GitHub") and url. |
Degrees, professional certifications, and regulated licenses.
| Property | Type | Req. | Description |
|---|---|---|---|
| name | string | yes | Credential name, e.g. "AWS Certified Solutions Architect", "RN License". |
| issuer | string | yes | Issuing organization. |
| issueDate | date | no | Date of issue. |
| expiryDate | date | no | Expiry date, if applicable. |
| credentialId | string | no | Certificate or license ID for public verification. |
| url | uri | no | Link to the credential record or badge. |
| verification | object | no | See verification object. |
Human language proficiencies.
| Property | Type | Req. | Description |
|---|---|---|---|
| code | string | yes | BCP 47 language tag, e.g. "de", "pt-BR". |
| name | string | yes | Human-readable name, e.g. "German". |
| level | enum | no |
CEFR scale:
A1A2B1B2C1C2native
|
Job search preferences — the primary input for agentic matching. Agents filter on
preferences before reading work history. This is the most important section
for agentic marketplace use cases.
constraints the role violates. This is a hard rule, not a hint.
| Property | Type | Req. | Description |
|---|---|---|---|
| desiredRoles | string[] | no | Job titles or role types the candidate is actively seeking. |
| industries | string[] | no | Industries or verticals of interest. |
| locations | string[] | no | Preferred cities, regions, or countries. |
| workModes | enum[] | no |
remotehybridonsite
|
| salary | object | no | min, max (numbers), currency (ISO 4217), period (annual/monthly/daily/hourly), negotiable (boolean). |
| workHours | enum[] | no |
full-timepart-timecontractfreelance
|
| constraints | object | no | noticePeriod, availableFrom (date), travelWillingness (none/occasional/frequent), notes (free text for non-negotiables). |
Reusable portfolio artifacts and proof-of-work items. Each item is linked to specific skills.
| Property | Type | Req. | Description |
|---|---|---|---|
| type | enum | yes |
codearticleportfolio
test-resultpublicationtalkother
|
| title | string | yes | Title of the artifact. |
| url | uri | yes | Link to the artifact. |
| description | string | no | What this artifact demonstrates. |
| relatedSkills | string[] | no | Names of skills (from skills[]) this artifact supports. |
| issuer | string | no | Platform or organization hosting this artifact. |
| verification | object | no | See verification object. |
Provenance and trust metadata. Appears in two places:
(1) as a top-level section recording document-level provenance, and
(2) as an optional nested object on individual work, education,
skills, credentials, and evidence items.
Document-level fields
| Property | Type | Req. | Description |
|---|---|---|---|
| createdBy | enum | no | user platform agent import |
| createdAt | date-time | no | When the document was first created. |
| updatedBy | string | no | Actor that last updated the document. |
| integrity | string | no | Content hash for tamper detection. Format: "<algorithm>:<hex-digest>", e.g. "sha256:abc123…". Informational in v0.1. |
Item-level verification object
| Property | Type | Req. | Description |
|---|---|---|---|
| level | enum | no |
How this item was verified:
selftestissuerplatform
self = self-reported · test = passed an assessment · issuer = confirmed by the credential issuer · platform = verified by the hosting platform.
|
| issuerName | string | no | Name of the verifying entity. |
| issuerType | enum | no | company school cert-provider platform other |
| issuedAt | date | no | When the verification was performed. |
| url | uri | no | Link to the verification artifact or badge. |
Privacy controls. Set a default visibility level for the whole document, then override specific fields using JSON Pointer paths.
| Property | Type | Req. | Description |
|---|---|---|---|
| defaultVisibility | enum | no |
Baseline for the document:
publicrecruitersprivate
public = anyone · recruiters = authenticated employer-side actors · private = owner only.
|
| overrides | array | no |
Array of { path, visibility } objects. path is a
JSON Pointer
(RFC 6901), e.g. "/identity/contact/phone". Overrides apply on top of
defaultVisibility.
|
"visibility": { "defaultVisibility": "recruiters", "overrides": [ { "path": "/identity/contact/phone", "visibility": "private" }, { "path": "/preferences/salary", "visibility": "recruiters" } ] }
A free extension object for domain-specific or proprietary fields. Use namespaced keys to avoid collisions with future spec additions.
"custom": { "jobgrow:talentScore": 94, "myapp:internalId": "cand-00421" }
Adding data to custom never breaks a conforming parser. Removing custom never breaks core functionality.
Examples
Three complete, schema-conforming documents are included in the repository. They illustrate
how preferences, verification, and visibility are used
in practice, and demonstrate that the schema is not developer-centric.
Tools
Validator CLI
A Node.js CLI that validates any JSON file against the OTP schema and prints readable errors.
Source: tools/validator-cli/
cd tools/validator-cli npm install && npm run build node dist/index.js path/to/profile.json
Agent tools
TypeScript stubs for integrating OTP into MCP-compatible agent frameworks.
Source: tools/agent-examples/
Provides two composable functions ready to be registered as MCP tools:
validateProfile and introspectProfile.
Migration
OTP is designed to be clearly mappable to and from existing formats.
| Format | Guide | Notes |
|---|---|---|
| JSON Resume | migration-json-resume.md | Full field-by-field table. OTP is a superset; mapping is lossless for all core fields. |
| HR-XML | migration-hrxml.md | High-level conceptual guide. Internal ATS fields (recruiter notes, workflow state) are intentionally dropped. |
Governance & neutrality
Open Talent Protocol is vendor-neutral. JobGrow and neogene.ai are its initial sponsors, but the spec is designed for broad ecosystem adoption. No single company has veto power over the schema.
The project is governed by a maintainer council using lazy consensus. See GOVERNANCE.md for the full process, and docs/governance-roadmap.md for the long-term direction (including possible neutral foundation hosting).
Licensed under MIT. The spec will always be free to implement.