# Portugal Public Tenders (Portal BASE) (`fluxopronto/portugal-public-tenders`) Actor

Portuguese public tender notices from the official Portal BASE open data (IMPIC, dados.gov.pt), updated weekly. Only tenders still open for bids by default. Filter by CPV, buyer (name or NIF), base price, procedure and deadline. Links to tender documents.

- **URL**: https://apify.com/fluxopronto/portugal-public-tenders.md
- **Developed by:** [João Ferreira](https://apify.com/fluxopronto) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 tender 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

## Portugal Public Tenders (Portal BASE)

Find Portuguese public tenders that are **still open for bids**, straight from the official Portal BASE open data published by IMPIC on dados.gov.pt (public domain, updated weekly). Filter by CPV, buyer, base price, procedure, contract type and bid deadline, and get clean JSON, CSV or Excel with a link to the tender documents.

### What you get for each tender notice

| Field | Example |
|---|---|
| `publicationDate`, `bidDeadline`, `bidPeriodDays` | `2026-09-30`, `2026-10-28`, `28` |
| `title`, `lots` | `Aquisição de serviços de licenciamento…`, list of lots |
| `contractingAuthority` | `{ "nif": "503933813", "name": "Infraestruturas de Portugal, SA" }` |
| `basePrice`, `currency` | `911519`, `EUR` (null when the notice has no base price) |
| `procedureType`, `noticeType`, `contractTypes` | `Concurso público`, `Anúncio de procedimento`, `["Aquisição de serviços"]` |
| `cpvCodes`, `cpv` | `["72260000-5"]` with descriptions |
| `tenderDocumentsUrl` | link to the tender documents on the procurement platform |
| `officialJournalPdfUrl` | the notice PDF in the Diário da República |
| `source` | dataset, file, licence and attribution |

### Typical uses

- **Bid teams and suppliers:** every open tender in your CPV codes, above a minimum value, with the deadline and the documents link.
- **Consultants and market research:** who is buying what, at what base price, with which procedure.
- **Alerts:** schedule the Actor daily and keep only the new notices in your own workflow.

### Examples (real runs on the 2026 file, 2026-10-08)

**All tenders still open for bids** (default input): 1,123 notices out of 24,320 published in 2026.

**Open IT tenders:**

```json
{ "cpvCodes": ["72"] }
```

35 notices. Reading the whole year file takes about 3 seconds after download; peak memory about 65 MB.

**Large construction tenders closing in November:**

```json
{ "cpvCodes": ["45"], "minBasePrice": 1000000, "deadlineFrom": "2026-11-01", "deadlineTo": "2026-11-30" }
```

### Input

All filters are optional and combined with AND; several values inside one filter are OR.

- `openOnly` (default `true`): only notices whose bid deadline is today or later, Lisbon time.
- `cpvCodes`: prefix match (`72` = IT services, `45` = construction, `33600000-6` = pharmaceuticals and sub-codes).
- `keywords`: searched in title, lots and buyer name; case and accents ignored.
- `contractingAuthorities`: 9-digit NIF (most reliable) or part of the name.
- `minBasePrice`, `maxBasePrice` (EUR): notices without a base price are excluded when set.
- `procedureTypes`, `contractTypes`: part of the Portuguese name is enough.
- `deadlineFrom`, `deadlineTo`, `publishedFrom`, `publishedTo`: `YYYY-MM-DD`.
- `includeAmendments` (default `true`): include amendment and correction notices.
- `maxResults` (default 1,000).

### Source, freshness and limits

- **Source:** IMPIC – Portal BASE, dataset «Contratos Públicos - Portal Base - IMPIC - Anúncios de 2012 a 2026» on dados.gov.pt, licence declared as public domain. The Actor reads the file list from the dados.gov.pt API on every run, so it always uses the latest weekly file.
- **Freshness:** IMPIC updates the file weekly; a notice published a few days ago may not be in it yet. For same-day alerts, check the official platforms too.
- **Years:** IMPIC publishes the current year as JSON; earlier years are only in XLSX and are not read in this version.
- **No personal data:** every notice is published by a public body.
- Not affiliated with or endorsed by IMPIC or the Portuguese State.

### Pricing

Pay per result: you pay for each tender notice saved to the dataset. Set a maximum cost per run in the run options if you want a hard limit.

### Also by this developer

**Portugal Public Contracts (Portal BASE):** the contracts that were actually awarded (winner, price, dates, competitors).

# Actor input Schema

## `openOnly` (type: `boolean`):

Keep only notices whose bid deadline (DataLimitePropostas) is today or later, in Lisbon time. Turn off to search past notices too.

## `cpvCodes` (type: `array`):

Common Procurement Vocabulary, prefix match: "72" = all IT services, "45" = construction work, "33600000-6" = pharmaceuticals and sub-codes.

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

Words searched in the notice title, lots and buyer name. Case and accents are ignored.

## `contractingAuthorities` (type: `array`):

Public body that published the notice: 9-digit NIF (most reliable) or part of the name.

## `minBasePrice` (type: `integer`):

Notices without a base price are excluded when this is set.

## `maxBasePrice` (type: `integer`):

Notices without a base price are excluded when this is set.

## `procedureTypes` (type: `array`):

For example "Concurso público" or "Concurso limitado por prévia qualificação". Part of the name is enough.

## `contractTypes` (type: `array`):

For example "Aquisição de serviços", "Aquisição de bens móveis", "Empreitadas de obras públicas".

## `deadlineFrom` (type: `string`):

YYYY-MM-DD.

## `deadlineTo` (type: `string`):

YYYY-MM-DD.

## `publishedFrom` (type: `string`):

YYYY-MM-DD. Also selects which yearly files are read.

## `publishedTo` (type: `string`):

YYYY-MM-DD.

## `includeAmendments` (type: `boolean`):

Also return "Anúncio de Alteração" and corrections, which change an earlier notice.

## `years` (type: `array`):

Yearly files to read. IMPIC publishes JSON only for the current year; leave empty to use it.

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

Stop after this many notices.

## Actor input object example

```json
{
  "openOnly": true,
  "cpvCodes": [
    "72"
  ],
  "includeAmendments": true,
  "maxResults": 1000
}
```

# Actor output Schema

## `tenders` (type: `string`):

Tender notices that matched your filters (JSON, CSV or Excel).

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

Files read, notices read, notices saved and why the run stopped.

# 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 = {
    "cpvCodes": [
        "72"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fluxopronto/portugal-public-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 = { "cpvCodes": ["72"] }

# Run the Actor and wait for it to finish
run = client.actor("fluxopronto/portugal-public-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 '{
  "cpvCodes": [
    "72"
  ]
}' |
apify call fluxopronto/portugal-public-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fluxopronto/portugal-public-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/VYYxgAcb2ABOkI6Dq/builds/QlDGlfk6PQwo6U7Py/openapi.json
