Most job searches start on a search engine. When someone types "warehouse jobs near me" or "remote marketing manager", Google can show a dedicated job search experience with filters for location, job type and date posted, and listings drawn from employer sites and job boards. If your vacancies aren't marked up properly, they're competing for those searches with one hand tied behind their back.
JobPosting structured data is how you make your vacancies eligible. It's one of the more demanding schema types: Google has strict content policies, specific rules for remote roles and salary data, and expects expired jobs to be removed promptly. Get it wrong and your listings can be excluded, or your site can receive a structured data manual action.
This guide walks through eligibility, required and recommended properties, a full JSON-LD example, how to handle remote jobs and expired listings, and how to get new jobs crawled quickly in 2026.
Key Takeaways
- JobPosting markup makes vacancies eligible for Google's job search experience in Search.
- Required properties:
title,description,datePosted,hiringOrganizationandjobLocation(orapplicantLocationRequirementsfor fully remote jobs). - Only the employer should provide
baseSalary, and it should be the real figure, not an estimate. - When a job closes, set
validThroughto a past date, remove the markup, or return 404/410. - Google recommends the Indexing API over sitemaps for job posting URLs because it prompts faster crawling.
Who Should Use JobPosting Schema?
Any organisation publishing genuine vacancies on its own site can benefit: employers with careers pages, recruitment agencies, staffing firms and job boards. Recruitment agencies have particular opportunities here; our guide to SEO for recruitment agencies covers the wider strategy. Many applicant tracking systems output JobPosting markup automatically, so check what yours does before building anything custom.
Content Policies: What Gets Listings Excluded
Google's job posting documentation includes a list of content it won't allow. One of the clearest:
“We don't allow job postings that require payment from applicants.”
— Google Search Central, Job posting structured data
Other disallowed content includes:
- Markup on pages that don't contain a single job (such as a search results or category page).
- Incomplete descriptions, or descriptions identical to the title.
- Misrepresenting the employer, job or location, including fake jobs.
- Advertisements disguised as jobs, and job requests from people offering their own services.
- Expired jobs left live with active markup.
- Postings with no way to apply, or that require a login just to read the description.
- Spammy, obstructive or grammatically poor content, or offensive language.
Required and Recommended Properties
| Property | Status | Key rules |
|---|---|---|
title | Required | Job title only, with no codes, dates, salaries or company names |
description | Required | Full description in HTML; can't be the same as the title |
datePosted | Required | Original posting date in ISO 8601 |
hiringOrganization | Required | The company name, not a specific branch; "confidential" for anonymous roles |
jobLocation | Required* | Where the employee physically works; *not needed for fully remote jobs using applicantLocationRequirements |
applicantLocationRequirements | Recommended / required for remote | Where remote employees may be located |
jobLocationType | Recommended | TELECOMMUTE only for fully remote jobs |
baseSalary | Recommended | Employer-provided actual salary; unitText of HOUR, DAY, WEEK, MONTH or YEAR |
employmentType | Recommended | FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER |
validThrough | Recommended | Expiry date; omit if there isn't one |
directApply | Recommended | Whether the URL offers a short, direct application process |
identifier | Recommended | Your internal job ID |
Your hiringOrganization can mirror the details in your site-wide Organization schema, including the logo.
Example: JobPosting JSON-LD
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "JobPosting",
"title": "Customer Support Specialist",
"description": "<p>Help our customers by phone and chat…</p>",
"identifier": {"@type": "PropertyValue", "name": "Example Ltd", "value": "CS-2041"},
"datePosted": "2026-10-10",
"validThrough": "2026-11-30T23:59:00+00:00",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Example Ltd",
"sameAs": "https://www.example.com/",
"logo": "https://www.example.com/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "5 Example Way",
"addressLocality": "Leeds",
"postalCode": "LS1 1AA",
"addressCountry": "GB"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "GBP",
"value": {"@type": "QuantitativeValue", "minValue": 26000, "maxValue": 29000, "unitText": "YEAR"}
},
"directApply": true
}
</script>
Remote and Hybrid Jobs
For a fully remote role, set jobLocationType to TELECOMMUTE and use applicantLocationRequirements to say which countries or regions applicants may live in. Google's documentation says jobLocation isn't required for fully remote jobs that include those location requirements. Don't use TELECOMMUTE for hybrid roles; those have a physical office, so give the jobLocation and explain the hybrid arrangement in the description.
Removing Expired Jobs
Google's documentation lists three ways to show a job is no longer open:
- Set
validThroughto a date in the past. - Remove the page so it returns a 404 or 410 status code (see our HTTP status codes guide).
- Remove the JobPosting markup from the page.
Leaving expired jobs live with active markup breaches the content policies. Large job boards should also think about what happens to thousands of expired URLs over time; our article on index bloat covers cleanup options.
Getting Jobs Crawled Fast: Indexing API vs Sitemaps
| Method | Speed | Use it for |
|---|---|---|
| Indexing API | Prompts Googlebot to crawl sooner, per Google | Notifying Google when job URLs are added, updated or removed |
| XML sitemap | Slower; a hint for discovery | Full-site coverage, including job pages |
| URL Inspection "Request indexing" | Manual, limited | Spot-checking a handful of important jobs |
Google's Indexing API can only be used for pages with JobPosting or BroadcastEvent embedded in a VideoObject. It lets you notify Google of updated URLs and of removed URLs. Google's job posting guide still recommends a sitemap for full-site coverage alongside it. For other page types, our IndexNow guide covers the protocol used by Bing and other engines.
Step-by-Step Implementation
- Audit your careers pages. One job per URL, full description visible, a clear way to apply.
- Check your ATS. If it outputs markup, validate it rather than duplicating it.
- Add JobPosting JSON-LD to the job template, populated from your job data.
- Validate with the Rich Results Test and fix all errors.
- Set up the Indexing API for new, updated and closed jobs, plus a sitemap.
- Automate expiry. When a job closes, update
validThrough, remove markup or return 404/410 automatically. - Monitor Search Console for structured data errors and manual actions.
Writing Job Descriptions That Perform
Markup only makes a listing eligible; the content still has to persuade a candidate to click and apply. Google's policies already demand a complete description, but going further helps. Lead with what the role involves day to day, list must-have and nice-to-have requirements separately, state the working pattern (on-site, hybrid or remote) clearly, and explain the application steps. Use the job title people actually search for rather than internal jargon, so "Customer Support Specialist" beats "Customer Happiness Ninja". Keep each vacancy on its own stable URL so links and shares keep working until the role closes.
Common Mistakes
- Stuffing the title with salary, location, job codes or "URGENT!".
- Marking up job listing pages (search results) instead of individual job detail pages.
- Using estimated salaries. Only the employer should provide
baseSalary. - Using TELECOMMUTE for hybrid jobs.
- Forgetting to expire jobs. This is a policy violation, not just an untidy site.
- Requiring login to read the description.
For other schema types that often appear on the same sites, see our guides to Article schema for career blogs and Event schema for in-person hiring fairs.
{FAQ}Reach More Candidates From Search
JobPosting markup is technical but rewarding: done right, it puts your vacancies in front of active job seekers at no cost per click. If you'd like help implementing it, connecting the Indexing API or cleaning up expired listings, our team can handle it as part of our SEO services. Our schema markup guide covers other types. Request a quote to get started.
References
- Job posting (JobPosting) structured data – Google Search Central
- Indexing API quickstart – Google Search Central
- General structured data guidelines – Google Search Central
- JobPosting – Schema.org




