Skip to main content
seofields
docs

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

FieldTypeRequiredDescription
titlestringThe job title, e.g. "Senior Software Engineer".
descriptiontextFull job description — responsibilities, qualifications, benefits.
datePosteddateDate the job was posted (ISO 8601).
validThroughdatetimeThe date after which the listing is no longer valid.
employmentTypestringFULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, or OTHER.
hiringOrganizationurl | OrganizationThe organization offering the job.
jobLocation.addressPostalAddressPhysical job location — street, city, region, country.

Plugin Registration

sanity.config.ts
import { defineConfig } from 'sanity'
import { schemaOrgJobPostingPlugin } from 'sanity-plugin-seofields/schema'

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

Schema Usage

Add theschemaOrgJobPosting field to any document schema:

schemas/job.ts
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

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

Next.js Component

app/jobs/[slug]/page.tsx
import { JobPostingSchema } from 'sanity-plugin-seofields/schema/next'

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

JSON-LD Output

Generated JSON-LD
{
  "@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"
    }
  }
}

Was this page helpful?