JobPosting Schema Generator — Publish Clear, Compliant Jobs
Generate valid JobPosting JSON‑LD for on‑site and remote roles. Clarify title, description, dates, organization, location, and pay to improve understanding and discovery.
Try the JobPosting GeneratorWhy many job pages underperform
- Vague snippets: title, location, or dates don’t match the real posting.
- Remote eligibility and applicant regions aren’t signaled clearly.
- Pay transparency fields are missing or inconsistently formatted.
- Validator warnings for `validThrough` timezone or incomplete addresses.
How SwiftSchema helps
Our generator guides the essentials: role title, description, datePosted, validThrough, hiringOrganization, and either jobLocation with a full PostalAddress or a clear TELECOMMUTE setup with applicant regions.
It supports employmentType and baseSalary with currency and units to reflect pay transparency. Copy‑ready JSON‑LD reduces mistakes and speeds up publishing.
How it works
- 01
Choose JobPosting in the generator below.
- 02
Enter title, description, hiring organization, and datePosted.
- 03
Pick on‑site (jobLocation + PostalAddress) or remote (jobLocationType=TELECOMMUTE + applicantLocationRequirements).
- 04
Add employmentType and baseSalary with currency and unit when available; set validThrough with timezone.
- 05
Copy JSON or Script, paste into your job page, validate in the Rich Results Test, and keep roles up to date.
Ready to build the markup?
Paste once per job. Validate. Keep dates fresh.
What is JobPosting structured data?
JobPosting is the structured representation of an open role. It communicates the job title, responsibilities, hiring organization, posting/closing dates, work location, employment type, and compensation. Search engines, aggregators, and chat assistants rely on this data to populate job experiences and to vet whether an employer meets transparency and eligibility standards. When your JSON-LD mirrors the public job description, it shows that the role is legitimate, current, and detailed — all traits Google rewards and that help you avoid thin, low-signal job pages.
Unlike general WebPage markup, JobPosting aligns directly with employment regulations and marketplace requirements. For instance, many jurisdictions now require salary ranges; structured data is how you prove compliance at scale. Telecommute options, visa or location requirements, and application URLs all live in the schema, giving crawlers confidence to surface your listing in the right regions and to remove it once the deadline passes.
Why rich job metadata matters
- Discoverability: Google Jobs and other platforms filter roles using structured fields. Missing
employmentTypeorapplicantLocationRequirementscan exclude you from remote or flexible-job searches. - Compliance: Pay transparency laws (e.g., Colorado, NYC) expect public compensation info. Structured data enforces consistent formatting and makes audits easier.
- User trust: Detailed markup ensures snippets and SERP cards show accurate titles, organizations, and locations, reducing bait-and-switch perceptions.
- Operational efficiency: Automating JSON-LD reduces manual copy errors when HR teams publish dozens of roles weekly. It also makes it easier to expire roles promptly with
validThrough.
These benefits compound when you manage large hiring roadmaps. Structured data becomes a control plane for your job inventory, keeping content rich and truthful.
Essential properties to prioritize
title: Match the internal requisition but add clarity for candidates (“Senior Backend Engineer – Payments Platform”). Avoid placeholder text like “Hiring Now.”description: Provide a full HTML-safe summary of responsibilities, qualifications, benefits, and application steps. Thin, one-paragraph descriptions may fail quality checks.datePostedandvalidThrough: Use ISO 8601 (YYYY-MM-DDor timestamps with timezone).validThroughmust include a time and offset (2025-12-01T23:59:00-05:00) so aggregators know when to hide expired roles.hiringOrganization: Include the legal company name,@type, and optionalsameAs,logo, oremploymentAgencyflag. Consistency across roles helps brand recognition.jobLocation/jobLocationType: For on-site or hybrid roles, include a fullPostalAddresswithaddressCountry. For remote roles, setjobLocationType: TELECOMMUTEand useapplicantLocationRequirementsto list allowed regions (countries, states, or job markets).employmentType: Use standard values (FULL_TIME,PART_TIME,CONTRACTOR,INTERN, etc.). Combine multiples for flexible arrangements.baseSalary(orestimatedSalary): Providecurrency,value, andunitText(YEAR, HOUR). Include ranges viaminValue/maxValuewhen possible to stay compliant.identifier: Reference the requisition or job board ID to aid deduplication.applicantLocationRequirements/eligibilityToWorkRequirement: Clarify visa or regional limitations to keep leads qualified.
Document these expectations in your recruiting ops playbook so content, legal, and HR teams supply the necessary data before hitting publish.
Preparing job content before generating schema
- Gather the approved JD: Confirm the final copy includes responsibilities, minimum qualifications, and benefits. Avoid placeholders like “Lorem ipsum” that would trigger thin-content flags.
- Validate compensation details: Determine salary range, bonus eligibility, and currency. Confirm compliance with local laws (e.g., conversion to local currency for international markets).
- Confirm location strategy: Decide if the role is on-site, hybrid, or remote. If remote, list the specific states or countries where you can employ talent, plus any time-zone expectations.
- Collect company metadata: Have logos, sameAs URLs (LinkedIn, Crunchbase), and
@idreferences ready to keep hiringOrganization consistent across roles. - Set lifecycle dates: Choose
datePostedandvalidThrough. AlignvalidThroughwith ATS auto-expiration settings so search engines and HR systems agree on status. - Map application flow: Identify the
applicationContact,employmentAgencyinvolvement, ordirectApplyURL if you support the new Google property.
This prep means the SwiftSchema session becomes a faithful transcription of approved data, not a scramble to invent details, keeping every job page substantial.
Implementation workflow inside SwiftSchema
- Select JobPosting in the generator and confirm metadata.
- Enter the
title,description(HTML allowed in Schema.org), anddatePosted. Paste the same description that appears on the page to avoid mismatch warnings. - Add the hiring organization details. Reuse the same
@idorsameAslinks across all roles for consistency. - Choose location model:
- On-site: Add a
jobLocationarray ofPlaceobjects with embeddedPostalAddress. Include multiple offices if the role can sit in different cities. - Remote: Set
jobLocationType: TELECOMMUTEand defineapplicantLocationRequirementsusingCountryorAdministrativeArea.
- On-site: Add a
- Specify
employmentType,workHours, andoccupationalCategory(e.g.,15-1132for software engineers) when available. - Populate
baseSalarywith currency, value, unit, and optional min/max. If you cannot disclose pay, consider linking to an EstimatedSalary entity on a related occupation page. - Set
validThroughwith a timezone-aware timestamp. Remove or update the schema once the role closes. - Export JSON-LD, embed it in the job detail page along with ItemPage/WebPage markup, and validate using Google’s Rich Results Test plus the Job Posting testing tool in Search Console.
Troubleshooting and QA
- Mismatch between schema and page: Google may issue manual actions if salary, location, or job type differs between structured data and HTML. Run diff scripts that compare key fields to the on-page copy.
- Expired jobs still live: Monitor Search Console for “JobPosting requires updated date” warnings. Automate removal of JSON-LD when
validThroughpasses or mark the role as closed in your CMS. - Incomplete remote data: Setting
jobLocationType: TELECOMMUTEwithoutapplicantLocationRequirementscan limit visibility. Always declare where applicants can reside. - Duplicate postings: Use
identifierand consistent URLs to prevent the same role from appearing multiple times. Canonicalize to the permanent job page, not a campaign landing page. - Missing currency or unit: Validators flag baseSalary when either
currencyorunitTextis absent. Double-check every entry. - Unauthorized reviews: If you include
employmentAgency, ensure the agency has permission to publish under your brand; otherwise, Google might block the markup.
In addition to manual validation, integrate automated QA: nightly scripts that test JSON-LD for expired roles, missing pay data, or mismatched remote fields.
Maintenance and compliance
Recruiting pipelines change quickly. Build workflows so when a role is filled, the CMS or ATS automatically removes or updates the JobPosting schema within hours. Keep lastReviewed current and conduct quarterly audits to confirm pay ranges and location notes remain accurate with new regulations. Create a shared spreadsheet (or use your ATS export) listing every active role, canonical URL, salary range, applicant regions, and expiration date; reconcile it against on-site schema weekly.
Partner with legal/compliance teams to review templates whenever laws shift (e.g., California’s pay transparency updates). Document decision trees for remote eligibility, visa sponsorship, and direct-apply offerings to ensure transparency claims in structured data match real operations. Treat JobPosting schema as part of your employer brand — clean data signals that you respect candidates’ time and align with search quality guidelines.
Common Errors & Fixes
- Missing timezone in
validThrough: use a full timestamp with offset. - Incomplete addresses: use
PostalAddressfor on‑site roles. - Mismatch between remote flags and location: align
jobLocationTypeand applicant regions. - Salary missing currency or unit: include both for every
baseSalary. - Stale postings still indexed: remove or update JSON-LD as soon as the role closes.
Required properties
titledescriptiondatePostedhiringOrganization.namejobLocation (or jobLocationType/telecommute)
Recommended properties
validThroughemploymentTypeapplicantLocationRequirementsbaseSalary.valuebaseSalary.currencyjobLocation.addressoccupationalCategoryidentifier
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Senior Frontend Engineer",
"description": "Build accessible UI components and optimize performance.",
"datePosted": "2025-09-20",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "SwiftSchema",
"sameAs": "https://www.swiftschema.com"
},
"applicantLocationRequirements": {
"@type": "Country",
"name": "United States"
},
"jobLocationType": "TELECOMMUTE",
"validThrough": "2025-12-01T23:59:00-05:00",
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"value": 165000,
"unitText": "YEAR"
}
}
}FAQs
Does JobPosting structured data make jobs appear in Google Jobs?ShowHide
It helps Google understand your jobs. Eligibility for Google Jobs also depends on program participation and compliance; markup alone doesn’t guarantee appearance.
How do I handle remote roles?ShowHide
Use `jobLocationType` with `TELECOMMUTE` and specify applicable regions in `applicantLocationRequirements`.
Is salary required?ShowHide
Recommended. Provide `baseSalary` with a value and currency when available, or consider `EstimatedSalary` on an occupation page.
How do I handle expiration?ShowHide
Set `validThrough` using an ISO 8601 timestamp with timezone and ensure closed roles are removed or updated promptly.