Open Standard · MIT License · v0.2

Open Job Protocol

A machine-first, vendor-neutral JSON standard for job opportunities — with flat, agent-optimized fields aligned with OTP v0.2 for bilateral matching.

Why Open Job Protocol?


Job postings today are unstructured prose optimized for SEO, not for AI agents. schema.org/JobPosting serves Google, not hiring agents. Every ATS, job board, and company career page uses a different format. Critical signals like salary, remote policy, and team composition are buried in paragraphs or missing entirely.

Open Job Protocol (OJP) fixes this. v0.2 restructures postings into flat, snake_case top-level fields with strict additionalProperties: false, direct alignment with OTP v0.2 field names, and ESCO taxonomy support for skills. OJP is the employer half of a bilateral ecosystem — its companion standard, the Open Talent Protocol, handles the candidate and profile side.

Goal What it means in practice
Machine-first JSON is the canonical format. Flat top-level fields, snake_case keys, and strict additionalProperties: false for reliable parsing.
Employer-controlled salary_transparency lets employers decide when to disclose compensation. No data is shared without explicit intent.
Agent-ready must_have and nice_to_have are structured objects agents can filter and rank on — not prose to be parsed.
OTP-aligned Field names map directly to OTP v0.2salary_band, seniority, skill level, and CEFR language proficiencies match exactly.
Vendor-neutral MIT licensed. No required registry, platform, or ATS.
Interoperable Mappable to schema.org/JobPosting, Google for Jobs, LinkedIn Job Posting API, and HR-XML. Full v0.1 migration guide included.

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-job-protocol.git
cd open-job-protocol/tools/validator-cli
npm install && npm run build

# Validate one of the v0.2 example documents
node dist/index.js ../../examples/v0.2/backend-engineer-senior.json
✓ Valid Open Job Protocol document

Minimal valid document

A valid v0.2 document needs only the 10 required top-level fields. Everything else — salary, requirements, team, process — is optional.

{
  "schema_version": "0.2.0",
  "ojp_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "created_at": "2026-03-30T10:00:00Z",
  "updated_at": "2026-03-30T10:00:00Z",
  "status": "active",
  "title": "Senior Frontend Engineer",
  "description": "Build and maintain our React-based product...",
  "employment_type": "full_time",
  "organization": { "name": "Acme Corp" },
  "location": { "arrangement": "hybrid" }
}

Schema reference


The full schema is a JSON Schema (draft 2020-12) document at schema/v0.2/ojp.schema.json. Below, each section is documented with its fields, types, and intent.

Looking for v0.1? The v0.1 schema remains available. See the v0.1 → v0.2 migration guide for a full field mapping.

Every OJP v0.2 document must include these 10 required fields.

PropertyTypeReq.Description
schema_version string yes Must be "0.2.0".
ojp_id uuid yes Unique job posting identifier.
created_at date-time yes Posting creation timestamp (ISO 8601).
updated_at date-time yes Last modification timestamp (ISO 8601).
status enum yes Lifecycle status:
draftactivepaused closedexpiredfilled
title string yes Job title (max 200).
description string yes Full role description (max 5000).
employment_type enum yes
full_timepart_timecontract freelanceinternshiptemporary
organization object yes Hiring entity. See organization.
location object yes Work location and arrangement. See location.

Optional top-level fields

PropertyTypeDescription
valid_through date Posting expiration date.
summary string One-paragraph agent-optimized role summary (max 500).
seniority enum Matches OTP seniority exactly:
internjuniormid seniorstafflead principaldirectorvpc_level
function string Organizational function (max 100). E.g. "Engineering", "Sales".
total_openings integer Number of open positions (min 1).
salary_transparency enum When salary is disclosed:
publicon_requestafter_interview

The hiring entity. Only name is required within this object.

PropertyTypeReq.Description
namestringyesCompany name (max 200).
urlurinoCompany website.
industrystringnoPrimary industry (max 100).
sizeenumno Matches OTP preferences.company_size:
startupscale_upmid_marketenterprise
departmentstringnoHiring department (max 100).
headquartersstringnoHQ location (max 200).

