The companion standard for job postings
open.rooster.jobs is the employer-side twin of open.rooster.cv. Where the resume protocol describes a candidate as clean, portable data, this one describes an opening the same way. Because both sides share the same vocabularies — employment types, compensation periods, remote modes, and location codes — a posting and a profile line up field for field, and matching stops being guesswork.
{
"protocol": { "name": "open.rooster.jobs", "version": "0.1" },
"posting": {
"title": "Senior Analyst",
"employmentType": "full_time"
},
"company": { "name": "Northstar Apps" },
"compensation": { "min": 90000, "currency": "USD", "period": "year" },
"location": { "city": "Austin", "country": "US", "remote": "hybrid" },
"requirements": { "requiredSkills": ["SQL", "Python"], "minYears": 3 },
"metadata": { "language": "en-US" }
}Why a structured job posting?
The other side of the match
Where open.rooster.cv describes a candidate, open.rooster.jobs describes an opening — the same shared vocabularies on both sides make matching lossless.
One schema, many boards
A single JSON Schema describes the role, company, compensation, location, and requirements — so any conforming job board or ATS can read or render it.
No vendor lock-in
A posting belongs to the employer who wrote it. The protocol is open and portable, not tied to any single job board or applicant tracking system.
Aggregator-friendly ingestion
Structured data removes brittle HTML scraping. Aggregators and search engines can import clean fields directly from the source.
Validated end to end
AJV-based validation against open.rooster.jobs/0.1 guarantees postings are well-formed before they are published or exchanged.
Extensible
An extensions mechanism lets domains (staffing, government, healthcare) add fields without breaking the core.
Serializes losslessly to schema.org JobPosting
Adopting open.rooster.jobs costs you nothing on the search side: every document maps directly to the schema.org JobPosting JSON-LD that Google for Jobs indexes — so publishers keep their search traffic and gain a clean, agent-readable feed. RoosterCV embeds this markup on every public posting.
| open.rooster.jobs/0.1 | schema.org JobPosting |
|---|---|
| posting.title | title |
| posting.description | description |
| posting.postedAt / metadata.createdAt | datePosted |
| posting.expiresAt | validThrough |
| posting.employmentType | employmentType (FULL_TIME, PART_TIME, …) |
| company.name / company.website | hiringOrganization (Organization) |
| location.city / region / country | jobLocation (Place → PostalAddress) |
| location.remote = "remote" | jobLocationType: TELECOMMUTE |
| compensation.{min,max,currency,period} | baseSalary (MonetaryAmount → QuantitativeValue) |
| requirements.requiredSkills | skills |
| requirements.minYears | experienceRequirements (monthsOfExperience) |
| source.applyUrl | url |
What the open standard adds beyond JobPosting: ghost-job accountability — posting.status, hard expiresAt, and provenance stamps — the machine-readable vacancy-status disclosure that regulations like Ontario's (effective Jan 2026) now imply.
Try it in two minutes
Job converter
Paste any posting → validated open.rooster.jobs JSON. Free, no account.
Validator
Check documents against the schema in the browser or over the public API.
Company feeds
Every RoosterCV employer board is served at /api/feeds/{company} — CORS-open for agents and aggregators.
For developers
Build job importers, exporters, and integrations against a stable JSON Schema. Validate with any JSON Schema 2020-12 validator. It shares vocabularies with open.rooster.cv, so a single vocabulary layer serves both sides of the match.
The resume standard →For HR teams
Publish postings once as structured data and syndicate them anywhere — no re-keying, no lost fields. Because postings and profiles speak the same protocol, our matching tools can score candidates against your roles directly.
See the HR platform →