Skip to main content

Guides 8 min read

Job Posting Structured Data for Google for Jobs: A Practical Guide

By Harmny
Last verified November 2026

The short answer

Google can show your open roles in its job search results when each job has its own public page with valid JobPosting structured data that matches what people see on the page. The markup is a block of JSON-LD in the page. Put a real pay range and location in it, keep it in step with the visible text, remove jobs when they close, and test it before you expect anything. Markup makes a job eligible; Google decides what to show.

What JobPosting markup is

JobPosting is a type from schema.org. You describe a job in JSON-LD, a small data block inside the page, and search engines read it without having to guess from the layout. It does not change how the page looks.

What Google asks for

Google’s documentation sorts the fields into required and recommended. This is the shape of it, as checked in November 2026:

  • Required: the job title, the description, the date posted, the hiring organization and the job location. The valid-through date is required when the job has an expiry date.
  • Recommended: base salary, employment type, a direct-apply flag, an identifier, and for remote roles the remote flag and the places applicants can be in.

Google changes these lists now and then. Read its JobPosting documentation before you build, and treat this page as a map, not the rulebook.

Rules that cause most errors

  1. One job, one page. Each job needs its own URL. A list of jobs with markup on the list page is not enough.
  2. Match the page. The title, pay and location in the markup must be the same as the text a visitor sees.
  3. Real content. Put the full description in, not a teaser, and do not stuff the markup with terms that are not on the page.
  4. Let Google crawl it. The page must be reachable without a login and not blocked in robots.txt.
  5. Remove filled jobs. Return a 404 or 410, or take the markup out, so a closed job does not stay listed.
  6. Pay as numbers. Give the minimum, maximum, currency and unit (hour, month, year) as separate values, not as a sentence.

Pay in the markup

Pay fits the baseSalary property: a currency, plus a value or a minimum and maximum, plus the unit. If you hire in a place with pay transparency rules, the visible range in the posting is what those rules look at, so keep the visible range and the markup identical. Our state-by-state pay transparency guide covers what each state asks you to publish.

Remote jobs

A remote role is marked as telecommute and lists the countries where applicants may be located. A job that can be done from anywhere still needs a clear place requirement, because it is also relevant to the state pay rules for remote work.

Test it

  1. Open the public job URL in Google’s Rich Results Test and check that a JobPosting is detected with no errors.
  2. Make sure the sitemap lists the job pages and that the sitemap is submitted in Search Console.
  3. After the pages are live, look at the job postings report in Search Console for errors and warnings across the site.

How Harmny does it

On the recruiting module, every public job page on your careers page includes JobPosting markup built from the job you entered. It carries the title, description, date posted, your organization, the city, state and country, the pay range if you set one, remote eligibility and a direct-apply flag. A job that is closed returns a not-found page, and a sitemap at /jobs/sitemap.xml lists the open jobs of careers pages that are public. Harmny can also draft a first version of a job description from a title and a few notes, which you review and edit before you publish.

Harmny does not post to other job boards, and it cannot make Google list a job. If a job does not show up, test the page and check the report in Search Console.

Google for Jobs: common questions