Announcement·

When a Job Posting Is Closed, Your Feed Should Know

Jobven closes a job posting when the employer's board stops listing it, sends job.closed, and drops it from the feed. Handle reopened roles without duplicates.

When a Job Posting Is Closed, Your Feed Should Know

Someone finds a job on your site, writes a cover letter, clicks apply, and lands on a page that says the position is no longer available. They do not conclude that the employer moved fast. They conclude that your listings are stale, and the next time they need a job they go somewhere else.

Getting new jobs is the easy half of a job feed. Knowing which ones are gone is the half that decides whether people trust what you show them.

Closed roles leave the feed

Jobven re-checks every employer's board on a schedule. When a posting stops appearing across repeated checks, the job's status becomes closed, it drops out of the default job feed, and a job.closed event goes out to any webhook subscription that asked for it.

That means you can keep a clean board without tracking every listing yourself. You are not diffing yesterday's results against today's, and you are not re-fetching a million records to find the handful that went quiet.

Closed jobs stay fetchable by id, so anything you have already stored can still be resolved. They simply stop being served as current.

A relisted role keeps its id

Employers put roles back up. A position gets re-approved, a hire falls through, a seasonal listing returns.

When that happens, the job reopens under the id you already have rather than arriving as a new record. Whatever you stored against that id, your own metadata, saved searches, application records, stays valid.

The event you receive is job.created, not job.updated. That is deliberate: you were told the job closed, so on your side there is nothing to apply an update to.

This is the one part worth checking in your own code. If your handler for a created job does an unconditional insert, a reopened role will arrive as a duplicate:

// Handles both a genuinely new job and a reopened one
app.post('/webhooks/jobven', (req, res) => {
  const { event, data } = req.body

  if (event === 'job.created') {
    db.jobs.upsert({ where: { id: data.id }, data })
  }

  if (event === 'job.closed') {
    db.jobs.update({ where: { id: data.id }, data: { status: 'closed' } })
  }

  res.sendStatus(200)
})

An upsert keyed on the job id handles both cases and costs nothing extra.

Status changes have their own events

job.updated does not fire when a job's status changes. It tracks content: title, salary, employmentType, remoteType, applyUrl and expiresAt. Status movements are carried by job.created and job.closed instead, so a subscription that only listens for updates will not see a closure.

If you filter jobs yourself, status=closed returns results you can query directly, which is useful for reconciling a store that has drifted.

Where to start

If you already receive Jobven webhooks, add job.closed to your subscription and confirm your created-job handler upserts. If you are polling, the same information is on the regular API: closed jobs leave the default feed, and you can ask for them explicitly.

The event reference covers the payload shape for each event, and the webhooks guide walks through setting up a subscription from scratch.

Over a million job postings have passed through Jobven. The ones that close now leave.