# Changelog of LinkedIn Remote Jobs Scraper 🌍 (clean feed, no login) (`tagadanar/linkedin-remote-jobs`) Actor

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

## Changelog

### 2026-09-19

- **The run now ends with a status that explains itself.** Instead of a bare
  `Done: 0 remote job(s) pushed.`, every run says how many remote jobs were
  delivered, how many keyword 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 keywords ran, or LinkedIn genuinely answered with
  no remote 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 keyword, one keyword after another, and with full descriptions on,
  one more fetch plus a 300 ms pause for every job delivered, against a "Max
  jobs" input that accepts 100,000. One of the last thirty runs ended on the
  platform timeout, which is a run that loses its own status message and reads,
  from the Store, as an actor that does not work.
- 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 descriptions are 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 description 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.

### 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).

### 0.1 (2026-08-20)

First release. A narrow, remote-only repackaging of the LinkedIn Jobs Scraper engine:

- Every search is pinned to LinkedIn's own "Remote" work-arrangement facet (`f_WT=2`). There is no work-type input to forget.
- Search by keyword and an optional country/region. Filter by posted-since (last 24 hours, week or month).
- The hiring company is a first-class part of every row: company name, LinkedIn page, handle and logo.
- Optional full job description per posting: description, seniority, employment type, job function, industry and live applicant count. Billed only when the extra data is found.
- Company + job data only. No personal profiles, no applicants, no login and no API key.
