# Job Posting Structured Data: Plain English Guide
> Structured data is a machine-readable summary of your page. What that means for job postings, the five fields Google requires, and how to add them in about ten minutes.
[Articles](/articles)
Aug 6, 2026 / SEO & Growth / 9 min read
# Job Posting Structured Data, Explained From Scratch
[
Simon Gingras](/author/simon-gingras)
Simon Gingras
Founder, Kardow
Simon built Kardow after years in B2B SaaS. He has launched niche job boards, writes about job board strategy, SEO, and monetization, and ships product daily.
[View profile →](/author/simon-gingras) [LinkedIn ↗](https://www.linkedin.com/in/simon-gingras/)
If you have been told your job pages need structured data, or markup, or schema, and you are not entirely sure those are three names for the same thing, this page is for you. They are. Here is what it means, why job pages specifically care, and how to add it in about ten minutes.
## What Structured Data Actually Is
A person reading one of your job pages can tell at a glance that Acme Corp is the employer, Austin is the location, and $150,000 is the salary. They work it out from layout, wording, and context without thinking about it.
A search engine is inferring all of that from raw text, and inference is unreliable. Is "Austin" the city, or the hiring manager's name? Is that figure a salary or a budget the role manages?
Structured data settles it. You attach a small block of code to the page that labels each fact explicitly: _this string is the job title, this one is the employer, this is the city_. It is not visible to visitors and it does not change how the page looks. It exists purely so machines stop guessing.
### The one-line version
Structured data is a labelled summary of facts already on your page, written where only machines read it. It adds no new information for humans. It removes ambiguity for search engines.
## The Words People Use Interchangeably
Most of the difficulty here is vocabulary rather than technology. Six terms get used loosely, three of them mean the same thing, and nobody says which is which. Worth ten seconds:
| Term | What it actually refers to | Same thing as? |
| --- | --- | --- |
| Structured data | The general idea: extra machine-readable information describing what a page is about. | Yes, people use this interchangeably with "schema" and "markup". |
| Schema.org | The shared vocabulary that defines the types and property names, such as JobPosting and hiringOrganization. A dictionary, not a file format. | Often shortened to just "schema", which is where the confusion starts. |
| Markup | The actual code you add to the page. | Yes, same thing again. "Add job posting markup" means "add structured data". |
| JSON-LD | One of three formats for writing it. A block of JSON in a script tag. The other two, Microdata and RDFa, weave attributes into your HTML. | No. This is a format choice. Google recommends JSON-LD. |
| Rich results | What you might get back: the enhanced listings Google can show when it trusts your structured data. | No. This is the outcome, not the code. |
| Google for Jobs | The specific job search experience that JobPosting structured data can make you eligible for. | No. It is one destination that reads your markup. |
So "add job posting markup", "implement JobPosting schema", and "put structured data on your job pages" are three ways of asking for one task. If you have been reading conflicting guides, that alone may be why they seemed to disagree.
## Why Job Pages Specifically Need It
For most page types structured data is optional polish. For job postings it is closer to a prerequisite, because it is the entry condition for **Google for Jobs**, the job search box that appears above normal results for hiring queries.
Google populates that box from pages carrying valid JobPosting structured data. No markup means no consideration, regardless of how good the page is. That is the practical reason job boards and careers pages treat this as mandatory while a blog might never bother.
## What It Looks Like
Here is a complete, valid example with nothing optional in it. If you copied this into a job page and changed the values, you would have working structured data.
job-page-head.html
```
```
Reading it: `@context` says which vocabulary you are using, always schema.org. `@type` says what kind of thing the page describes, here a JobPosting. Everything after that is a labelled fact. The nested objects exist because an employer and an address are things in their own right rather than plain strings, which is why `hiringOrganization` takes an object with a `name` rather than just the company name directly.
## The Five Fields Google Requires
Google lists exactly five required properties on a JobPosting. Miss any and the listing is unlikely to appear at all. Everything else it publishes, including salary, employment type, and expiry date, is recommended, so leaving those out produces a warning rather than an error.
| Property | In plain terms | Example value |
| --- | --- | --- |
| title | The job title, as a candidate would search it | Senior Software Engineer |
| description | The full job description, not a summary | The complete posting text, as HTML |
| datePosted | When the job actually went live | 2026-08-06 |
| hiringOrganization | Who is hiring, as an object rather than a plain string | Acme Corp |
| jobLocation | Where the job is. Fully remote roles answer this differently, see below. | Austin, TX, US |
Two of these cause nearly all the trouble. `description` must be the full job description rather than a teaser, and it must match what the page shows. And `title` must be the actual job title, not the headline of your advert. Google's wording on that is blunt: the title of the job, not the title of the posting. If your listings carry titles like "Join Our Amazing Team", that is a real problem with a real cost, covered in [job title schema markup](/articles/job-title-schema-markup).
## Handling Remote Jobs
The one case where the five-field rule needs qualifying. A fully remote job has no physical `jobLocation`, so instead of an address you supply two properties saying it is remote and where applicants may be based:
remote-job.jsonld
```
"jobLocationType": "TELECOMMUTE",
"applicantLocationRequirements": {
"@type": "Country",
"name": "US"
}
```
Use `TELECOMMUTE` only for genuinely fully remote roles. A hybrid job that expects someone in the office two days a week is an on-site job as far as the markup is concerned, and should carry the real office address.
## Build Yours
Rather than editing the example by hand, fill in the fields below. It builds the same structure, handles the remote and on-site branches for you, and runs entirely in your browser.
Free JobPosting schema generator
Fill in the fields. Valid JSON-LD updates live. No sign-up, runs in your browser.
Job title Job description
Employer name Employer website
Date posted Valid through (optional)
Employment type Full time Part time Contractor Temporary Intern Volunteer Per diem Other Location type On-site Hybrid Fully remote
City Region / state Postal code Country (e.g. US)
Applicants may work from (country)
Currency Salary min Salary max Per Hour Day Week Month Year
Only add salary if it is real and visible on the job page.
job-posting.jsonld
Copy the `