Work location and arrangement. Only arrangement is required.

PropertyTypeReq.Description
arrangementenumyes Matches OTP work_model:
onsitehybridremote
countrystringnoISO 3166-1 alpha-2. Matches OTP location.country.
citystringnoCity name (max 100).
regionstringnoState or region (max 100).
remote_regionsstring[]noISO 3166-1 alpha-2 country codes for remote eligibility.
relocation_supportbooleannoWhether relocation assistance is offered.
visa_sponsorshipbooleannoWhether visa sponsorship is available.

Compensation range. Same structure as OTP salary_band for bilateral matching.

PropertyTypeReq.Description
minnumberyesMinimum salary.
maxnumberyesMaximum salary.
currencystringyesISO 4217 currency code (e.g. "EUR", "USD").
periodenumyes
annualmonthlydailyhourly

Hard requirements — candidates must meet all of these. An OJP-compliant agent must not present a candidate who fails any must_have constraint.

PropertyTypeDescription
skillsskill_requirement[]Each: name (required), min_level (1–5, maps to OTP skills[].level), min_years, esco_id.
experience_yearsobjectmin and optional max.
credentialsstring[]Required degrees or qualifications (max 200 each).
certificationsstring[]Required certifications (max 200 each). E.g. "CKA", "ACLS".
languageslanguage_requirement[] Each: language (ISO 639-1), proficiency (CEFR):
A1A2B1B2C1C2native
Matches OTP languages[].proficiency exactly.
work_authorizationstring[]ISO 3166-1 alpha-2 country codes. Matches OTP visa_status.authorized_countries.

Preferred qualifications — bonus scoring, not hard filters.

PropertyTypeDescription
skillsskill_requirement[]Same shape as must_have.skills.
experience_yearsobjectpreferred years.
credentialsstring[]Preferred qualifications.
certificationsstring[]Preferred certifications.
languageslanguage_requirement[]Same shape as must_have.languages.
Design note: The must_have / nice_to_have split is the key agent differentiator. An OJP-compliant agent must treat must_have as a hard filter and nice_to_have as ranking signal. This is a hard rule, not a hint.

Array of benefits offered by the employer.

PropertyTypeReq.Description
categoryenumyes
healthretirementdevelopment flexibilityfamilyfinancialother
descriptionstringyesBenefit details (max 500).

Team composition and context for culture matching.

PropertyTypeDescription
namestringTeam or squad name (max 100).
sizeintegerCurrent team size.
reports_tostringHiring manager title (max 200).
tech_stackstring[]Team's technology stack (max 100 each).
methodologystringWork methodology (max 100). E.g. "scrum", "kanban".
descriptionstringTeam mission and purpose (max 1000).

Hiring process transparency — stages, timeline, and application method.

PropertyTypeDescription
stageshiring_stage[] Each: name, type:
screeningtechnicalbehavioral case_studytake_homeofferother
and optional duration_minutes.
total_duration_daysintegerTarget time-to-offer in days.
decision_timelinestringWhen candidates hear back (max 200).
application_urluriWhere to apply.
accepts_otp_profilebooleanWhether OTP profiles are accepted as applications.
ai_screeningbooleanTransparency: is AI used in candidate screening?

Culture signals for work-style and values matching.

PropertyTypeDescription
valuesstring[]Core company values (max 100 each).
work_stylestring[]Work style descriptors (max 100 each). E.g. "async-first", "low-meeting".

Data provenance — which agent or system created this posting.

PropertyTypeReq.Description
agent_idstringyesIdentifier of the agent or system (max 200).
platformstringnoPlatform name (max 200). E.g. "lever", "greenhouse".

OTP ↔ OJP bilateral matching


Symmetric matching between OTP v0.2 candidate profiles and OJP v0.2 job listings. An agent with both documents can compute a bilateral match score without any natural language processing.

