
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Export executive and manager job offers from APEC (apec.fr), France's job board for cadres. Search by keyword and location with contract, experience, remote, salary and date filters, or paste search and offer links. Salary, contract, company, address, skills, contacts, apply links and full descriptions. No login needed.
Export executive and manager job offers from APEC (apec.fr), France's job board for cadres, in seconds. Search by keyword and location, narrow down by contract, experience, remote work, salary, date, job function or industry, or simply paste APEC links. Every offer comes with salary range, contract, company, address and coordinates, skills, contact names, apply link and the full description. No login, no account, no cookies.
data analyst, contrôleur de gestion) and, if you like, a location (Lyon, Gironde, 33, Ile-de-France).| Field | What it does |
|---|---|
searchQueries | Job titles, skills or companies, one search per line. Every word of a term must match, so keep terms short. |
location | City, department (name or number), region or country. Separate several places with ;. |
startUrls | Offer links, bare offer numbers (179260751W) or apec.fr search links. |
maxResults | How many offers to save in total (0 = no limit). |
contractTypes, experienceLevels, remoteWork, postedWithin | Contract (CDI, CDD, alternance, stage, intérim), experience band, remote policy, posting date. |
minSalaryK, maxSalaryK | Gross annual salary band in thousands of euros. |
jobFunctions, industries, positionStatus, companyTypes | APEC's function families, industries, private/public/technician roles, and who posted the offer. |
radiusKm | With one city as the location, also include offers within this distance. |
sortBy, includeDetails, maxResultsPerSearch | Newest first, search-card-only mode for speed, per-search cap. |
{
"searchQueries": ["data analyst", "contrôleur de gestion"],
"location": "Lyon",
"radiusKm": 30,
"contractTypes": ["CDI"],
"postedWithin": "7D",
"maxResults": 100
}
One row per job offer. Main fields:
| Field | Description |
|---|---|
id, title, url | APEC offer number, job title and offer page |
company, companyLegalName, companyLogo, companyDescription | Employer name, legal entity, logo and presentation |
location, city, department, region, streetAddress, postalCode, latitude, longitude | Where the job is |
salaryText, salaryMin, salaryMax, salaryPeriod, salaryBasis | Salary as shown, plus parsed numbers in euros |
contractType, contractDurationMonths, isPartTime, startDate | Contract details |
experienceLevel, educationLevel, jobFunction, jobRole, industry, positionType, remoteWork, travelZone | APEC's classification of the role |
skills, softSkills, languages | Skills the offer lists |
summary, description, descriptionHtml, candidateProfile, recruitmentProcess | Search-card summary and full texts (plain text and HTML) |
applyUrl, applyMethod, requiresCoverLetter, contactFirstName, contactLastName, extractedEmails, extractedPhones | How to apply and who to contact |
postedAt, firstPublishedAt, lastModifiedAt | Dates (UTC, ISO 8601) |
Example (trimmed, contact name changed):
[
{
"id": "179573127W",
"title": "Data Analyst F/H",
"url": "https://www.apec.fr/candidat/recherche-emploi.html/emploi/detail-offre/179573127W",
"company": "ELIS",
"companyLegalName": "ELIS SERVICES",
"companyBrand": "ELIS",
"companyId": 118954,
"companyLogo": "https://www.apec.fr/files/live/mounts/images/media_entreprise/118954/logo_ELIS_SERVICES_118954_881693.jpg",
"companyDescription": "Si comme nous, vous travaillez mieux quand on vous fait confiance, C'est par ici\n\nCar Chez Elis, on sait que l'on peut compter sur les personnes que l'on …",
"location": "Puteaux - 92",
"city": "Puteaux",
"department": "Hauts-de-Seine",
"departmentCode": "92",
"region": "Ile-de-France",
"country": "France",
"postalCode": "92800",
"streetAddress": "18 RUE HOCHE",
"addressCity": "PUTEAUX",
"latitude": 48.8836138,
"longitude": 2.2387286,
"salaryText": "A partir de 45 k€ brut annuel",
"salaryMin": 45000,
"salaryMax": null,
"salaryCurrency": "EUR",
"salaryPeriod": "YEAR",
"salaryBasis": "gross",
"contractType": "CDI",
"contractDurationMonths": null,
"isPartTime": false,
"experienceLevel": "Minimum 7 ans",
"educationLevel": null,
"jobFunction": "Système, réseaux, données",
"jobFunctionGroup": "Informatique",
"jobRole": "Data analyst",
"industry": "Autres activités de soutien aux entreprises n.c.a.",
"industryGroup": "Services divers aux entreprises",
"positionType": "Cadre du secteur privé",
"remoteWork": "Pas de télétravail autorisé",
"travelZone": "Union Européenne",
"startDate": null,
"skills": [
"Intelligence artificielle",
"Microsoft Power BI",
"Snowflake",
"Architecture",
"Datafactory"
],
"softSkills": [
"Mathématiques",
"Microsoft Office XP",
"Proxy"
],
"languages": [],
"description": "Ne venez pas chez Elis, si vous n'aimez pas faire parler la donnée !\n\nMais si vous voulez transformer les besoins métiers en solutions data à forte valeur …",
"descriptionHtml": "<p>Ne venez pas chez Elis, si vous n'aimez pas faire parler la donnée !<br /><br />Mais si …",
"candidateProfile": "- Bac+5 en Informatique Décisionnelle, Data Management, Statistiques, Mathématiques appliquées ou un équivalent universitaire\n- Minimum 7 ans en projets …",
"candidateProfileHtml": "<p>- Bac+5 en Informatique Décisionnelle, Data Management, Statistiques, Mathématiques app …",
"recruitmentProcess": null,
"applyUrl": "https://api.mytalentplug.com/job/v1/joboffer/redirect?id=b408c0a9-bea2-4008-9d0a-eedf4c1cd765",
"applyMethod": "URL_ONLY",
"numberOfPositions": 2,
"clientReference": "talentplug-31228052",
"contactFirstName": "Claire",
"contactLastName": "Martin",
"followUpContactName": null,
"followUpContactRole": null,
"extractedEmails": [],
"extractedPhones": [],
"postedAt": "2026-10-12T09:05:08Z",
"firstPublishedAt": "2026-10-12T09:05:08Z",
"lastModifiedAt": "2026-10-12T09:05:08Z",
"isConfidential": false,
"isVerifiedOffer": true,
"lowApplicationVolume": false,
"origin": "ADEP",
"detailFetched": true,
"searchQuery": "data analyst",
"scrapedAt": "2026-10-21T05:58:53Z"
}
]
You pay $0.65 per 1,000 offers ($0.00065 per offer saved), plus the small platform usage of the run (compute and French residential proxy traffic). In our tests 1,000 offers with full details used about $0.01 of platform usage, so 1,000 offers ≈ $0.66 in total and 20 offers cost about $0.014. Offers that could not be saved are never charged, and a run stops cleanly when it reaches your maximum charge.
Is it legal to scrape APEC? The scraper reads only public job offers that anyone can see on apec.fr without an account. Check that your use of the data, especially contact names, complies with the GDPR and APEC's terms.
Do I need a login or my own proxy? No. No APEC account is needed. APEC blocks datacenter addresses, so the scraper uses French residential exits by default; if you pick datacenter, it switches to residential by itself when refused.
How many offers can I get? As many as APEC lists for your search. A search with no keyword returns every offer in France (over 100,000). Use maxResults to cap the run.
Why is a field empty? Not every employer fills every field: salary is often "A négocier", and remote work, education level and start date are optional on APEC. Empty fields are null or [].
Can I schedule it or use the API? Yes. Schedule daily runs with "Posted within: last 24 hours" for alerts, and read results through the API or webhooks.
Can I get only the search cards? Yes: turn off Full offer details for faster runs with title, company, location, salary, contract and the short summary.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchQueriesarrayOptionalSearch terms
Job titles, skills or company names, one per line, e.g. 'data analyst', 'contrôleur de gestion', 'chef de projet'. Each term is its own search, and every word of a term has to match the offer, so keep terms short (2 to 4 words). Leave empty to list every offer for the location or filters.
locationstringOptionalLocation
City, department (name or number), region or country, e.g. 'Lyon', 'Gironde', '33', 'Bretagne', 'Ile-de-France', 'Belgique'. Separate several places with ';'. Leave empty to search all of France and abroad.
startUrlsarrayOptionalAPEC links
Optional. Offer links (www.apec.fr/candidat/recherche-emploi.html/emploi/detail-offre/179260751W), bare offer numbers (179260751W) or search links copied from the site (www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=data&lieux=711). Filters below are added to pasted search links.
maxResultsintegerOptionaldefault 20Maximum offers
How many offers to save in total across all searches. 0 = no limit (up to 100,000).
contractTypesarrayOptionalContract type
Only offers with one of these contracts.
experienceLevelsarrayOptionalExperience
Experience the employer asks for.
remoteWorkarrayOptionalRemote work
Remote-work policy stated in the offer.
postedWithinenumOptionalPosted within
Only offers published recently.
minSalaryKintegerOptionalMinimum salary (k€ per year)
Gross annual salary in thousands of euros, e.g. 50 for 50,000 €. Uses the site's salary filter (20 to 200).
maxSalaryKintegerOptionalMaximum salary (k€ per year)
Gross annual salary in thousands of euros, e.g. 80 for 80,000 €.
jobFunctionsarrayOptionalJob function
APEC's job function families.
industriesarrayOptionalIndustry
The employer's industry.
positionStatusarrayOptionalPosition status
Private-sector executive, public-sector executive, or supervisor/technician roles.
companyTypesarrayOptionalAdvertiser type
Who posted the offer. Empty = all.
radiusKmintegerOptionalRadius around the city (km)
With a single city as the location, also include offers within this distance of it.
sortByenumOptionaldefault "relevance"Sort by
Order of the results.
includeDetailsbooleanOptionaldefault trueFull offer details
Open every offer for the full description, candidate profile, company description, address, skills, contact names and apply link. Turn off for faster runs with search-card fields only (title, company, location, salary, contract, short summary).
maxResultsPerSearchintegerOptionalMaximum offers per search
Optional cap for each search term or link, so one broad term does not use up the whole limit. 0 = no per-search cap.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["RESIDENTIA…Proxy
APEC blocks datacenter addresses, so French residential exits are used by default. If you pick datacenter and the site refuses it, the run switches to French residential exits by itself.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | APEC offer number |
| title | string | |
| url | string | |
| company | string | null | |
| location | string | null | |
| salaryMin | number | null | |
| salaryMax | number | null | |
| latitude | number | null | |
| longitude | number | null | |
| skills | array | |
| description | string | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job offer | One saved APEC job offer. | $0.00065 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/apec-scraper').call({
"searchQueries": [
"data analyst"
],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"RESIDENTIAL"
],
"scrapelyProxyCountry": "FR"
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/apec-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/apec-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.