Skip to content
Free tool · Structured data

Job Posting Schema Generator

Generate JobPosting JSON-LD for Google’s job search, with salary, location or remote, and a closing date.

No sign-up. Runs entirely in your browser.

Start with these 4. The rest are optional.

The full job description. Basic HTML such as <p> and <ul> is allowed.

JobPosting JSON-LD

Job title, Description, Date posted, Company still required
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "employmentType": "FULL_TIME"
}
</script>

Markup for one role. Site Audit checks structured data coverage across every page it crawls.

Try Site Audit

What this markup does today

The markup behind Google’s job search experience. Remove it, or set validThrough, when the role closes: expired postings left live are a common reason for a manual action.

In the output

What you get

  • Valid JobPosting JSON-LD
  • On-site address or remote with a country
  • A salary range as a MonetaryAmount
  • Employment type and closing date
  • That title, description, datePosted and hiringOrganization, which Google requires, are present.
  • That an on-site role has a jobLocation address, and a remote role uses TELECOMMUTE with an applicant country instead.
  • That a salary range is a MonetaryAmount with a currency and a unit such as YEAR.
  • That employment type and a closing date are set, so the posting expires on time.
Three steps

How to use the Job Posting Schema Generator

1

Enter the title, description and employer

Use the full job description as it appears on the page.

2

Set location or remote

An office address for on-site roles; for remote roles, the country applicants must be in.

3

Add salary and a closing date

Then paste the block into the job’s own page, one block per role.

Why it matters

Why job pages need markup

It is how roles reach job search.

Google’s job search experience is built from JobPosting markup. Without it, a role is just a page.

Remote needs saying explicitly.

A fully remote role is marked TELECOMMUTE with the countries applicants may be in, not given a fake office address.

Salary gets clicks.

Candidates filter by pay. A salary range in the markup is shown where the role is shown.

Expired roles must go.

Leaving markup live after a role closes breaks Google’s guidelines. Set a closing date or remove it.

After you run it

What to do with the result

Job markup is what puts a role into Google’s job search, and it carries strict rules: one posting per page, real locations, and removal when the role closes. Generating it from the same data as the job page, with the closing date set, keeps it inside the rules without anyone remembering to take it down.

Site Audit

Frequently asked questions

Set jobLocationType to TELECOMMUTE and add applicantLocationRequirements with the country applicants must be in. Leave out jobLocation for fully remote roles rather than inventing an office.

See where you actually stand.

A free tool checks one thing once. Veritas watches all of it, continuously, across every engine that decides whether you get cited.

GOOGLE · CHATGPT · PERPLEXITY · GEMINI · AI OVERVIEWS