FREE TOOL · NO SIGNUP

Generate JobPosting Schema for Google for Jobs

Build valid JobPosting JSON-LD with hiring organization, location, employment type, posting dates, and salary range — copy or download it in one click.

Job details

·

Role

Plain text or HTML. Include responsibilities and requirements — Google emits this as HTML.

Hiring organization

Absolute https URL.

Your internal req ID (PropertyValue).

Employment type

Dates

When the posting expires.

Location

Salary

Application

Where candidates apply.

Example output — fill in your job details to generate your own JobPosting JSON-LD.
JobPosting JSON-LD Valid schema Remote Salary
jobposting-schema-senior-frontend-engineer.json
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Senior Frontend Engineer",
  "description": "<p>We are hiring a Senior Frontend Engineer to build and scale our customer-facing web app. You will own complex React/Next.js features end-to-end, partner closely with design and product, and raise the bar on performance and accessibility.</p><p><strong>Responsibilities</strong></p><ul><li>Ship high-quality React/TypeScript features for a fast-growing SaaS product.</li><li>Improve Core Web Vitals, accessibility, and front-end test coverage.</li><li>Mentor engineers and help shape our front-end architecture.</li></ul><p><strong>Requirements</strong></p><ul><li>5+ years building production web apps with React.</li><li>Strong TypeScript and modern CSS skills.</li><li>Experience with Next.js and an eye for UX detail.</li></ul>",
  "datePosted": "2026-06-01",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Acme Technologies",
    "sameAs": "https://www.example.com",
    "logo": "https://www.example.com/logo.png"
  },
  "validThrough": "2026-08-31",
  "employmentType": "FULL_TIME",
  "identifier": {
    "@type": "PropertyValue",
    "name": "Acme Technologies",
    "value": "ENG-2026-014"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "addressCountry": "US",
      "streetAddress": "500 Howard St",
      "addressLocality": "San Francisco",
      "addressRegion": "CA",
      "postalCode": "94105"
    }
  },
  "jobLocationType": "TELECOMMUTE",
  "applicantLocationRequirements": {
    "@type": "Country",
    "name": "US"
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "unitText": "YEAR",
      "minValue": 150000,
      "maxValue": 190000
    }
  },
  "directApply": true
}

Paste this into your <head>

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Senior Frontend Engineer",
  "description": "<p>We are hiring a Senior Frontend Engineer to build and scale our customer-facing web app. You will own complex React/Next.js features end-to-end, partner closely with design and product, and raise the bar on performance and accessibility.</p><p><strong>Responsibilities</strong></p><ul><li>Ship high-quality React/TypeScript features for a fast-growing SaaS product.</li><li>Improve Core Web Vitals, accessibility, and front-end test coverage.</li><li>Mentor engineers and help shape our front-end architecture.</li></ul><p><strong>Requirements</strong></p><ul><li>5+ years building production web apps with React.</li><li>Strong TypeScript and modern CSS skills.</li><li>Experience with Next.js and an eye for UX detail.</li></ul>",
  "datePosted": "2026-06-01",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Acme Technologies",
    "sameAs": "https://www.example.com",
    "logo": "https://www.example.com/logo.png"
  },
  "validThrough": "2026-08-31",
  "employmentType": "FULL_TIME",
  "identifier": {
    "@type": "PropertyValue",
    "name": "Acme Technologies",
    "value": "ENG-2026-014"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "addressCountry": "US",
      "streetAddress": "500 Howard St",
      "addressLocality": "San Francisco",
      "addressRegion": "CA",
      "postalCode": "94105"
    }
  },
  "jobLocationType": "TELECOMMUTE",
  "applicantLocationRequirements": {
    "@type": "Country",
    "name": "US"
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "unitText": "YEAR",
      "minValue": 150000,
      "maxValue": 190000
    }
  },
  "directApply": true
}
</script>

Add the same markup to the job page, then validate with Google’s Rich Results Test and submit the URL in Search Console.

The Complete Guide

JobPosting Schema: How to Rank in Google for Jobs

5 MIN READ

Understand with AI

Discuss with your preferred AI assistant

5
Required fields

title, description, hiringOrganization, datePosted, and jobLocation (or jobLocationType) must all be present.

JSON-LD
Markup format

Google recommends JSON-LD in a single <script> tag — the format this generator produces.

validThrough
Posting lifecycle

Set an expiry date so closed roles drop out of Google for Jobs automatically.

If you want your open roles to show up in the dedicated jobs box at the top of Google Search — the experience known as Google for Jobs — you need JobPosting structured data. Without it, your listings compete on plain blue links; with it, they can appear as rich, filterable cards complete with company logo, location, salary, and posting date.

This guide explains exactly what JobPosting schema is, which fields Google requires, how salary and remote roles are modeled, and the mistakes that quietly get postings rejected. Paste your details into the generator above and you will have valid markup in seconds.

