# Changelog of APEC Job Scraper \[Just 💰$0.8] — French Executive Jobs (`blackfalcondata/apec-scraper`) Actor

- **URL**: https://apify.com/blackfalcondata/apec-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/blackfalcondata/apec-scraper.md

## Changelog

> Entries between 0.1.2 and 0.3.52 were not recorded here. This file resumes at
> 0.3.52 rather than reconstructing months of releases after the fact.

### 0.3.79 (2026-08-24)

- Fixed: pasting an offer URL and nothing else returned an empty result. Job URLs were only read when Input Mode was set to "Scrape specific offer URLs", so a run that supplied URLs while the mode selector sat on its "Search" default finished successfully with zero results and never fetched the offer. Supplying only URLs now scrapes those URLs. If you also set a keyword or contract type, the keyword search still wins, and the run log now says which of the two it used.
- Fixed: URLs pasted into "Paste / Direct URLs" (`startUrls`) were accepted by the input form and then ignored. They are now merged into Job URLs and scraped. Both plain strings and `{"url": "..."}` objects are accepted.
- Fixed: offers scraped by URL came back with an empty `title` and no `postedAt`. The detail response carries both, but neither was ever copied onto the record, so a URL-scraped job had no readable job title. `sectorActivityId` and `sectorActivityParentId` are filled from the same response. Records scraped by keyword search are unchanged, including their incremental change tracking.
- Fixed: an offer URL whose id was missing its trailing letter returned nothing. apec.fr offer ids end in a letter (179294942W), and the site answers an id without it as if the offer did not exist, so a URL built with a digits-only id looked like a dead offer. Such an id is now resolved to the real offer. Ids that already carry their letter are unaffected and cost no extra request.
- A URL that is not an offer link is now explained instead of silently skipped. The run log names the URL, shows the accepted form, and points a search-results link at the keyword and filter inputs.
- The Job URLs field now documents both apec.fr link formats. Both were already supported, but only one was shown, which made a valid current apec.fr link look unsupported.
- New: an apec.fr search link can now be pasted into Job URLs or Paste / Direct URLs and is used as the search. Keyword, location, contract type, working arrangement, salary range and posting age are all read from the link. Previously only links to a single offer worked, and a search link returned nothing.
- Salary bounds from a link are applied as a pair, because apec ignores one bound on its own. If your link sets only one, the other is filled with a value that does not narrow the results, so nothing is dropped that the link did not ask to drop.
- A search link that includes a posting-age filter now marks the run as covering only part of the listing set, so incremental runs no longer report older listings as expired when they were simply outside the time window.
- Filters you set in the input fields take priority over the same filter in a pasted link. The keyword is the exception: a keyword in the link wins, because the keyword field ships with an example value that is easy to leave in place by accident. The run log states which keyword was used.
- Parts of a link that are not supported are now named in the run log instead of being dropped in silence.

### 0.3.72 (2026-08-19)

- Expired offers in `jobUrls` are now reported as not found instead of as extraction failures. Apec answers an offer it no longer serves with an empty response, which the actor read as a broken reply; a run whose supplied offer URLs had all expired failed with "please try again later" even though nothing was wrong. Such offers are now counted under `notFound`, and a run that still reaches its other offers finishes normally.

### 0.3.52 (2026-08-03)

- Runs finish faster and consume noticeably less platform usage, which lowers the total cost of a run for you. Verified on the same search before and after: identical 25 results with all 70 populated fields, run time down from 58s to 28-43s.

### 0.1.2 (2026-04-17)

- Incremental tracking now works in URL mode — offer URLs are classified as NEW/UPDATED/UNCHANGED across runs and EXPIRED when they drop from the input or return 404
- Fixed: `emitExpired=true` now actually emits tombstone records for offers that disappeared since the last run (previously the flag had no effect)

### 0.1.1 (2026-04-17)

- Added `mode` + `jobUrls` inputs — scrape specific offer URLs directly without running a search
- 30-day cache for not-found offers (reduces redundant lookups on repeated runs)
- Run summary shown in the actor status message

### 0.1.0 (2026-04-16)

Initial release.

- Structured executive job listings from apec.fr with salary, company, location, skills, and contract details
- Incremental mode with state tracking (new/changed/unchanged/expired)
- Compact output mode for AI-agent workflows
- `descriptionMaxLength` truncation
- `contractTypes` filter (CDI, CDD, Stage, Alternance, Interim)
- Cross-run repost detection (`isRepost`, `repostOfId`, `repostDetectedAt`)
- Triple-format descriptions (text, HTML, markdown) for RAG/LLM pipelines
