
Posts
Posts


Technical guide
Which fields Google requires, which ones to add next, how to handle remote roles, salary and expired jobs, and what 14 live careers websites actually put in their job page markup.
Updated 31 October 2026Fields checked against Google guidance and 14 live job pages.
JobPosting schema is the structured data that tells Google, and any other system reading your page, exactly what a job is: its title, description, location, date posted, employer and more. Add it correctly to every job page on your careers website and your vacancies become eligible for Google’s job search experience, with your logo and job details. Add it carelessly and it can cause errors or even a manual action. This guide shows what to include and how.
title, description, datePosted, hiringOrganization and jobLocation. Everything else is recommended.validThrough only when a job has a real closing date, and expire jobs that are filled, because failing to do so can lead to a manual action.This guide is part of our work on AI and search visibility. It sits under our hub on GEO and AEO for careers websites and complements the ultimate SEO guide for careers websites.
JobPosting is a type from schema.org, the shared vocabulary for structured data. On a job page, you add it as a block of JSON-LD, a small piece of code in the page that labels the facts: this is the job title, this is the employer, this is the place. Google says structured data on job pages makes your postings “eligible to appear in a special user experience in Google Search results”, with your logo and job details, and lets job seekers filter by criteria such as location or job title.
It is also simply good hygiene for any system that reads your site. A labelled fact is easier to extract than a sentence buried in a paragraph. That makes it useful for AI search too, even though Google is clear that its AI features need no special schema; see our guide to GEO and AEO for careers websites for the full picture.
These are the properties in Google’s documentation, with how many of the 14 job pages we checked carried each one in the page source.
| Property | Google status | What it holds | Found on |
|---|---|---|---|
| title | Required | The job title only, with no codes, addresses or salary | 14 of 14 |
| description | Required | The full job in HTML, a complete representation of the role | 14 of 14 |
| datePosted | Required | The original posting date in ISO 8601 format | 14 of 14 |
| hiringOrganization | Required | The company name, not the specific site | 14 of 14 |
| jobLocation | Required | The physical place, including addressCountry | 14 of 14 |
| employmentType | Recommended | FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN and others | 14 of 14 |
| identifier | Recommended | Your unique ID for the job | 14 of 14 |
| validThrough | Required if the job has an expiry date | When the posting expires | 2 of 14 |
| baseSalary | Recommended | Actual salary from the employer, as a value or a min and max | 1 of 14 |
| directApply | Recommended | Whether the URL lets candidates apply directly | 4 of 14 |
| applicantLocationRequirements and jobLocationType | Remote jobs | Where remote applicants may be, and TELECOMMUTE for fully remote roles | 2 of 14 |
Source: Google Search Central JobPosting documentation; Happydance check of 14 live job pages, 31 October 2026. Careers websites are not named in the table.
This example uses placeholder values and follows Google’s documented format. It includes the five required fields and the most useful recommended ones.
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Software Engineer",
"description": "<p>Full description: responsibilities, qualifications, skills, hours.</p>",
"datePosted": "2026-10-01",
"validThrough": "2026-12-01T23:59",
"employmentType": "FULL_TIME",
"identifier": { "@type": "PropertyValue", "name": "Example Co", "value": "R-12345" },
"hiringOrganization": {
"@type": "Organization", "name": "Example Co",
"sameAs": "https://www.example.com", "logo": "https://www.example.com/logo.png" },
"jobLocation": { "@type": "Place", "address": { "@type": "PostalAddress",
"streetAddress": "1 Example Street", "addressLocality": "London",
"postalCode": "EC1A 1AA", "addressCountry": "GB" } },
"baseSalary": { "@type": "MonetaryAmount", "currency": "GBP",
"value": { "@type": "QuantitativeValue", "minValue": 70000, "maxValue": 85000, "unitText": "YEAR" } },
"directApply": true
}
For a fully remote role that may be done anywhere in one country, Google’s documentation uses applicantLocationRequirements with a country, plus "jobLocationType": "TELECOMMUTE", and the description must clearly say the job is 100% remote.
Use the job title only. Google’s best practice is to leave out job codes, addresses, dates, salaries and company names, and to avoid shouting. “Market Specialist, French speaker” is better than a headline in capitals.
Give the complete job in HTML, with at least paragraph breaks. Google recognises p, ul and li tags. The description cannot be the same as the title, and it should cover responsibilities, qualifications, skills, hours, education and experience.
Give the physical place the employee reports to and always include addressCountry. For several locations, use an array of jobLocation values.
Only employers may provide it, and it must be the actual base salary, not an estimate. Use minValue and maxValue for a range. If the salary is in the markup, it must also be visible on the page.
Add it when there is a real expiry date. If a job never expires or you do not know when it will, leave it out. If the job is filled earlier, remove the posting.
Use it only when the page really offers a short, simple application without unnecessary intermediate steps. Google notes it is still developing how it uses this field.
We read the JSON-LD on a live job page for each of the 15 careers websites in our best careers sites of 2026 ranking, all built on Happydance. 14 carry JobPosting markup in the page source, and the fifteenth adds it once the page renders. Every one of the 14 includes the full required set and, in addition, employment type and a unique job identifier.
Number of the 14 job pages with JobPosting markup in the page source that include each field.
Source: Happydance check of live job pages, 31 October 2026. Careers websites are not named in this chart.
The core is strong everywhere. A few careers websites go further, and each is verifiable on the live site:
Maintaining correct JobPosting markup across thousands of jobs is a job for software, not spreadsheets. On Happydance, the platform automatically generates metadata, schema markup and HTML and XML sitemaps, with structured schema and AI-ready metadata as part of its AI discoverability. The Job Description Genie and the content grader (80 criteria, with bias detection) help keep the visible job content strong and complete, which is what the description field must reflect. The analytics dashboard then shows how candidates arrive.
Explore the AI careers website platform and the SEO Concierge Service, which includes technical optimisation of schema markup, or audit your careers website to see how your job pages measure up.
JobPosting schema is structured data, usually JSON-LD, that labels the key facts of a job on its page: title, description, date posted, employer, location and more. It makes the job eligible for Google’s job search experience and easier for any system to read accurately.
Google requires five: title, description, datePosted, hiringOrganization and jobLocation. Remote jobs use jobLocationType, and validThrough is required for postings that have an expiry date. Properties such as employmentType, identifier, baseSalary and directApply are recommended.
Put one JobPosting JSON-LD block on each page dedicated to a single job, in the HTML the server sends. Do not place it on list pages. Every value must match what a visitor sees on the page.
Validate the code with the Google Rich Results Test, then deploy a few pages and use the URL Inspection tool in Search Console to confirm Google sees the markup and the content on the rendered page.
Populate validThrough with a past date, remove the page so it returns a not found response, or add a noindex. Google warns that failing to act on expired jobs in good time may result in a manual action.
Google says no special schema is needed to appear in its AI features, so JobPosting is not an AI trick. It is accurate, labelled information about your jobs that makes them easier for Google for Jobs and other systems to understand, which supports AI visibility.
For a job that is 100% remote, use jobLocationType with the value TELECOMMUTE and state clearly in the description that it is fully remote. If applicants must live in certain places, add applicantLocationRequirements.
Our careers website audit reviews the technical foundations behind your job pages, including structured data.