Business Platforms

Getting Listings Into Google for Jobs With JobPosting Schema

Which JobPosting properties Google requires and recommends, how to mark up remote roles, what to do when a job closes, when to use the Indexing API, and how to test before and after launch.

Getting Listings Into Google for Jobs With JobPosting Schema

There is no form for submitting vacancies to Google for Jobs and no fee for appearing in it. Google builds its job search results from pages it crawls, and it decides which pages qualify by reading JobPosting structured data on each one. Get the markup right and your listings are eligible. Get it wrong, or leave closed jobs marked as open, and they drop out without any error message.

The details below were checked against Google's documentation, which changes from time to time. Treat Google's JobPosting reference as the final word and this article as a working guide to it.

How a listing reaches Google for Jobs

Each vacancy needs its own page with its own address, and the structured data goes on that page. Google asks for the markup on the most specific page for a single job. Search results pages and category lists must not carry it. The job description has to be visible without logging in, and the markup has to describe the same job a visitor sees on the page.

JSON-LD is the simplest format to generate: one <script type="application/ld+json"> block built from the listing's fields when the page is rendered. Output it in the server-rendered HTML where you can, so it does not depend on scripts running in the browser.

The job experience is offered in a set list of countries and regions. The reference page has the current list, which is worth checking before you promise results to employers in a new market.

The five required properties

PropertyWhat Google expectsCommon mistake
titleThe job title onlyAdding job codes, locations, salaries, dates or the company name, or decorating it with special characters
descriptionThe full description in HTML: duties, qualifications, skills, hoursA one-line summary, or a copy of the title
datePostedThe original posting date in ISO 8601 formatResetting it every day to look fresh
hiringOrganizationThe company offering the job, by its company nameNaming a branch or the job board itself
jobLocationWhere the employee will report to work, with as much address detail as you have. addressCountry is mandatory.Using the recruiter's office address, or leaving out the country

Two notes for recruiters and job boards. When the employer cannot be named, Google's guidance is to set the organization's name to confidential instead of inventing one or substituting the agency. And for the description, Google recognizes paragraph and list tags (<p>, <ul>, <li>) and asks for at least paragraph breaks. Headings and bold text inside the description are not used.

A job with several work locations takes several jobLocation entries in an array.

  • validThrough: the date the posting expires. Include it whenever a closing date exists. Leave it out if the job has no end date or you do not know it.
  • employmentType: one or more of FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM or OTHER. Map your own job types to these exact values.
  • baseSalary: the real salary from the employer, never an estimate, as an amount or a range with a currency and a unit (HOUR, DAY, WEEK, MONTH or YEAR).
  • identifier: the employer's own reference for the vacancy.
  • directApply: true when a candidate can complete the application from this page without being sent through repeated sign-ins and forms elsewhere.
  • jobLocationType and applicantLocationRequirements: for remote roles, covered below.

Google also lists education and experience properties as beta and says they may have no visible effect yet. Fill them only if you already hold the data in structured form.

A complete example

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "JobPosting",
  "title": "Warehouse Supervisor",
  "description": "<p>Full description of duties, requirements and hours.</p>",
  "identifier": {
    "@type": "PropertyValue",
    "name": "Example Logistics",
    "value": "WS-1042"
  },
  "datePosted": "2030-01-18",
  "validThrough": "2030-03-18T00:00",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Example Logistics",
    "sameAs": "https://www.example.com"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "100 Example Road",
      "addressLocality": "Columbus",
      "addressRegion": "OH",
      "postalCode": "43004",
      "addressCountry": "US"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 52000,
      "maxValue": 60000,
      "unitText": "YEAR"
    }
  }
}
</script>

Generate this from the same fields that render the visible page, never from a separate set of values. If the page says the job is in Columbus and the markup says Cleveland, the markup no longer describes what visitors see, which breaks Google's general structured data rules. The full vocabulary is defined at schema.org/JobPosting, but only the properties Google documents affect job search.

Remote roles need their own markup

Set jobLocationType to TELECOMMUTE only when the job is fully remote. Roles with occasional home working, or where remote work is negotiable, are not remote in Google's terms and should be marked up as ordinary on-site jobs with a physical jobLocation. The description itself must also say that the job is remote.

A remote job still needs geography. State where candidates may be based with applicantLocationRequirements, naming at least one country:

"jobLocationType": "TELECOMMUTE",
"applicantLocationRequirements": {
  "@type": "Country",
  "name": "USA"
}

