Job Posting schema: required vs recommended properties
Google requires five properties for job postings — title, description, date posted, hiring organization and job location — and recommends an expiry date, employment type, salary and, for remote jobs, applicant location requirements.
| Property | Status | Format | Notes |
|---|---|---|---|
| Job title | Required | Text | The position only: no company, location, dates or job codes. |
| Job description | Required | Text | Responsibilities, qualifications, skills and hours. Basic HTML (p, br, ul, li) is allowed. |
| Date posted | Required | Date, YYYY-MM-DD | |
| Hiring organization | Required | Group | |
| Valid through | Recommended | Date and time, ISO 8601 | Required if the job has an expiry date. |
| Employment type | Recommended | One or more of a fixed set | |
| Base salary | Recommended | Group | Only an actual salary from the employer, not a market estimate. |
| Hiring organization › Company name | Optional | Text | |
| Hiring organization › Company website | Optional | URL | |
| Hiring organization › Logo URL | Optional | URL | |
| This job is 100% remote | Optional | Yes / no | |
| Job location | Optional | Group | Where the work is done. Optional for fully remote jobs. |
| Job location › Street address | Optional | Text | |
| Job location › City | Optional | Text | |
| Job location › State or region | Optional | Text | |
| Job location › Postal code | Optional | Text | |
| Job location › Country code | Optional | ISO 3166-1 alpha-2 code | |
| Applicant location requirement (country code) | Optional | Text | For remote jobs: the country applicants must be in. |
| Base salary › Currency | Optional | ISO 4217 code | |
| Base salary › Minimum | Optional | Number | |
| Base salary › Maximum | Optional | Number | |
| Base salary › Per | Optional | One of a fixed set | |
| Job ID | Optional | Text | Your internal reference for the job. |
| Candidates can apply directly on this page | Optional | Yes / no |
Is JobPosting markup eligible for a Google rich result?
JobPosting markup makes a job eligible for Google’s job search experience. Google requires a title, description, posting date, hiring organization and job location (or, for remote jobs, applicant location requirements).
Status verified on 24 September 2026. Google’s documentation: https://developers.google.com/search/docs/appearance/structured-data/job-posting
About Job Posting structured data
JobPosting markup is how a job listing gets into Google’s job search experience, where candidates can filter by location, type and date. It is one of the most tightly specified types, and Google’s job guidelines are strict: the description must match the page, expired jobs must be removed or marked with an expiry date, and the salary must be real.
If you run a job board or publish your own vacancies, the markup lives on the page for each individual job, not on a list of jobs. This generator produces the JSON-LD for one job at a time.
Common Job Posting schema mistakes
- Putting the company, location or dates in the job title. The title should be the position only, such as “Senior Accountant”.
- A description that only repeats the title. It must describe the job: responsibilities, qualifications, skills and hours.
- Leaving validThrough off a job that has a closing date. If the posting expires, you must say when, and you should remove the markup or update it when the job is filled.
- Marking a remote job with a location but no applicant location requirement. Fully remote jobs use jobLocationType TELECOMMUTE and at least one country in applicantLocationRequirements.
- Adding estimated salaries. baseSalary should be the actual pay the employer offers, not a market estimate.
- Lower-case or made-up employment types. Values are case-sensitive: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM or OTHER.
- Keeping markup on pages for jobs that are no longer open.
Job Posting schema example
A full-time accountant role in Karachi with a monthly salary range, an expiry date and direct apply, as generated on this page, is shown below.
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Accountant",
"description": "<p>We are looking for a Senior Accountant to lead our month-end close.</p><ul><li>Prepare financial statements under IFRS</li><li>Manage accounts payable and receivable</li><li>Support the annual audit</li></ul><p>Requirements: ACCA or CA qualification and 5+ years of experience.</p>",
"datePosted": "2026-09-01",
"validThrough": "2026-10-31T23:59:00+05:00",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Example Ltd",
"sameAs": "https://example.com",
"logo": "https://example.com/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "45 Shahrah-e-Faisal",
"addressLocality": "Karachi",
"addressRegion": "Sindh",
"postalCode": "75350",
"addressCountry": "PK"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "PKR",
"value": {
"@type": "QuantitativeValue",
"minValue": 300000,
"maxValue": 400000,
"unitText": "MONTH"
}
},
"identifier": {
"@type": "PropertyValue",
"name": "Example Ltd",
"value": "ACC-2026-014"
},
"directApply": true
}How to use it
- Fill in the job posting details — the form marks each field Required, Recommended or Optional.
- Watch the JSON-LD and the validation list update as you type.
- Copy the JSON-LD, the HTML script tag or the Next.js snippet, or download the .json file.
- Paste it into your page, then check it with Google’s Rich Results Test.
Frequently asked questions
Which properties are required for JobPosting schema?
A title, a description, a date posted, a hiring organization and a job location. For a 100% remote job, applicant location requirements are required instead of a physical location.
How do I mark up a remote job?
Set jobLocationType to TELECOMMUTE, add at least one country in applicantLocationRequirements, and make sure the description states that the job is remote.
How do I show a salary range?
Use baseSalary with a currency and a QuantitativeValue holding minValue and maxValue and a unitText such as MONTH or YEAR. Only use real pay figures from the employer.
What happens when the job is filled?
Remove the markup or the page, or set validThrough to a past date. Google expects expired jobs not to be presented as open.
Can I use JobPosting markup on a page listing many jobs?
No. Put it on the page of each individual job. A list page should link to the individual jobs.
Valid markup makes a page eligible for a rich result; it does not guarantee one. Google decides what to show. Test your page with Google’s Rich Results Test before relying on it.