DECP Scraper: French Public Contracts Awarded (Marches Publics)
Pricing
from $0.00005 / actor start
DECP Scraper: French Public Contracts Awarded (Marches Publics)
Scrape 650K+ awarded French public contracts (DECP) — buyer SIRET, winner SIRET, amount, CPV, procedure. Filter by date, CPV, montant, departement. For B2G prospection, market intel, lead gen. $5/1K records.
Pricing
from $0.00005 / actor start
Rating
0.0
(0)
Developer
Actor stats
1
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
DECP Scraper — 650K+ Awarded French Public Contracts API
⭐ Bookmark this actor → apify.com/dltik/decp-fr-scraper — Apify ranks by bookmarks, so it directly drives the visibility of this scraper. One click. No signup beyond your existing Apify account.
Scrape 650K+ awarded French public contracts from DECP (Données Essentielles de la Commande Publique — Arrêté du 22 décembre 2022). Get the buyer SIRET, winner SIRET, contract amount in euros, notification date, CPV code, procedure, duration, location for every public contract awarded by French communes, départements, regions, hospitals, ministries and public agencies. Filter by date, CPV, montant, département, buyer, winner. No OAuth, no API key, no monthly subscription.
What makes this scraper different
| Feature | This DECP scraper | TED-only scrapers | Generic procurement scrapers |
|---|---|---|---|
| French municipal contracts (sub-EU threshold) | ✅ 650K+ | ❌ | ⚠️ shallow |
| Buyer SIRET (joinable to Sirene / Pappers) | ✅ | ❌ | ❌ |
| Winner SIRET (titulaire 1/2/3) | ✅ | ❌ partial | ❌ |
Contract amount in euros (montant) | ✅ structured | ⚠️ rare | ❌ |
CPV prefix filter (72, 45, 85...) | ✅ | ✅ | ⚠️ |
| Montant min/max filter | ✅ | ❌ | ❌ |
Département filter (prefix on lieu_execution) | ✅ | ❌ | ❌ |
Innovative-contract toggle (marcheinnovant) | ✅ | ❌ | ❌ |
Green-procurement toggle (considérations env.) | ✅ | ❌ | ❌ |
| Per-record charge (no actor-start fee) | ✅ | ❌ inflated | ✅ |
| Concessions dataset toggle | ✅ | ❌ | ❌ |
What can this scraper do?
- 🇫🇷 650K+ awarded French public contracts from the official DECP feed (Arrêté 22/12/2022, live)
- 🏛️ Every type of public buyer — communes, départements, régions, CHU, ministères, agences, syndicats intercommunaux
- 💰 Structured montant in euros — filter sub-threshold MAPA, mid-range marchés, mega-contrats by exact value
- 🏢 Buyer and winner SIRET — directly joinable to Sirene for instant company enrichment
- 🎯 CPV prefix filter —
72for IT services,45for construction,85for health,50410000for metrology, etc. - 🌿 Green / innovation toggles —
marcheinnovant=oui+considerationsenvironnementalesfor ESG-aware prospection - 🗺️ Lieu d'exécution code — INSEE / postcode / département for geo-targeted bidding
- 🚀 No auth, no quota — HTTP-only, Opendatasoft Explore v2.1, datacenter proxy optional
What data can you extract per contract?
| Field | Description |
|---|---|
contract_id | DECP contract identifier (id) |
objet | Free-text object of the contract |
nature | Marché / Accord-cadre / Marché subséquent |
montant_eur | Awarded amount, in EUR (numeric) |
date_notification | Date the contract was notified to the winner (YYYY-MM-DD) |
annee_notification | Year extracted from date_notification (numeric) |
date_publication_donnees | Date the DECP record was published |
acheteur_siret | 14-digit SIRET of the public buyer |
acheteur_nom_resolved | Buyer name (null — join Sirene to enrich) |
titulaire_siret | 14-digit SIRET of the primary winner (titulaire 1) |
titulaire_type_identifiant | SIRET, TVA, UE, HORS-UE |
titulaire_nom_resolved | Winner name (null — join Sirene to enrich) |
titulaires_all | All co-titulaires (1-3) with id + type |
code_cpv | Common Procurement Vocabulary code (8 digits + check) |
cpv_label | CPV human label (null — combine with a CPV reference table) |
procedure | "Procédure adaptée", "Appel d'offres ouvert", "Marché négocié"... |
duree_mois | Contract duration in months |
lieu_execution_code | Execution location code (INSEE / postcode / dept) |
lieu_execution_type | "Code postal", "Code commune", "Code département"... |
forme_prix | Unitaire / Forfaitaire / Mixte |
offres_recues | Number of offers received (proxy for competitiveness) |
considerations_sociales | Social-clauses status |
considerations_environnementales | Environmental-clauses status |
marche_innovant | Boolean — innovation procurement flag |
ccag | CCAG reference (Cahier des Clauses Administratives Générales) |
modalites_execution, techniques, types_prix | Contract-shape details |
origine_france_pct, origine_ue_pct | Stated French / EU origin share |
sous_traitance_declaree | Sub-contracting flag |
type_groupement_operateurs | Joint-venture grouping type |
source_publication | DECP source feed (e.g. "DGFIP – PES MARCHÉ") |
source_dataset | decp-2022-marches-valides or decp-2022-concessions-valides |
source_url | data.economie.gouv.fr permalink |
scraped_at | UTC timestamp of the run |
How to scrape DECP in 5 steps
- Create a free Apify account — no credit card required.
- Open DECP Scraper on Apify Store.
- Set your filters — for example
cpv=["72"](IT),departement="75"(Paris),notifiedSince="today-180",montantMin=50000. - Pick
maxResults— start at 20 to validate, scale to 5,000 once happy. Hard cap 10,000 per run (Opendatasoft window). - Click Start — clean JSON in seconds, exportable to CSV / JSON / Excel from the Apify dataset UI.
How much does it cost to scrape DECP contracts?
PAY_PER_EVENT — $0.005 per contract scraped ($5 per 1,000 results). Failed / empty runs not charged.
| Run size | Contracts | Apify cost | Time |
|---|---|---|---|
| Quick test | 20 | $0.10 | ~3s |
| Standard | 200 | $1.00 | ~15s |
| Deep | 1,000 | $5.00 | ~1 min |
| Massive | 5,000 | $25.00 | ~5 min |
Add includeConcessions=true to also pull the small concessions dataset (~600 records, long-term public service delegations).
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
query | string | — | Free-text search in objet |
cpv | array | [] | CPV codes, prefix-matched. ["72"] = all IT, ["45","85"] = construction OR health |
acheteurSiret | string | — | Exact buyer SIRET (14 digits) |
titulaireSiret | string | — | Exact winner SIRET — every contract a given company has won |
notifiedSince | string | — | ISO date YYYY-MM-DD or today-N |
notifiedUntil | string | — | ISO date YYYY-MM-DD |
montantMin | integer | — | Minimum contract value (EUR) |
montantMax | integer | — | Maximum contract value (EUR) |
lieuExecutionCode | string | — | Exact location code (INSEE / postcode / dept as published) |
departement | string | — | Two-digit dept prefix on lieu_execution_code |
procedure | string | — | Partial match — adaptee, ouvert, restreint, negocie |
marcheInnovant | bool | false | Keep only marcheinnovant=oui |
considerationsEnv | bool | false | Keep contracts with environmental clauses |
includeConcessions | bool | false | Also pull the concessions dataset (~600 rows) |
maxResults | integer | 50 | 1–10000 |
proxyConfig | object | none | Apify proxy (rarely needed) |
Output example
{"type":"marche","source_dataset":"decp-2022-marches-valides","contract_id":"202424.02","objet":"Prestations relatives au contrôle métrologique des instruments de pesage","nature":"Marché","montant_eur":40000.0,"date_notification":"2024-04-25","annee_notification":2024,"date_publication_donnees":"2024-04-26","acheteur_siret":"25020879000098","titulaire_siret":"34974317900203","titulaire_type_identifiant":"SIRET","titulaires_all":[{"id":"34974317900203","type":"SIRET"}],"code_cpv":"50410000-2","procedure":"Procédure adaptée","duree_mois":48,"lieu_execution_code":"02000","lieu_execution_type":"Code postal","forme_prix":"Unitaire","offres_recues":1,"considerations_sociales":"Pas de considération sociale","considerations_environnementales":"Pas de considération environnementale","marche_innovant":true,"ccag":"Fournitures courantes et services","source_publication":"DGFIP – PES MARCHÉ","source_url":"https://data.economie.gouv.fr/explore/dataset/decp-2022-marches-valides/table/?q=202424.02","scraped_at":"2026-06-20T14:32:01Z"}
Use cases
- 🎯 B2G prospection pipeline — feed your CRM with every new contract matching your CPV + département; never miss a public buyer who's actively spending in your category.
- 📊 Win/loss intelligence — pull every contract awarded to a competitor SIRET (
titulaireSiret) to learn which buyers they own and what amounts they win at. - 💼 Account-based marketing — pull every contract awarded by a target buyer SIRET (
acheteurSiret) — see exactly which prestataires they trust and what they spend on each line. - 🏛️ Public-spend dashboards — aggregate
montant_eurpercode_cpv×annee_notification×departementfor sector-level dashboards. - 🌿 ESG / green-procurement intel — filter
marcheInnovant=trueorconsiderationsEnv=trueto track public buyers leading on innovation and environmental clauses. - 🤖 Public-tender bot — combine with BOAMP Scraper (live calls for tender) for full upstream-to-downstream coverage of the French public procurement funnel.
Use the actor via API
Python:
import requestsrun = requests.post("https://api.apify.com/v2/acts/dltik~decp-fr-scraper/run-sync-get-dataset-items",headers={"Authorization":"Bearer YOUR_APIFY_TOKEN","Content-Type":"application/json"},json={"cpv":["72"],"departement":"75","notifiedSince":"today-180","montantMin":100000,"maxResults":200,},).json()print(f"Scraped {len(run)} contracts")
curl:
curl-X POST "https://api.apify.com/v2/acts/dltik~decp-fr-scraper/run-sync-get-dataset-items"\-H"Authorization: Bearer YOUR_APIFY_TOKEN"\-H"Content-Type: application/json"\-d'{"cpv":["45"],"departement":"13","notifiedSince":"2024-01-01","montantMax":1000000,"maxResults":500}'
FAQ
What is DECP exactly?
DECP (Données Essentielles de la Commande Publique) is the legal obligation, since 2018 and reinforced by the Arrêté du 22/12/2022, for every French public buyer to publish the essential data of every awarded contract above €40K (sometimes lower, depending on the buyer category). Data is centralised on data.economie.gouv.fr.
How fresh is the data? DECP has a structural 2–6 month publication lag — public buyers consolidate then publish in batches. For real-time call-for-tenders, combine with BOAMP Scraper. For EU-threshold tenders, see TED Europa scrapers.
Is every French public contract included? Compliance is enforced unevenly — ~85% of communes publish, ~15% of small communes still don't. Large buyers (régions, ministères, CHU) are very well covered.
Why is acheteur_nom_resolved null?
DECP only publishes the buyer SIRET, not the name. Join the SIRET with our Pappers Sirene Scraper or MCP Pappers server to enrich with the buyer's legal name, address, and effectif.
Will I get blocked?
The data.economie.gouv.fr Opendatasoft instance has no anti-bot and no published rate limit. We've never been blocked at moderate volume. Datacenter proxy is the default.
Can I export to CSV? Yes — the Apify dataset UI exports to JSON, CSV, XLSX, RSS and HTML out of the box.
⭐ Found this DECP Scraper useful? Bookmark it — Apify ranks actors by bookmarks, so it's the strongest single signal for Store visibility. One click.
Other scrapers by dltik
| Actor | What it does | Price |
|---|---|---|
| BOAMP Scraper | French national calls for tender (upstream of DECP) | $0.005/tender |
| TED Europa Scraper | EU-threshold public procurement (above DECP) | $0.005/tender |
| Pappers Sirene Scraper | 26M French companies — enrich SIRETs from DECP | $0.001/result |
| Pappers MCP Server | French company data for AI agents (Claude / GPT) | $0.01/tool-call |
| BODACC Scraper | French commercial court announcements | $0.003/record |
| Annuaire Administration FR | French gov agencies & contacts | $0.003/org |
| HATVP Scraper | French elected officials' financial declarations | varies |
| France Travail Scraper | 700K+ FR public job offers | $0.0015/job |
License: MIT · Author: dltik