With that in place, jobLocation is no longer required. On your posting form this means two fields, not one: a "fully remote" checkbox, and a list of countries or states the hire can live in. Free text such as "Remote (EU)" in a city field cannot be turned into valid markup.

Expired jobs, sitemaps and the Indexing API

Google does not allow expired postings, so closing a job properly matters as much as publishing it. When a job closes or is filled, do one of three things:

  • make sure validThrough is set and in the past,
  • remove the page so it returns a 404 or 410 status, or
  • remove the JobPosting markup from the page.

A filled job with links pointing to it can stay as a page that says "this position has been filled" and suggests similar roles, with the markup removed. A short-lived listing can simply go. Whatever the rule, automate it: a scheduled task that expires jobs past their closing date, and a "mark as filled" button for employers that runs the same code.

To tell Google about changes, keep an XML sitemap of live job pages with accurate last-modified dates. Google additionally recommends the Indexing API for job pages, because it prompts a faster crawl than a sitemap does. You send an "updated" notification when a job is published or changed and a "deleted" notification after the page has been removed or set to noindex. Three cautions: the API is restricted to pages with job posting or livestream markup, the default quota is meant for setup and testing with more requiring approval, and submissions are checked for spam. It needs a Google Cloud service account that is added as an owner of the site in Search Console, which is a developer task.

Policies that get listings dropped

Valid markup on a page that breaks the content rules still fails. Google's policies for job postings exclude, among others:

  • pages that list several jobs under one JobPosting,
  • incomplete descriptions,
  • postings with no way to apply, and descriptions hidden behind a login,
  • jobs that require payment from applicants,
  • adverts or promotions presented as vacancies,
  • postings that misrepresent who is hiring,
  • resume collection where no position is open, and "job wanted" posts from candidates.

For a public job board this is a moderation requirement as much as a technical one. If employers can publish without review, their violations become your site's problem. A structured data manual action causes Google to ignore the markup on affected pages.

Test before launch and keep watching

  1. Run a job page through Google's Rich Results Test. Fix every error, then look at warnings, which usually point to missing recommended properties.
  2. Test several kinds of listing: on-site, remote, multi-location, with and without salary, with a confidential employer.
  3. After deploying, use URL Inspection in Search Console on a few live job pages to confirm Google can fetch them and sees the markup.
  4. Check the rich result report for job postings in Search Console weekly at first. A sudden rise in invalid items usually follows a template change or a new field on the posting form.
  5. Make sure exactly one block of JobPosting markup is output per page. Two plugins both adding it is a common cause of conflicting values.

Plugin output or custom markup

On WordPress you may already have most of this. WP Job Manager, for example, adds JobPosting markup to each single listing page automatically, and several other job board plugins do something similar. Test what yours outputs against the tables above before writing anything. The usual gaps are salary, remote attributes, expiry handling and Indexing API notifications.

Custom work is justified when jobs come from an ATS feed, when you run a board with thousands of listings and need bulk validation and automatic notifications, or when your listing fields do not map cleanly to what Google expects. We handle this as part of building job boards and recruitment portals and on WordPress job boards, often alongside the feed work described in connecting your website to an ATS. If you are still planning the site, start with how to build a job board website.

Frequently asked questions

Does it cost anything to appear in Google's job results?

No. Eligibility comes from structured data on your own pages and from following Google's guidelines. Eligibility is not a guarantee, though: Google decides which listings it shows for a given search.

How long does a new job take to show up?

Google gives no fixed time. It depends on when the page is next crawled. A sitemap with accurate dates helps, and the Indexing API prompts a faster crawl, which is why Google recommends it for job pages.

Only if your page carries the complete description and gives a clear way to apply. Set directApply honestly: it is for pages where the application can be completed without detours.

Do salaries have to be included?

No, baseSalary is recommended and not required. If you include it, it must be the employer's actual figure or range. Local pay transparency laws may separately require salary information in the advert, which is a question for the employer's legal adviser.

Add WorldWin Coder to your preferred sources

Add worldwincoder.com as a preferred source on Google, or open this article in your AI assistant to use it as a source.

Swati Priyadrshni
· Founder & CEO at WorldWin Coder

I'm Swati Priyadarshani, Founder & CEO of LMS Advisor and Co-Founder of WorldWin Coder Pvt. Ltd. (est. 2019). Over the last 10+ years, I've helped enterprises build learning platforms that actually get used - not just deployed.

Keep reading

Have something to build, fix or move?

Tell us where you are. A developer reads every inquiry, and you get next steps and a free quote within one business day.