On this page:
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.

validThrough

validThrough · Recommended

Appears in

JobPosting

What is it?

The expiration date of a job posting. After this date, the listing is considered closed and Google removes it from job search results. This field tells candidates and search engines when the application window ends.

Why this matters for AEO

AI assistants use validThrough to avoid surfacing expired listings. When a user asks "What open positions does HubSpot have?" the AI engine checks expiration dates to filter out closed roles. A listing without validThrough may persist in AI responses long after the position is filled, leading to poor candidate experience and wasted clicks. Accurate expiration dates build trust with both AI engines and candidates.

What the specs say

Schema.org:Date or DateTime. The date after when the item is not valid. For example the end of an offer, salary period, or a period of opening hours. schema.org/validThrough

Google: Recommended. "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'." Google Search Central

How to find your value

  • Recruiting team — The planned closing date for the requisition
  • Company policy — Standard posting duration (30, 60, or 90 days from datePosted)
  • ATS settings — Auto close date configured in the applicant tracking system
  • Hiring manager — When they expect to stop accepting applications

Typical posting windows range from 30 to 90 days. If the position stays open indefinitely, you can omit validThrough entirely. Google does not require it, but including it prevents stale listings from appearing in results after the position is filled.

Format and code

Type: Date or DateTime (ISO 8601)

Date only:

{
  "@type": "JobPosting",
  "datePosted": "2024-01-18",
  "validThrough": "2024-03-18"
}

Date with time:

{
  "@type": "JobPosting",
  "datePosted": "2024-01-18",
  "validThrough": "2024-03-18T00:00"
}

Date with timezone:

{
  "@type": "JobPosting",
  "datePosted": "2024-01-18",
  "validThrough": "2024-03-18T23:59:59+00:00"
}

Invalid formats:

"validThrough": "March 18, 2024"
"validThrough": "03/18/2024"

Google enforces ISO 8601. Non standard formats will fail validation.

Webflow implementation

Static pages

Add the expiration date in your JSON-LD:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Sales Representative",
  "datePosted": "2024-06-01",
  "validThrough": "2024-08-01"
}
</script>

CMS template pages

Use a Webflow Date field for the closing date:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "validThrough": "{{wf {&quot;path&quot;:&quot;closing-date&quot;,&quot;type&quot;:&quot;PlainText&quot;} }}"
}
</script>

Create a "Closing Date" Date field in your CMS collection. Webflow outputs dates in ISO format when rendered as plain text. Set this when creating each job listing, or use a formula based default (e.g., 60 days after the posting date).

In Schema HQ

The value is read from CMS closing date field and formats it as ISO 8601 in the JSON-LD. If no closing date is set, Schema HQ omits the field rather than outputting an empty value. When a listing expires, Schema HQ can flag it for removal from your sitemap.

Real examples

Google documentation (Google Search Central):

{
  "@type": "JobPosting",
  "title": "Software Engineer",
  "datePosted": "2024-01-18",
  "validThrough": "2024-03-18T00:00",
  "employmentType": "CONTRACTOR",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Google",
    "sameAs": "https://www.google.com"
  }
}

W3C Talent Marketplace (w3.org):

{
  "@type": "JobPosting",
  "title": "Junior software developer",
  "datePosted": "2021-02-04",
  "validThrough": "2021-03-04T18:23:01+05:00",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "ACME Corp.",
    "url": "www.example.com"
  }
}

Web Data Commons analysis shows validThrough appears in 60% of JSON-LD JobPostings, significantly lower than datePosted (99%). Many employers leave the expiration date unset, which can lead to stale listings persisting in search results.

Related fields

  • datePosted: when the listing was published (starting point for the posting window)
  • title: the position with this application deadline
  • hiringOrganization: the company setting the deadline
  • directApply: whether candidates can still apply through the page

FAQ

What happens when a job passes its validThrough date?

Google removes the listing from job search results after the expiration date. The structured data remains on the page, but it no longer produces rich results. If the position is reopened, update validThrough to a future date and datePosted to the new posting date.

Is validThrough required for JobPosting?

No. Google lists it as Recommended. However, omitting it means Google relies on its own algorithms to determine when a listing is stale. This can result in the listing persisting longer than intended or being dropped unpredictably. Setting an explicit expiration date gives you control over the listing lifecycle.

Should validThrough include a time component?

It is not required but is useful when listings close at a specific time. For most implementations, a date only value is sufficient. If your ATS closes applications at midnight, "2024-03-18T00:00" communicates the exact cutoff.

On this page:
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.

Need help with schema on your site?

We implement structured data for Webflow sites — from audit to deployment.

Work with us

Work with us