Skip to content
SEO Madmanby Adam Hafez
Free tool

JobPosting schema checker: required and recommended fields

JobPosting schema checker: test job posting JSON-LD for Google's 5 required and 7 recommended fields, employmentType, expiry. Free, runs in your browser.

Runs entirely in your browser. Nothing you enter is uploaded, logged or stored.

Parsed with the browser's own JSON.parse against Google's documented property tables for JobPosting. Nothing you type is sent anywhere.

Key takeaways

  • Google documents five required JobPosting properties, title, description, datePosted, hiringOrganization and jobLocation, and seven recommended ones.
  • jobLocation is not required when applicantLocationRequirements is present, which is Google's documented exception for fully remote postings.
  • A jobLocationType of TELECOMMUTE still needs at least one country, through applicantLocationRequirements or a fallback jobLocation.
  • Google lists eight accepted employmentType values and warns that failing to act on expired jobs may result in a manual action.
  • This checker covers JobPosting specifically, a type the site's general JSON-LD validator does not include among its seven supported types.

What it takes

  • A pasted JobPosting JSON-LD object

More tools

All of them free, all of them browser-only.

Browse the tools

How to use it

  1. 1Paste the JobPosting JSON-LD blockCopy the contents of the script tag with type="application/ld+json" describing the job, not the surrounding page markup.
  2. 2Fix any missing required property firsttitle, description, datePosted, hiringOrganization and jobLocation are the five Google documents as required; a missing one disqualifies the posting from the Job Search rich result entirely.
  3. 3Check the jobLocation exception if the role is remoteA jobLocationType of TELECOMMUTE waives the jobLocation requirement only when applicantLocationRequirements names at least one country; omitting both still fails.
  4. 4Confirm employmentType against the documented enumGoogle accepts FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM and OTHER; any other string is not a documented value even if it parses as valid JSON.
  5. 5Set validThrough and remove the posting on timeA missing validThrough leaves no documented signal for when the role closes, and Google states directly that failing to expire a closed posting on time may result in a manual action.

JobPosting is one of the most tightly specified structured data types Google documents: a required table, a recommended table, a fixed list of employment types, a special rule for remote roles and a policy on expired jobs. This checker keeps all of those rules intact. Paste one JobPosting JSON-LD object and it reports each property as a card, parsed with the browser’s own JSON.parse.

What this JobPosting schema checker tests

  • @type. A Pass when @type is JobPosting, a Warning otherwise, because the property tables below come from Google’s JobPosting documentation.
  • Five required properties. title, description, datePosted, hiringOrganization and jobLocation. A property that is absent, null or an empty string counts as missing.
  • The remote exception. Google says jobLocation is not required if applicantLocationRequirements is present. When it is, the checker marks jobLocation “Missing, but waived” and passes it.
  • Remote postings need a country. For jobLocationType: "TELECOMMUTE", Google says you must specify at least one country, using applicantLocationRequirements (preferred) or defaulting to the country of a jobLocation. If both are absent, the checker adds a failing card.
  • Seven recommended properties. employmentType, baseSalary, validThrough, jobLocationType, applicantLocationRequirements, identifier and directApply. Missing ones are informational.
  • employmentType values. Each value, single or in an array, must be one of FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM or OTHER.
  • validThrough. A date already in the past is flagged, because Google warns that failing to act on expired jobs may result in a manual action.

How to read the results

Each card shows a property, its state and the note from Google’s documentation behind the check. The badge has four states:

  • Pass. The property is present or the value is valid.
  • Required, missing. A required property is absent, a remote posting has no country, or validThrough has passed. Fix these first.
  • Warning. The @type is not JobPosting, or an employmentType value is not on Google’s list.
  • Info. A recommended property is missing. Add it where you have the data, such as a real baseSalary or a closing date in validThrough.

If the box shows “Not valid JSON” with a parser message, fix the syntax first. No checks run until the JSON parses.

Worked example

The checker opens with a remote posting for a Senior SEO Analyst that has title, description, datePosted, hiringOrganization, jobLocationType: "TELECOMMUTE" and employmentType: "FULL_TIME". The result:

  • @type, title, description, datePosted and hiringOrganization pass.
  • jobLocation reads “Required, missing”, since there is no applicantLocationRequirements to waive it.
  • An extra card, “Remote posting needs a country”, fails because neither applicantLocationRequirements nor jobLocation names one.
  • employmentType and jobLocationType pass. baseSalary, validThrough, applicantLocationRequirements, identifier and directApply show Info as missing.
  • employmentType passes the value check, and “validThrough set” shows Info.

Adding one property fixes both failures:

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

jobLocation then reads “Missing, but waived” and the remote country card disappears.

Common mistakes it catches

  • Remote jobs with no geography. TELECOMMUTE on its own does not satisfy Google’s rule. A country is still required.
  • Made-up employment types. Values such as “Full-time” or “PERMANENT” are not on Google’s list of eight. The match is case-sensitive, so use the exact uppercase values.
  • Closed jobs still marked up. A validThrough date in the past, with the page still live, is the condition Google ties to a possible manual action.
  • Empty required strings. A "description": "" left by a template counts as missing here. Google asks for the full job description in HTML, covering responsibilities, qualifications and requirements.

What it does not check: the format of datePosted (Google asks for ISO 8601, such as 2026-09-01), the structure inside hiringOrganization or baseSalary, or whether the markup sits on the same page as the visible job description.

Sources

  1. 1.Job posting (JobPosting) structured data - Google Search CentralPrimary

Frequently asked questions

What are the required fields for JobPosting structured data?

Google documents five required properties, datePosted, description, hiringOrganization, jobLocation and title. The recommended list is applicantLocationRequirements, baseSalary, directApply, employmentType, identifier, jobLocationType and validThrough. The checker reports every one of the twelve as present or missing.

How do I mark up a fully remote job?

Set jobLocationType to TELECOMMUTE and name at least one country applicants may work from in applicantLocationRequirements. Google prefers that property, and with it present jobLocation is no longer required. A remote posting with neither applicantLocationRequirements nor jobLocation fails in this checker.

Why does the JSON-LD validator on this site not already cover JobPosting?

That tool covers Article, Product, FAQPage, HowTo, Organization, BreadcrumbList and Recipe. JobPosting carries its own required and recommended tables, an enumerated employmentType and expiry guidance the other types do not share, so it is checked here instead.

What happens if a job posting is left up after it closes?

Google says jobs no longer open for applications must be expired, for example with a validThrough date in the past, and that failure to take timely action on expired jobs may result in a manual action. This checker flags a validThrough date that has already passed.

Can I paste the whole script tag or a page with @graph?

No. Paste one JSON object whose @type is JobPosting, without the surrounding script tag. The checker uses JSON.parse, so HTML around the JSON is reported as invalid JSON, and an array or @graph wrapper leaves every field reading as missing.

Does a passing result guarantee the Job Search rich result?

No. This checker confirms the properties Google documents are present and that two values are valid. Eligibility also depends on Google's content policies, such as the markup appearing on the same page as the job description jobseekers can read.