JobPosting Schema Generator

Build JobPosting JSON-LD for a careers page — the markup Google for Jobs requires for a listing to appear. Runs entirely in your browser.

Job details

Fill in what you have — optional fields are left out of the markup entirely.

Hiring organization

Location

Salary (optional)

Defaults to USD if left blank and an amount is given.

JSON-LD

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting"
}
</script>

Required by Google, still empty

Job titleDescriptionDate postedHiring organization nameJob location address
What Google for Jobs actually requires

A JobPosting rich result needs a title, description, date posted, and a named hiring organization at minimum — plus a way to place the job, which is either a physical jobLocation address or, for remote roles, a jobLocationType of TELECOMMUTE. Everything else — employment type, salary, an expiration date, an organization logo — is optional and improves how the listing filters and displays, but won't by itself block the rich result from appearing.

Keep the markup in sync with the live posting: if the role closes, is filled, or its details change, update or remove the page (and its schema) so search engines aren't left pointing at content that no longer matches.

Frequently asked questions

Do I need to set validThrough?

No, but Google recommends it. A job posting without an expiration date may be treated as stale after 30 days by default, which can cause Google to stop showing it in Google for Jobs even if it's still live on your site. Setting validThrough tells Google exactly how long the listing should be considered active.

How does the remote-work toggle actually work?

Toggling to "Fully remote" sets jobLocationType to TELECOMMUTE and drops the address fields from the form entirely — Google's guidance is that a fully-remote posting should NOT include a jobLocation address. Toggling to "On-site / hybrid" does the opposite: it shows the address fields and builds a jobLocation with a PostalAddress, since Google requires a physical location for a non-remote posting.

What happens if I don't include a salary?

Google doesn't strictly require salary information for the JobPosting rich result itself, but some job boards and regions now require salary transparency by law, and search experiences that let people filter by pay range simply won't surface a listing that has no baseSalary. Leaving it out is valid — it just may reduce visibility wherever salary filtering is used.

Can I use this for an internal careers page, not just a job board?

Yes — the schema works the same either way. JobPosting markup describes a single job opening wherever it's published; Google doesn't distinguish between a dedicated job board and a company's own careers page as long as the page is publicly crawlable and the listing is genuinely open.

Does this submit my job posting to Google for Jobs automatically?

No — this only generates the markup. You still need to publish the page with this script embedded in it, and Google discovers the listing through normal crawling and indexing, the same way it finds any other structured data on your site.

Related tools

Command Palette

Search for a command to run...