Indeed Company Jobs Monitor — Hiring Signals & Alerts
Pricing
from $0.50 / 1,000 job row scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
0
Monthly active users
20 days ago
Last modified
Categories
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 actor | Leading Indeed scraper | Cheapest 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 mode | Yes — run-over-run diff, new + verified-closed signals | No (one-shot scrape) | No (one-shot scrape) |
| Alerts (Slack / email / webhook) | Yes, built in | No | No |
| Parsed salary min/max/period/currency | Yes, plus annualised min/max | salary text | salary fields |
| Remote flag, urgently-hiring, company rating | Yes | partial | partial |
| Employer dossier (website, revenue, logo) | Yes, on every row | — | — |
| Full description enrichment | Optional (lot-detail-enriched) | Yes | Yes |
| Raw source record kept | Yes (raw sub-object) | No | No |
| Failure handling | Per-company isolation + fresh proxy session per retry — one bad company never kills the run | — | — |
| Designed for | Recurring hiring-signal feeds (GTM/intent) | bulk one-shot search scrapes | bulk 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 fulldescription_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,remoteflag,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_pagetells you how the company was given (search= plain name,cmp= company-page slug/URL);company_queryechoes your input;scraped_atis 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
- Click Try for free.
- 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) orcmp:Walmart. - (Optional) pick the country site (default US), filter by title keyword, location (server-side
locationQuery, 25-mile radius, or client-sidelocationFilter), remote only, or last N days. - Click Start → open the Dataset tab. That's a snapshot of each company's newest open roles (the
maxJobsPerCompanynewest, default 50). - 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)
| Event | What it covers | Price |
|---|---|---|
monitor-run-completed | one company snapshot — charged once per company per run (snapshot and monitor runs) | $0.005 / company |
lot-scraped | each job/signal row in your dataset | $0.0005 / row ($0.50 per 1,000) |
new-lot-detected | each NEW posting detected in monitor mode | $0.02 / new posting |
lot-detail-enriched | each posting that receives its full description (opt-in) | ~$0.0005 / job |
alert-delivered | each 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
maxJobsPerCompanyof 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 withlocationQuery/keywordto 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-postingonly if Indeed marks it expired or no longer holds it — thenotesays 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 abaseline-snapshotrow, not alerted or charged asnew-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, oroff. Acmp:<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_sourceisemployeror null. Walmart postings carried a stated salary on 94 of 100 rows in testing; small employers far less often. - Descriptions: the 300-character
snippetcomes from the posting's description on every row (one extra request per 50 postings, not charged).fetchDescriptions: trueadds the fulldescription_text/description_htmland is charged aslot-detail-enrichedonly 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.