APEC Jobs Scraper (apec.fr)
Pricing
from $0.64 / 1,000 job offers
APEC Jobs Scraper (apec.fr)
Scrape apec.fr, France's executive & manager job board, by keywords, place and filters or from search URLs: title, company, place, salary, contract, full advert text, skills, apply link.
Pricing
from $0.64 / 1,000 job offers
Rating
0.0
(0)
Developer
Nice Dev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
💼 What is APEC Jobs Scraper?
APEC Jobs Scraper extracts job offers from apec.fr, France's national job board for executives, managers and engineers (about 100 000 live offers): title, company and employer type, place and distance, salary, contract type, remote-work policy, sector, the full advert text, required skills, the apply link, and whether the offer is new or re-posted.
Type your keywords (data engineer, chef de projet), optionally places (Lyon, 75, Ile-de-France, Allemagne) or a radius around a city, pick filters, or paste any apec.fr search URL, click Start, and download the offers in JSON, CSV or Excel. No login needed, and it is fast (100 offers with full text in a few minutes, 1,000 without it in seconds) and cheap ($0.70 per 1,000 offers). Schedule it with Only new offers to receive, at each run, only what you have not seen yet.
📋 What data can you extract from apec.fr?
One item per offer, 77 fields:
| Category | What you get |
|---|---|
| 🏷️ Offer | title, link, APEC reference number — Data Manager Gouvernance Data F/H |
| 🏢 Employer | company name and registered name, logo, employer type (direct employer, recruitment agency, staffing agency, IT services, job board), confidential or not — Cabinet de recrutement |
| 📍 Place | city, department, region, country, map coordinates, distance from the centre of a radius search — Paris 01 - 75 |
| 💰 Salary | the salary as written, minimum and maximum in euros a year, negotiable or not — 45 - 50 k€ brut annuel |
| 📄 Contract | contract type and length, remote work, part time, number of positions, position status — CDI, Partiel possible |
| 📝 Full advert | the whole job description, the candidate profile and the company presentation, in plain text and in HTML, plus the short teaser of the results page |
| 🧠 Skills | each required skill with its kind (know-how, soft skill, language) and level — Anglais · Courant |
| 🧭 Job and sector | experience required, job function and family, APEC job role, business travel, sector, NAF activity code — Minimum 5 ans, Chief Data Officer |
| ✉️ How to apply | the apply link and how applications are received |
| 🕒 Dates | the date apec.fr shows, the first publication (the real age), re-posted or not, validation and last edit |
| 🔎 Origin and flags | where the advert comes from (APEC recruiter back-office, website, feed, resold by another job board), few applicants, quality checked, search score, which search found it |
Every decoded label comes with its raw APEC id, in the same item: you read Cabinet de recrutement and you join on employerTypeId.
Every field, with an example, is listed in the Output section below.
Fields marked detail in the Output tab (description, candidateProfile, companyDescription, skills, applyUrl, firstPublishedAt, isRepost, experienceLevel, jobFunction, jobRole, travelZone…) are filled when Include details is on (default). Turn it off for a search-results-only scrape: one request per 100 offers instead of one per offer (1,000 offers in seconds instead of minutes); the description is then the 283-character snippet.
✅ Why use APEC Jobs Scraper?
- 📄 The whole advert, not a teaser: description, candidate profile and company presentation, plus the skills list and the apply link, at the same price as the search-results-only scrapers.
- 🆕 Only new offers: schedule the Actor, it remembers what it delivered and skips it (not charged). Re-posted offers are flagged (
isRepost) and can be dropped (Skip re-posted offers): on 2026-09-17, 16 of the 30 newest offers of the board had first been published 1 to 77 days earlier. - 🎯 Type the place, not a code:
Lyon,Paris 15,Rhône,75,Bretagne,Allemagneare resolved against APEC's own list of regions, departments, countries and 36 000 communes; or search within N km of a city or of a point, withdistanceKmon each offer. - 🧭 Every filter of the site: contract type and duration, experience, education level, internship length, start date, remote work, business travel, employer type (direct employer vs recruitment agency vs job-board feeds), sectors, job functions and the 502 APEC job roles, salary band, posting age, geolocated only, sort order. Or paste an apec.fr search URL: its filters are used as is.
- 🧹 Filters on the offers themselves: publication date range, excluded words in the title, company name contains / excluded, no confidential employer, salary figure required, few applicants, posting origin. A filtered-out offer is not charged.
- 🏢 Employer type on every row: direct employer, recruitment agency, staffing agency, IT services or reselling job board.
- 🔁 Several searches in one run (keywords × places), each with its own cap, deduplicated on the offer number.
- 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…) and JSON/CSV/Excel export via the Apify platform.
🚀 How to scrape apec.fr
- Create a free Apify account.
- Open APEC Jobs Scraper and enter one or more Keywords (leave empty for the whole board, newest first), optionally Locations (one search per place) and filters (contract types, remote work, experience, employer types, sectors, job functions or roles, salary band, posting age…).
- Or paste your own apec.fr URLs into Start URLs: search-results pages (their filters are kept) or single offers.
- Set Max offers (default 100;
0= no limit) and, with several searches, Max offers per search. Keep Include details on for the full text, skills, apply link and re-post flag. - Click Start and download the dataset in JSON, CSV, Excel or via API.
💰 How much does it cost to scrape apec.fr?
This Actor uses pay per event pricing: $0.70 per 1,000 offers, full details included — plus $0.001 per run start (10 cents per 100 runs). Higher Apify plans pay less per offer:
| Apify plan | Price per 1,000 offers |
|---|---|
| Free | $0.70 |
| Bronze | $0.68 |
| Silver | $0.66 |
| Gold | $0.64 |
Platform usage (compute, proxy) is included in the price.
- Every
dataoffer on the board (≈ 8,000) ≈ $5.60. - A daily monitor of 200 new offers ≈ $0.14 a day.
- The $5 of free credits every Apify account starts with already cover about 7,000 offers.
Offers filtered out or already delivered (Only new offers) are not charged.
⚙️ Input
{"searchQueries": ["data engineer", "data scientist"],"locations": ["Ile-de-France", "Lyon"],"maxItemsPerQuery": 100,"contractTypes": ["CDI"],"remoteWork": ["PARTIAL", "FULL"],"employerTypes": ["COMPANY", "IT_SERVICES"],"salaryMin": 45,"postedWithin": "7","maxItems": 500,"includeDetails": true}
Monitoring: only the offers not delivered before, re-posts dropped:
{"searchQueries": ["contrôleur de gestion"],"locations": ["Rhône"],"onlyNew": true,"stateKey": "controle-gestion-rhone","skipReposts": true,"maxItems": 0}
Or with your own URLs:
{"startUrls": [{ "url": "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=data&lieux=75&typesContrat=101888" },{ "url": "https://www.apec.fr/candidat/recherche-emploi.html/emploi/detail-offre/179239722W" }],"maxItems": 500}
| Field | Notes |
|---|---|
searchQueries, locations | Keywords (one search per entry) × places (a department number or name, a region, a city, France or a country). Up to 500 searches per run; an offer found by several searches is saved once. |
startUrls | Your own apec.fr URLs: search-results pages (filters kept, pagination automatic) or single offer pages. When set, keywords, places and the radius fields are ignored. |
maxItems, maxItemsPerQuery | Stop after this many offers for the whole run, and for EACH search. 0 = no cap. |
contractTypes, contractDurationBand, internshipDuration | APEC's own contract filters: permanent, fixed-term, temp, work-study, internship; the length of a fixed-term contract or of an internship. |
experienceLevels, educationLevel, positionStatus, startDateWithin | Years of experience, degree level, status of the position (cadre, agent de maîtrise…), how soon it starts. |
remoteWork, travelZones, onlyGeolocated | Remote-work policy, how far the job travels, and whether APEC has placed the offer on a map. |
sectors, jobFunctions, jobRoles | APEC's 29 sectors, 56 job functions and 502 métiers. A métier is given by its exact name or its id; offers of any selected function OR métier are kept. |
employerTypes, tagEmployerType, postingOrigins | Who posts the offer (company, recruitment or staffing agency, IT services, resold by another job board), and where the advert comes from. Tagging runs each search once per employer type so that every offer carries one. |
salaryMin, salaryMax, requireSalary | APEC's own salary filter, in thousands of euros a year; an offer is kept when its published range overlaps yours. Offers with no figure are kept unless you ask for one. |
radiusKm, latitude, longitude | Search within N km of each city, or of a point of your own. Every offer then carries distanceKm. |
postedAfter, postedBefore, postedWithin, sortBy | A publication-date range of your own (2026-09-01, or a period before now: 7 days, 2 weeks, 1 month, 24 hours), APEC's own "posted within" filter, and the order of results. |
excludeKeywords, companyNameContains, excludeCompanies, excludeConfidential, onlyLowApplicantCount, skipReposts | Filters applied on the offers themselves: drop a title that contains one of these words (case and accents ignored), keep or drop a company, drop confidential adverts, keep the ones with few applicants, drop re-posts. Nothing they drop is charged. |
includeDetails | Open each offer for the full advert text, skills, apply link, first publication date and re-post flag (default on). |
onlyNew, stateKey, resetState | Monitoring: only the offers never delivered under this memory key, down to the oldest one the last run delivered for each search; with skipReposts, the re-posts it dropped are remembered too (a re-post stays one). resetState forgets the memory. |
excludeEmptyFields | Drop null and empty values from every offer: a compact JSON, smaller exports. |
| Advanced | proxyConfiguration (Apify proxy by default, included in the price; your own proxies serve the search pages, the offer pages always go through the included proxy; the residential proxy is not available), maxConcurrency, maxRequestsPerMinute, maxRequestRetries, debugLog. |
📦 Output
{"id": 179239722,"offerNumber": "179239722W","url": "https://www.apec.fr/candidat/recherche-emploi.html/emploi/detail-offre/179239722W","source": "apec.fr","title": "Data Manager Gouvernance Data F/H","company": "DGTL Performance","isConfidential": false,"employerTypeId": 143685,"employerType": "Cabinet de recrutement","locationText": "Paris 01 - 75","city": "Paris 01","departmentCode": "75","department": "Paris","region": "Ile-de-France","country": "France","latitude": 48.8566,"longitude": 2.3522,"isGeolocated": true,"distanceKm": null,"salaryText": "45 - 50 k€ brut annuel","salaryMin": 45000,"salaryMax": 50000,"salaryCurrency": "EUR","salaryPeriod": "YEAR","salaryBasis": "GROSS","salaryIsNegotiable": false,"contractTypeId": 101888,"contractType": "CDI","contractDurationMonths": null,"remoteWorkId": 20765,"remoteWork": "Partiel possible","sectorId": 101762,"sector": "Conseil et gestion des entreprises","nafCodeId": 101606,"nafCode": "7022Z","nafLabel": "CONSEIL POUR LES AFFAIRES ET AUTRES CONSEILS DE GESTION","postingOriginCode": 101866,"postingOrigin": "ADEP","isAggregatorListing": false,"isDirectClient": true,"isQualityChecked": true,"lowApplicantCount": false,"relevanceScore": 44.07,"logoUrl": null,"publishedAt": "2026-09-10T03:38:05.000Z","validatedAt": "2026-09-10T03:38:05.000Z","descriptionSnippet": "Rejoignez un acteur majeur du secteur des transports en commun pour piloter la montée en maturité de sa plateforme Data…","description": "Rejoignez un acteur majeur du secteur des transports en commun pour piloter la montée en maturité de sa plateforme Data. Vous structurerez et industrialiserez les pratiques de gouvernance…","descriptionHtml": "<p>Rejoignez un acteur majeur…</p>","candidateProfile": "Indispensables :\n- Plus de 6 ans d'expérience directe en Gouvernance Data…","companyDescription": "DGTL / Signe + est le facilitateur pour tous les acteurs qui recherchent des ressources ou des missions DATA…","skills": [{ "label": "Gouvernance des données", "type": "SAVOIR_FAIRE", "level": "Confirmé" },{ "label": "Anglais", "type": "LANGUE", "level": "Courant" }],"applyUrl": "https://www.jobposting.pro/emploi-2665246-113#postuler","applicationMethod": "URL_ONLY","firstPublishedAt": "2026-08-06T17:02:38.000Z","isRepost": true,"updatedAt": "2026-09-10T03:38:05.000Z","experienceLevelId": 597155,"experienceLevel": "Minimum 5 ans","jobFunctionId": 101813,"jobFunction": "Système, réseaux, données","jobFunctionFamily": "Informatique","jobRoleId": 600070,"jobRole": "Chief Data Officer","positionTypeId": 101900,"positionType": "Cadre du secteur privé","travelZoneId": 596720,"travelZone": "Pas de déplacement","numberOfPositions": 1,"isPartTime": false,"jobReference": "2665246","companyLegalName": "DGTL PERFORMANCE","companyId": 803909,"detailFetched": true,"searchKeyword": "data","searchUrl": "https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=data&typesConvention=143685&sortsType=DATE&sortsDirection=DESCENDING","scrapedAt": "2026-09-17T08:10:00.000Z"}
You can download the dataset in various formats such as JSON, HTML, CSV or Excel.
All 77 fields
| Fields | What you get |
|---|---|
id, offerNumber, url, source, title | 179239722, 179239722W, https://www.apec.fr/candidat/recherche-emploi.html/emploi/detail-offre/179239722W, apec.fr, Data Manager Gouvernance Data F/H |
company, isConfidential, logoUrl, employerType | DGTL Performance, false, logo URL, Cabinet de recrutement (with Tag each offer with its employer type) |
postingOrigin, isAggregatorListing | ADEP (APEC recruiter back-office), SITE_WEB_APEC, IMPORT_XML, AGREGATION = resold by another job board → true |
locationText, city, departmentCode, department, region, country, latitude, longitude, distanceKm | Paris 01 - 75, Paris 01, 75, Paris, Ile-de-France, France, 48.86, 2.34, 7.4 (radius searches) |
salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryBasis, salaryIsNegotiable | 45 - 50 k€ brut annuel, 45000, 50000, EUR, YEAR, GROSS, false (true for "A négocier") |
contractType, contractDurationMonths, remoteWork | CDI, null, Partiel possible |
sector, nafCode, nafLabel | Conseil et gestion des entreprises, 7022Z, CONSEIL POUR LES AFFAIRES… |
publishedAt, firstPublishedAt, isRepost, validatedAt, updatedAt | ISO 8601 — date shown by apec.fr, first publication (the real age), true when the offer was pushed back to the top, validation, last edit |
descriptionSnippet | the 283-character teaser shown in search results |
description, descriptionHtml, candidateProfile, companyDescription | the full advert in three parts (plain text), and its HTML as apec.fr stores it — not sanitized: clean it before inserting it into a web page |
skills | [{ "label": "Python", "type": "SAVOIR_FAIRE", "level": "Confirmé" }, …] (know-how, soft skills, languages) |
applyUrl, applicationMethod | external application link, URL_ONLY / EMAIL_URL |
experienceLevel, jobFunction, jobFunctionFamily, jobRole, positionType, travelZone, numberOfPositions, isPartTime, jobReference | Minimum 5 ans, Système, réseaux, données, Informatique, Chief Data Officer, Cadre du secteur privé, Nationale, 1, false, 2665246 |
lowApplicantCount, isDirectClient, isQualityChecked, relevanceScore | APEC's own flags and search score |
searchKeyword, searchUrl, scrapedAt | which search found the offer, the equivalent apec.fr page, ISO timestamp |
companyId, companyLegalName, isGeolocated, detailFetched | APEC's own company id and registered name, whether APEC placed the offer on a map, and whether the full advert could be read |
employerTypeId, contractTypeId, remoteWorkId, sectorId, nafCodeId, postingOriginCode, experienceLevelId, jobFunctionId, jobRoleId, positionTypeId, travelZoneId | the raw APEC id of each decoded label, side by side with it: join on stable codes |
💡 Tips
How to get more results
Leave maxItems at 0 and keep the search broad (no keywords, a whole region rather than a single city) — APEC exposes every matching offer, there is no result cap. Add employerTypes only when you want to narrow the board (e.g. direct employers).
How to reduce costs
The price is per offer saved: maxItems, maxItemsPerQuery, Only new offers and the filters on the offers are the levers (nothing filtered out is charged). Filters of the site (contract, place, salary…) are cheaper still: the offers are never downloaded. Turning includeDetails off makes runs faster but does not change the price.
Several searches in one run
searchQueries × locations = one search each (4 above), max 500 per run. Max offers per search caps each of them, so that the first one does not use the whole Max offers budget; an offer found by two searches is saved once and counts for the first.
Monitoring: only the new offers
Tick Only new offers (onlyNew), give each schedule its own Memory key (stateKey) and schedule the Actor daily. The first run returns everything; the next ones return only the offers no previous run with the same Memory key delivered, down to the oldest one the last run delivered for each search — the others are skipped before their details are opened and are not charged. The memory lives in the named key-value store apec-jobs-scraper-seen of your account (up to 150 000 offers per key). Give each schedule its own key; Reset the memory starts over. A re-posted offer keeps its number: it is not delivered twice. Keep the date sort, and add Skip re-posted offers if a re-post should not count as new. A run that finds nothing new ends green with "No new or matching offers" after a few search pages.
Filter by publication date
postedAfter / postedBefore take a date (2026-09-01, the whole day in Paris time) or a period before now (7 days, 2 weeks, 1 month: same time of day in Paris; 24 hours through the API). The date is publishedAt, the one apec.fr shows and sorts by: a re-post moves it to the day the offer came back to the top, so add Skip re-posted offers for truly new offers. With the default date sort, the crawl stops at the first page older than postedAfter.
Radius search
"locations": ["Villeurbanne"], "radiusKm": 15 = offers within 15 km of Villeurbanne, like "à moins de 15 km" on apec.fr (the site adds the offers of the city itself). Or "radiusKm": 20, "latitude": 45.764, "longitude": 4.8357 around any point. Departments, regions and countries cannot be the centre of a radius.
Start URLs
Paste apec.fr search URLs (https://www.apec.fr/candidat/recherche-emploi.html/emploi?motsCles=data&lieux=75&typesContrat=101888): their filters are kept (keywords, places, contract type and duration, experience, education level, internship length, start date, job function, sector, employer type, position status, remote work, business travel, geolocated only, salary bounds or band, posting age, sort, and a distance around one city) and the other input filters fill what the URL does not set. Single offer URLs (…/detail-offre/179239722W) are scraped directly. The page of a pasted search URL is not read: the search starts at its first page, and the same search pasted twice (another page, a tracking key) is one search. An offer URL pasted alone has no search-result card: validatedAt, descriptionSnippet and isDirectClient are null, every other field is the same as when a search finds it.
🔌 Integrations and API
Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON, CSV or Excel from any tool, with only the fields you need (fields, omit options of the dataset export). Tick Drop empty fields (excludeEmptyFields) for a compact JSON without null or empty values — the export's skipEmpty drops empty offers, not empty fields.
❓ FAQ
Is it legal to scrape apec.fr?
The Actor only reads what apec.fr shows publicly to any anonymous visitor: job advertisements. It logs in to nothing and solves no captcha. Job adverts can contain personal data (a named contact in the text), which is protected by GDPR: do not store it without a legitimate reason — recruiter names and e-mails are never output. You are responsible for using the data in compliance with apec.fr's Terms of Use and applicable law. This Actor is not affiliated with, endorsed by or connected to the APEC.
Does it need a login or a proxy?
No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). Your own proxies, if you give some, serve the search pages: the offer pages always go through the included proxy. A request apec.fr turns away is retried at once on a new proxy session (without a proxy, after a pause of 5 seconds, doubled at each retry up to 300 seconds).
Is the data safe to open in Excel or to show on a web page?
Titles and advert texts are the recruiters' own words, copied as they are. A text can begin with -, +, = or @ (a title such as -20% de turnover, a reference such as =REF2026): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value. For Excel, download the Excel (XLSX) export: its cells are written as text, so a leading - or = is shown as written (measured: =1+1 stays =1+1); the CSV export is raw, so if you open a CSV, import these columns as text. descriptionHtml is the advert's HTML exactly as apec.fr stores it, and the Actor does not sanitize it: escape it, or clean it with a sanitizer, before putting it on a web page — as you would with any text written by a stranger.
Good to know
- About 40 % of the board are "Partenaire" offers (
postingOrigin: AGREGATION,isAggregatorListing: true): adverts resold by other job boards (cadremploi, Meteojob, Direct Emploi…), wherecompanyis often the board's name. UseemployerTypes,postingOriginsorexcludeCompaniesto keep them out. employerTypeis filled when the search is restricted to one type: Tag each offer with its employer type runs each search once per type (apec.fr has no such field per offer; the 5 types split the board exactly), a few more search pages, and Max offers per search then applies to each type.- A radius around a city needs its coordinates: apec.fr's own place autocomplete gives them (1 light request per city; Paris, Lyon and Marseille are built in). A city apec.fr cannot place fails that search with a clear message — use
latitude/longitudethen. salaryMin/salaryMaxfilters are APEC's own: an offer is kept when its published range overlaps yours; offers without a figure ("A négocier") are always kept — add Only offers with a salary figure to drop them.- APEC re-publishes offers regularly:
publishedAtmoves,firstPublishedAtdoes not,isReposttells them apart (nullwithout details). - Only new offers: a date-sorted search is read down to the oldest offer the last run delivered for it (same memory key), no further — an older offer never comes: one that run left out (its cap), or one apec.fr publishes late under an older date. Reset the memory, or a new key, reads deeper. The search also stops after 500 already-delivered offers in a row, or at the run's cap (
maxItems/maxItemsPerQuery) of them: a previous run under the same cap never delivered more in a row. A delivered offer re-posted since the previous run (back on top with a newer date) does not count and lowers that cap by one. Two runs at the same time on the same memory key may deliver an offer twice. - Date-sorted crawls of thousands of offers can see a few offers twice (new offers are inserted at the top while the crawl runs): they are deduplicated on
offerNumber.sortBy: "ID"is steadier for very deep crawls. - Recruiter names and e-mails are never output: only what the public offer page shows.
- An offer URL pasted next to a search that also finds it is saved once, counted in that search.
- If a detail cannot be fetched after every retry (a rare refusal, a network error), the offer is still saved from its search-result card with
detailFetched: false, and its URL is listed in theFAILED_REQUESTSrecord of the key-value store. A run that saves nothing while requests failed ends as failed, never as an empty success. If apec.fr refuses the full adverts one after the other (20 in a row — or Max offers when it is lower, 8 at least —, more refused than read), the run stops and fails instead of charging rows without their details.
A run the platform stops without warning (out of memory, run timeout)
- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the offers already saved are skipped: none is delivered or charged twice, and
maxItemsstill counts them. - With Only new offers, the memory is saved once a minute: resurrect the stopped run and the offers it had saved meanwhile join the memory; leave it stopped for good, and the next run may return up to a minute of them once more.
Something doesn't work?
The last line of the log counts the offers saved, filtered out, already delivered and no longer on apec.fr (an offer URL pasted alone that was removed), and the requests that failed after every retry. Those requests and the removed offers are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store (a search page under its apec.fr URL). A run that saved nothing and had failed requests fails, and its last message gives the cause (a search apec.fr rejects says so, instead of "run it again"). A run that saved some offers fails too when at least as many requests failed for good as were read (page 1 read, the next pages or the offer pages blocked): a green run with a short dataset would hide the outage. One failed request among many is only a warning.
If apec.fr changes its pages, you are told instead of paying for blank rows. A search page that counts offers but gives none the Actor can read is an error (listed in FAILED_REQUESTS), never a quiet "No offers found". If the first 20 offers read all lack their title, publication date, salary text, contract type, posting origin, company (confidential offers aside), place, sector or — with includeDetails — description or first publication date, the run saves nothing more, stops and fails, and its last message names the missing field: at most those first offers are charged. An offer that postedAfter / postedBefore drops because it has no date at all counts among those 20.
🛟 Support
Open an issue in the Issues tab with a link to your run: the log and the FAILED_REQUESTS record of the key-value store show which requests failed and why.