# Changelog of LinkedIn Jobs Scraper 💼 (hiring signals, all-in price) (`tagadanar/linkedin-jobs-scraper`) Actor

- **URL**: https://apify.com/tagadanar/linkedin-jobs-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/tagadanar/linkedin-jobs-scraper.md

## Changelog

### 2026-09-19

- **The run now ends with a status that explains itself.** Instead of a bare
  `Done: 0 job(s) pushed.`, every run says how many jobs were delivered, how many
  searches you asked for and how many actually ran — and when a run comes back
  short or empty, why: LinkedIn refused the requests, the run hit its time limit
  or charge limit before finishing, the "Max jobs" cap was reached before the
  later searches ran, or LinkedIn genuinely answered with no jobs for those
  keywords. A blocked run is never reported as an empty search, and a search page
  that comes back full-size with no job card on it is reported as a possible
  LinkedIn markup change rather than as "no results".

### 2026-09-08 (later)

- The clock guard shipped earlier today now comes from one shared module the
  whole fleet uses (`src/budget.js`, vendored from `actors/tools/lib/budget.js`),
  rather than a copy per actor. The engine this actor runs on turned out to be
  vendored FIVE ways, and only two of them had been fixed — which is the same
  way the bug got here in the first place.

### 2026-09-08

- **A run can no longer spend more time than it has.** Nothing in this actor
  knew what time it was: `fetchHtml` booked its worst case up front (three
  attempts at a 30-second request timeout, plus backoff, was ~95 seconds one
  page could cost) and every loop above it was unbounded — up to 101 search
  pages per search, one search per keyword times each location, and with detail
  enrichment on, one more fetch plus a 300 ms pause for every job delivered,
  against a "Max jobs" input that accepts 100,000. A run that hits the platform
  timeout loses its own status message and reads, from the Store, as an actor
  that does not work; the sibling actor on this same engine
  (LinkedIn Remote Jobs) had already had one end that way.
- Every fetch now plans against the time that is actually left rather than its
  worst case: the request timeout is clamped to it, a backoff that would outlive
  the budget is not slept, and a fetch the clock ended is reported as the clock,
  never as LinkedIn refusing.
- When the run gets short, the optional detail enrichment is what gets dropped
  first, so the last of the clock turns into jobs you receive rather than jobs
  nobody gets. The premium event bills on delivery, so a skipped enrichment is
  simply not charged.
- The run's closing status now names what it did not do: how many jobs were
  delivered without descriptions, and which searches never ran (each named with
  its location, since one keyword can fan out over several).

### 2026-09-02

- The run now ends with a status message in the Console (the "Done" line was log-only, so a run could not explain itself in the Store).

### 2026-07-13

- README: added the missing Pricing section, disclosing per-event prices and the $0.001 actor-start fee.

### 2026-07-12

- Invalid input no longer fails the run. The run now finishes cleanly with a clear explanation in its status message, so a typo or an empty list is easy to spot and fix.
- List inputs now accept datasets piped straight from another scraper: entries
  that are objects are read through their usual key names (url/link,
  query/keyword/title, name/company and similar) instead of being rejected.

### 0.1 (2026-07-11)

First release. Scrape public LinkedIn job postings with the filters you already use on the site:

- Search by keyword and location, with every keyword run against every location.
- Filter by on-site / remote / hybrid, experience level, job type and posted-since (last 24 hours, week or month).
- Sort by most relevant or most recent.
- The hiring company is a first-class part of every row: company name, LinkedIn page, handle, logo and (with details on) industry.
- Optional full job details per posting: description, seniority, employment type, job function, industry and live applicant count. Billed only when the extra data is found.
- Paste a LinkedIn jobs search URL straight from your browser to reuse any filter combination, including a company filter.
- Company + job data only. No personal profiles, no applicants, no login and no API key.
