Indeed Company Jobs Monitor — Hiring Signals & Alerts avatar

Indeed Company Jobs Monitor — Hiring Signals & Alerts

Pricing

from $0.50 / 1,000 job row scrapeds

Go to Apify Store
Indeed Company Jobs Monitor — Hiring Signals & Alerts

Indeed Company Jobs Monitor — Hiring Signals & Alerts

From $0.005 per company snapshot + $0.0005 per job — monitor any employer's newest Indeed postings, diff runs to flag new & closed roles, and get Slack/email/webhook hiring-signal alerts. Salary, location, remote flag, dates & company rating included. No login or API key.

Pricing

from $0.50 / 1,000 job row scrapeds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

0

Monthly active users

20 days ago

Last modified

Share

📡 Indeed Company Jobs Monitor — Hiring Signals & Alerts

Point this actor at your target companies and it watches their Indeed job postings for you: every run snapshots each employer's newest open roles (title, location, salary, dates, link), diffs them against the previous run, and emits clean NEW-posting and CLOSED-posting hiring signals — with Slack, email, and webhook alerts. A new job posting is the cleanest "this company is investing in X right now" buying signal there is, and Indeed covers the employers that never publish a Greenhouse/Lever board: retail, logistics, healthcare, manufacturing, SMBs — everyone.

No login or API key from you — built on Indeed's own job-search API, the one its public search page calls. Works on all 62 Indeed country sites.


How it compares

This actorLeading Indeed scraperCheapest Indeed scraper
Price per 1,000 jobs$0.50 (lot-scraped @ $0.0005)$6.00 per 1,000 results~$0.08 per 1,000 (pay-per-event)
Company-watch / monitor modeYes — run-over-run diff, new + verified-closed signalsNo (one-shot scrape)No (one-shot scrape)
Alerts (Slack / email / webhook)Yes, built inNoNo
Parsed salary min/max/period/currencyYes, plus annualised min/maxsalary textsalary fields
Remote flag, urgently-hiring, company ratingYespartialpartial
Employer dossier (website, revenue, logo)Yes, on every row——
Full description enrichmentOptional (lot-detail-enriched)YesYes
Raw source record keptYes (raw sub-object)NoNo
Failure handlingPer-company isolation + fresh proxy session per retry — one bad company never kills the run——
Designed forRecurring hiring-signal feeds (GTM/intent)bulk one-shot search scrapesbulk one-shot search scrapes

The big scrapers are built to bulk-export search results. This actor is built to be scheduled: a cheap per-company snapshot plus a diff, so your CRM/Clay/n8n gets only the postings that actually changed.


Why hiring is an intent signal

  • 🧑‍💼 A new "Salesforce Administrator" posting → they run Salesforce. Sell them Salesforce tooling.
  • 📈 A wave of "Account Executive" reqs → they're scaling GTM. Sell them sales tech, data, enablement.
  • 🏗️ A "Plant Manager — 2nd shift" in a new city → expansion, new facility, new budget.
  • 📉 A posting closing → the role is filled (time to congratulate the new hire) or the budget moved.

GTM platforms charge thousands for this feed. Indeed already publishes it — this actor turns it into structured rows for the exact companies you care about. It's the perfect complement to ATS-board monitors (Greenhouse/Lever/Ashby): most of the economy doesn't use those ATSs, but almost everyone posts to Indeed.


