JobPosting markup for Google for Jobs
The JSON-LD JobPosting Schema Builder assembles the structured data Google needs to surface a role in its Jobs experience. Accurate markup puts your opening into a filterable widget at the top of search results — one of the highest-leverage free recruiting channels available to any employer, regardless of size.
When a job seeker searches for a role on Google, the Jobs carousel often appears above organic listings. That widget pulls entirely from structured data embedded on the source page, not from the page text itself. Without a valid JobPosting schema block, your listing is invisible to that experience no matter how well-written the page is.
How it works
The tool emits a JobPosting object at the root of a <script type="application/ld+json"> block. The key fields:
- title / description / employmentType — the role name, the full job description text, and a value from Google’s allowed list such as
FULL_TIME,PART_TIME,CONTRACTOR, orTEMPORARY. - datePosted / validThrough — both in ISO 8601 date format (
YYYY-MM-DD).datePostedis required;validThroughis strongly recommended. - hiringOrganization — an
Organizationobject withname, optionalsameAs(your company website), and optionally alogoURL (square PNG, 112 px or larger, crawlable). - baseSalary — a
MonetaryAmountwrapping aQuantitativeValuewithminValue,maxValue, and aunitTextofHOUR,DAY,WEEK,MONTH, orYEAR. - jobLocation — a
Placewith a nestedPostalAddresscontainingstreetAddress,addressLocality,addressRegion, andaddressCountry. - Remote jobs — adding
jobLocationType: "TELECOMMUTE"plus anapplicantLocationRequirementsobject lets Google show the role in remote-filtered searches. The builder toggles both fields together when you check the remote box.
Example salary block
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 80000,
"maxValue": 110000,
"unitText": "YEAR"
}
}
Practical guidance
Always set validThrough to the application deadline. Stale postings without an expiry date can linger in Google Jobs results long after the role is filled, which frustrates applicants and creates a poor brand impression. Google may also demote or remove postings it detects as stale.
Match unitText to the actual figure. If you pay £20/hour, use HOUR not YEAR. Mismatched units produce confusing salary displays in the rich result and may cause a manual review failure.
Validate before publishing. Copy the generated script tag and paste it into Google’s Rich Results Test (search.google.com/test/rich-results). It will flag any missing required fields and show a preview of how the listing will appear. The most common failure is a missing datePosted or an invalid employmentType value.
For hybrid or partially remote roles, list the physical office address in jobLocation and still add TELECOMMUTE to jobLocationType — Google supports both in the same posting, which surfaces the role in both location-filtered and remote-filtered searches.
After publishing, allow a few days for Google to crawl and index the page. Verify eligibility in Google Search Console under the Enhancements section, where job posting errors are reported per URL.