My Tool Studio
Schema Markup·4 min read

Job Posting Schema for Google Jobs: Setup and Expiry

Google for Jobs is a closed club with a simple entry requirement: your careers page has to carry valid JobPosting markup. Get job posting schema for Google Jobs right and your listing appears in the blue jobs carousel above the regular results, filterable by location, salary, and employment type. Get it wrong, or skip it, and your posting is just another web page competing on ordinary rankings. This guide covers the required fields, a worked validThrough example, and the expiry rules that trip up more employers than anything else.

{"@type": "JobPosting","name": "…","url": "…"}RICH RESULTJobPosting

Job posting schema for Google Jobs: how the pipeline works

Why a plain careers page stays invisible.

The situation is almost always the same. A company posts openings on its own site instead of paying a job board, applicants trickle in from LinkedIn, and someone eventually asks why the roles never show up when you google the job title plus the city. The answer is that Google's job experience doesn't parse prose. It reads JobPosting structured data, and pages without it aren't considered listings at all.

Once the markup is in place and the page is indexed, Google extracts the title, company, location, salary, and dates into its own interface. Candidates can filter by the employmentType you declared and apply through the URL you provided. The page content still matters, but the markup is the ticket in.

The required JobPosting fields, and what each one proves

Five properties, no exceptions.

Google checks the required JobPosting fields before anything else: title, description, datePosted, hiringOrganization, and jobLocation. The title should be the role name alone, Line Cook rather than URGENT!! Line Cook $$ Apply Now, because decorated titles are a documented rejection reason. The description must be the full HTML job text, not a one-line summary, and it needs to match what a human sees on the page.

hiringOrganization is an Organization node naming the employer, and jobLocation is a Place wrapping a PostalAddress with street, city, region, postal code, and country. Salary via baseSalary isn't required, but listings without it lose the salary filter and, in some regions, ranking weight. Remote roles additionally need an applicantLocationRequirements property, which is worth knowing before you mark a role as remote.

A worked JobPosting example with validThrough

Small fragment, complete story.

Say a restaurant posts a cook position on June 1 and wants applications closed by the end of August. The core of the markup comes out like this: {"@type": "JobPosting", "title": "Line Cook", "datePosted": "2026-06-01", "validThrough": "2026-08-31T23:59", "employmentType": "FULL_TIME"}. Four data points plus the type, and Google now knows what the role is, when it opened, when it stops accepting people, and what kind of contract it is.

The full block adds the description, the hiring organization, the address, and a baseSalary expressed as a MonetaryAmount holding a QuantitativeValue, for example 18 USD with unitText HOUR. Every one of those nested structures is assembled for you by the JobPosting Schema Generator, which is the point of using a form instead of writing braces by hand.

Expired job postings and schema: the validThrough contract

The rule most employers break.

validThrough is a promise. When the datetime passes, Google expects the listing to be gone, and the guidelines are explicit about the cleanup: remove the JobPosting markup from the page, or remove the page, or make sure the posting returns a 404 or 410. The topic of expired job postings and schema matters because leaving stale markup live is treated as advertising a job that doesn't exist.

Sites that repeatedly show expired listings can lose eligibility across all their postings, not just the stale one. The practical fix is boring and effective: put the close date in your CMS next to the posting, and make unpublishing the page part of the hiring workflow the moment a role is filled.

JobPosting mistakes that get listings rejected

Four failures that show up constantly.

Most JobPosting rejections in Search Console trace back to a handful of causes:

  • Markup on a list page. JobPosting belongs on the page for one specific job, never on a careers index showing ten roles at once.
  • Description mismatch. The description property says one thing, the visible page says another, and Google reads that as cloaking.
  • Free-text employment types. The value must be an enum like FULL_TIME or CONTRACTOR; writing Full time with a space fails silently.
  • Missing address granularity. A jobLocation of just United States is not enough; Google wants street-level or at least city-level precision for on-site roles.

Practical habits for healthy JobPosting markup

Three things that pay off every hire.

First, always set validThrough even though it's optional, because it doubles as your own reminder system and Google uses it to expire the listing gracefully. Second, request indexing in Search Console right after publishing; job postings are time-sensitive and waiting a week for a crawl wastes a third of a typical posting window.

Third, run every new posting through the Rich Results Test before you tell anyone it's live. The test catches enum typos and missing required fields in seconds, which beats discovering them in a coverage report two weeks into a silent campaign.

JobPosting Schema Generator and the neighboring tools

Where this fits in the toolbox.

The JobPosting Schema Generator handles one job page at a time, which is exactly the right granularity. Your company's identity is a separate entity: build that once with the Organization Schema Generator and keep the hiringOrganization name here consistent with it. If the employer is a storefront business with hours and walk-ins, LocalBusiness Schema is the better home for the company-level markup.

For pages that need several markup types at once, or types this suite doesn't cover individually, the Schema Markup Generator is the general-purpose builder to reach for.

Try it now

Open JobPosting Schema Generator

The tool is one click away. No sign up, no upload, no payment.

Open JobPosting Schema Generator