---
title: "JobPosting Schema Markup API for Google Jobs · Unhead"
canonical_url: "https://unhead.unjs.io/docs/svelte/schema-org/api/schema/job-posting"
last_updated: "2026-09-17T09:16:19.434Z"
meta:
  description: "Create JobPosting schema markup with defineJobPosting. Learn required job fields, locations, salary, employment type, and JSON-LD examples."
  "og:description": "Create JobPosting schema markup with defineJobPosting. Learn required job fields, locations, salary, employment type, and JSON-LD examples."
  "og:title": "JobPosting Schema Markup API for Google Jobs · Unhead"
---

Home

`
Unhead on GitHub

Switch to SvelteSwitch to TypeScriptSwitch to VueSwitch to ReactSwitch to Solid.jsSwitch to AngularSwitch to Nuxt

**Schema**

# **JobPosting Schema Markup API for Google Jobs**

[Copy for LLMs](https://raw.githubusercontent.com/unjs/unhead/refs/heads/main/docs/schema-org/5.api/9.schema/job-posting.md)

## **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~~**](https://developers.google.com/search/docs/appearance/structured-data/job-posting) 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"
    }
  }
}
```

Use the [**~~Schema.org Generator~~**](https://unhead.unjs.io/tools/schema-generator) to build your structured data visually.

## Schema.org Job Posting

- **Type**: `defineJobPosting<T extends Record<string, any>>(input?: JobPosting & T)`  
  Describes a `**JobPosting**` on a `**WebPage**`.

## Useful Links

- [**~~JobPosting - Schema.org~~**](https://schema.org/JobPosting)
- [**~~JobPosting Schema Markup - Google Search Central~~**](https://developers.google.com/search/docs/appearance/structured-data/job-posting)

## Required properties

- **title** `**string**`  
  The title of the job, not the title of the posting, such as `**Software Engineer**` or `**Barista**`.
- **description** `**string**`  
  The full description of the job in HTML format.
- **hiringOrganization** [**~~Organization~~**](https://unhead.unjs.io/docs/schema-org/api/schema/organization)  
  The organization offering the job position.
- **jobLocation** `**Place**`  
  The physical location where the employee reports to work. For a fully remote job, set `**jobLocationType: 'TELECOMMUTE'**` and provide `**applicantLocationRequirements**` instead.
- **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 to `**TELECOMMUTE**`.

## Defaults

- **@type**: `**JobPosting**`
- **@id**: `**${canonicalUrl}#job-posting**`
- **hiringOrganization**: id reference of the identity
- **mainEntityOfPage**: ID reference of the WebPage

## Resolves

See [**~~Global Resolves~~**](https://unhead.unjs.io/docs/schema-org/guides/get-started/overview#how-does-schemaorg-get-page-data) for full context.

- `**datePosted**`: Date
- `**hiringOrganization**`: Organization
- `**jobLocation**` and `**applicantLocationRequirements**`: Place and AdministrativeArea nodes
- `**baseSalary**`: MonetaryAmount
- `**validThrough**`: Date
- object forms of `**educationRequirements**`, `**experienceRequirements**`, and `**identifier**`

## 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~~**](https://unhead.unjs.io/docs/schema-org/api/schema/organization): Hiring organization
- [**~~LocalBusiness~~**](https://unhead.unjs.io/docs/schema-org/api/schema/local-business): Job location

[Edit this page](https://github.com/unjs/unhead/edit/main/docs/schema-org/5.api/9.schema/job-posting.md)

[Markdown For LLMs](https://raw.githubusercontent.com/unjs/unhead/refs/heads/main/docs/schema-org/5.api/9.schema/job-posting.md)

**Did this page help you? **

[**ItemList** Add ItemList structured data with Unhead. Create ordered lists and eligible Google carousels for courses, movies, recipes, and restaurants.](https://unhead.unjs.io/docs/schema-org/api/schema/item-list) [**LocalBusiness** Implement LocalBusiness structured data with Unhead. See JSON-LD examples, core properties, and subtypes such as Dentist, Restaurant, and Store.](https://unhead.unjs.io/docs/schema-org/api/schema/local-business)

**On this page **

- [JSON-LD Example](#json-ld-example)
- [Schema.org Job Posting](#schemaorg-job-posting)
- [Useful Links](#useful-links)
- [Required properties](#required-properties)
- [Recommended Properties](#recommended-properties)
- [Defaults](#defaults)
- [Resolves](#resolves)
- [Examples](#examples)
- [Types](#types)
- [Related Schemas](#related-schemas)