What Is JobPosting Schema?

JobPosting schema is a block of JSON-LD (JavaScript Object Notation for Linked Data) that you add to a job page's HTML. It describes the role in a machine-readable format based on the schema.org/JobPosting vocabulary. Google reads this markup, validates it, and — if it qualifies — surfaces the role inside Google for Jobs.

JSON-LD is the format Google recommends because it lives in a single <script> tag and does not interleave with your visible HTML. You drop it into the <head> or anywhere in the <body> of the job page and you are done.

Google splits JobPosting fields into required and recommended. Miss a required field and the posting is ineligible; skip a recommended one and you simply leave engagement on the table.

Required properties

  • title — the role title only (e.g. "Senior Frontend Engineer"), not a sentence or location.
  • description — a complete HTML description of the role, including responsibilities and qualifications.
  • hiringOrganization — the company name (with website and logo recommended).
  • datePosted — the date the role was first published, in ISO 8601 format.
  • jobLocation — the physical address, or jobLocationType: TELECOMMUTE for fully remote roles.
  • validThrough — the expiry date, so Google removes the listing automatically once it closes.
  • employmentType — one or more of FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER.
  • baseSalary — a MonetaryAmount with a currency and a QuantitativeValue (a single value or a min/max range) plus a unitText pay period.
  • identifier — your internal requisition ID, emitted as a PropertyValue.
  • directApply — set to true when candidates can apply directly on the page.

How to Add JobPosting Schema, Step by Step

1. Gather the role details

Collect the title, a full description, the hiring company plus logo URL, the location (or remote requirement), employment type, the posting and expiry dates, and the salary range. These map one-to-one onto the fields in the generator above.

2. Generate and review the JSON-LD

Enter the details and the tool produces a valid JobPosting object instantly. Watch the validation panel: red errors block eligibility, amber warnings flag fields worth adding. Fix every error before you ship.

3. Add the markup to the job page

Copy the ready-made <script type="application/ld+json"> tag and paste it into the HTML of the specific job page — not a generic listings page. Each role needs its own page with its own unique markup.

4. Validate and submit

Run the page through Google's Rich Results Test to confirm there are no errors, then submit the URL in Search Console. Google will crawl it and, once approved, the role becomes eligible for the jobs experience.

Handling Salary and Remote Roles Correctly

Salary is one of the highest-impact recommended fields. Use a range with minValue and maxValue when pay varies, or a single value when it is fixed, and always include the currency and a unitText (HOUR, DAY, WEEK, MONTH, or YEAR). Postings with a salary tend to attract more clicks because candidates self-qualify faster.

Remote roles are modeled differently from on-site ones. For fully remote work, set jobLocationType to TELECOMMUTE and use applicantLocationRequirements to state which country or region applicants must reside in. For hybrid roles, provide both a physical jobLocation and the TELECOMMUTE type — the generator does this automatically when you pick "Hybrid".

Common Mistakes That Get Postings Rejected

  • Stuffing the title — adding location, salary, or seniority adjectives. Keep it to the role name.
  • Markup that does not match the page — the schema must describe the visible content; mismatches are a policy violation.
  • Expired postings left live — set validThrough and remove the markup (or return a 404/410) when the role closes.
  • Plain-text description — Google expects an HTML description; wrap responsibilities and requirements in real tags.
  • One page for many roles — every job needs its own URL and its own JobPosting block.

Expert Tips

Always include a salary range

A baseSalary with currency, min/max, and pay period helps candidates self-qualify and lifts click-through — and it keeps you ahead of pay-transparency rules.

Match the markup to the page

Every field in the schema must reflect the visible job page, and each role needs its own URL. Mismatched or duplicated markup is the fastest way to get a posting rejected.

Frequently Asked Questions

What is JobPosting schema used for?

JobPosting schema is JSON-LD structured data that makes a job page eligible for Google for Jobs — the enhanced jobs box in Google Search. It lets Google display the role as a rich card with the company, location, salary, and posting date, which improves visibility and click-through.

Is JobPosting structured data required for Google for Jobs?

Yes. Google for Jobs only ingests roles that include valid JobPosting markup with all required fields — title, description, hiringOrganization, datePosted, and either a jobLocation or jobLocationType. Without it, the role will not appear in the jobs experience.

How do I mark up a remote job?

Set jobLocationType to TELECOMMUTE and add applicantLocationRequirements with the country or region applicants must live in. For hybrid roles, also include a physical jobLocation . The generator handles both patterns when you select the work arrangement.

Should I include salary in the schema?

It is strongly recommended. Adding a baseSalary with currency, value (or min/max range), and a pay period makes the listing more useful and tends to lift engagement. Several regions are also moving toward pay-transparency rules, so including salary keeps you ahead.

Related guides

Related tools