JobPosting schema incomplete: missing required fields
JobPosting JSON-LD missing title, description, datePosted, hiringOrganization or jobLocation is dropped from Google's job listing experience. Find incomplete JobPosting markup free and add the required fields.
What it means
Your page has JobPosting structured data, but a required or recommended property is absent. Missing required fields — title, description, datePosted, hiringOrganization, or jobLocation — raise a warning; missing recommended fields (salary, employment type, direct-apply) raise a notice. In either case the posting may be excluded from Google's job-listing rich result.
Why it matters
Google surfaces job postings in a dedicated experience — the results carousel and the Jobs tab — showing title, company, location, and salary before the click. Incomplete markup disqualifies the posting entirely. title is the actual job title (not the HTML <title>); description is the full HTML description and must match the visible page; datePosted sets freshness and drives expiration; hiringOrganization needs at least a name; and jobLocation (a Place with a PostalAddress) is required for any non-remote role — a missing location is the most common reason for rejection.
How to fix it
- Place
JobPostingmarkup on the individual job detail page, not a listing or search page. - Set
titleto match the visible job title exactly — do not reuse the HTML<title>. - Write
descriptionas the full job description in HTML, matching the visible content. - Set
datePostedin ISO 8601, and addvalidThroughso expired postings are not indexed forever. - For non-remote roles add
jobLocationwith aPostalAddress; for fully remote roles omit it, setjobLocationTypetoTELECOMMUTE, and includeapplicantLocationRequirements. - Add recommended
baseSalary,employmentType, anddirectApply, then validate in the Rich Results Test.
Example
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Go Engineer"
}{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Go Engineer",
"description": "<p>Own our crawler pipeline end to end...</p>",
"datePosted": "2026-07-01",
"hiringOrganization": {"@type":"Organization","name":"Crawlinx","sameAs":"https://crawlinx.com"},
"jobLocation": {
"@type": "Place",
"address": {"@type":"PostalAddress","addressLocality":"Lisbon","addressCountry":"PT"}
},
"validThrough": "2026-09-01T23:59"
}title, description, datePosted, hiringOrganization and jobLocation are required. For a remote role, drop jobLocation and set jobLocationType to TELECOMMUTE with applicantLocationRequirements.
When it's not a problem
If the page is a job listing or search aggregator rather than an individual posting, JobPosting markup is inappropriate regardless of completeness — remove it. For fully remote positions, omitting jobLocation is correct provided jobLocationType is TELECOMMUTE (Crawlinx will not warn in that case). Notice-level findings for missing recommended fields do not block rich-result eligibility. This rule is separate from schema.invalid (structurally broken markup).
How Crawlinx detects it
We validate every JobPosting block against Google's required set (title, description, datePosted, hiringOrganization, jobLocation). Fully remote postings are recognised when jobLocationType is TELECOMMUTE, so they aren't falsely flagged for a missing jobLocation.
How common is it?
8 audited sites in our corpus currently show this issue. The breakdowns below show which platforms, gatekeepers, verticals and countries are most exposed.
FAQ
- What fields does Google require for a job posting?
- title, description (HTML allowed), datePosted, hiringOrganization and jobLocation. validThrough is strongly recommended so expired jobs drop out automatically.
- How do I mark up a remote job?
- Omit jobLocation, set jobLocationType to "TELECOMMUTE", and add applicantLocationRequirements with the country or region candidates must be in.
- Why isn't my job in Google's job listings?
- Beyond incomplete markup, jobs also drop when validThrough has passed, when the page is noindex, or when the posting isn't reachable via a crawlable link. Check all three.
Audit your own site — free
157 checks, internal PageRank, render-diff. No signup, results in ~30s.