Add your job title, description, dates, hiring organization, location and salary. Copy valid schema.org JobPosting JSON-LD for Google for Jobs and paste it into the job page <head>. Remote and hybrid roles are handled correctly. Free, no sign-up, and nothing leaves your browser.
JobPosting schema is structured data, based on the schema.org JobPosting type, that describes a job opening: its title, description, hiring organization, location, salary and dates. It is the markup Google for Jobs reads to show eligible listings in Google Search.
You add it to each job page as JSON-LD. Valid markup makes a listing eligible. It does not guarantee it will appear, and the markup must match the job shown on the page.
Unlike many schema types, JobPosting is still an active, documented Google feature, so correct markup is a real eligibility requirement.
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior SEO Specialist",
"description": "<p>We are hiring...</p>",
"datePosted": "2026-10-20T09:00:00Z",
"validThrough": "2026-12-20T00:00:00Z",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Acme Corp",
"sameAs": "https://www.example.com"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"addressLocality": "Mumbai",
"addressCountry": "IN"
}
}
}A few are required. Salary, expiry and employment type are recommended and improve how a listing performs.
| Property | Status | What it describes |
|---|---|---|
title, description, datePosted | Required | The role, its full description and when it was posted |
hiringOrganization | Required | The company hiring, with name and ideally logo and URL |
jobLocation | Required | The workplace address, for on-site and hybrid roles |
applicantLocationRequirements | Required | Countries applicants can work from, for remote and hybrid roles |
validThrough | Recommended | The expiry date. Required if the listing expires |
employmentType, baseSalary, identifier | Recommended | Contract type, pay and a job reference |
skills, qualifications, jobBenefits | Optional | Extra detail about the role |
jobLocationType accepts one value, TELECOMMUTE. Values such as “Remote” or “Hybrid” are not valid. The generator maps your choice to the right properties.
| Work arrangement | Properties to use |
|---|---|
| On-site | jobLocation only. Leave out jobLocationType |
| Fully remote | jobLocationType: TELECOMMUTE and applicantLocationRequirements |
| Hybrid | jobLocation, jobLocationType: TELECOMMUTE and applicantLocationRequirements |
Each applicant location is written as a Country object, for example {"@type":"Country","name":"IN"}, which is the form Google expects.
The generator does the writing. These four steps take you from a blank form to tested markup.
Enter the title, description, date posted and an expiry date.
Add who is hiring, then pick on-site, hybrid or remote and fill the matching location.
Add pay, employment type and benefits that appear on the page.
Paste the script into the job page head, then run the Rich Results Test.
Put one JobPosting block on each job’s own page. When a job closes, remove the markup, update validThrough to a past date, or remove the page, so expired roles do not stay marked as open.
Short answers on required fields, remote roles and expired jobs.
JobPosting schema describes a job opening: title, description, organization, location, salary and dates. It is the structured data behind Google for Jobs, the job search experience in Google Search.
Title, description, datePosted and hiringOrganization are required, plus a jobLocation for on-site and hybrid roles. Remote and hybrid roles also need applicantLocationRequirements with at least one country. This generator flags missing items before you copy.
Google accepts one value, TELECOMMUTE. On-site roles leave it out and use jobLocation. Fully remote roles use TELECOMMUTE with applicantLocationRequirements. Hybrid roles combine a physical jobLocation with TELECOMMUTE and applicantLocationRequirements.
validThrough tells Google when a listing expires. Set it for roles with a deadline, and keep it accurate so closed jobs do not stay in results.
baseSalary holds a MonetaryAmount with a currency and either an exact value or a minimum and maximum, plus a pay period such as HOUR or YEAR. Only add pay that is shown on the page.
Yes, handle it one of three ways: remove the markup, set validThrough to a past date, or remove the page. Leaving a closed job marked as open gives job seekers a poor experience.
Google for Jobs is its own search experience, separate from AI Overviews. Clear structured job data can still make openings easier for AI systems to read accurately, but it does not guarantee inclusion.
Yes. It is completely free, with no sign-up and no limit. Everything runs in your browser, so your job details are never uploaded to a server.
Job pages work best with organization, local business and breadcrumb markup around them.
Search Savvy’s technical SEO team implements and monitors schema across every template, and fixes the technical issues that hold your site back.