How to Get a Job Board Indexed on Google for Jobs: Complete Schema Markup Guide (2026)

How to Get a Job Board Indexed on Google for Jobs: Complete Schema Markup Guide

Updated July 2026 · 15 min read · SEO, Structured Data, JobPosting Schema

Short answer: To appear in Google for Jobs, add valid JobPosting JSON-LD structured data to each individual job listing page (never to search/category pages), make sure every required property matches what’s visibly on the page, submit an XML sitemap, and ideally connect the Google Indexing API for faster crawling. There is no way to “submit” jobs directly to Google — indexing happens entirely through structured data on your own crawlable pages.

How Google for Jobs Actually Works

Google for Jobs is not a job board you submit listings to — there’s no employer account, no posting fee, and no dashboard. It’s an aggregation layer: Google crawls the open web for pages containing valid JobPosting structured data and surfaces matching listings in a dedicated, filterable rich result above standard organic search results.

That means getting indexed comes down to one thing: publishing correct, crawlable JSON-LD on every individual job listing page, and keeping it accurate as jobs open, update, and close.

Job Board Software

Required vs. Recommended Schema Properties

JobPosting schema properties for Google for Jobs eligibility
PropertyStatusNotes
titleRequiredThe actual job title only — no keyword stuffing or location appended
descriptionRequiredFull job description; HTML formatting allowed
datePostedRequiredISO 8601 format, e.g. 2026-07-15
hiringOrganizationRequiredOrganization name; sameAs and logo strongly recommended
jobLocationRequired (unless fully remote)Full PostalAddress; use jobLocationType: TELECOMMUTE for remote roles instead
validThroughRequiredExpiration date — listings without it are treated as a quality signal against them
employmentTypeRecommendedUse enum values like FULL_TIME, not free text like “Full Time”
baseSalaryRecommended, high-impactGoogle states users strongly prefer listings with explicit salary over those without
jobLocationTypeRecommended for remoteSet to TELECOMMUTE for fully remote positions
applicantLocationRequirementsRecommended for remoteTells Google which countries/regions applicants may work from
identifierRecommendedYour internal job ID, used for deduplication and updates
directApplyOptionalSignals whether candidates can apply without leaving your site

Full JSON-LD Example

This example includes both required and high-impact recommended properties for a standard on-site role:

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "JobPosting",
  "title": "Senior Backend Engineer",
  "description": "<p>We're hiring a Senior Backend Engineer to build and maintain our API layer. You'll work with modern backend tooling in a small, collaborative team.</p>",
  "identifier": {
    "@type": "PropertyValue",
    "name": "Acme Corp",
    "value": "JOB-4821"
  },
  "datePosted": "2026-07-15",
  "validThrough": "2026-09-15T23:59:59Z",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Acme Corp",
    "sameAs": "https://acmecorp.com",
    "logo": "https://acmecorp.com/logo.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "123 Market 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>

For a remote role, replace jobLocation with jobLocationType: "TELECOMMUTE" and add applicantLocationRequirements to specify where applicants may be based.

Step-by-Step Implementation

  1. Put structured data on the leaf page only. Add JobPosting JSON-LD to the individual job detail page — never on a search results or category page listing multiple jobs.
  2. Match visible content to the schema exactly. Title, description, location, and salary in the JSON-LD must mirror what a visitor sees on the rendered page.
  3. Use one canonical URL per job. If the same listing is reachable through multiple URLs (filters, tracking parameters), set a rel="canonical" tag pointing to the single authoritative URL.
  4. Set an accurate validThrough date. When a job closes, either return a 404/410 status, remove the JobPosting markup, or make sure validThrough has passed.
  5. Submit an XML sitemap covering all job posting URLs, and keep lastmod timestamps accurate as jobs are updated.
  6. Connect the Google Indexing API for job posting URLs — it prompts Googlebot to crawl new and updated listings within hours instead of days or weeks.
  7. Monitor Google Search Console’s “Job postings” enhancement report to catch structured data errors and warnings as they appear.

