French Public Tender Monitor - BOAMP Alerts
Pricing
from $1.60 / 1,000 baseline notices
French Public Tender Monitor - BOAMP Alerts
Soyez alerté dès qu'un nouveau marché public français correspondant à votre activité est publié au BOAMP. Filtrez par mots-clés, départements et type de marché ; uniquement les avis jamais vus. API officielle, données organisationnelles, sans contacts personnels.
Pricing
from $1.60 / 1,000 baseline notices
Rating
0.0
(0)
Developer
Lowland Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
French Public Tender Monitor — BOAMP Alerts
Watches BOAMP (Bulletin officiel des annonces des marchés publics — France's official public-procurement bulletin) for new tender notices matching your profile: French keywords, departments, market type. It alerts the moment a matching notice is published, and it remembers what it has already told you — so an alert always means a genuinely new tender, never a re-scrape of yesterday's list.
It reads BOAMP's official open-data API (the reuse channel France publishes for exactly this), and the output is GDPR-clean by construction: buyer organization, subject, deadline, department — never the notice's contact persons. Safe to store, share with your bid team, or import into a CRM.
This is the French national leg of public procurement — the below-EU-threshold tenders that don't appear on TED. Its EU-wide sibling, the EU Tender Monitor, watches TED. Run both for full French + European coverage.
Quick start (30 seconds, no account keys needed)
- Run the actor with the prefilled input (keyword "informatique", last 3 days) — it finishes in a few seconds and shows a baseline of recent notices.
- Replace the demo profile with your own: your French keywords, the departments you serve, your market type.
- Add a daily schedule (Actor page → Schedule). From then on, runs are quiet until a matching tender is actually published.
Who uses this
- A regional IT services company monitors ,keywords: ["informatique", "logiciel"]
departments: ["69", "01", "38"](its region) daily — every new public IT tender near it lands with thedeadlineand theboamp.frlink the day it publishes. - A construction SME watches
marketTypes: ["travaux"]in its departments — only public works it can actually bid on. - A supplier runs
keywordsfor its product category nationwide to find every public buyer newly in the market. - A bid consultancy monitors several client profiles on one schedule, each a separate keyword/department set.
- A market analyst tracks tender volumes per department and market type as a public-spending indicator — the baseline plus daily deltas is a clean series.
What you get
One JSON item per event: a baseline snapshot per notice on the first run, then only new matching notices. A new-tender alert looks like:
{"noticeId": "26-71206","objet": "Marché d'acquisition et de livraison de véhicules pour la commune","buyerName": "Commune de Saint-Benoît","publishedDate": "2026-07-19","deadline": "2026-08-18","departments": ["974"],"descriptors": ["Véhicules (acquisition)"],"descriptorCodes": ["475"],"marketType": "Fournitures","family": "Marchés européens","noticeType": "Avis de marché","url": "https://www.boamp.fr/pages/avis/?q=idweb:26-71206","isBaseline": false,"isUpdate": false}
Field honesty notes:
- Everything is in French —
objetand descriptors are as BOAMP publishes them. Keyword matching runs on the French subject; use French terms. deadlineis the response deadline where the notice carries one (contract notices); award notices carry none.noticeTypedistinguishes a contract notice (Avis de marché) from an award (Avis d'attribution) and other natures — filter downstream if you only want one.winnerNameappears on award notices — the winning organization, no contact data.- Corrections (
rectificatifs) publish on BOAMP as their own new notice, so they arrive as a new alert rather than a modification of the original.
How much does tender monitoring cost?
Pay per outcome — checking costs nothing; you pay when the monitor tells you something new:
- New matching notice (the alert): $0.02.
- Baseline item (first run only): $0.002.
- Actor start: $0.005. Everything included - no separate platform-usage charges, and higher Apify plans get automatic unit-price discounts.
Cost feel: a focused profile (a keyword or two, a few departments) sees a handful of new notices per working day → roughly $2–8/month for complete coverage, with the one-time baseline (say 100 notices) costing about $0.20. A run with zero new matches costs $0.005 all-in. Dedicated tender-alert services charge €30–200/month.
Why an alert costs more than a scraped row
The store's headline ("from $2.00 / 1,000 baseline results") is what a trial costs: a 100-notice baseline ≈ $0.20. Apify displays every event per 1,000, so the alert reads "$20.00 / 1,000" next to raw scrapers at $1–3 per 1,000 rows — but that is a different thing:
- A raw scraper sells rows: to monitor with rows you re-download the BOAMP feed every day and diff it yourself.
- This monitor sells the transition: it remembers state in your account and charges $0.02 exactly when a notice you have not seen matches your profile.
Not technical? Let your AI assistant set it up
Paste this prompt with a line about your business (in French or English):
Set up the Apify actor lowlanddata/france-public-tender-monitor to watch Frenchpublic tenders for me. Build the input JSON from my business description:- keywords: 3-8 FRENCH words a tender subject would contain (e.g. ["informatique","logiciel"] for IT; BOAMP is a French bulletin so French terms match)- departments: French department codes I serve (e.g. ["75","69","974"])- marketTypes: ["services"], ["travaux"] (works) or ["fournitures"] (supplies) ifrelevantLeave alertOn, emitBaseline and maxItems at their defaults. Run it once and showme the baseline as a table (objet, buyer, department, deadline, url). Then createa daily schedule and set up a notification so I get an email when a run producesitems.
Coverage — measured, not promised
- Source: BOAMP's official opendatasoft open-data API, keyless. Covers French public-procurement notices — over 1,000 published per working day.
- French national scope by design — the below-EU-threshold tenders TED does not carry. For EU-wide above-threshold tenders, run the EU Tender Monitor alongside.
- French only. BOAMP publishes in French; keyword matching is on the French
objet. This monitor does not translate — that is stated, not hidden. - Server-side filters (date window, departments, market types, keyword search) run in the API query.
- A profile broader than several thousand notices per run is truncated honestly (the run status says so) — narrow it.
How the monitor thinks
- First run = baseline. It fetches your profile's matches from the last
lookbackDays(default 7), pushes them flaggedisBaseline: trueat the low baseline price, and memorizes them.emitBaseline: falseseeds silently. - After that, only new notices. Each run continues from the previous run (one day of overlap; the memory absorbs duplicates) and pushes only notices it has never alerted.
- Editing the profile starts a fresh baseline — matching-relevant inputs are the profile's identity, so a changed profile can never flood you with alerts computed against another profile's memory.
- Memory lives in a named key-value store (
stateStoreName, defaultfrance-tender-monitor-state) in your account. Run several profiles on separate schedules against the same store — they never interfere.resetState: truewipes the current profile's memory. - Re-running after a crash or overlap re-alerts at most the last few unsaved items — state is checkpointed during the run.
Input reference
| Field | Type | Default | Notes |
|---|---|---|---|
keywords | array | [] | French terms, matched on the notice subject. OR within. |
departments | array | [] | French department codes (75, 69, 974, 2A). |
marketTypes | array | [] | fournitures, services, travaux. |
lookbackDays | integer | 7 | Baseline reach on the first run (max 30). |
alertOn | string | "new" | "new-and-updated" adds état-change alerts. |
emitBaseline | boolean | true | false = silent seeding. |
resetState | boolean | false | One-shot: wipe this profile's memory. |
maxItems | integer | 500 | Overflow alerts on the next run, never lost. |
stateStoreName | string | "france-tender-monitor-state" | Only change to fully isolate instances. |
* At least one of keywords, departments or marketTypes is required.
Scheduling and API use
Run it daily and pair the schedule with a Monitoring alert on "dataset items > 0" to get an email exactly when a tender matched.
curl -X POST \"https://api.apify.com/v2/acts/lowlanddata~france-public-tender-monitor/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"keywords": ["informatique"], "departments": ["75"]}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('lowlanddata/france-public-tender-monitor').call({keywords: ['informatique', 'logiciel'],departments: ['69', '01'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items); // only new notices since the last run
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("lowlanddata/france-public-tender-monitor").call(run_input={"keywords": ["travaux"],"marketTypes": ["travaux"],})items = client.dataset(run["defaultDatasetId"]).list_items().items
Daily runs finish in well under a minute, comfortably inside the 300s sync-call wall.
Use it with AI agents (MCP)
Claude, Cursor and other MCP-capable agents can run this monitor as a tool through Apify's hosted MCP server: the agent builds the profile from a plain-language brief, runs it, and reads the notices back — no glue code.
Claude Code:
$claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/france-public-tender-monitor"
Cursor or Claude Desktop (add a custom connector / MCP server with this URL):
https://mcp.apify.com?actors=lowlanddata/france-public-tender-monitor
Sign in with your Apify account when prompted — runs are billed to it. Setup details per client: Apify MCP docs, or start from this actor's own MCP page: apify.com/lowlanddata/france-public-tender-monitor/api/mcp.
Prompts that work once connected:
- "Surveille les marchés publics informatiques dans le Rhône et montre-moi ceux d'aujourd'hui."
- "Watch French public works tenders in Paris and alert me daily."
- "Quels marchés de services ont été publiés cette semaine en Île-de-France ?"
Is it legal to monitor French public tenders?
Yes — French public-procurement notices are published for exactly this purpose, and BOAMP provides an official open-data API for their reuse. No login walls, no anti-bot bypass — if the API is unreachable, the run reports it rather than fighting it. And the output is safe by construction: contact persons are never requested from the API (see below).
Source: BOAMP / DILA, reused under France's open-data licence.
Compliance: safe to store, safe to CRM-import
BOAMP notices do contain personal data — the buyer's contact person, with a name,
email and phone, inside the notice's detailed data blob. This actor's guarantee is
structural: it requests only the organization-level fields from the API (subject,
buyer name, department, dates, descriptors, winner organization) and never
fetches the contact blob at all — the personal data never crosses the wire. An
automated test proves that even a response carrying such a blob cannot reach the
output. One honest limit: objet is text the buyer wrote — on rare occasions a
name appears in free text. Everything structured is guaranteed clean.
FAQ
Why did my second run return nothing? Because nothing new matched — that is the product working. The first run is the baseline; afterwards you only pay for notices you have not seen.
Does the output contain the buyer's contact person? No — by design. The API request never asks for the contact fields. You get the buying organization and the official notice link; contacts are on the notice itself if you need them for a bid.
Why French keywords? BOAMP is a French national bulletin — the notice subject is in French, so French keywords match. For English/multilingual EU-wide tenders, use the EU Tender Monitor (TED).
How is this different from the EU Tender Monitor? BOAMP covers French national tenders (including below the EU thresholds); TED covers EU-wide above-threshold tenders. Run both for complete coverage.
What about a correction to a tender? French corrections publish as their own new BOAMP notice, so you get them as a new alert with the same subject.
Troubleshooting
- "The profile matches all of BOAMP" — add at least one of
keywords,departmentsormarketTypes. - "Coverage truncated by the per-run request budget" — the window matched more
than several thousand notices; narrow the profile or lower
lookbackDays. - "Monitor state record … is not readable" — the state was written by a newer
version; run once with
resetState: trueto start a fresh baseline.
Something else off? Open an issue on the actor's Issues tab — reports are read and answered.