OTP v0.2 (Candidate)OJP v0.2 (Job)Match typeLogic
skills[].name / .levelmust_have.skills[].name / .min_levelhard filterSkill name match + level ≥ min_level
skills[]nice_to_have.skills[]soft rankBonus score for matching preferred skills
certifications[]must_have.certifications[]hard filterCertification name match
experience[].durationmust_have.experience_years.minhard filterSum of durations ≥ min
languages[].proficiencymust_have.languages[].proficiencyhard filterCEFR level ≥ required level
salary_bandsalary_bandbilateralcandidate.min ≤ job.max AND job.min ≤ candidate.max
work_modellocation.arrangementhard filterArrangement in candidate's work_model array
visa_status.authorized_countriesmust_have.work_authorizationhard filterCandidate authorized in required country
senioritysenioritysoft rankExact or adjacent match
preferences.culture_valuesculture.valuessoft rankOverlap scoring

Discovery


Employers host a well-known discovery file so agents can find all active listings without scraping.

# https://acme.com/.well-known/ojp.json

{
  "version": "0.2.0",
  "organization": "Acme Corp",
  "jobs_url": "https://acme.com/api/jobs.ojp.json",
  "total_active_jobs": 12,
  "updated_at": "2026-03-28T14:00:00Z",
  "accepts_otp_profile": true,
  "contact": "careers@acme.com"
}

Examples


Three schema-conforming v0.2 documents are included in the repository. They demonstrate how must_have/nice_to_have, salary_band, and process are used across different industries and seniority levels.

Tools


Validator CLI

A Node.js CLI that validates any JSON file against the OJP schema and prints readable errors. Source: tools/validator-cli/

cd tools/validator-cli
npm install && npm run build
node dist/index.js path/to/job.json

Agent tools

TypeScript stubs for integrating OJP into MCP-compatible agent frameworks. Source: tools/agent-examples/

Provides composable functions ready to be registered as MCP tools: validateJobPosting, matchCandidateToJob, and introspectJobPosting.

MCP server

A standalone MCP server exposing all 6 OTP/OJP agent tools (validate, introspect, parse for both schemas). Source: tools/mcp-server/ (hosted in the OTP repo).

Migration


OJP is designed to be clearly mappable to and from existing job posting formats.

FormatGuideNotes
OJP v0.1 v0.2-migration.md Full field mapping from nested (meta, role, offering) to flat top-level structure. v0.1 schema remains available.
schema.org/JobPosting migration-schemaorg.md Full field-by-field mapping. OJP is a superset of schema.org’s job properties.
HR-XML migration-hrxml.md Conceptual guide. HR-XML’s PositionOpening maps to OJP without data loss.
LinkedIn Job Posting API migration-linkedin.md Maps LinkedIn’s foundation schema fields to OJP sections.

Ecosystem


OJP defines the employer side of agentic marketplaces. It is designed to work alongside complementary open standards that together cover both sides of the hiring equation.

Open Talent Protocol (OTP) is the candidate-side counterpart to OJP — a machine-first, vendor-neutral JSON standard for structuring professional profiles. OTP v0.2 uses progressive disclosure tiers to control how much data is revealed at each stage of matching, so 80% of agent traffic can run on the cheapest models.

opentalentprotocol.org · GitHub repository

Together, OTP + OJP enable fully structured, agent-driven bilateral matching. Employers express requirements and offer details in an OJP posting; candidates express preferences and constraints in their OTP profile. Agents on both sides can evaluate fit and negotiate programmatically — no unstructured job-board listings or PDF resumes required.

Governance & neutrality


Open Job 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.

OJP is the employer-side counterpart to Open Talent Protocol. Together, they form a complete, open standard for agentic talent marketplaces. The same community develops both protocols.

The project is governed by a maintainer council using lazy consensus. See GOVERNANCE.md for the full process.

Licensed under MIT. The spec will always be free to implement.