APEC Jobs Scraper — French Cadre Jobs, Employer Type & NAF
Pricing
$0.90 / 1,000 per offer returneds
APEC Jobs Scraper — French Cadre Jobs, Employer Type & NAF
Scrape apec.fr, France's executive job board (~88,000 live offers). Filter by keyword, place, salary, contract, sector, métier, remote and 20 more. Every row names the employer TYPE - direct employer, recruitment cabinet, agency, ESN or resold job-board feed - plus its NAF industry code.
Pricing
$0.90 / 1,000 per offer returneds
Rating
0.0
(0)
Developer
Scrapers Delight
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
🇫🇷 APEC Jobs Scraper — French cadre jobs, with the employer classified
Scrape apec.fr — the Association pour l'emploi des cadres, France's national executive and manager job board — as one clean row per offer, with the things the board itself only exposes as filters already stamped on the row:
- Who is really hiring — direct employer, recruitment cabinet, staffing agency, IT-services company (ESN), or a partner job-board feed resold onto APEC.
- The employer's statutory industry code — the French NAF/APE code and its label
(
7112B — INGÉNIERIE, ÉTUDES TECHNIQUES), decoded from APEC's own nomenclature. - A parsed salary — min, max, currency, period, gross-or-net — out of a French sentence.
- The French place hierarchy — city, department code, department name, region, country.
43% of APEC is resale. In a blind 100-row sample of the newest Partenaire offers, taken 2026-09-04, 100 of 100 were
posted as "Hellowork" — the job board's name, not the employer's.
This actor excludes that feed by default, and when you ask for it, labels it. Verified against all
five ranked rival APEC actors' input schemas on 2026-09-04: none of them expose the employer type
at all.
What you get
One record per offer. Every number on this page is measured — from a 1,000-row run on 2026-09-04, and from the offline validation gate (82 assertions, all passing) — never estimated.
{"numeroOffre": "179364504W","jobId": 179364504,"jobUrl": "https://www.apec.fr/candidat/detail-offre.html/detail-offre/179364504W","title": "Technicien d'Usinage F/H","companyName": "SELFING","isConfidential": false,"employerClass": "direct-employer","employerClassLabel": "Entreprise","isAggregatorListing": false,"postingOrigin": "ADEP","locationText": "Saint-Vincent-de-Reins - 69","city": "Saint-Vincent-de-Reins","departmentCode": "69","department": "Rhône","region": "Auvergne-Rhône-Alpes","country": "France","latitude": 46.0738879,"longitude": 4.3866474,"isGeolocatable": true,"salaryText": "40 - 42 k€ brut annuel","salaryMin": 40000,"salaryMax": 42000,"salaryCurrency": "EUR","salaryPeriod": "YEAR","salaryBasis": "GROSS","salaryIsNegotiable": false,"salaryIsStatutoryMinimum": false,"hasNumericSalary": true,"contractType": "CDI","contractDurationMonths": null,"remoteWork": null,"nafCode": "2813Z","nafActivity": "FABRICATION D'AUTRES POMPES ET COMPRESSEURS","sector": "Mécanique - Métallurgie","publishedAt": "2026-09-04T06:16:32.000Z","validatedAt": "2026-09-04T06:16:32.000Z","descriptionSnippet": "Nous recherchons un Technicien d'Usinage (H/F) pour intervenir sur des opérations complètes de fabrication de pièces mécaniques, sur machines conventionnelles et/ou à commande numérique. …","descriptionSnippetLength": 283,"descriptionIsTruncated": true,"lowApplicantCount": false,"apecQualityFlag": true,"isRealClient": true,"logoUrl": "https://www.apec.fr/media_entreprise/525266/logo_SELFING_525266.gif","relevanceScore": 1.15,"searchKeyword": null,"searchLabel": "all APEC offers","sourceUrl": null,"scrapedAt": "2026-09-04T06:19:28.501Z","contractTypeCode": 101888,"remoteWorkCode": null,"employerClassCode": 143684,"nafCodeId": 101272,"sectorCode": 101774,"postingOriginCode": 101866}
📊 Field fill — measured on a live 1,000-row Apify run, 2026-09-04
Run qmosjXQrePLfebhUT — the whole board, newest first, aggregator feeds excluded (the default).
1,000 rows, 1,000 unique offer numbers, 12 pages, 7.4 seconds.
| Field | Fill |
|---|---|
numeroOffre · jobId · jobUrl | 100% |
title · companyName | 100% |
employerClass · employerClassLabel · isAggregatorListing | 100% |
postingOrigin | 100% |
nafCode · nafActivity · sector | 100% |
contractType | 100% |
publishedAt · validatedAt | 100% |
descriptionSnippet | 100% (exactly 283 chars on 1,000 of 1,000 — see limits) |
locationText · country | 100% |
city · departmentCode · department · region | 99.8% |
salaryText | 100% |
latitude · longitude | 94.0% |
salaryMin | 74.9% |
salaryMax | 58.4% |
logoUrl | 61.9% |
remoteWork | 44.4% |
contractDurationMonths | 11.2% |
isConfidential · lowApplicantCount · apecQualityFlag · isRealClient · isGeolocatable · hasNumericSalary · salaryIsNegotiable | 100% (always present, true or false) |
Across those 1,000 rows: 151 distinct NAF codes, 27 sectors, 87 departments, and the four non-aggregator employer classes at 250 rows each — the crawl steps them round-robin so one class cannot eat the whole cap. 888 CDI / 73 mission d'intérim / 30 CDD / 9 alternance · 749 with a numeric salary (582 a real range) · 251 "à négocier" · 9 flagged as having few applicants · 10 confidential · 998 France, 2 abroad.
🎯 Who buys this
| Buyer | What they do with it |
|---|---|
| Recruitment agencies & RPOs | employerClass: direct-employer is a list of French companies hiring without an agency — the cleanest possible prospect list, and impossible to build from the other APEC actors. |
| Staffing / ESN sales teams | it-services-esn shows exactly which competitors are winning which client work, by NAF code and department. |
| HR-tech and ATS vendors | Companies posting cadre roles are actively spending on hiring. Filter by sector, department and salary band. |
| Market and salary researchers | Parsed salary min/max against NAF code, region, experience level and remote policy across ~90,000 live offers. |
| Job-board and aggregator operators | Feed the whole board, deduped, with the resale rows already separated out. |
| Sourcers and candidates | lowApplicantCount marks postings that have attracted few applications — nobody else surfaces it. |
⚙️ How it works
POST https://www.apec.fr/cms/webservices/rechercheOffre — the site's own JSON search API. No
cookie, no API key, no CSRF header, no login. Plain HTTP through the Apify datacenter proxy, 512 MB,
no browser. robots.txt on apec.fr is User-agent: * with zero Disallow lines.
Two supporting routes, both the site's own XHR: lieuautocomplete turns "Bordeaux" into a place id,
metierAutocomplete turns a fuzzy job title into APEC's canonical métier labels.
Labels come from a 3,502-entry nomenclature — sectors, all 733 NAF codes, 502 métiers, contract
types, employer classes, 124 French places, 195 countries — fetched once from APEC's own
referentielstatique service and bundled with the actor, so a label never depends on a live call.
refreshLabels: true re-fetches it if you want same-day nomenclature.
🔧 Input — 56 parameters, all wired and tested
Search scope
| Field | What it does |
|---|---|
keywords | Free-text terms, one crawl each. Measured: "developpeur" 3,295 offers · "commercial" 23,324 · "ingenieur" 21,148. Empty = the whole board. |
jobTitles | Fuzzy titles expanded through APEC's own métier autocomplete into canonical labels. |
searchUrls | Paste apec.fr search URLs. Parsed, never fetched — the query params map 1:1 onto the API. |
offerNumbers | Exact lookup by 179364344W or its numeric id. Feed yesterday's numbers back to see which are still live; the run log names the ones that have gone. |
excludeKeywords | Client-side NOT on title + snippet. Excluded rows are never billed. |
Location
location (names: "Paris", "75", "Ile-de-France", "Allemagne", "Bordeaux") · lieuxIds (raw ids) ·
radiusKm + centerLat + centerLng · onlyGeolocated.
Who is hiring
employerType (the wedge) · excludeAggregatorFeeds (default on) · stampEmployerClass
(default on) · includeConfidential · companyNameContains · excludeCompanies ·
postingOrigins · onlyLowApplicantCount.
Role, contract, pay, date
contractTypes · jobFunctions (10 families + 46 sub-functions) · jobFunctionIds (502 individual
métiers) · sectors (29) · experienceLevels · positionStatus · remoteWork ·
contractDurationBands · internshipDuration · educationLevel · travelZones · startDateWithin
· salaryMinK + salaryMaxK · minSalaryEur + maxSalaryEur (strict) · onlyWithNumericSalary ·
postedWithin · postedAfter + postedBefore.
Sort, volume, output, plumbing
sortBy (DATE · ID · SCORE · COMPANY · GEOLOC) · sortOrder · maxItems · maxItemsPerSearch ·
pageSize · startIndex · dedupeAcrossSearches · includeRawCodes · includeTitleHighlight ·
compact · outputFields · refreshLabels · proxyConfiguration · maxConcurrency ·
requestDelayMs · maxRetries · requestTimeoutSecs.
Example input
{"keywords": ["développeur"],"location": ["Ile-de-France"],"employerType": ["143684"],"contractTypes": ["101888"],"salaryMinK": 50,"salaryMaxK": 70,"maxItems": 500}
💰 Pricing
$0.0009 per offer returned — $0.90 per 1,000 — and no per-run start fee.
| Price per offer | Start fee per run | |
|---|---|---|
| This actor | $0.0009 | none |
easyapi/apec-jobs-scraper (28 monthly users) | $0.00299 | $0.09 |
shahidirfan/APEC-Jobs-Scraper (17) | $0.001 | $0.005 |
blackfalcondata/apec-scraper (4) | $0.0008 | $0.005 |
Rival prices read live from each actor's pricingInfos on 2026-09-04. Every credible rival charges
a start fee on top of the per-row rate; this one does not, which matters most on small and scheduled
runs. Duplicates removed across pages and searches, and rows dropped by your own filters, are
never charged — rows are shipped through Apify's budget-aware push, so delivered always equals
billed.
Measured on Apify: 1,000 offers in 7.4 seconds over 12 requests at 512 MB — $0.0054 of platform
compute, against $0.90 of event billing. chargedEventCounts came back at exactly 1,000 for 1,000
rows delivered, and at exactly 50 for the 50-row demo input.
⚠️ Honest limits — please read before buying
- There is no full job description. APEC truncates
texteOffreto exactly 283 characters on 100% of rows (1,000 of 1,000 measured; 600 of 600 and 300 of 300 in two earlier samples). It ships asdescriptionSnippetwithdescriptionIsTruncated: trueon the row. Every per-offer detail route on apec.fr is behind a DataDome interstitial (/cms/webservices/offre/public,/offre/withLieu,/offre/existeall 403;/cms/webservices/offre/{id}is 401), and this actor does not touch them. If you need full descriptions, this is not the tool. - The salary band is an intersection filter. APEC's own
salaryMinK/salaryMaxKmatches any offer whose published range overlaps the band, an open-ended "A partir de 70 k€" counts as unbounded above, and "A négocier" offers pass every band. UseminSalaryEur/maxSalaryEurfor a hard floor or ceiling on the printed figure. - A minimum salary sent alone does nothing on APEC. Measured:
salaireMinimumwithoutsalaireMaximumleavestotalCountat the unfiltered whole-board figure, with byte-identical rows. The actor completes a lone bound for you and says so in the log. sectorandfonctionsare French-language labels, straight from APEC's nomenclature. They are not translated.- Employer class needs the partitioned crawl. APEC never returns it on the row. With
stampEmployerClass: falseyou get one combined query and a blankemployerClasscolumn. - Deep paging drifts. New offers arrive at the head of a DATE sort while you page, so contiguous
pages overlap: measured 2.67% at the head and 4.33% mid-corpus over 600-row bands, versus 0.88%
sorting by ID. Duplicates are removed on
numeroOffrebefore billing either way;sortBy: "ID"is the steadier deep crawl. apecQualityFlagandisRealClientare APEC's own undocumented internal booleans (indicateurOqa,clientReel). They are passed through honestly; we do not know their exact definition and do not claim one.- Education level is a thin facet — Bac+5 returned 53 offers of ~88,000. Expect small results.
numeroOffreis the stable id and the dedupe key. It is 1:1 with the numericid(541 unique of each across 600 sampled rows, zero divergence).
❓ FAQ
What is APEC? The Association pour l'emploi des cadres — France's public-interest body for executive, manager and engineer employment. Its board carries roughly 90,000 live offers, almost all cadre-level.
Do I need an APEC account or API key? No. The search API needs no cookie, no token and no login.
How many offers are there?
totalCount read live at the end of 2026-09-04: 91,002. By employer class: Entreprise 19,090 ·
Cabinet de recrutement 17,657 · Agence d'emploi 10,027 · SSII/ESN 4,998 · Partenaire (resold feed)
39,123. The board moves all day — it read 87,843 twelve hours earlier — so treat any single figure
as a reading, not a constant.
What does "exclude aggregator feeds" actually remove?
The Partenaire convention — offers a partner job board syndicates onto APEC. 39,123 of the
91,002 live offers, and in a 100-row sample every one was posted as "Hellowork". They are real offers, but the company name is the
board's, not the employer's.
Can I get the employer's SIREN or contact details?
No. APEC's search response carries the trading name (nomCommercial), the logo and the NAF code —
not the SIREN, not an email, not a phone number. The NAF code plus the name is usually enough to
match against a company database on your side.
Can I search by an exact job title?
Use jobTitles — it runs your term through APEC's own métier autocomplete first, so "data analyst"
resolves to the canonical métier the board indexes on. Use keywords for the raw string.
How do I search around a city rather than a whole department?
Set radiusKm with centerLat / centerLng. Verified: 15 km around Lyon returned 120 rows, the
farthest 1.17 km out, all in department 69.
Can I monitor for new offers?
Yes — run on a schedule with postedWithin: "101850" (last 24 h; 18,680 offers when read at
20:20 UTC on 2026-09-04) or "101851" (last 7 days; 44,092), and dedupe on numeroOffre on your
side. To re-check specific postings, feed
their numbers into offerNumbers.
Is it fast? 1,000 rows in 15 requests. Median search latency 2.4–4.9 s, p95 17.6 s under parallel load. Measured concurrency safety: 5 parallel 5/5, 10 parallel 10/10 on one session, 25 rapid sequential calls 25/25 with no rate limiting observed.
Do I need residential proxies? No. The search API answered 200 from a direct IP, an Apify datacenter IP and a residential French IP alike. The datacenter default is the tested path.
Why is the actor only 512 MB when others in this lane run 2 GB and 4 GB? Because they run browsers to render HTML against DataDome for the detail route. This one reads JSON.
What happens on an empty run? If APEC answered but nothing matched your filters, the run exits clean with an explanation of which of your filters removed how many rows. If not a single page could be read, the run fails loudly — an empty dataset must never be mistaken for an empty job board.
⚖️ Legal & fair use
- APEC's
robots.txtwas read live on 2026-09-04:User-agent: *with noDisallowlines, plus four published sitemaps. The search route this actor uses is the same one the public site calls. - Only public job advertisements are collected. No login, no paywall, no anti-bot control is bypassed, and the DataDome-protected per-offer routes are deliberately never requested.
- Job advertisements can contain personal data (a named contact, a confidential employer). You are the data controller for anything you collect and store, and GDPR applies. Use it for legitimate business purposes, honour deletion requests, and do not re-publish personal data.
- Trade marks and content belong to their owners. This actor is not affiliated with, endorsed by, or connected to APEC.