# BOAMP France Public Tenders Scraper (`ivladimir/boamp-fr-tenders`) Actor

Scrape BOAMP France public tenders with filters for keywords, departments, market types, notice types, buyer, and open deadlines. Get structured data on titles, buyers, deadlines, CPV codes, and more.

- **URL**: https://apify.com/ivladimir/boamp-fr-tenders.md
- **Developed by:** [Владимир Иваницкий](https://apify.com/ivladimir) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

## BOAMP France Public Tenders Scraper

Extract structured data from BOAMP, the official French public procurement bulletin. Filter tenders by keywords, departments, market types, notice types, buyer name, and publication date. Get clean JSON with titles, buyers, deadlines, CPV codes, and more.

### What data you get

| Field | Type | Description |
|-------|------|-------------|
| id | string | Unique notice ID (e.g., "26-105465") |
| url | string | Link to the notice on BOAMP |
| title | string | Notice title |
| buyer | string | Buyer (acheteur) name |
| noticeType | string | Notice nature (e.g., "Avis de marché") |
| procedure | string | Procedure type (e.g., "Procédure Ouverte") |
| marketTypes | array | Market types (TRAVAUX, SERVICES, FOURNITURES) |
| departments | array | French department codes |
| publishedAt | string | Publication date (YYYY-MM-DD) |
| deadline | string | Response deadline (ISO 8601) |
| cpv | array | CPV codes or descriptions |
| family | string | Notice family (e.g., "Marchés européens") |
| sourceUrl | string | Same as url |
| winners | array or null | Winners (if available) |

### Use cases

- **Market research**: Analyze public procurement trends by sector, region, or buyer.
- **Lead generation**: Find open tenders matching your products or services.
- **Competitive intelligence**: Track competitors' wins and contract awards.
- **Automated monitoring**: Set up scheduled runs to get new tenders daily.
- **Data enrichment**: Integrate tender data into CRM or BI tools.

### How to use

1. Go to the Actor page and click **Try for free**.
2. Configure input filters (keywords, departments, etc.) or leave defaults.
3. Click **Start** to run the Actor.
4. Download results in JSON, CSV, Excel, or connect via API.

### Input example

```json
{
  "keywords": ["nettoyage", "logiciel"],
  "departments": ["75", "69"],
  "marketTypes": ["SERVICES"],
  "noticeTypes": ["APPEL_OFFRE"],
  "buyer": "",
  "publishedSince": "2025-01-01",
  "onlyOpen": true,
  "maxItems": 200
}
```

### Output example

```json
{
  "id": "26-105465",
  "url": "https://www.boamp.fr/pages/avis/?q=idweb:26-105465",
  "title": "Achat titres-restaurant",
  "buyer": "Communauté de communes Sud Alsace Largue",
  "noticeType": "Avis de marché",
  "procedure": "Procédure Ouverte",
  "marketTypes": ["SERVICES"],
  "departments": ["68"],
  "publishedAt": "2026-10-31",
  "deadline": "2026-12-01T10:00:00+00:00",
  "cpv": ["Titres restaurant"],
  "family": "Marchés européens",
  "sourceUrl": "https://www.boamp.fr/pages/avis/?q=idweb:26-105465",
  "winners": null
}
```

### Pricing

This Actor uses **pay-per-result** pricing: **$4 per 1,000 results**. Platform usage costs are included. For example, scraping 500 notices costs **$2**. See the **Pricing** tab for details.

### FAQ

**Is scraping BOAMP legal?**\
Yes, BOAMP is a public database of government tenders. We only scrape publicly available data and respect robots.txt. Always ensure your use complies with local regulations.

**Do I need a proxy?**\
No, BOAMP is accessible without a proxy. The Actor works directly.

**How fresh is the data?**\
Data is fetched in real-time when you run the Actor. Use scheduling to get daily updates.

**Can I filter by multiple departments?**\
Yes, provide an array of department codes (e.g., \["75", "69"]).

**What if I need more than 10,000 results?**\
The maximum per run is 10,000. For larger volumes, run multiple times with different date ranges.

**Are winners always available?**\
Winners are included when published in the notice; otherwise, the field is null.

### Integrations

- **API**: Use the Apify API to trigger runs and fetch results programmatically.
- **Webhooks**: Get notified when a run finishes or fails.
- **Google Sheets**: Export directly to Google Sheets via Apify integration.
- **Make/Zapier**: Connect to 1000+ apps for automated workflows.
- **Scheduling**: Set up recurring runs (e.g., daily) to monitor new tenders.

### 🇺🇦 Коротко українською

Цей Actor збирає дані про французькі публічні тендери з BOAMP. Ви можете фільтрувати за ключовими словами, департаментами, типами ринків та іншими параметрами. Отримуйте структуровані дані у JSON, CSV або Excel. Ціна — $4 за 1000 результатів, включаючи витрати платформи. Ідеально для моніторингу тендерів та аналізу ринку.

# Actor input Schema

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

Full-text search in notice (any match), e.g. 'nettoyage', 'logiciel'.

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

French department codes, e.g. 75, 69, 13.

## `marketTypes` (type: `array`):

TRAVAUX, SERVICES, FOURNITURES.

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

e.g. APPEL_OFFRE, RESULTAT, RECTIFICATIF. Empty = all.

## `buyer` (type: `string`):

Optional buyer (acheteur) name filter.

## `publishedSince` (type: `string`):

YYYY-MM-DD. Default: last 7 days.

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

Only notices whose response deadline is after now.

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

Max results.

## Actor input object example

```json
{
  "keywords": [],
  "departments": [],
  "marketTypes": [],
  "noticeTypes": [
    "APPEL_OFFRE"
  ],
  "onlyOpen": true,
  "maxItems": 200
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped items in the default dataset

# 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("ivladimir/boamp-fr-tenders").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("ivladimir/boamp-fr-tenders").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 ivladimir/boamp-fr-tenders --silent --output-dataset

```

## MCP server setup

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

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/YQZCtAbrujtk8UhNQ/builds/ifynSAVlxhAvnEC5e/openapi.json
