JobPosting Schema Markup API for Google Jobs
Implementation overview
Use defineJobPosting() to publish complete job data as JSON-LD. This reference covers required descriptions, hiring organizations, locations and dates, plus salary, remote-work, and employment fields.
JobPosting structured data can make a job listing eligible for Google's job search experience. Eligibility also depends on the page content and Google's job posting guidelines.
JSON-LD Example
{
"@context": "https://schema.org",
"@type": "JobPosting",
"title": "Software Engineer",
"description": "We are looking for a Software Engineer to join our team.",
"datePosted": "2026-07-15",
"validThrough": "2027-01-15",
"employmentType": "FULL_TIME",
"hiringOrganization": {
"@type": "Organization",
"name": "Acme Corp",
"sameAs": "https://acme.com"
},
"jobLocation": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"addressLocality": "San Francisco",
"addressRegion": "CA",
"addressCountry": "US"
}
},
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"value": 120000,
"unitText": "YEAR"
}
}
}
Schema.org Job Posting
- Type:
defineJobPosting<T extends Record<string, any>>(input?: JobPosting & T)
Describes aJobPostingon aWebPage.
Useful Links
Required properties
- title
string
The title of the job, not the title of the posting, such asSoftware EngineerorBarista. - description
string
The full description of the job in HTML format. - hiringOrganization Organization
The organization offering the job position. - jobLocation
Place
The physical location where the employee reports to work. For a fully remote job, setjobLocationType: 'TELECOMMUTE'and provideapplicantLocationRequirementsinstead. - datePosted
ResolvableDate
Publication date for the job posting.
Recommended Properties
- employmentType
string
Type of employment (e.g., full-time, part-time, contract, temporary, seasonal, internship). - validThrough
ResolvableDate
The date after which the job posting is no longer valid. - applicantLocationRequirements:
AdministrativeArea
The geographic area in which applicants may be located. - baseSalary:
MonetaryAmount
The base salary of the job or of an employee in an EmployeeRole. - directApply:
boolean
Indicates whether direct application is allowed. - identifier:
string | PropertyValue
An identifier for the job posting, unique within the hiring organization. - jobLocationType:
string
For fully remote jobs, set this toTELECOMMUTE.
Defaults
- @type:
JobPosting - @id:
${canonicalUrl}#job-posting - hiringOrganization: id reference of the identity
- mainEntityOfPage: ID reference of the WebPage
Resolves
See Global Resolves for full context.
datePosted: DatehiringOrganization: OrganizationjobLocationandapplicantLocationRequirements: Place and AdministrativeArea nodesbaseSalary: MonetaryAmountvalidThrough: Date- object forms of
educationRequirements,experienceRequirements, andidentifier
Examples
Simple
defineJobPosting({
title: 'Software Engineer',
description: 'We are looking for a Software Engineer to join our team to help us build Unhead.',
hiringOrganization: {
name: 'Unhead',
},
jobLocation: {
address: {
streetAddress: '1600 Amphitheatre Pkwy',
addressLocality: 'Mountain View',
addressRegion: 'CA',
postalCode: '94043',
addressCountry: 'US',
}
},
baseSalary: {
currency: 'USD',
value: {
value: 100000,
unitText: 'YEAR',
},
},
employmentType: 'FULL_TIME',
validThrough: '2027-01-15',
datePosted: '2026-07-15',
})
Types
/**
* A listing that describes a job opening in a certain organization.
*/
export interface JobPostingSimple extends Thing {
/**
* The original date that employer posted the job in ISO 8601 format.
* For example, "2017-01-24" or "2017-01-24T19:33:17+00:00".
*/
datePosted: ResolvableDate
/**
* The full description of the job in HTML format.
*
* The description must be a complete representation of the job, including job responsibilities, qualifications,
* skills, working hours, education requirements, and experience requirements. The description can't be the same as
* the title
*/
description: string
/**
* The organization offering the job position. This must be the name of the company (for example, "Starbucks, Inc"),
* and not the specific location that is hiring (for example, "Starbucks on Main Street").
*/
hiringOrganization: NodeRelation<Organization>
/**
* The title of the job (not the title of the posting). For example, "Software Engineer" or "Barista"
*/
title: string
/**
* The actual base salary for the job, as provided by the employer (not an estimate).
*/
baseSalary?: NodeRelation<MonetaryAmount>
/**
* Type of employment
*/
employmentType?: EmploymentType | EmploymentType[]
/**
* The date when the job posting will expire in ISO 8601 format. For example, "2017-02-24"
* or "2017-02-24T19:33:17+00:00".
*/
validThrough?: ResolvableDate
/**
* Indicates whether the URL that's associated with this job posting enables direct application for the job.
*/
directApply?: boolean
/**
* Description of benefits associated with the job.
*/
jobBenefits?: string
/**
* Educational credentials or qualifications required for the job.
*/
educationRequirements?: NodeRelations<EducationalOccupationalCredential | string>
/**
* Description of the level of experience required for the job.
*/
experienceRequirements?: NodeRelations<OccupationalExperienceRequirements | string>
/**
* Skills, abilities, or knowledge needed for the job.
*/
qualifications?: string
identifier?: NodeRelation<PropertyValue | string>
experienceInPlaceOfEducation?: boolean
}
type JobLocation
= | {
jobLocation: NodeRelations<Place>
jobLocationType?: 'TELECOMMUTE'
applicantLocationRequirements?: NodeRelations<JobLocationRequirement>
}
| {
jobLocation?: NodeRelations<Place>
jobLocationType: 'TELECOMMUTE'
applicantLocationRequirements: NodeRelations<JobLocationRequirement>
}
export type JobPosting = JobPostingSimple & JobLocation
Related Schemas
- Organization: Hiring organization
- LocalBusiness: Job location
ItemList Schema - JSON-LD Guide & Examples
Add ItemList structured data with Unhead. Create ordered lists and eligible Google carousels for courses, movies, recipes, and restaurants.
LocalBusiness Schema - JSON-LD Guide & Examples
Implement LocalBusiness structured data with Unhead. See JSON-LD examples, core properties, and subtypes such as Dentist, Restaurant, and Store.