Automating French Public Tender Monitoring (BOAMP) with n8n and AI
By Clément Lacaille (Tech-Bharat) · Published 5 September 2026 · 6 min read · how we build and test
Complete FlowKit Bundle — €269
12 ready-to-import n8n workflows, setup guide in French, 14-day guarantee
A construction site manager, a consultant, or an SME that bids on public contracts commonly spends several hours a week combing through France's official public procurement bulletin (BOAMP): opening the list of published notices, reading each one's subject, discarding whatever doesn't match their sector or geographic area, before finding the handful of tenders actually worth bidding on. The volume makes this tedious — tens of thousands of notices are published every year — and the cost isn't just wasted time: it's also the good tender missed because nobody had time to read it before the deadline. BOAMP exposes a free public API, maintained by the DILA (France's official legal information directorate), which makes this monitoring fully automatable in n8n.
Why automate instead of still reading by hand
Filtering tender notices by keyword is nothing new: it's essentially the method Jolien Grandia and Peter Kruyen validated at scale in their study Assessing the implementation of sustainable public procurement using quantitative text-analysis tools: A large-scale analysis of Belgian public procurement notices (Journal of Purchasing and Supply Management, 2020 — see the study). The authors apply automated text analysis to more than 140,000 notices from the Belgian public procurement portal to extract trends that no manual reading could have surfaced at that scale. The idea transposed here is more modest — filtering, not producing a research paper — but the underlying point holds: past a certain volume, tender notice text lends itself very well to automated processing, provided you define clear criteria.
The architecture: from the BOAMP API to a filtered digest
Schedule Trigger (daily, early morning)
│
▼
HTTP Request → BOAMP API (keywords, CPV, department, date)
│
▼
Remove Duplicates (key = notice identifier, memory across runs)
│
▼
AI Agent: Go/No-Go score against the company profile
│
├─► High score → immediate Slack/email with a link to the notice
└─► All notices → Supabase (history, justification, status)
Querying the BOAMP API
A daily Schedule Trigger fires an HTTP Request node against the BOAMP API, hosted on the DILA's Opendatasoft platform (dataset boamp). The data explorer exposes an "API" tab that generates the exact URL and where parameter matching the filters you click through in the interface — the most reliable way to build your query without guessing at exact field names, which can change over time. In practice, a monitoring query typically combines:
- a full-text filter on the tender's subject and summary (your industry keywords);
- one or more CPV codes (Common Procurement Vocabulary), the European nomenclature that categorizes each tender by the nature of the work — far more reliable than a keyword for targeting a specific sector;
- a geographic filter (department or region) if you only bid within a defined catchment area;
- a publication-date window limited to the last 24-48 hours, so you only pull notices that are genuinely new.
Never alert twice for the same notice
BOAMP regularly re-publishes the same notice within the results window as long as its closing date hasn't passed, which would produce duplicates on every daily run. The Remove Duplicates node, using the "Remove Items Processed in Previous Executions" operation with the notice's unique identifier as the key and "Value Is New" mode, solves this without code: n8n remembers identifiers already seen across executions, and only genuinely new notices move on to the next step.
Go/No-Go scoring with AI
Once duplicate noise is eliminated, there's usually still too large a volume of notices for systematic manual reading — this is where AI adds the most value, provided it's constrained to a structured judgment rather than a vague summary. An AI Agent node or a simple LLM chain receives two things: the notice's full subject (nature of the work, estimated amount, place of performance, submission deadline) and a company profile you define once in the system prompt — industry, target contract size, covered geographic area, and disqualifying keywords to exclude. A Structured Output Parser forces a response into a usable shape:
{
"notice_id": "24-123456",
"decision": "go",
"relevance_score": 8,
"justification": "Web development work, amount in range, department covered",
"submission_deadline": "2026-09-22"
}
This structure lets you automatically route high scores to an immediate alert, while still keeping low scores for after-the-fact review rather than letting them silently disappear — a model that wrongly discards a tender, with no trace left behind, can never be corrected.
A digest, not a stream of notifications
Rather than sending an alert for every relevant notice detected throughout the day, a single grouped daily digest — sent once the day's processing is done — avoids the fatigue of a Slack channel that pings all day long. The multi-source digest pattern already documented on this blog applies here almost as-is: a Code node groups the day's "go" notices, sorted by descending score, into a single message with, for each one, the title, estimated amount, deadline, and a direct link to the full notice on BOAMP. "No-go" and ambiguous notices stay available in the Supabase table for anyone who wants to check that nothing important was wrongly discarded.
Archiving to turn monitoring into a dashboard
Every processed notice, whether kept or not, deserves a row in a Supabase tenders table (identifier, subject, CPV code, amount, AI decision, score, closing date, response status). This history serves two distinct purposes: first, recalibrating the scoring prompt by comparing its past decisions against tenders actually won or rightly ignored; second, providing the foundation for a standard sales-pipeline view — how many notices seen, how many responded to, how many won. Once a contract is won, its delivery deadline and any renewal clauses naturally fall into the same kind of tracking detailed in our contract deadline tracking guide with n8n, instead of starting over in a separate spreadsheet.
Common pitfalls
- Keywords that are too broad. "IT" or "construction" alone will pull in hundreds of out-of-scope notices every day; always combine a keyword with a CPV code to narrow the filter before the AI step, so it processes a reasonable volume instead of compensating for an overly permissive filter.
- A scoring prompt with no concrete examples. Without two or three annotated examples of "go" and "no-go" notices specific to your business in the system message, the model applies generic criteria that don't reflect your real acceptance thresholds (team size, required references, minimum profitable amount).
- Ignoring the submission deadline when sorting the digest. A relevant notice closing in two days should surface above a one-month-out notice regardless of its relevance score — add that criterion to the sort, not just the AI score.
- Never revisiting the filter after a few weeks. Relevant CPV codes and areas shift as your business evolves; periodically review archived "no-go" notices to make sure no winnable tender is sitting there unnoticed.
Going further
This automated monitoring pairs naturally with the Compliance & Audit Pack (€149): the same timestamped audit-trail logic in Supabase, used here to trace every processed notice, also documents the bid file once you've committed to a tender. If your exchanges with public buyers then arrive by email (requests for additional documents, award notifications), the Inbox AI Pack (€79) takes over to sort and prioritize them automatically. Both packs, combined in the Complete FlowKit Bundle (€269 instead of €347 bought separately), cover the full chain from spotting a tender to tracking its execution.
FAQ
Frequently asked questions
Is the BOAMP API paid?
No. France's official public procurement bulletin API is published for free by the DILA under an open license, with no key and no blocking quota for normal monitoring use. No paid credential is needed for the HTTP Request node in this workflow.
Can the AI decide on its own that a tender isn't relevant and discard it permanently?
That isn't recommended. The model should produce a score and a justification, not a silent deletion: always archive discarded notices in Supabase with their justification, so you can correct the prompt if a relevant tender gets misclassified, and refine your criteria over the following weeks.
How do you avoid getting the same tender notice several days in a row?
The BOAMP API returns recently published notices, including ones already seen the day before as long as their closing date hasn't passed. The Remove Duplicates node in 'Remove Items Processed in Previous Executions' mode, keyed on the notice's identifier, filters out anything already alerted without having to manage that memory by hand.
Does this monitoring also cover EU-wide tenders (TED/OJEU), or only French ones?
This guide focuses on BOAMP, which covers the bulk of French public tenders both below and above EU thresholds. Notices published in the Official Journal of the EU (TED) follow a similar search logic on their own API; the same n8n pipeline adapts by simply swapping the HTTP Request node and the field mapping.