SEO · Structured data

Job Posting Schema Generator

This job posting schema generator builds valid JobPosting JSON-LD for Google’s job search: title, description, posting date, hiring organization, location or remote requirements, employment type and salary, with each field checked as you type.

Eligible for a Google rich result

JobPosting markup makes a job eligible for Google’s job search experience. Google requires a title, description, posting date, hiring organization and job location (or, for remote jobs, applicant location requirements).

Status verified on 24 September 2026 · Google’s JobPosting documentation

Fill in your details

The position only: no company, location, dates or job codes.

Responsibilities, qualifications, skills and hours. Basic HTML (p, br, ul, li) is allowed.

Required if the job has an expiry date.

Hiring organizationRequired
Job locationOptional

Where the work is done. Optional for fully remote jobs.

Base salaryRecommended

Only an actual salary from the employer, not a market estimate.

Your internal reference for the job.

{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Senior Accountant",
  "description": "<p>We are looking for a Senior Accountant to lead our month-end close.</p><ul><li>Prepare financial statements under IFRS</li><li>Manage accounts payable and receivable</li><li>Support the annual audit</li></ul><p>Requirements: ACCA or CA qualification and 5+ years of experience.</p>",
  "datePosted": "2026-09-01",
  "validThrough": "2026-10-31T23:59:00+05:00",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Example Ltd",
    "sameAs": "https://example.com",
    "logo": "https://example.com/logo.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "45 Shahrah-e-Faisal",
      "addressLocality": "Karachi",
      "addressRegion": "Sindh",
      "postalCode": "75350",
      "addressCountry": "PK"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "PKR",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 300000,
      "maxValue": 400000,
      "unitText": "MONTH"
    }
  },
  "identifier": {
    "@type": "PropertyValue",
    "name": "Example Ltd",
    "value": "ACC-2026-014"
  },
  "directApply": true
}

Validation — no errors

All required and recommended fields are present and correctly formatted.

Rich result preview (illustration)

Senior Accountant
Example Ltd · Karachi
full timePKR 300000–400000 / month

An illustration of the kind of result this markup could produce — not a guarantee. Google decides whether to show a rich result at all.

The markup is generated in your browser from what you type. Nothing is uploaded.

Job Posting schema: required vs recommended properties

Google requires five properties for job postings — title, description, date posted, hiring organization and job location — and recommends an expiry date, employment type, salary and, for remote jobs, applicant location requirements.

PropertyStatusFormatNotes
Job titleRequiredTextThe position only: no company, location, dates or job codes.
Job descriptionRequiredTextResponsibilities, qualifications, skills and hours. Basic HTML (p, br, ul, li) is allowed.
Date postedRequiredDate, YYYY-MM-DD
Hiring organizationRequiredGroup
Valid throughRecommendedDate and time, ISO 8601Required if the job has an expiry date.
Employment typeRecommendedOne or more of a fixed set
Base salaryRecommendedGroupOnly an actual salary from the employer, not a market estimate.
Hiring organization › Company nameOptionalText
Hiring organization › Company websiteOptionalURL
Hiring organization › Logo URLOptionalURL
This job is 100% remoteOptionalYes / no
Job locationOptionalGroupWhere the work is done. Optional for fully remote jobs.
Job location › Street addressOptionalText
Job location › CityOptionalText
Job location › State or regionOptionalText
Job location › Postal codeOptionalText
Job location › Country codeOptionalISO 3166-1 alpha-2 code
Applicant location requirement (country code)OptionalTextFor remote jobs: the country applicants must be in.
Base salary › CurrencyOptionalISO 4217 code
Base salary › MinimumOptionalNumber
Base salary › MaximumOptionalNumber
Base salary › PerOptionalOne of a fixed set
Job IDOptionalTextYour internal reference for the job.
Candidates can apply directly on this pageOptionalYes / no

Is JobPosting markup eligible for a Google rich result?

JobPosting markup makes a job eligible for Google’s job search experience. Google requires a title, description, posting date, hiring organization and job location (or, for remote jobs, applicant location requirements).

Status verified on 24 September 2026. Google’s documentation: https://developers.google.com/search/docs/appearance/structured-data/job-posting

About Job Posting structured data

JobPosting markup is how a job listing gets into Google’s job search experience, where candidates can filter by location, type and date. It is one of the most tightly specified types, and Google’s job guidelines are strict: the description must match the page, expired jobs must be removed or marked with an expiry date, and the salary must be real.

If you run a job board or publish your own vacancies, the markup lives on the page for each individual job, not on a list of jobs. This generator produces the JSON-LD for one job at a time.

Common Job Posting schema mistakes

  • Putting the company, location or dates in the job title. The title should be the position only, such as “Senior Accountant”.
  • A description that only repeats the title. It must describe the job: responsibilities, qualifications, skills and hours.
  • Leaving validThrough off a job that has a closing date. If the posting expires, you must say when, and you should remove the markup or update it when the job is filled.
  • Marking a remote job with a location but no applicant location requirement. Fully remote jobs use jobLocationType TELECOMMUTE and at least one country in applicantLocationRequirements.
  • Adding estimated salaries. baseSalary should be the actual pay the employer offers, not a market estimate.
  • Lower-case or made-up employment types. Values are case-sensitive: FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM or OTHER.
  • Keeping markup on pages for jobs that are no longer open.

Job Posting schema example

A full-time accountant role in Karachi with a monthly salary range, an expiry date and direct apply, as generated on this page, is shown below.

{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Senior Accountant",
  "description": "<p>We are looking for a Senior Accountant to lead our month-end close.</p><ul><li>Prepare financial statements under IFRS</li><li>Manage accounts payable and receivable</li><li>Support the annual audit</li></ul><p>Requirements: ACCA or CA qualification and 5+ years of experience.</p>",
  "datePosted": "2026-09-01",
  "validThrough": "2026-10-31T23:59:00+05:00",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Example Ltd",
    "sameAs": "https://example.com",
    "logo": "https://example.com/logo.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "45 Shahrah-e-Faisal",
      "addressLocality": "Karachi",
      "addressRegion": "Sindh",
      "postalCode": "75350",
      "addressCountry": "PK"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "PKR",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 300000,
      "maxValue": 400000,
      "unitText": "MONTH"
    }
  },
  "identifier": {
    "@type": "PropertyValue",
    "name": "Example Ltd",
    "value": "ACC-2026-014"
  },
  "directApply": true
}

How to use it

  1. Fill in the job posting details — the form marks each field Required, Recommended or Optional.
  2. Watch the JSON-LD and the validation list update as you type.
  3. Copy the JSON-LD, the HTML script tag or the Next.js snippet, or download the .json file.
  4. Paste it into your page, then check it with Google’s Rich Results Test.

Frequently asked questions

Which properties are required for JobPosting schema?

A title, a description, a date posted, a hiring organization and a job location. For a 100% remote job, applicant location requirements are required instead of a physical location.

How do I mark up a remote job?

Set jobLocationType to TELECOMMUTE, add at least one country in applicantLocationRequirements, and make sure the description states that the job is remote.

How do I show a salary range?

Use baseSalary with a currency and a QuantitativeValue holding minValue and maxValue and a unitText such as MONTH or YEAR. Only use real pay figures from the employer.

What happens when the job is filled?

Remove the markup or the page, or set validThrough to a past date. Google expects expired jobs not to be presented as open.

Can I use JobPosting markup on a page listing many jobs?

No. Put it on the page of each individual job. A list page should link to the individual jobs.

Valid markup makes a page eligible for a rich result; it does not guarantee one. Google decides what to show. Test your page with Google’s Rich Results Test before relying on it.