Generate valid JobPosting JSON-LD structured data for your open roles. Fill in the details and copy the markup so your listing is eligible for Google Jobs. Free, no sign-up required.
The title of the position. Use a plain title, not a code or internal req number.
The full description. It can include HTML formatting, but plain text works fine too.
Physical location of the role. Optional for remote jobs, still added if you fill it in.
Enter your job title above and your JSON-LD will build here automatically.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"employmentType": "FULL_TIME"
}
</script><head> section of the individual job posting page (one block per open role).Structured data tells search engines what your role is. These free widgets make the page better for candidates.
Let candidates message you in one tap while your listing is fresh. A quick contact path turns interest into applications.
Answer the questions candidates always ask, salary, remote policy, process, right on the job page. Clear pages back up the data in your schema.
Show what it is really like to work with you. Real employee voices make an open role far more compelling than a bullet list.
Pull your latest company updates onto the careers page automatically. An active, fresh page signals to search engines that your listings are current.
Other free tools to help you optimize and grow.
Generate Organization, WebSite, and LocalBusiness JSON-LD structured data for your whole site.
Use Tool →Generate Article, BlogPosting, and NewsArticle JSON-LD structured data for your posts.
Use Tool →Generate valid FAQ Page JSON-LD structured data to earn FAQ rich results.
Use Tool →Generate title, description, and social meta tags for any page in seconds.
Use Tool →Create Open Graph and Twitter Card tags so your links look great when shared.
Use Tool →How It Works
No account needed, no sign-up, completely free. Fill in your job details, and valid JSON-LD structured data builds live, ready to copy into your page.
Add the job title, a full description, the employment type, and the date you posted the role. The title is all it takes to start building valid markup.
Name the hiring organization, set the location or mark the role remote, and optionally add a salary. Everything you type builds the markup live, with no empty fields left in.
Copy the generated JSON-LD, paste it into the head of the job posting page, and confirm it with the Google Rich Results Test. No sign-up, completely free.
The Basics
Search engines read your careers pages, but structured data tells them exactly what they are looking at: the title, the company, the location, the pay, and when the role was posted.
The idea
Your job details → schema.org JobPosting → JSON-LD in your <head>
Result: your open role becomes eligible for the Google Jobs experience
Job posting schema is structured data that describes a single open role using the shared schema.org vocabulary and the JobPosting type. Instead of hoping Google infers the title, employer, and location from your HTML, you state them explicitly in a format built for machines to read.
This is what powers Google Jobs, the dedicated hiring box that appears above regular search results. When your listing carries valid JobPosting markup, it becomes eligible to appear there, with the title, company, location, and posting date pulled straight from your data.
The recommended format is JSON-LD: a small block of JSON placed in the head of the individual job page. It lives separately from your visible content, so it is easy to add without touching your design. Structured data does not guarantee placement, but it makes your roles unambiguous to search engines and the AI assistants that increasingly summarize the web.
Fields
Google needs a handful of fields before a role qualifies for the Google Jobs experience. Here is what is required, what is conditional, and what is recommended.
| Field | What it does | Importance | Status |
|---|---|---|---|
| title | The plain-language title of the role, e.g. Senior Frontend Engineer. | Required | Required |
| description | The full job description. Can include HTML formatting or plain text. | Required | Required |
| datePosted | The date the listing first went live, in ISO 8601 format. | Required | Required |
| hiringOrganization | The company advertising the job, as an Organization with a name. | Required | Required |
| jobLocation | The physical Place and address of the role. Required unless the job is fully remote. | Required for on-site | Conditional |
| validThrough | The date the posting expires. Keeps stale roles from lingering in search. | Recommended | Recommended |
| baseSalary | The pay for the role, as a MonetaryAmount with currency, value, and unit. | Recommended | Recommended |
| employmentType | Full time, part time, contractor, and so on. Powers job-type filters. | Recommended | Recommended |
Based on Google Search JobPosting structured data guidelines, 2026.
What It Can Unlock
Structured data makes your roles eligible for hiring features and helps machines understand your listings. Eligibility is never guaranteed, but the groundwork matters.
Valid JobPosting markup makes your role eligible for the Google Jobs experience, the dedicated hiring box that appears above regular results.
Your title, company, location, and posting date can show directly in search, so candidates see the essentials before they even click.
Marking a role as remote with an applicant location requirement lets it surface when candidates filter for work-from-home positions.
Adding a baseSalary can show an estimated or stated pay range on your listing, which tends to attract more qualified applicants.
The datePosted and validThrough fields tell search engines how current a role is, so expired jobs drop out cleanly.
Structured job data makes your openings easier for AI assistants and answer engines to read, summarize, and attribute correctly.
Avoid These
Structured data helps only when it is accurate and valid. Steer clear of these common errors.
Leaving a filled or expired role marked up hurts trust. Keep validThrough current and remove the markup once a job closes.
Keep validThrough currentThe datePosted must reflect when the role actually went live. Do not reset it to look fresher than it is.
Use the real posting dateA one-line description gives candidates and search engines little to work with. Include responsibilities, requirements, and benefits.
Write a complete descriptionOnly add JobPosting schema to real, open positions candidates can actually apply for. Fake or evergreen listings breach Google guidelines.
Mark up only real openingsA non-remote job needs a jobLocation with an address. Without it, the role may not qualify for the Google Jobs experience.
Add an address for on-site rolesAlways run your markup through the Rich Results Test. A single syntax slip can invalidate the whole block.
Validate before you shipGet More From It
Practical ways to make your schema work harder. All CommonNinja widgets mentioned are free to start.
Each job gets its own JobPosting block on its own page. Do not list several roles in a single block or on a shared index page.
An expiry date keeps closed roles from lingering in search and signals that your listings are actively maintained.
Google recommends including pay, and listings with a salary tend to draw more qualified candidates. Use a real figure or range.
Schema describes the role; a clear FAQ answers what candidates actually ask about pay, process, and remote policy. Add one right on the job page.
Try the FAQ widget →JobPosting markup describes one role. Your Organization schema describes the whole company. Use both. Our free Website Schema Generator builds the site-wide part.
Try the Website Schema Generator →Re-run the Rich Results Test whenever you edit a listing or update your careers template. It catches errors before Google does.
Glossary
A quick reference for the properties behind job posting markup.
| Field | Definition | Example | When It Matters |
|---|---|---|---|
| title | The plain title of the position. Use the role name candidates would search for, not an internal code. | Senior Frontend Engineer | Every job you mark up |
| datePosted | The date the listing first went live, in ISO 8601 format. Tells search engines how current the role is. | 2026-07-15 | Every job you mark up |
| validThrough | The date the posting expires. Once passed, the role drops out of the Google Jobs experience cleanly. | 2026-09-15 | Every job with a deadline |
| employmentType | The nature of the role: FULL_TIME, PART_TIME, CONTRACTOR, and so on. Powers job-type filters. | FULL_TIME | Recommended on every role |
| jobLocationType | Set to TELECOMMUTE for fully remote roles, paired with an applicant location requirement. | TELECOMMUTE | Remote positions |
| baseSalary | The pay for the role as a MonetaryAmount, with a currency, a value, and a unit such as YEAR. | USD 90000 / YEAR | Recommended, boosts applications |
From the Blog
Go deeper on recruiting, careers pages, and making your content easier for search engines to understand.
In this article, we are going to discuss SEO, explain why it’s important to the success of a website, and suggest ways t...
Read article →In this article, we will look at some important SEO factors to consider when building a website, for the purpose of incr...
Read article →In this article, we are going to discuss the top Job Listings Widgets for your website. We’ll present a list of widgets,...
Read article →In this article, we discuss the importance of readability in SEO, highlighting its impact on search engine rankings, use...
Read article →In this article, we are going to discuss the top Job Application Form widgets for your website. We’ll present a list of ...
Read article →In this article, we explore how SEO enhances Instagram visibility, focusing on optimizing profiles with keywords, strate...
Read article →