Common Errors That Block Indexing

Frequent JobPosting schema issues and fixes
IssueFix
JobPosting markup on a page listing multiple jobsMove markup to individual job detail pages only
Missing or expired validThroughAlways include a real expiration date; update it if the job is reposted
employmentType as free text (“Full Time”)Use schema.org enum values like FULL_TIME, PART_TIME, CONTRACTOR
Duplicate URLs for the same jobPick one canonical URL and set rel="canonical" on the rest
Remote job missing location requirementsAdd jobLocationType: TELECOMMUTE and applicantLocationRequirements
Schema data doesn’t match visible page contentKeep title, location, and salary identical between JSON-LD and rendered HTML
Closed jobs left indexed with active schemaReturn 404/410 or strip the markup immediately when a role closes
No Indexing API integrationNew and updated jobs lag days behind — connect the API for near-real-time crawling
Google explicitly states that structured data violating its job posting content policies — incomplete descriptions, closed roles left active, misleading location data, or content that doesn’t match the visible page — can result in individual listings being removed or a full manual action against the site.

How to Validate and Monitor

  • Rich Results Test (search.google.com/test/rich-results) — checks whether a specific URL’s markup qualifies for the Google for Jobs rich result.
  • Schema Markup Validator (validator.schema.org) — validates against the broader Schema.org spec, useful for catching syntax issues.
  • URL Inspection Tool in Search Console — confirms what Googlebot actually renders on the page, not just what your source code contains.
  • Job postings report in Search Console — under Enhancements, shows valid, warning, and error counts across your indexed job pages over time.

Skip manual schema coding entirely

WPNova’s Structured Data plugin builds and validates JobPosting schema for you — including salary, remote location fields, and expiration handling — directly inside WordPress, so every job listing your board publishes is Google for Jobs–ready by default.

See WPNova Structured Data Plugin →

Frequently Asked Questions

How do I submit my job board to Google for Jobs?

You don’t submit it directly — there’s no form, dashboard, or API for pushing listings into Google for Jobs. Google crawls your pages and indexes any listing with valid JobPosting structured data on its own individual URL.

What are the required JobPosting schema properties?

Google requires title, description, datePosted, hiringOrganization, jobLocation (or jobLocationType for remote roles), and validThrough. Listings missing any required property are not eligible for the Google for Jobs rich result.

Do I need baseSalary in my schema?

It’s not strictly required, but Google’s own documentation notes that users prefer job postings with explicitly stated salaries, and salary data measurably improves visibility and click-through rates.

Why isn’t my job board showing up in Google for Jobs even though the schema validates?

Passing the Rich Results Test doesn’t guarantee indexing. Common causes are duplicate URLs without canonical tags, stale or expired listings left active, thin job descriptions, or a mismatch between the visible page content and the JSON-LD data.

How long does it take for jobs to appear in Google for Jobs?

With the Indexing API connected, listings typically appear within 1–24 hours. Without it, Google’s standard crawl schedule applies, which can take days to weeks — especially problematic for time-sensitive job postings.

Can I use JobPosting schema on a page listing multiple jobs?

No. Google requires exactly one JobPosting per page, placed on the specific job’s detail page. Applying it to search results or category pages listing multiple jobs violates Google’s structured data guidelines.

What happens if I leave expired jobs indexed?

Leaving active JobPosting schema on closed roles erodes trust with Google’s crawler and can be treated as a quality signal against your listings. Return a 404/410 status, remove the markup, or ensure validThrough has passed as soon as a job closes.

Is Google for Jobs free to use?

Yes. There’s no paid tier, premium placement, or way to pay for higher visibility — the only cost is the engineering time to implement and maintain accurate structured data.

Does JSON-LD or microdata work better for JobPosting schema?

Google supports both, but JSON-LD is its preferred and recommended format since it can be added as a single script block without interleaving markup into the visible HTML, making it easier to maintain and less error-prone.

Resources