# French Architecture Competitions (BOAMP) (`radaxx_exe/boamp-concours-architecture`) Actor

Weekly watch of French architecture competitions and maîtrise d'œuvre tenders from the official BOAMP open data, with structured fields extracted from the notice text: prime, works budget, rendering level (ESQ+, APS), teams admitted, surface, required team competences.

- **URL**: https://apify.com/radaxx_exe/boamp-concours-architecture.md
- **Developed by:** [Alexis PARABOSCHI](https://apify.com/radaxx_exe) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 avis de concours ou de marché

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## French Architecture Competitions (BOAMP) — Concours de maîtrise d'œuvre

Find every **architecture competition** (*concours de maîtrise d'œuvre*) and **maîtrise d'œuvre tender** published in France, with the facts an architecture firm needs to decide whether to apply — already extracted from the notice text:

| Field | Example | Where it comes from |
|---|---|---|
| `primeAmount` + `primeTax` | 92 000 TTC | prime paid to each team admitted to the competition |
| `worksBudgetAmount` + `worksBudgetTax` | 4 200 000 HT | *enveloppe prévisionnelle affectée aux travaux* |
| `renderingLevel` | `ESQ+` | level of the design to submit: ESQ, ESQ+, APS, or none |
| `teamsAdmitted` | 3 | number of teams invited to compete |
| `surfaceM2` | 1 860 | built surface of the programme |
| `competences` | Architecte, Structure, Fluides / thermique, Économiste, VRD… | team composition required |
| `missionElements` | APS, APD, PRO, ACT, VISA, EXE, DET, AOR, OPC, SSI | mission elements (loi MOP) |
| `deadline` | 2025-09-15 15:00 | application deadline, as written in the notice |
| `domain` | `bâtiment` | bâtiment, espaces publics, infrastructure or non classé — pure infrastructure tenders (roads, networks, water) are left out by default |

Every extracted value comes with **`evidence`**: the sentence it was read from, so you can check it in one glance.

Generic BOAMP scrapers return the raw notice. This Actor reads it for you.

### Who is it for

- **Architecture firms** that answer competitions and want a weekly shortlist by region, filtered by prime or works budget.
- **Engineering firms** (BET structure, fluides, économistes, paysagistes) looking for teams to join.
- **Software and data products for architects** that need clean, structured competition data via API or MCP.

### How to use it

1. Choose how many days to scan (default: the last 7 days).
2. Optionally filter by region, département, keywords, minimum prime or minimum works budget.
3. Run. Results are sorted by deadline.

Each run also saves a **ready-to-read Markdown digest grouped by region** in the key-value store under the key `DIGEST` — paste it into an e-mail or a newsletter.

#### Example input

```json
{
  "daysBack": 7,
  "noticeTypes": ["concours"],
  "regions": ["Nouvelle-Aquitaine", "Occitanie"],
  "minPrime": 20000
}
```

#### Example output (abridged)

```json
{
  "idweb": "25-79438",
  "url": "https://www.boamp.fr/pages/avis/?q=idweb:25-79438",
  "noticeType": "concours",
  "title": "Concours restreint de maîtrise d'oeuvre sur esquisse plus pour la construction d'un centre technique…",
  "buyer": "CA LAMBALLE TERRE ET MER",
  "departments": ["22"],
  "regions": ["Bretagne"],
  "cpv": ["71240000"],
  "deadlineDate": "2025-09-15",
  "primeAmount": 30000,
  "primeTax": "HT",
  "worksBudgetAmount": 4200000,
  "worksBudgetTax": "HT",
  "renderingLevel": "ESQ+",
  "teamsAdmitted": 3,
  "surfaceM2": 1860,
  "competences": ["Architecte", "Économiste", "Structure", "Fluides / thermique", "Électricité", "VRD", "Acoustique", "Environnement / énergie", "OPC"],
  "missionElements": ["ESQ", "APS", "APD", "PRO", "ACT", "VISA", "EXE", "DET", "AOR", "OPC", "SSI"],
  "evidence": {
    "prime": "…recevra une prime d'un montant de 30 000,00 euros HT…",
    "worksBudget": "…La part de l'enveloppe prévisionnelle affectée aux travaux est de 4 200 000 euros HT…"
  }
}
```

### Map of the week (PNG)

Each run also saves a static map of the returned competitions as `MAP` in the key-value store (Output tab → "Map of the competitions"). One numbered point per competition — the numbers match the `n°` in the `DIGEST` — sized by prime, in a warm colour when the deadline falls before Sunday. Overseas competitions are listed in an inset. Communes come from the notice's place of performance and are geocoded with the IGN Géoplateforme; when no commune is given, the point sits at the centre of the département (`locationPrecision` in each item tells which). A second image, `MAP_LIST`, adds the numbered list of projects on the left (short title, place, prime or works budget, deadline) so it can be shared on its own, e.g. on LinkedIn. Set `mapBranding` to put your newsletter name above the title, `mapFooter` to customise the footer, or `generateMap: false` to skip it. Each item also carries `city`, `postalCode`, `longitude` and `latitude`, ready for your own interactive map.

### Use it from an AI agent (MCP)

Add `https://mcp.apify.com?tools=<your-username>/boamp-concours-architecture` to Claude, Cursor or any MCP client: your agent can then ask *"which architecture competitions close in Bretagne this month, with a prime above 20 k€?"*.

### Pricing

Pay per result: you are charged for each notice returned, nothing for notices scanned and filtered out. Set **Maximum results** or a maximum cost per run to cap spending.

### How it works and limits

- **Source**: official BOAMP open data published by the DILA (Licence Ouverte / Open Licence 2.0), queried live. No scraping, no login.
- **Selection**: notices with an architecture CPV code (712xxxxx) or a *maîtrise d'œuvre* / architecture title. Works contracts and award notices are left out.
- **Extraction** relies on the wording buyers use. When a value is not written in the notice, the field is `null` rather than guessed. Always check the official notice before applying.
- **Deadlines** are shown as written in the notice (the BOAMP time zone field is not reliable).
- **No personal data**: buyers are organisations; e-mail addresses and phone numbers are removed from all text.

*Source : DILA, BOAMP. Independent tool, not affiliated with the DILA.*

***

#### En français

Veille automatique des **concours d'architecture** et **marchés de maîtrise d'œuvre** du BOAMP : prime, enveloppe travaux, niveau de rendu (ESQ, ESQ+, APS), nombre d'équipes admises, surface, compétences exigées, éléments de mission et date limite, avec la phrase source de chaque information. Un récapitulatif hebdomadaire par région est généré à chaque exécution (clé `DIGEST`).

# Actor input Schema

## `daysBack` (type: `integer`):

Number of publication days to scan, today included (Paris time). 7 = the last week. Ignored when 'Published from' is set.

## `dateFrom` (type: `string`):

First publication day (YYYY-MM-DD). Leave empty to use 'Days to scan'.

## `dateTo` (type: `string`):

Last publication day, included (YYYY-MM-DD). Defaults to today.

## `noticeTypes` (type: `array`):

'concours' = design competitions (concours de maîtrise d'œuvre). 'moe' = other maîtrise d'œuvre / architecture tenders (MAPA, procédure adaptée…).

## `regions` (type: `array`):

Keep notices located in these French regions. Empty = all of France.

## `domains` (type: `array`):

For maîtrise d’œuvre tenders other than competitions: keep these domains. Default keeps buildings, public spaces and unclassified notices, and drops pure infrastructure (roads, networks, water). Competitions are always kept.

## `departments` (type: `array`):

Keep notices in these départements (e.g. 33, 75, 2A, 974). Empty = no filter.

## `keywords` (type: `array`):

Keep notices whose title contains any of these words (accent- and case-insensitive), e.g. collège, groupe scolaire, réhabilitation.

## `minPrime` (type: `integer`):

Keep competitions paying at least this prime per team. Notices where no prime was found are excluded when this is set.

## `minWorksBudget` (type: `integer`):

Keep notices whose works budget (enveloppe travaux) is at least this amount. Notices without a budget are excluded when this is set.

## `onlyOpen` (type: `boolean`):

Drop notices whose application deadline has passed.

## `includeCorrections` (type: `boolean`):

Also return correction notices about architecture tenders.

## `maxItems` (type: `integer`):

Upper bound on the number of notices returned (and charged).

## `generateMap` (type: `boolean`):

Saves a static map of the returned competitions as MAP in the key-value store: one numbered point per competition (numbers match the DIGEST), size by prime, warm colour when the deadline is this week. Communes are geocoded with the IGN Géoplateforme; département centre as fallback.

## `mapBranding` (type: `string`):

Optional line shown above the map title (e.g. your newsletter name).

## `mapFooter` (type: `string`):

Footer text of the map. Keep the BOAMP source mention.

## `debugRawSample` (type: `boolean`):

Saves the raw BOAMP records of matching notices as RAW_SAMPLE in the key-value store, to tune the extractor. Leave off in normal use.

## Actor input object example

```json
{
  "daysBack": 7,
  "noticeTypes": [
    "concours",
    "moe"
  ],
  "domains": [
    "bâtiment",
    "espaces publics",
    "non classé"
  ],
  "onlyOpen": true,
  "includeCorrections": true,
  "maxItems": 500,
  "generateMap": true,
  "mapFooter": "Source : BOAMP (DILA), Licence Ouverte 2.0",
  "debugRawSample": false
}
```

# Actor output Schema

## `notices` (type: `string`):

One item per BOAMP notice with prime, works budget, rendering level, teams admitted, surface, competences, mission elements, deadline and evidence sentences.

## `digest` (type: `string`):

Ready-to-read Markdown summary of the returned notices, grouped by region and sorted by deadline.

## `summary` (type: `string`):

Date range scanned, number of notices scanned and returned, data source.

## `map` (type: `string`):

Static map of the returned competitions, numbered as in the digest. Absent when no competition is returned or the map is disabled.

## `mapList` (type: `string`):

The same map with the numbered list of projects (place, prime or works budget, deadline) on the left: readable on its own, for social posts.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("radaxx_exe/boamp-concours-architecture").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("radaxx_exe/boamp-concours-architecture").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call radaxx_exe/boamp-concours-architecture --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,radaxx_exe/boamp-concours-architecture"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/NbvgiixwK8vlVevrJ/builds/9boXnxbuKj44ewvUs/openapi.json
