APEC Jobs Scraper — French Cadre Jobs, Employer Type & NAF avatar

APEC Jobs Scraper — French Cadre Jobs, Employer Type & NAF

Pricing

$0.90 / 1,000 per offer returneds

Go to Apify Store
APEC Jobs Scraper — French Cadre Jobs, Employer Type & NAF

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

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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.

FieldFill
numeroOffre · jobId · jobUrl100%
title · companyName100%
employerClass · employerClassLabel · isAggregatorListing100%
postingOrigin100%
nafCode · nafActivity · sector100%
contractType100%
publishedAt · validatedAt100%
descriptionSnippet100% (exactly 283 chars on 1,000 of 1,000 — see limits)
locationText · country100%
city · departmentCode · department · region99.8%
salaryText100%
latitude · longitude94.0%
salaryMin74.9%
salaryMax58.4%
logoUrl61.9%
remoteWork44.4%
contractDurationMonths11.2%
isConfidential · lowApplicantCount · apecQualityFlag · isRealClient · isGeolocatable · hasNumericSalary · salaryIsNegotiable100% (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

BuyerWhat they do with it
Recruitment agencies & RPOsemployerClass: 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 teamsit-services-esn shows exactly which competitors are winning which client work, by NAF code and department.
HR-tech and ATS vendorsCompanies posting cadre roles are actively spending on hiring. Filter by sector, department and salary band.
Market and salary researchersParsed salary min/max against NAF code, region, experience level and remote policy across ~90,000 live offers.
Job-board and aggregator operatorsFeed the whole board, deduped, with the resale rows already separated out.
Sourcers and candidateslowApplicantCount 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

FieldWhat it does
keywordsFree-text terms, one crawl each. Measured: "developpeur" 3,295 offers · "commercial" 23,324 · "ingenieur" 21,148. Empty = the whole board.
jobTitlesFuzzy titles expanded through APEC's own métier autocomplete into canonical labels.
searchUrlsPaste apec.fr search URLs. Parsed, never fetched — the query params map 1:1 onto the API.
offerNumbersExact 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.
excludeKeywordsClient-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 offerStart fee per run
This actor$0.0009none
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

  1. There is no full job description. APEC truncates texteOffre to 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 as descriptionSnippet with descriptionIsTruncated: true on the row. Every per-offer detail route on apec.fr is behind a DataDome interstitial (/cms/webservices/offre/public, /offre/withLieu, /offre/existe all 403; /cms/webservices/offre/{id} is 401), and this actor does not touch them. If you need full descriptions, this is not the tool.
  2. The salary band is an intersection filter. APEC's own salaryMinK/salaryMaxK matches 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. Use minSalaryEur / maxSalaryEur for a hard floor or ceiling on the printed figure.
  3. A minimum salary sent alone does nothing on APEC. Measured: salaireMinimum without salaireMaximum leaves totalCount at the unfiltered whole-board figure, with byte-identical rows. The actor completes a lone bound for you and says so in the log.
  4. sector and fonctions are French-language labels, straight from APEC's nomenclature. They are not translated.
  5. Employer class needs the partitioned crawl. APEC never returns it on the row. With stampEmployerClass: false you get one combined query and a blank employerClass column.
  6. 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 numeroOffre before billing either way; sortBy: "ID" is the steadier deep crawl.
  7. apecQualityFlag and isRealClient are 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.
  8. Education level is a thin facet — Bac+5 returned 53 offers of ~88,000. Expect small results.
  9. numeroOffre is the stable id and the dedupe key. It is 1:1 with the numeric id (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.


  • APEC's robots.txt was read live on 2026-09-04: User-agent: * with no Disallow lines, 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.