Skip to main content

Posts

JobPosting Schema for Careers Websites: Guide and Examples

a cover of a book
a person smiling at camera
See other posts from by Melanie Murphy CMO

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.

Key takeaways

  • Google requires five JobPosting properties: title, description, datePosted, hiringOrganization and jobLocation. Everything else is recommended.
  • Every piece of information in the markup must be visible on the job page. Salary in the markup but not on the page is a content policy violation.
  • Add 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.
  • Of the 14 live job pages we checked with JobPosting markup in the page source, all 14 include the five required fields plus employment type and a job identifier.
  • Optional fields such as validThrough, baseSalary and remote work fields appear on only a few pages, so there is room to go further for any careers website.
  • Google says no special schema is needed for its AI features. Accurate JobPosting markup is still the foundation that makes a job easy to understand and trust.

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.

5fields Google requires
14/15live job pages with the markup in the page source
14/14include all five required fields
1JobPosting block per job page

What JobPosting schema does for your careers page

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.

JobPosting schema for your careers page: required and recommended fields

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.

PropertyGoogle statusWhat it holdsFound on
titleRequiredThe job title only, with no codes, addresses or salary14 of 14
descriptionRequiredThe full job in HTML, a complete representation of the role14 of 14
datePostedRequiredThe original posting date in ISO 8601 format14 of 14
hiringOrganizationRequiredThe company name, not the specific site14 of 14
jobLocationRequiredThe physical place, including addressCountry14 of 14
employmentTypeRecommendedFULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN and others14 of 14
identifierRecommendedYour unique ID for the job14 of 14
validThroughRequired if the job has an expiry dateWhen the posting expires2 of 14
baseSalaryRecommendedActual salary from the employer, as a value or a min and max1 of 14
directApplyRecommendedWhether the URL lets candidates apply directly4 of 14
applicantLocationRequirements and jobLocationTypeRemote jobsWhere remote applicants may be, and TELECOMMUTE for fully remote roles2 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.

How to add JobPosting schema

  1. Use one JobPosting per job page. Google says to place JobPosting structured data only on pages dedicated to a single job, not on list pages.
  2. Put it in the page source. JSON-LD in the HTML that arrives from the server is readable without running scripts, so every crawler can see it.
  3. Match the visible page. The job title, location, salary and every other value in the markup must appear on the page. If a copy of the job exists at another URL, use canonical URLs.
  4. Test it. Validate with the Google Rich Results Test, then deploy a few pages and use the URL Inspection tool in Search Console to see how Google reads them.
  5. Keep Google informed. Submit a sitemap with accurate lastmod dates. Google also recommends the Indexing API for job posting URLs, because it prompts Googlebot to crawl sooner.
  6. Expire jobs on time. When a job closes, populate validThrough with a past date, remove the page or add a noindex; Google warns that delay may result in a manual action.

A complete JobPosting example

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.

Field by field tips

title

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.

description

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.

jobLocation

Give the physical place the employee reports to and always include addressCountry. For several locations, use an array of jobLocation values.

baseSalary

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.

validThrough

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.

directApply

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.

Mistakes to avoid

  • Markup that does not match the page. Google’s example: a job title on the page that differs from the title property, or salary in the markup that is not shown on the page.
  • Using name instead of title. Google says the two are not interchangeable.
  • Leaving closed jobs live. Expired jobs that remain accessible are a flagged error and may lead to a manual action.
  • Putting JobPosting on list pages. Use it only on pages dedicated to a single job.
  • Adding an estimated salary. Only the employer’s actual salary is allowed.
  • Keyword stuffing titles and descriptions. It is against Google’s job posting content policies and does nothing for readers.
  • Hiding it behind scripts. Keep the JSON-LD in the server HTML so that every crawler can read it.

What 14 careers websites include in their JobPosting markup

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.

Fields found on the job pages we checked

Number of the 14 job pages with JobPosting markup in the page source that include each field.

  • Required fields (all five)14 of 14
  • employmentType14 of 14
  • identifier14 of 14
  • directApply4 of 14
  • validThrough2 of 14
  • Remote work fields2 of 14
  • baseSalary1 of 14

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:

Making it easier: where Happydance helps

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: frequently asked questions

What is JobPosting schema?

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.

Which JobPosting properties does Google require?

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.

Where do I put JobPosting schema on a careers website?

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.

How do I test JobPosting schema?

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.

What should I do with expired jobs?

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.

Does JobPosting schema help with AI search?

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.

How should I mark up a remote job?

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.

Check your job page markup

Our careers website audit reviews the technical foundations behind your job pages, including structured data.

Book a careers website audit

Sources

Related Articles