Job Posting Schema: How to Get Your Jobs Into Google Jobs
Last Updated: February 25, 2026 · 13 min read
Google Jobs is a dedicated job search experience that appears at the top of search results when candidates search for positions like "software engineer jobs in Hyderabad" or "marketing manager remote jobs". To get your job listings into this carousel, you need JobPosting schema.
This applies both to company career pages (where you post your own jobs) and job board platforms (where you aggregate listings from multiple employers). Both need proper schema — but the implementation approach differs.
📊 Real Impact
A mid-size IT company in Pune added JobPosting schema to their careers page and started receiving 40% more organic applications per month. Their jobs now appear in Google Jobs for relevant searches without any paid job board listings.
1. Required vs. Recommended Fields
| Property | Required? | Notes |
|---|---|---|
| title | ✅ Required | Job title — exactly as it appears on the page |
| description | ✅ Required | Full job description in HTML or plain text |
| hiringOrganization | ✅ Required | Company name and URL |
| jobLocation | ✅ Required | Physical location of the job |
| datePosted | ✅ Required | ISO 8601 date when job was posted |
| validThrough | ⭐ Recommended | Application deadline date |
| employmentType | ⭐ Recommended | FULL_TIME, PART_TIME, CONTRACTOR, INTERN, etc. |
| baseSalary | ⭐ Recommended | Salary range (shown in Google Jobs) |
| jobLocationType | ⭐ Recommended | TELECOMMUTE for remote jobs |
| applicantLocationRequirements | ⭐ Recommended | Country required for remote jobs |
| experienceRequirements | Optional | Years of experience needed |
2. Complete JobPosting Schema Example
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior React Developer",
"description": "<p>We are looking for an experienced React developer to join our product team in Bengaluru. You will work on our flagship SaaS product used by 50,000+ customers globally.</p><p><strong>Requirements:</strong></p><ul><li>4+ years of React experience</li><li>Strong knowledge of TypeScript, Next.js</li><li>Experience with REST APIs and GraphQL</li></ul>",
"hiringOrganization": {
"@type": "Organization",
"name": "TechCorp India",
"sameAs": "https://techcorpindia.com",
"logo": "https://techcorpindia.com/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "100 Koramangala",
"addressLocality": "Bengaluru",
"addressRegion": "Karnataka",
"postalCode": "560034",
"addressCountry": "IN"
}
},
"employmentType": ["FULL_TIME"],
"datePosted": "2026-02-01",
"validThrough": "2026-03-31T23:59:59",
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "INR",
"value": {
"@type": "QuantitativeValue",
"minValue": 1800000,
"maxValue": 2800000,
"unitText": "YEAR"
}
},
"experienceRequirements": {
"@type": "OccupationalExperienceRequirements",
"monthsOfExperience": 48
},
"skills": "React, TypeScript, Next.js, GraphQL, Node.js",
"identifier": {
"@type": "PropertyValue",
"name": "TechCorp India",
"value": "JOB-2026-RC-001"
}
}
</script>3. Remote Job Schema
For fully remote jobs, you must add jobLocationType: "TELECOMMUTE". You still need to include a jobLocation — use your company's headquarters, then add the remote indicator:
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Product Manager (Remote)",
"jobLocationType": "TELECOMMUTE",
"applicantLocationRequirements": {
"@type": "Country",
"name": "India"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"addressCountry": "IN",
"addressLocality": "Mumbai"
}
}
}4. Employment Type Values
Use these exact string values for employmentType (Google-specific values):
FULL_TIMERegular full-time positionPART_TIMEPart-time hoursCONTRACTORContract / freelanceTEMPORARYFixed-term / seasonalINTERNInternshipVOLUNTEERUnpaid volunteerPER_DIEMDay rate / per diemOTHERDoes not fit above categories5. Critical Rules to Follow
Mark expired jobs promptly
When a position closes, either remove the page or add jobStatus: "Closed" to the schema. Letting expired jobs float in Google Jobs gets your domain flagged.
Never use future dates for datePosted
datePosted must be when the job was actually posted, not a future date. Google cross-references crawler dates against your datePosted field.
Description must match page content
The description in schema must match what's visible on the page. Don't stuff keywords in the description that aren't in the actual job post.
One JobPosting per URL
Each job should have its own URL with its own JobPosting schema. Do not put multiple JobPosting schemas on a single page (like a jobs listing page).
6. Frequently Asked Questions
Does JobPosting schema work for company career pages and job boards?▼
Yes, both. Company career pages (posting their own jobs) and aggregator job boards (posting jobs from multiple employers) both benefit from JobPosting schema. The key difference: job boards need to ensure each listing has its own URL and the hiringOrganization correctly identifies the actual employer, not the board.
What happens if I don’t update expired job listings?▼
Expired job listings with active schema create a poor user experience and can flag your domain with Google Jobs. Set validThrough to the application deadline. When a job closes, update eventStatus to Closed or remove the schema. Repeated expired listings lead to Google reducing your domain’s Google Jobs trust score.
Is salary information required for Google Jobs?▼
Salary (baseSalary) is recommended but not required. However, listings that include salary range consistently rank higher in Google Jobs results and get more candidate engagement. Transparency on salary is increasingly important to job seekers and improves application quality.
How do I mark a remote job correctly?▼
Add jobLocationType: “TELECOMMUTE” to the schema. You must still include a jobLocation with a physical address (use your company HQ). For country-restricted remote roles, add applicantLocationRequirements as a Country object specifying the allowed country codes.
Can I add multiple employment types to one JobPosting?▼
Yes. employmentType accepts an array: employmentType: [“FULL_TIME”, “CONTRACTOR”]. This is valid and useful for hybrid arrangements (e.g., full-time employees who may also work as contractors initially). Stick to Google’s defined set of values for this field.
Do I need to add JobPosting schema to every job listing page?▼
Yes. JobPosting schema must be on each individual job listing page. It cannot be added to job listing/search pages that show multiple jobs. Each role needs its own URL with its own schema block. Automating this via your ATS or CMS template is the most scalable approach.
How long does it take for a job listing to appear in Google Jobs?▼
Typically 1–7 days after Google crawls the page. Submit the URL to Google via Search Console URL Inspection → Request indexing to expedite. High-volume sites with frequent postings may see faster crawling. Once Google validates the schema, the listing appears in Google Jobs.
What is the identifier field and is it important?▼
The identifier property links a job posting to your internal ATS ID. It helps Google distinguish between re-posted versions of the same role and prevents duplicate listings. Use a PropertyValue object with your company name and the internal job ID as the value.
Validate Your Job Posting Schema
Check your JobPosting structured data for missing required fields before submitting to Google.
Validate Job Posting Schema →