---
title: "JobPosting Schema"
description: "Add Schema.org JobPosting structured data to your Sanity-powered site with sanity-plugin-seofields. Get job listings into Google for Jobs with title, location, salary, and dates."
canonical: https://sanity-plugin-seofields.thehardik.in/docs/schema-org/job-posting
---

# JobPosting

The JobPosting schema type describes an employment opportunity. With valid markup your roles become eligible for Google for Jobs — a dedicated job-search experience that drives high-intent traffic directly to your careers site.

## About JobPosting

Google for Jobs requires title, description, datePosted, and hiringOrganization at a minimum. Always set validThrough when a closing date is known — Google removes expired listings automatically. Pair this type with  Organization  on your company page so search engines can connect the listing to your employer brand.

## Fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `title` | string | Yes | The job title, e.g. "Senior Software Engineer". |
| `description` | text | Yes | Full job description — responsibilities, qualifications, benefits. |
| `datePosted` | date | Yes | Date the job was posted (ISO 8601). |
| `validThrough` | datetime | No | The date after which the listing is no longer valid. |
| `employmentType` | string | No | FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, or OTHER. |
| `hiringOrganization` | url \| Organization | No | The organization offering the job. |
| `jobLocation.address` | PostalAddress | No | Physical job location — street, city, region, country. |

## Plugin Registration

```typescript
import { defineConfig } from 'sanity'
import { schemaOrgJobPostingPlugin } from 'sanity-plugin-seofields/schema'

export default defineConfig({
  plugins: [
    schemaOrgJobPostingPlugin(),
  ],
})
```

## Schema Usage

Add the `schemaOrgJobPosting` field to any document schema:

```typescript
import { defineField, defineType } from 'sanity'

export default defineType({
  name: 'job',
  title: 'Job',
  type: 'document',
  fields: [
    defineField({
      name: 'schemaOrgJobPosting',
      title: 'JobPosting Schema',
      type: 'schemaOrgJobPosting',
    }),
  ],
})
```

## GROQ Query

```javascript
*[_type == "job"][0]{
  schemaOrgJobPosting {
    title,
    description,
    datePosted,
    validThrough,
    employmentType,
    hiringOrganization,
    jobLocation
  }
}
```

## Next.js Component

```tsx
import { JobPostingSchema } from 'sanity-plugin-seofields/schema/next'

export default function Page({ data }) {
  return <JobPostingSchema data={data.schemaOrgJobPosting} />
}
```

## JSON-LD Output

```json
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Senior Frontend Engineer",
  "description": "We're hiring a senior engineer to build our design system in React and TypeScript.",
  "datePosted": "2025-03-12",
  "validThrough": "2025-05-12T23:59:00Z",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Acme Corp",
    "sameAs": "https://acme.example.com"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "1 Market Street",
      "addressLocality": "San Francisco",
      "addressRegion": "CA",
      "postalCode": "94105",
      "addressCountry": "US"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 160000,
      "maxValue": 210000,
      "unitText": "YEAR"
    }
  }
}
```
