# Belgian Public Procurement Scraper (`studio-amba/belgian-procurement-scraper`) Actor

Scrape Belgian public procurement tenders from e-Notification (enot.publicprocurement.be). Extract tender titles, deadlines, buyers, CPV codes, estimated values, and procedure types. No login required.

- **URL**: https://apify.com/studio-amba/belgian-procurement-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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

## Belgian Public Procurement Scraper

Scrape Belgian public procurement tenders from official government sources. Extract tender titles, reference numbers, buyers, deadlines, CPV codes, estimated values, and procedure types.

This actor collects data from TED (Tenders Electronic Daily) filtered for Belgium, and the Belgian e-Notification platform (enot.publicprocurement.be). No login or cookies required — all data is publicly available.

### How to scrape Belgian public procurement data

1. Go to [this actor's page](https://apify.com/store) on the Apify Store.
2. Click "Start" to open the input configuration.
3. Enter a search keyword (e.g., "IT services", "construction", "informatique").
4. Set how many days back to search and the maximum number of results.
5. Click "Start" and wait for the scraper to finish.
6. Download your data in JSON, CSV, XML, or Excel format.

### Data sources

The scraper queries multiple Belgian procurement data sources in order of data quality:

1. **TED (Tenders Electronic Daily)** — The official EU procurement journal. Contains all Belgian tenders above EU thresholds. Structured API with rich metadata.
2. **Belgian e-Notification** — Belgium's national e-procurement platform at enot.publicprocurement.be. Contains all Belgian public procurement notices including those below EU thresholds.

The actor uses a fallback strategy: if the primary source returns no results, it automatically tries the next source.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQuery` | string | "informatique" | Free text keyword to search tenders |
| `daysBack` | integer | 30 | How many days back to search (1-365) |
| `maxResults` | integer | 100 | Maximum number of tenders to return (1-1000) |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings |

#### Example input

```json
{
    "searchQuery": "IT services",
    "daysBack": 60,
    "maxResults": 50,
    "proxyConfiguration": { "useApifyProxy": true }
}
````

### Output format

Each tender in the dataset contains:

| Field | Type | Description |
|-------|------|-------------|
| `noticeTitle` | string | Title of the procurement notice |
| `referenceNumber` | string | Official reference/document number |
| `buyer` | string | Contracting authority name |
| `publicationDate` | string | Date the notice was published (YYYY-MM-DD) |
| `deadline` | string | Submission deadline (YYYY-MM-DD) |
| `estimatedValue` | number | Estimated contract value |
| `currency` | string | Currency code (usually EUR) |
| `cpvCodes` | array | Common Procurement Vocabulary codes |
| `procedureType` | string | Type of procurement procedure |
| `noticeDescription` | string | Short description of the tender |
| `url` | string | Direct link to the full notice |
| `noticeStatus` | string | Current status of the notice |
| `language` | string | Language of the notice |
| `scrapedAt` | string | ISO timestamp of when data was collected |

#### Example output

```json
{
    "noticeTitle": "Services informatiques de consultation",
    "referenceNumber": "2024/S 045-123456",
    "buyer": "SPF Finances",
    "publicationDate": "2024-03-01",
    "deadline": "2024-04-15",
    "estimatedValue": 500000,
    "currency": "EUR",
    "cpvCodes": ["72000000"],
    "procedureType": "Open procedure",
    "noticeDescription": "IT consulting services for federal tax administration",
    "url": "https://ted.europa.eu/en/notice/-/detail/123456-2024",
    "noticeStatus": "Open",
    "language": "FR",
    "scrapedAt": "2024-03-15T10:30:00.000Z"
}
```

### Use cases

- **Bid monitoring** — Track new procurement opportunities matching your business capabilities.
- **Market research** — Analyze government spending patterns across sectors and regions.
- **Competitive intelligence** — See which contracts competitors are bidding on or winning.
- **Compliance monitoring** — Track public spending and procurement procedures.
- **Lead generation** — Find organizations that regularly procure services in your domain.
- **Data journalism** — Investigate public procurement trends and anomalies.

### Supported search keywords

The scraper supports any keyword in French, Dutch, German, or English. Common examples:

- IT: "informatique", "IT services", "software", "cloud"
- Construction: "construction", "bouwwerken", "travaux"
- Consulting: "conseil", "consulting", "consultancy"
- Healthcare: "medical", "gezondheid", "sante"
- Transport: "transport", "logistics", "mobilite"

### Cost and performance

- Typical run: 30-60 seconds for 100 results
- Memory: 256 MB is sufficient
- Proxy: Apify Proxy recommended but not strictly required for government sites
- Cost: approximately $0.01-0.05 per run depending on result count

### Limitations

- TED only contains tenders above EU procurement thresholds (varies by type, typically >140K EUR for services)
- Some fields may be empty depending on the source and notice type
- Historical data availability varies; most recent 12 months is most reliable
- The Belgian e-Notification platform may occasionally be unavailable during maintenance

### Legal and compliance

All data scraped by this actor is publicly available government information published for transparency purposes. Belgian and EU procurement law requires public publication of tender notices. This actor only collects data that is freely accessible without any authentication.

# Actor input Schema

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

Free text keyword to search tenders (e.g., 'informatique', 'construction', 'IT services'). Leave empty to get recent tenders.

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

How many days back to search for tenders. Maximum 365.

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

Maximum number of tenders to return.

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

Proxy settings for the scraper.

## Actor input object example

```json
{
  "searchQuery": "informatique",
  "daysBack": 30,
  "maxResults": 100,
  "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",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/belgian-procurement-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",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/belgian-procurement-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Belgian Public Procurement Scraper",
        "description": "Scrape Belgian public procurement tenders from e-Notification (enot.publicprocurement.be). Extract tender titles, deadlines, buyers, CPV codes, estimated values, and procedure types. No login required.",
        "version": "0.1",
        "x-build-id": "fEaqYtaNanqddvv4p"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~belgian-procurement-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-belgian-procurement-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~belgian-procurement-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-belgian-procurement-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~belgian-procurement-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-belgian-procurement-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": "Search Query",
                        "type": "string",
                        "description": "Free text keyword to search tenders (e.g., 'informatique', 'construction', 'IT services'). Leave empty to get recent tenders."
                    },
                    "daysBack": {
                        "title": "Days Back",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "How many days back to search for tenders. Maximum 365.",
                        "default": 30
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of tenders to return.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings for the scraper."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
