# French Public Procurement — BOAMP Tender Scraper (`studio-amba/boamp-scraper`) Actor

Search and extract French public procurement tenders from BOAMP (Bulletin Officiel des Annonces des Marches Publics). Filter by keyword, department, notice type, or date range. Returns tender details, buyer, deadline, awarded contractor, and full notice data. No cookies, no login.

- **URL**: https://apify.com/studio-amba/boamp-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## French Public Procurement Scraper — BOAMP Tenders

Search and extract French public procurement tenders from BOAMP (Bulletin Officiel des Annonces des Marches Publics). Filter by keyword, department, notice type, market type, or date range. Returns tender details, buyer, deadline, awarded contractor, and classification codes. No cookies, no login required.

### How to scrape BOAMP data

This actor queries the official BOAMP open data API to deliver structured French procurement data. BOAMP is France's mandatory publication bulletin for public procurement — covering all government contracts from central ministries to local communes. The database contains over 1.67 million notices, updated twice daily.

#### Search by Keyword

Search in French for best results — "informatique", "construction", "nettoyage", "conseil", "fournitures". The API searches across tender titles and descriptions.

#### Filter by Department or Market Type

Narrow to a specific French department (75 for Paris, 13 for Marseille area) or market type (works, supplies, services). Combine with date range for precise monitoring.

#### Track Awards

Set notice type to "attribution" to see who won recent contracts — essential for competitive intelligence and bid/no-bid decisions.

### What data does French Public Procurement Scraper extract?

| Field | Type | Description |
|-------|------|-------------|
| **title** | String | Tender subject/object |
| **buyer** | String | Contracting authority name |
| **description** | String | Full tender description |
| **noticeType** | String | Call for tenders, award, or correction |
| **marketType** | String | Works, supplies, or services |
| **publicationDate** | String | Publication date |
| **bidDeadline** | String | Response deadline |
| **department** | String | Department code(s) |
| **referenceNumber** | String | BOAMP reference number |
| **classificationCodes** | Array | CPV classification codes |
| **awardedContractor** | String | Winner name (on award notices) |
| **awardAmount** | Number | Contract value (on award notices) |
| **url** | String | Direct link to BOAMP notice |
| **scrapedAt** | String | ISO timestamp |

### Example output

```json
{
    "title": "Marche de prestations informatiques",
    "buyer": "Ville de Paris",
    "description": "Accord-cadre pour des prestations de developpement logiciel",
    "noticeType": "appel",
    "marketType": "services",
    "publicationDate": "2026-05-18",
    "bidDeadline": "2026-06-30",
    "department": "75",
    "referenceNumber": "26-12345",
    "classificationCodes": ["72000000"],
    "awardedContractor": "",
    "awardAmount": null,
    "currency": "EUR",
    "sourceUrl": "https://www.boamp.fr/avis/detail/26-12345",
    "url": "https://www.boamp.fr/avis/detail/26-12345",
    "scrapedAt": "2026-05-20T14:30:00.000Z"
}
````

### Tips for best results

- **Award tracking**: Filter by "attribution" notice type to monitor who wins contracts in your sector. Build a competitive intelligence database.
- **Regional focus**: Use department codes to focus on your region. 75 = Paris, 69 = Lyon, 13 = Marseille, 33 = Bordeaux.
- **Scheduled monitoring**: Run daily to catch new opportunities within hours.

### How much does it cost?

| Search size | Estimated time | Estimated cost |
|-------------|---------------|----------------|
| 20 notices | ~3 seconds | ~$0.002 |
| 100 notices | ~10 seconds | ~$0.008 |
| 1,000 notices | ~2 minutes | ~$0.06 |

### Can I use it as an API?

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/boamp-scraper").call(run_input={
    "searchQuery": "informatique",
    "department": "75",
    "maxResults": 50,
})

for tender in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{tender['title']} | {tender['buyer']} | Deadline: {tender['bidDeadline']}")
```

### Limitations

- OpenDataSoft API caps offset pagination at 10,000 results — use date-range windowing for bulk extraction
- Some fields (donnees, gestion) contain nested JSON that varies by notice type
- Updated twice daily — may not reflect the most recent hours

### Other European procurement scrapers

- **[Dutch Procurement (TenderNed)](https://apify.com/studio-amba/tenderned-scraper)** — Dutch public tenders
- **[BODACC Scraper](https://apify.com/studio-amba/bodacc-scraper)** — French insolvency and company announcements

### Your feedback

Found a bug or want a feature? Open an issue on the [Issues tab](https://console.apify.com/actors/studio-amba~boamp-scraper/issues).

# Actor input Schema

## `searchQuery` (type: `string`):

Search tenders by keyword. Example: 'informatique', 'construction', 'nettoyage'.

## `department` (type: `string`):

Filter by department code. Example: '75' for Paris, '13' for Bouches-du-Rhone.

## `noticeType` (type: `string`):

Filter by notice type.

## `marketType` (type: `string`):

Filter by market type.

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

Only notices published on or after this date. Format: YYYY-MM-DD.

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

Only notices published on or before this date. Format: YYYY-MM-DD.

## `maxResults` (type: `integer`):

Maximum number of notices to return.

## `proxyConfiguration` (type: `object`):

Apify proxy configuration.

## Actor input object example

```json
{
  "searchQuery": "informatique",
  "noticeType": "all",
  "marketType": "all",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "informatique",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/boamp-scraper").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 = {
    "searchQuery": "informatique",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/boamp-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchQuery": "informatique",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/boamp-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/boamp-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "French Public Procurement — BOAMP Tender Scraper",
        "description": "Search and extract French public procurement tenders from BOAMP (Bulletin Officiel des Annonces des Marches Publics). Filter by keyword, department, notice type, or date range. Returns tender details, buyer, deadline, awarded contractor, and full notice data. No cookies, no login.",
        "version": "0.0",
        "x-build-id": "v1bZIoIdbqs4ZaBaM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~boamp-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-boamp-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/studio-amba~boamp-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-boamp-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/studio-amba~boamp-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-boamp-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Search tenders by keyword. Example: 'informatique', 'construction', 'nettoyage'."
                    },
                    "department": {
                        "title": "Department",
                        "type": "string",
                        "description": "Filter by department code. Example: '75' for Paris, '13' for Bouches-du-Rhone."
                    },
                    "noticeType": {
                        "title": "Notice Type",
                        "enum": [
                            "all",
                            "appel",
                            "attribution",
                            "rectificatif"
                        ],
                        "type": "string",
                        "description": "Filter by notice type.",
                        "default": "all"
                    },
                    "marketType": {
                        "title": "Market Type",
                        "enum": [
                            "all",
                            "travaux",
                            "fournitures",
                            "services"
                        ],
                        "type": "string",
                        "description": "Filter by market type.",
                        "default": "all"
                    },
                    "dateFrom": {
                        "title": "Published After",
                        "type": "string",
                        "description": "Only notices published on or after this date. Format: YYYY-MM-DD."
                    },
                    "dateTo": {
                        "title": "Published Before",
                        "type": "string",
                        "description": "Only notices published on or before this date. Format: YYYY-MM-DD."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of notices to return.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy configuration."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
