JobPosting
JobPosting is one of Google's strictest schema types. The Google for Jobs rich result (the dedicated SERP card with salary, employment type, location, and experience filters) has some of the tightest requirements of any rich result, and missing or wrong fields silently disqualify you from the card without any error message.
Getting it right is worth the effort. A job listing with complete, correct markup can earn 10x the impressions of a plain HTML page because the Google for Jobs card surfaces above regular search results for job queries.
The Xoo universe thread
The example is Xoo Code Inc. hiring a Senior Structured Data Engineer for the XooStructured team, following the schema.org/JobPosting vocabulary. The hiringOrganization references the Organization example via @id, and jobLocation references the LocalBusiness example's Dunmore store, which doubles as the engineering office in the Xoo universe. The job itself is for the SoftwareApplication product (XooStructured), closing the loop across four of the examples on this site.
Three fields that silently kill your rich result
If your job posting isn't showing in Google for Jobs despite valid markup, check these three fields first. baseSalary has to be a nested MonetaryAmount with a nested QuantitativeValue, not a plain number. employmentType has to be one of the UPPER_SNAKE enum values (FULL_TIME, PART_TIME, etc.), not free text. And validThrough has to be set to a future ISO 8601 datetime; without it, Google drops the job after roughly 30 days without telling you why. The Common Mistakes section covers all three with examples.
Full example of schema.org/JobPosting json-ld markup
The markup is verified as valid with Rich Results Test from Google.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@id": "https://xoocode.com/careers/senior-structured-data-engineer#job",
"@type": "JobPosting",
"title": "Senior Structured Data Engineer",
"description": "<p>Xoo Code Inc. is looking for a Senior Structured Data Engineer to join the XooStructured team at our Dunmore engineering office. You'll be working on the IDE that schema.org authors use to build, validate, and cross-reference JSON-LD markup â the tool this very website recommends.</p><p>The role is hands-on across the XooStructured editor, validator, and graph visualizer. You'll own one of the Rich Results Preview renderers end-to-end and contribute to the multi-document @id resolution engine that differentiates us from every other structured data tool on the market. Expect to collaborate closely with our Copenhagen research partners and to spend 25-40% of your time in Xoo Code Shop Dunmore's engineering loft, where the team has whiteboards, espresso, and an unreasonable number of second monitors.</p>",
"identifier": {
"@type": "PropertyValue",
"name": "Xoo Code Inc.",
"value": "XOO-ENG-2026-012"
},
"datePosted": "2026-03-15",
"validThrough": "2026-06-15T23:59:00-07:00",
"employmentType": "FULL_TIME",
"directApply": true,
"hiringOrganization": {
"@id": "https://xoocode.com#organization"
},
"jobLocation": {
"@id": "https://xoocode.com/shop/dunmore-1290"
},
"jobLocationType": "TELECOMMUTE",
"applicantLocationRequirements": [
{
"@type": "Country",
"name": "Canada"
},
{
"@type": "Country",
"name": "USA"
}
],
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "CAD",
"value": {
"@type": "QuantitativeValue",
"minValue": "135000",
"maxValue": "175000",
"unitText": "YEAR"
}
},
"experienceRequirements": {
"@type": "OccupationalExperienceRequirements",
"monthsOfExperience": "60"
},
"educationRequirements": {
"@type": "EducationalOccupationalCredential",
"credentialCategory": "bachelor degree",
"educationalLevel": "Bachelor of Computer Science, Software Engineering, or equivalent experience"
},
"qualifications": "5+ years of JavaScript / TypeScript. Deep familiarity with schema.org and JSON-LD. Experience building developer tools, IDEs, or compilers is a strong plus. Comfort working in a small, opinionated team where decisions are made in days not quarters.",
"responsibilities": [
"Own one Rich Results Preview renderer end-to-end (Product, Article, Event, Recipe, or Job depending on current priorities)",
"Contribute to the multi-document @id resolution engine that walks imported graphs and flags broken references",
"Ship features to both the desktop XooStructured IDE and the companion mobile viewer",
"Write and maintain the validation ruleset that mirrors Google's Rich Results Test requirements",
"Mentor one junior engineer and participate in code review across the team"
],
"skills": [
"TypeScript",
"React",
"JSON-LD",
"schema.org",
"Compiler or parser construction",
"Cross-platform desktop development (Electron / Tauri)"
],
"jobBenefits": [
"Fully remote with 25-40% optional Dunmore office time (travel reimbursed)",
"4 weeks paid vacation plus 12 statutory holidays",
"Extended health and dental coverage",
"Annual hardware budget (CAD 3500) for editor setup of your choice",
"Conference budget for one major schema.org or web standards event per year",
"XooStructured Pro license for your family and friends"
],
"incentiveCompensation": "Annual performance bonus of up to 15% of base salary, tied to shipped features and customer-facing quality metrics.",
"workHours": "Flexible hours, core overlap 10:00-14:00 MST. Async-first communication, minimal recurring meetings.",
"employmentUnit": {
"@type": "Organization",
"name": "XooStructured engineering team",
"parentOrganization": {
"@id": "https://xoocode.com#organization"
}
},
"industry": "Software development tools",
"occupationalCategory": "15-1252 Software Developers",
"workPerformed": {
"@type": "Occupation",
"name": "Structured Data Engineer",
"occupationLocation": {
"@id": "https://xoocode.com/shop/dunmore-1290"
}
},
"securityClearanceRequirement": "Not required",
"url": "https://xoocode.com/careers/senior-structured-data-engineer",
"applicationContact": {
"@type": "ContactPoint",
"email": "careers@xoocode.com",
"contactType": "HR"
},
"eligibilityToWorkRequirement": "Must have existing authorization to work in Canada or the USA. We do not currently sponsor work visas but we do assist with inter-country transfers for existing authorized workers."
}
</script>Rich result preview
Approximate preview of what Google may render from this markup. Hover any element inside the card to see which JSON-LD path produced it. Google decides whether to show any rich result. Markup makes you eligible, not guaranteed.
Senior Structured Data Engineer
Xoo Code Inc. is looking for a Senior Structured Data Engineer to join the XooStructured team at our Dunmore engineering office. You'll be working on the IDE th
Minimal valid version
The smallest markup that still produces a valid JobPosting entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Structured Data Engineer",
"description": "Xoo Code Inc. is hiring a Senior Structured Data Engineer for the XooStructured team at our Dunmore office...",
"datePosted": "2026-03-15",
"validThrough": "2026-06-15T23:59:00-07:00",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Xoo Code Inc.",
"sameAs": "https://xoocode.com"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "355 Eagle Butte Ave",
"addressLocality": "Dunmore",
"postalCode": "T1B 0K2",
"addressCountry": "CA"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "CAD",
"value": {
"@type": "QuantitativeValue",
"minValue": "135000",
"maxValue": "175000",
"unitText": "YEAR"
}
}
}
</script>Google rich results this unlocks
Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.
- Google docsJob posting rich result (Google for Jobs)primary
Common JobPosting mistakes
Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.
- 01
baseSalary as a plain number
Wrong"baseSalary": 95000Right"baseSalary": { "@type": "MonetaryAmount", "currency": "USD", "value": { "@type": "QuantitativeValue", "minValue": "90000", "maxValue": "110000", "unitText": "YEAR" } }Google requires baseSalary as a structured MonetaryAmount containing a nested QuantitativeValue. A plain number or string is silently ignored and you lose the salary filter on the Google for Jobs card. The value nested object supports minValue + maxValue for ranges or a single value field for fixed compensation. The unitText values are HOUR, DAY, WEEK, MONTH, YEAR. They must be uppercase and exact.
- 02
employmentType as free text
Wrong"employmentType": "Full time"Right"employmentType": "FULL_TIME"Google requires employmentType to be one of the documented UPPER_SNAKE enum values: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER. Free-text variants like 'Full time', 'Fulltime', or 'Full-time' validate as strings but Google ignores them, and your job loses the employment-type filter on the rich result card.
- 03
Missing validThrough
WrongJobPosting without a validThrough fieldRight"validThrough": "2026-06-15T23:59:00-07:00"Google automatically drops jobs whose validThrough has passed, and treats jobs without validThrough as stale after approximately 30 days. The format is ISO 8601 including the time and timezone offset, not just a date. Without validThrough, your rich result silently disappears from Google for Jobs a month after posting and you won't know why. Always set it to a realistic application deadline and update it if the role stays open.
- 04
Missing applicantLocationRequirements for remote jobs
WrongRemote job with only jobLocation set to the HQ city, no applicantLocationRequirementsRight"jobLocationType": "TELECOMMUTE", "applicantLocationRequirements": [ { "@type": "Country", "name": "Canada" }, { "@type": "Country", "name": "USA" } ]For fully or partially remote jobs, Google needs to know which countries or regions the applicant can live in. Otherwise it assumes same-country-as-jobLocation, which is often wrong. Use jobLocationType TELECOMMUTE to signal remote work, and applicantLocationRequirements (Country, State, or AdministrativeArea) to list valid applicant locations. This is the single biggest SEO opportunity most remote jobs miss.
Compare your markup against this exampleruns in your browser
Schema properties in this example
Comments
Loading comments...