Staaarter

Job Posting Schema Generator

Fill in a job's title, description, dates, hiring organization, location, and salary, and this tool builds a complete JobPosting JSON-LD object, including nested hiringOrganization, jobLocation, and baseSalary objects, wrapped in a ready-to-paste <script type="application/ld+json"> tag for your job listing page. A free online tool from Staaarter, right in your browser.

Runs locallyUpdated 2026-08-04
By Staaarter Team
generatorjson-ldjobposting

Overview

Introduction

Google for Jobs listings, the card-style job results with company logo, location, and salary shown directly in search, are powered entirely by JobPosting JSON-LD, and it's one of the more deeply nested schema.org types: hiring organization, job location, and salary are all separate nested objects rather than flat fields.

This generator takes the fields that matter (title, description, dates, organization, location, salary) and produces the correctly nested structure without you needing to memorize schema.org's PostalAddress or MonetaryAmount shapes by hand.

What Is Job Posting Schema Generator?

A form-driven generator for JobPosting JSON-LD, the schema.org type Google for Jobs (and other job search engines) use to parse structured job listings out of a page.

It covers the core required and recommended properties: title, description, datePosted, validThrough, employmentType, hiringOrganization, jobLocation (or remote status via jobLocationType), and baseSalary.

How Job Posting Schema Generator Works

Title, description, datePosted, and employmentType map directly to their JobPosting properties. Hiring organization fields (name, URL, logo) are nested into a hiringOrganization Organization object automatically.

Address fields (street, city, region, postal code, country) are nested into a jobLocation Place/PostalAddress structure only when at least one is filled in, and the remote toggle adds jobLocationType: TELECOMMUTE independently of whether an address is present. Salary fields build a nested baseSalary MonetaryAmount/QuantitativeValue object only when a salary value is entered.

When To Use Job Posting Schema Generator

Publishing a new job listing and wanting it eligible for Google for Jobs' rich job search experience.

Retrofitting structured data onto an existing careers page or applicant tracking system template.

Generating a one-off listing for a single role posted outside a normal ATS pipeline.

Features

Advantages

  • Handles the three-level nested baseSalary shape and the PostalAddress-nested jobLocation shape automatically, both frequent sources of hand-written JSON-LD errors.
  • Exposes the remote/TELECOMMUTE toggle as a single switch instead of requiring you to remember the exact property name and value.
  • Produces valid minimal JobPosting markup from just title, description, date, and hiring org, letting you add location and salary incrementally.

Limitations

  • Doesn't check the posting against Google's full job posting content policies (e.g. no expired listings, no fake urgency language); it only builds structurally valid markup.
  • Covers a single jobLocation; multi-location postings that Google's guidelines support via an array of jobLocation objects need manual editing of the JSON after export.
  • Doesn't set applicantLocationRequirements, which Google recommends in addition to jobLocationType for fully remote roles open to a specific country's applicants.

Examples

A remote, full-time role with salary

Input

Title: Senior Frontend Engineer
Description: Build and ship UI for our developer tools platform.
Date posted: 2026-08-04
Valid through: 2026-09-04
Employment type: FULL_TIME
Hiring org: Acme Devtools, https://example.com, https://example.com/logo.png
Remote: yes
Salary: 140000-180000 USD/YEAR (using 160000 as the value)

Output

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Senior Frontend Engineer",
  "description": "Build and ship UI for our developer tools platform.",
  "datePosted": "2026-08-04",
  "employmentType": "FULL_TIME",
  "validThrough": "2026-09-04",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Acme Devtools",
    "sameAs": "https://example.com",
    "logo": "https://example.com/logo.png"
  },
  "jobLocationType": "TELECOMMUTE",
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "value": "160000",
      "unitText": "YEAR"
    }
  }
}
</script>

Remote status is expressed as jobLocationType: TELECOMMUTE, and salary is nested through MonetaryAmount into QuantitativeValue with the pay period in unitText.

Best Practices & Notes

Best Practices

  • Always set validThrough to the date the listing should stop being shown; Google uses it to detect and demote expired postings automatically.
  • Include baseSalary whenever you can; Google's guidelines note that job postings with transparent salary information tend to perform better in the job search experience.
  • Use the exact employmentType value matching the role's real terms rather than defaulting to FULL_TIME out of habit.
  • For remote roles, combine the TELECOMMUTE toggle with a real jobLocation address when the role is tied to a specific hiring region, even if work itself happens remotely.

Developer Notes

baseSalary needs the nested value.unitText field (HOUR/DAY/WEEK/MONTH/YEAR) because a bare number is ambiguous between an hourly rate and an annual salary; Google's rich result rendering reads unitText specifically to decide how to label the figure, so omitting it produces valid but ambiguous markup.

Job Posting Schema Generator Use Cases

  • Publishing a new job opening on a company careers page
  • Generating JobPosting markup for a job board template shared across many listings
  • Adding salary transparency data to an existing listing that previously omitted it

Common Mistakes

  • Leaving validThrough blank on a real listing, which risks Google continuing to surface it after the role is filled or closed.
  • Flattening baseSalary into a single object with a bare numeric value instead of nesting it through MonetaryAmount and QuantitativeValue, which most parsers reject.

Tips

  • Run the output through the Structured Data Validator tool in this category before publishing, since JobPosting has more required fields than most other schema types.
  • If your ATS already emits a machine-readable posting date, copy that exact value into datePosted rather than using the day you happen to be adding markup.

References

Frequently Asked Questions