Job Posting Structured Data: Complete Implementation Guide
JobPosting structured data enables your job listings to appear directly in the Google Jobs experience — a dedicated job search feature integrated into Google Search. When candidates search for roles, Google aggregates listings from across the web and presents them in a rich, filterable interface. By adding JobPosting markup to your career pages, you can surface your openings to a far wider audience without relying solely on third-party job boards. This guide covers everything you need to implement the markup correctly and maximise your visibility in job search results.
Why Use JobPosting Schema?
- Surface your job listings in the Google Jobs search experience, reaching candidates directly from Google Search.
- Provide structured salary, location, and employment type details that help candidates quickly assess whether a role is relevant.
- Reduce dependency on paid job board placements by driving organic traffic to your own careers pages.
- Improve application quality by presenting clear, detailed role information before the candidate clicks through to your site.
- Support remote and hybrid role filters, ensuring your listings appear when candidates search for flexible work arrangements.
Required Properties
These properties are required by Google for JobPosting structured data to be eligible for rich results.
| Property | Description |
|---|---|
| title | The job title as it should appear in search results. Use a concise, descriptive title — avoid internal codes or excessive capitalisation. |
| description | A full HTML description of the role including responsibilities, requirements, and any other relevant details. This is the primary content Google uses to match queries. |
| datePosted | The original date the job was posted, in ISO 8601 format (YYYY-MM-DD). Google uses this to assess freshness and may deprioritise stale listings. |
| hiringOrganization | An Organization object identifying the company offering the role. Include at minimum the name and sameAs (company URL) properties. |
| jobLocation | A Place object specifying where the role is based. Include the full address with addressLocality, addressRegion, and addressCountry. For remote roles, set jobLocationType to TELECOMMUTE instead. |
Recommended Properties
Adding these properties improves your chances of appearing in rich results and provides more context to search engines.
| Property | Description |
|---|---|
| baseSalary | A MonetaryAmount or QuantitativeValue describing the salary or salary range. Including pay information significantly improves click-through rates. |
| employmentType | The type of employment — FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, or INTERN. Accepts a single value or an array of values. |
| validThrough | The date after which the listing is no longer valid, in ISO 8601 format. Prevents expired roles from appearing in search results. |
| applicantLocationRequirements | For remote roles, specifies the geographic regions from which applicants are accepted. Use an AdministrativeArea object with a name property. |
| directApply | A boolean indicating whether candidates can apply directly on your page (true) or are redirected to another site (false). Helps Google present accurate apply actions. |
JSON-LD Example
Here is a complete JobPosting structured data example you can use as a starting point. Or use our JobPosting generator to create one automatically.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Front-End Developer",
"description": "<p>We are looking for a Senior Front-End Developer to join our engineering team in Manchester. You will lead the development of our customer-facing web applications using React and TypeScript.</p><p><strong>Requirements:</strong></p><ul><li>5+ years of professional front-end development experience</li><li>Strong proficiency in React, TypeScript, and modern CSS</li><li>Experience with automated testing frameworks</li></ul>",
"datePosted": "2025-09-01",
"validThrough": "2025-10-31",
"hiringOrganization": {
"@type": "Organization",
"name": "Northwind Technologies",
"sameAs": "https://www.northwindtech.co.uk",
"logo": "https://www.northwindtech.co.uk/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "100 Deansgate",
"addressLocality": "Manchester",
"addressRegion": "Greater Manchester",
"postalCode": "M3 2GP",
"addressCountry": "GB"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "GBP",
"value": {
"@type": "QuantitativeValue",
"minValue": 65000,
"maxValue": 85000,
"unitText": "YEAR"
}
},
"employmentType": "FULL_TIME",
"directApply": true
}
</script>How to Implement JobPosting Schema
- 1Add a JSON-LD script block to each individual job listing page. Do not place multiple JobPosting objects on a single index or category page.
- 2Set the title to the exact role name candidates would search for. Avoid prefixing it with the company name or location — those are separate properties.
- 3Provide a comprehensive HTML description covering responsibilities, qualifications, benefits, and application instructions.
- 4Include the hiringOrganization with the company name, website URL, and logo to ensure proper branding in search results.
- 5Specify jobLocation with a complete postal address. For remote positions, add jobLocationType set to TELECOMMUTE and omit the physical address.
- 6Validate each listing with Google's Rich Results Test and monitor indexing status through the Job Postings report in Google Search Console.
Common Mistakes to Avoid
- Using internal job codes or abbreviations in the title field (e.g. 'SR FE DEV - MCR') instead of a human-readable title that matches candidate search queries.
- Placing multiple JobPosting objects on a single listing page or on category pages — Google requires one JobPosting per dedicated URL.
- Omitting the validThrough date, which can cause expired roles to continue appearing in Google Jobs and frustrate candidates.
- Providing salary information that does not match what is stated on the page, violating Google's structured data guidelines.
- Forgetting to remove or update structured data when a position is filled, leading to stale listings in search results.
Testing & Validation
Before deploying your JobPosting structured data, validate it using these tools:
- 1Google Rich Results Test — Paste your page URL or code snippet to check if your structured data is eligible for rich results.
- 2Schema Markup Validator — Validates your JSON-LD syntax against the schema.org specification.
- 3Google Search Console — After deployment, monitor the Enhancements report for any errors or warnings.
Frequently Asked Questions
How quickly do job postings appear in Google Jobs after adding structured data?
Google typically indexes new job listings within a few days, though it can take up to a week. You can use the URL Inspection tool in Search Console to request indexing of specific pages to speed up the process.
Do I need structured data if I already post to job boards like Indeed or LinkedIn?
Yes. Adding JobPosting structured data to your own careers pages gives you a direct presence in Google Jobs alongside aggregator listings. This drives traffic to your site and reduces reliance on third-party platforms.
Can I mark a job as both on-site and remote (hybrid)?
Yes. Include a physical jobLocation and also set jobLocationType to TELECOMMUTE. This signals a hybrid arrangement and ensures the listing appears in both on-site and remote job searches.
Is salary information required for Google Jobs?
Salary is not strictly required, but Google strongly recommends it. Listings with salary data tend to receive higher engagement, and in some regions pay transparency is becoming a legal requirement.
Can I use JobPosting structured data for freelance or gig opportunities?
Yes. Set the employmentType to CONTRACT or OTHER as appropriate. Ensure the description clearly states the nature of the engagement so candidates have accurate expectations.
Ready to Generate Your JobPosting Schema?
Use our free generator to create valid JobPosting structured data in seconds.
Open JobPosting Generator