All articles
Schema Markup

How to implement JobPosting schema for Google Indexing API eligibility

JobPosting structured data is one of only two schema types that unlock Google Indexing API access. Here's the exact JSON-LD template that works.

IP
IndexPilot Team··5 min read

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

FieldRequiredNotes
titleYesJob title, not company name
descriptionYesHTML is allowed; be specific
datePostedYesISO 8601 date: YYYY-MM-DD
hiringOrganizationYesInclude name at minimum
jobLocation or applicantLocationRequirementsYes (one)Use applicantLocationRequirements for remote roles
validThroughRecommendedPrevents stale listings from ranking
employmentTypeRecommendedFULL_TIME, PART_TIME, CONTRACTOR, etc.
baseSalaryRecommendedSignificantly improves rich result appearance

Remote job listings

For fully remote positions, replace jobLocation with applicantLocationRequirements:

"applicantLocationRequirements": {
  "@type": "Country",
  "name": "United States"
},
"jobLocationType": "TELECOMMUTE"

Tip

Including both 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 past validThrough date are treated as closed and may be de-indexed.
  • Incorrect date format — datePosted must be ISO 8601. May 1, 2026 will fail; 2026-05-01 will not.
  • Schema inside <body> — Works in practice but Google recommends placing JSON-LD in <head>.

How to validate before submitting

  1. Visit Google Rich Results Test and enter your job listing URL
  2. Confirm the tool detects a JobPosting result with no errors
  3. Fix any warnings marked as "Recommended" — they improve display in search results
  4. Only after passing validation, submit via the Indexing API or IndexPilot

Related articles

Ready to submit URLs the right way?

IndexPilot validates every URL for Google Indexing API eligibility before submission — so you never waste quota on pages Google will ignore.