Why schema markup is the gatekeeper
Google's Indexing API does not read page content. It reads page structure. The only way a URL becomes eligible for priority indexing is if Google can detect a supported structured data type when it validates the page. No schema, no eligibility — regardless of how valuable or fresh the content is.
JobPosting is one of only two schema types that unlock Indexing API access. Implementing it correctly is the difference between submitting a page that Google prioritises and one that gets silently deprioritised.
The minimum valid JobPosting JSON-LD
Paste this template into the <head> of your job listing page and fill in the values:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Frontend Engineer",
"description": "<p>We are looking for a Senior Frontend Engineer...</p>",
"datePosted": "2026-05-01",
"validThrough": "2026-07-01T00:00:00Z",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Acme Corp",
"sameAs": "https://www.acmecorp.com",
"logo": "https://www.acmecorp.com/logo.png"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "San Francisco",
"addressRegion": "CA",
"postalCode": "94105",
"addressCountry": "US"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 120000,
"maxValue": 160000,
"unitText": "YEAR"
}
}
}
</script>Required vs. recommended fields
| Field | Required | Notes |
|---|---|---|
title | Yes | Job title, not company name |
description | Yes | HTML is allowed; be specific |
datePosted | Yes | ISO 8601 date: YYYY-MM-DD |
hiringOrganization | Yes | Include name at minimum |
jobLocation or applicantLocationRequirements | Yes (one) | Use applicantLocationRequirements for remote roles |
validThrough | Recommended | Prevents stale listings from ranking |
employmentType | Recommended | FULL_TIME, PART_TIME, CONTRACTOR, etc. |
baseSalary | Recommended | Significantly improves rich result appearance |
Remote job listings
For fully remote positions, replace jobLocation with applicantLocationRequirements:
"applicantLocationRequirements": {
"@type": "Country",
"name": "United States"
},
"jobLocationType": "TELECOMMUTE"Tip
applicantLocationRequirements and jobLocationType: "TELECOMMUTE"ensures the listing appears in Google's remote job filters.Common validation errors
- Missing
description— The most frequent error. A one-sentence description will pass validation but may reduce rich result eligibility. - Plain text in
description— Allowed, but HTML formatting improves the crawl. - Expired
validThrough— Listings with a pastvalidThroughdate are treated as closed and may be de-indexed. - Incorrect date format —
datePostedmust be ISO 8601.May 1, 2026will fail;2026-05-01will not. - Schema inside
<body>— Works in practice but Google recommends placing JSON-LD in<head>.
How to validate before submitting
- Visit Google Rich Results Test and enter your job listing URL
- Confirm the tool detects a
JobPostingresult with no errors - Fix any warnings marked as "Recommended" — they improve display in search results
- Only after passing validation, submit via the Indexing API or IndexPilot