What you get (per posting)

  • 🏷️ Role: jobkey (Indeed's posting id), title, norm_title, snippet (first 300 characters of the description), job_types, skills, schedules, benefits; optional full description_html / description_text
  • 🏢 Employer: company (exact, fuzzy matches filtered out), company_key, company_rating, company_review_count, company_overview_url, company_website, company_industry, company_revenue, company_logo_url
  • 📍 Location: location, city, state, postal, country_code, latitude, longitude, remote flag, work_arrangement (remote / hybrid / in_person)
  • 💰 Salary (employer-stated, parsed): salary_text, salary_min, salary_max, salary_currency, salary_period, salary_source, salary_annual_min, salary_annual_max
  • 📅 Dates: posted_at (date on Indeed) & pub_date / date_published (ISO), posted_relative, posted_days_ago, expired, expiration_date
  • 🚨 Hiring urgency: urgently_hiring, hiring_multiple_candidates (Indeed's high-volume-hiring flag), new_on_indeed (posted within the last 3 days)
  • 🔗 Links: direct url (viewjob), apply_url, third_party_apply_url (when the employer takes applications off Indeed), indeed_apply_enabled
  • 📶 Signal fields (monitor mode): signal = new-posting / closed-posting / baseline-snapshot, is_new, first_seen, last_seen, note
  • 🧾 raw — the complete job object Indeed's API returned (minus the ad-tracking URL list), so nothing Indeed returns is lost
  • source_page tells you how the company was given (search = plain name, cmp = company-page slug/URL); company_query echoes your input; scraped_at is the run time.

Three legacy columns are kept for compatibility but are always null on the API path, because Indeed's job API does not expose them: advertiser_id, sponsored, featured_employer (they were search-page ad-slot attributes). posted_relative and new_on_indeed are computed from the posting date (Today, 3 days ago, 30+ days ago; new = within 3 days).

Export to JSON, CSV, Excel, HTML, RSS, or pull via the Apify API straight into your CRM, Clay, n8n, Make, or warehouse.


How to use it

  1. Click Try for free.
  2. Enter your target companies — plain names like Walmart, Netflix, Chewy. For an exact employer, paste its Indeed company page (https://www.indeed.com/cmp/Walmart) or cmp:Walmart.
  3. (Optional) pick the country site (default US), filter by title keyword, location (server-side locationQuery, 25-mile radius, or client-side locationFilter), remote only, or last N days.
  4. Click Start → open the Dataset tab. That's a snapshot of each company's newest open roles (the maxJobsPerCompany newest, default 50).
  5. For a live hiring-signal feed: turn on Monitor mode, add an Apify Schedule (e.g. daily), and a Slack/email/webhook. The first run seeds a baseline; every run after that outputs and alerts only what changed.

Quick start (snapshot)

{ "companies": ["Walmart"], "maxJobsPerCompany": 50 }

Daily hiring-signal monitor

{
"companies": ["Netflix", "Stripe", "Chewy", "Datadog"],
"monitorMode": true,
"alertOnNewPosting": true,
"slackWebhookUrl": "https://hooks.slack.com/services/…"
}

Sales-team watcher (only AE roles, remote)

{ "companies": ["Snowflake", "MongoDB"], "keyword": "account executive", "remoteOnly": true, "monitorMode": true }

A German employer on de.indeed.com

{ "companies": ["Lidl"], "country": "DE", "maxJobsPerCompany": 100 }

Pricing (pay-per-event)

EventWhat it coversPrice
monitor-run-completedone company snapshot — charged once per company per run (snapshot and monitor runs)$0.005 / company
lot-scrapedeach job/signal row in your dataset$0.0005 / row ($0.50 per 1,000)
new-lot-detectedeach NEW posting detected in monitor mode$0.02 / new posting
lot-detail-enrichedeach posting that receives its full description (opt-in)~$0.0005 / job
alert-deliveredeach Slack/email/webhook alert sent~$0.005 / alert

Example: watching 50 target accounts daily ≈ 50 × $0.005 = $0.25/day for the snapshots, plus $0.02 per actual new posting found. A month of monitoring 50 companies costs less than a single bulk scrape elsewhere. (Final prices are set on the actor's pricing page.)


Scope, notes & limits (honest version)

  • Newest-jobs window: each run reads a company's postings newest-first and keeps maxJobsPerCompany of them (default 50; 0 = everything Indeed serves, up to 1,000 per search, 100 per request). That is what a change-monitor needs — new postings always enter at the top — and 50 covers most employers. For very high-volume employers either raise the cap or narrow with locationQuery / keyword to keep the window relevant.
  • Closed-posting detection is verified, not guessed. A posting that merely drops out of the window (a busy employer posted more than the cap) proves nothing. When a previously-seen posting disappears, the actor looks it up on Indeed's job API and reports closed-posting only if Indeed marks it expired or no longer holds it — the note says which. Jobs that merely scrolled off the window are left alone. (Verifications are capped per run — maxCloseChecksPerRun, default 25, 50 per request — and re-queued across runs.)
  • No duplicate "new" alerts ever: the monitor keeps a cumulative per-company seen-set, so a posting that leaves and re-enters the window is never re-flagged. For a tight alert feed on very high-volume employers, pair with newWithinDays (e.g. 3) so only freshly-posted roles enter the feed at all.
  • "New" means new since your previous run. A posting the monitor had not seen but that was already live before the previous run (it sat below that run's window — for example after raising maxJobsPerCompany, or when a busy employer posts more than the cap in a day) is delivered once as a baseline-snapshot row, not alerted or charged as new-lot-detected.
  • Fuzzy search, exact filter: Indeed's employer search is fuzzy ("Stripe" also returns "Stripe-A-Zone", "Straight Stripe Painting"), so the actor filters by the exact employer field — companyMatch = contains (default, catches "Walmart Supply Chain"), exact, or off. A cmp:<Slug> / company-page URL target is matched on Indeed's own employer page identity instead, which is exact.
  • First monitor run = baseline. You get the full snapshot, but nothing is flagged/charged/alerted as "new" — diffs start on run two. No double-alerting: state lives in a named key-value store (indeed-company-hiring-monitor-state) that persists across scheduled runs. The state is keyed per filter scope (keyword, location, remote, companyMatch), so changing those filters starts a fresh baseline.
  • Salary is employer-stated only. Indeed's own salary estimates are not exposed by this API, so salary_source is employer or null. Walmart postings carried a stated salary on 94 of 100 rows in testing; small employers far less often.
  • Descriptions: the 300-character snippet comes from the posting's description on every row (one extra request per 50 postings, not charged). fetchDescriptions: true adds the full description_text / description_html and is charged as lot-detail-enriched only for postings that actually received one.
  • Proxy: on the Apify platform the Apify proxy is required — Indeed refuses direct connections from Apify's network. The default datacenter group served every test call; the actor rotates to a fresh proxy session on any challenge, rate limit or network failure (up to 8 per run) before giving up on a company.
  • A failed company (network blip, challenge) is logged and skipped — it never crashes the run or your schedule. Only when Indeed refuses every company does the run end FAILED with the reason in the status message, and nothing is charged.
  • A run's RUN_SUMMARY (key-value store) lists per company what was read, kept, filtered, or why it failed.

FAQ

Which companies can I track? Any employer with jobs on an Indeed site — by far the broadest job surface there is. Use plain names ("Walmart"), or an Indeed company page ("cmp:Walmart" or the /cmp/... URL) for exact employer scoping on any country host.

How is this different from the big Indeed scrapers? They bulk-export search results once. This one is a monitor: cheap per-company snapshots, run-over-run diffing, and only-what-changed output + alerts. Different job (and ~12x cheaper per row).

How fresh are the signals? Schedule it daily (or hourly for hot accounts) — a new posting is detected on the first run after it appears in the company's newest-jobs window.

Will it double-alert? No. Monitor state is keyed per company + filter scope and persists in a named key-value store.

Can I get full job descriptions? Yes — set fetchDescriptions: true. 50 postings per request, charged as lot-detail-enriched per posting that gets a description.

Does it parse salaries? Yes — salary_min / salary_max / salary_period / salary_currency, plus annualised salary_annual_min / salary_annual_max (hourly × 2,080, monthly × 12, …) and whether the figure came from the employer (salary_source).

Remote roles? remote boolean on every row, work_arrangement (remote / hybrid / in_person) when Indeed tags it, plus a remoteOnly input filter.

What's in raw? The complete job object Indeed's API returned — if Indeed exposes it, you have it, even fields we didn't flatten.

What about pagination / all postings? Set maxJobsPerCompany to 0 to read everything Indeed serves for the employer (up to 1,000 per search). For monitoring the default window of 50 is a feature: new postings always pass through it.

Other countries? Set country to the Indeed site code (UK, DE, FR, CA, AU, IN, …, 62 sites). Labels such as job types and benefits come in the site's language; salaries in its currency.

Do I need proxies? On Apify, yes — leave the default Apify proxy on. The datacenter group worked for every test call; if you ever see repeated "fresh proxy session" lines in the log, switch the proxy input to RESIDENTIAL.

Can it feed Clay / n8n / Make / my CRM? Yes — webhook alerts per signal, or pull the dataset via the Apify API/integrations.