Skip to content

Job posting schema generator

Make a vacancy eligible for Google's job search experience, with salary, location or remote eligibility and an expiry date.

@JobPosting
Title only: no codes, salaries or "hiring now".
Employer
Location
Salary

Your entries are saved in this browser only (localStorage). Privacy

Required
6/6
Recommended
5/9

All Google-required properties present. That makes the page eligible, not guaranteed. Google's docs

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Technical SEO Specialist",
  "description": "<p>Own structured data and crawl health across 40,000 product pages. You will audit markup, ship fixes with engineering and report on rich-result coverage.</p>",
  "datePosted": "2026-09-20",
  "validThrough": "2026-11-20T23:59:00",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Example Outfitters",
    "sameAs": "https://example.com",
    "logo": "https://example.com/logo-512.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "1200 NW Marshall St",
      "addressLocality": "Portland",
      "addressRegion": "OR",
      "postalCode": "97209",
      "addressCountry": "US"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 78000,
      "maxValue": 95000,
      "unitText": "YEAR"
    }
  },
  "identifier": {
    "@type": "PropertyValue",
    "name": "Example Outfitters",
    "value": "SEO-2026-14"
  },
  "directApply": true
}
</script>
  • ?Recommended for Job posting: add applicantLocationRequirements if it applies.applicantLocationRequirements
  • ?Recommended for Job posting: add jobLocationType if it applies.jobLocationType
  • ?Recommended for Job posting: add educationRequirements if it applies.educationRequirements
  • ?Recommended for Job posting: add experienceRequirements if it applies.experienceRequirements

Checked in your browser against the required and recommended properties Google documents for this type. Confirm with Google's Rich Results Test once it's live.

Example Outfittersexample.com/page
Technical SEO Specialist
USD 78000–95000/yearfull-time
Own structured data and crawl health across 40,000 product pages. You will audit markup, ship fixes with engineering and report on rich-result coverage.…

An illustration of what the markup can feed. Google decides what actually appears and valid markup never guarantees a rich result.

When to use JobPosting markup

  • One page per open position, with the full job description visible.
  • Remote jobs: set jobLocationType TELECOMMUTE and the countries applicants may live in.
  • Remove the markup, or the page, once the job is filled.

Getting it right

  • Required: title, description, datePosted, hiringOrganization and jobLocation (or applicantLocationRequirements for fully remote jobs).
  • Keep the title to the job title only; no salary, codes or "urgent".
  • Add validThrough so the listing drops out automatically when it expires.
  • Use the Indexing API or a sitemap with lastmod to tell Google quickly about new and closed jobs.

Source: Google Search Central, Job posting structured data documentation, and schema.org/JobPosting.

Google's property list

PropertyGoogle says
datePostedrequired
descriptionrequired
hiringOrganizationrequired
hiringOrganization.namerequired
jobLocation or applicantLocationRequirementsrequired
titlerequired
applicantLocationRequirementsrecommended
baseSalaryrecommended
directApplyrecommended
employmentTyperecommended
identifierrecommended
jobLocationTyperecommended
validThroughrecommended
educationRequirementsrecommended
experienceRequirementsrecommended

Example output

{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Technical SEO Specialist",
  "description": "<p>Own structured data and crawl health across 40,000 product pages. You will audit markup, ship fixes with engineering and report on rich-result coverage.</p>",
  "datePosted": "2026-09-20",
  "validThrough": "2026-11-20T23:59:00",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Example Outfitters",
    "sameAs": "https://example.com",
    "logo": "https://example.com/logo-512.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "1200 NW Marshall St",
      "addressLocality": "Portland",
      "addressRegion": "OR",
      "postalCode": "97209",
      "addressCountry": "US"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 78000,
      "maxValue": 95000,
      "unitText": "YEAR"
    }
  },
  "identifier": {
    "@type": "PropertyValue",
    "name": "Example Outfitters",
    "value": "SEO-2026-14"
  },
  "directApply": true
}

Job Posting schema questions

Does salary markup matter?

baseSalary is recommended and job seekers filter by it. The separate "Estimated salary" feature was retired in 2025; JobPosting salary is unaffected.

Can the description contain HTML?

Yes. Google allows basic HTML tags such as p, ul, li and br in JobPosting descriptions.

How do I mark up a hybrid job?

Give the office as jobLocation. Only use TELECOMMUTE for jobs that are fully remote.

Related generators