MindCase
Saurabh Shubham

Indeed and Upwork: Which Job API Actually Stays Fresh?

A job listing that's already filled but still online is worse than no data at all. Here's what each job API actually gives you to catch that.

jobscomparison
Indeed and Upwork: which job API actually stays fresh?

A job board's staleness problem isn't missing listings — it's listings that look current and aren't. A posting from three weeks ago that's already filled, still sitting in search results with no expiry flag, costs more than an empty response would: you build an outreach list, a sourcing pipeline, or a hiring-demand dashboard around a data point that was already dead when you pulled it.

If you're an agent (or building one) reading this rather than a human, the full machine-readable schema for every endpoint below lives at mindcase.co/skills.md.

What does "freshness" actually mean for job data?

Not a timestamp on its own — a timestamp only tells you when a listing was created, not whether it's still open. The real test is operational: can you constrain a pull to a specific posting window before you fetch, and once you have the row, is there any signal on it that tells you whether the role is still live? Indeed Jobs, Naukri Jobs, and Upwork Jobs answer that differently enough that the choice matters for anything built on top of them.

Which of these lets you filter by posting window directly?

Two of the three do, and one doesn't.

Naukri has the most granular control. Its freshness parameter takes a direct day count — 1, 3, 7, 15, 30, or all — so a pull for roles posted in the last 24 hours is one input, not a post-fetch filter you write yourself.

Indeed does it with a rolling window instead of fixed tiers. fromDays takes any integer, so fromDays: 3 returns only jobs posted in the last three days — finer-grained than Naukri's fixed steps, but you're choosing the number yourself rather than picking from a documented set.

Upwork has no posting-window filter at all. sortBy only takes relevance or newest — an ordering, not a cutoff. There's no input that excludes anything older than N days; you'd have to pull results, read each row's posted field, and discard the ones outside your window yourself.

How do you pull only recently-posted Naukri listings?

Say you're running a daily digest for a staffing agency and only want roles that went live since yesterday:

curl -X POST "https://api.mindcase.co/v1/data/naukri/job/run?wait=true" \
-H "Authorization: Bearer $MINDCASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "params": {
    "inputs": "software engineer",
    "cities": ["Bangalore"],
    "freshness": "1",
    "sortBy": "date",
    "maxResults": 100
  }
}'

# $0.002 per job returned

Setting freshness and sortBy together does two things at once: it excludes anything older than the window, and it orders what's left by posting date instead of Naukri's relevance ranking — so the newest listing in your result set is also the first row.

What does the same pull look like on Indeed?

curl -X POST "https://api.mindcase.co/v1/data/indeed/jobs/run?wait=true" \
-H "Authorization: Bearer $MINDCASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "params": {
    "keyword": "warehouse associate",
    "location": "Houston, TX",
    "fromDays": 1,
    "sort": "date",
    "maxItems": 100
  }
}'

# $0.00005 per job returned

Same shape, different mechanism: fromDays is a window you set yourself rather than a documented tier. fromDays: 1 and Naukri's freshness: "1" answer the same question — "what opened in the last day" — through two different input designs.

Why doesn't Upwork give you a posting-window filter?

Because a posting window isn't the freshness risk that matters most on a gig marketplace. A Naukri or Indeed listing sits open for weeks; an Upwork job post can draw dozens of proposals within hours and close before a day-old cutoff would even catch it. Age alone tells you less than activity does.

That's what Upwork's row gives you instead: applicants, interviewing, invitesSent, unansweredInvites, and hired on every listing. A post from six hours ago with hired: true is dead data no matter how it sorts under newest. A post from three days ago with hired: false and low applicants is a real open lead. Indeed and Naukri don't return anything equivalent — no field on either endpoint tells you whether a role has already been filled, only when it was posted.

The practical split: Naukri and Indeed let you shrink the risk window before you fetch. Upwork doesn't shrink the window, but it hands you the one signal that actually catches a stale listing regardless of age.

What can't you get from Mindcase?

Two cases.

Neither Indeed nor Naukri tells you when a listing closes. fromDays and freshness filter on posting date, not expiry — a role that's been live and unfilled for three weeks passes the same sort=date check as one posted an hour ago, once both are outside the tight window. There's no filledAt or closedAt field on either endpoint to catch that gap.

Upwork's activity fields are a point-in-time read, not a stream. applicants and hired reflect the state of the listing at the moment you called the endpoint. A job that's open now can be filled an hour later, and the only way to catch that is to re-poll — there's no webhook or push notification on any of the three endpoints.

Which endpoint should you use for which job?

EndpointFreshness controlPriceBest for
Naukri Jobsfreshness tiers (1/3/7/15/30/all)$0.002 / jobIndia hiring pulls where a tight, documented posting window matters
Indeed JobsfromDays (any integer)$0.00005 / jobBroad market sweeps where you need a custom, finer-grained window
Upwork JobsNone — applicants/hired on each row instead$0.003 / jobGig listings where "still open" matters more than "recently posted"

FAQ

Naukri and Indeed both let you filter to jobs posted within a specific number of days before you fetch — Naukri with fixed tiers (1, 3, 7, 15, 30 days), Indeed with any integer via fromDays. Upwork has no equivalent input.

Yes, every row includes a posted field, and sortBy can be set to newest. What's missing is a filter that excludes anything older than a chosen cutoff — you'd have to read posted yourself and discard rows outside your window.

Check the hired field on the row, alongside applicants, interviewing, invitesSent, and unansweredInvites. None of these exist on Indeed or Naukri.

No. Neither endpoint returns a field for that. A listing that's been open and unfilled for weeks looks the same as a fresh one once both fall inside your posting-date filter.

Indeed is $0.00005 per job, Naukri is $0.002 per job, and Upwork is $0.003 per job — a 60x spread between the cheapest and most expensive of the three.