Job posting schema generator
Make a vacancy eligible for Google's job search experience, with salary, location or remote eligibility and an expiry date.
Required
6/6
Recommended
5/9
All Google-required properties present. That makes the page eligible, not guaranteed. Google's docs
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Technical SEO Specialist",
"description": "<p>Own structured data and crawl health across 40,000 product pages. You will audit markup, ship fixes with engineering and report on rich-result coverage.</p>",
"datePosted": "2026-09-20",
"validThrough": "2026-11-20T23:59:00",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Example Outfitters",
"sameAs": "https://example.com",
"logo": "https://example.com/logo-512.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "1200 NW Marshall St",
"addressLocality": "Portland",
"addressRegion": "OR",
"postalCode": "97209",
"addressCountry": "US"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 78000,
"maxValue": 95000,
"unitText": "YEAR"
}
},
"identifier": {
"@type": "PropertyValue",
"name": "Example Outfitters",
"value": "SEO-2026-14"
},
"directApply": true
}
</script>When to use JobPosting markup
- One page per open position, with the full job description visible.
- Remote jobs: set jobLocationType TELECOMMUTE and the countries applicants may live in.
- Remove the markup, or the page, once the job is filled.
Getting it right
- Required: title, description, datePosted, hiringOrganization and jobLocation (or applicantLocationRequirements for fully remote jobs).
- Keep the title to the job title only; no salary, codes or "urgent".
- Add validThrough so the listing drops out automatically when it expires.
- Use the Indexing API or a sitemap with lastmod to tell Google quickly about new and closed jobs.
Source: Google Search Central, Job posting structured data documentation, and schema.org/JobPosting.
Google's property list
| Property | Google says |
|---|---|
datePosted | required |
description | required |
hiringOrganization | required |
hiringOrganization.name | required |
jobLocation or applicantLocationRequirements | required |
title | required |
applicantLocationRequirements | recommended |
baseSalary | recommended |
directApply | recommended |
employmentType | recommended |
identifier | recommended |
jobLocationType | recommended |
validThrough | recommended |
educationRequirements | recommended |
experienceRequirements | recommended |
Example output
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Technical SEO Specialist",
"description": "<p>Own structured data and crawl health across 40,000 product pages. You will audit markup, ship fixes with engineering and report on rich-result coverage.</p>",
"datePosted": "2026-09-20",
"validThrough": "2026-11-20T23:59:00",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Example Outfitters",
"sameAs": "https://example.com",
"logo": "https://example.com/logo-512.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "1200 NW Marshall St",
"addressLocality": "Portland",
"addressRegion": "OR",
"postalCode": "97209",
"addressCountry": "US"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 78000,
"maxValue": 95000,
"unitText": "YEAR"
}
},
"identifier": {
"@type": "PropertyValue",
"name": "Example Outfitters",
"value": "SEO-2026-14"
},
"directApply": true
}Job Posting schema questions
Does salary markup matter?
baseSalary is recommended and job seekers filter by it. The separate "Estimated salary" feature was retired in 2025; JobPosting salary is unaffected.
Can the description contain HTML?
Yes. Google allows basic HTML tags such as p, ul, li and br in JobPosting descriptions.
How do I mark up a hybrid job?
Give the office as jobLocation. Only use TELECOMMUTE for jobs that are fully remote.