# EU Tenders and Awards: TED Public Procurement, EU and EEA (`nightwave-owner/eu-public-procurement`) Actor

Returns EU public tenders and contract award notices from the official TED API for all EU and EEA countries: buyer, value, deadline, winning supplier and awarded value. Filter by country, date, CPV code, keyword and notice type. Supports onlyNew for daily tender and award alerts.

- **URL**: https://apify.com/nightwave-owner/eu-public-procurement.md
- **Developed by:** [Viktor Wiberg](https://apify.com/nightwave-owner) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 tenders

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

## EU Tenders and Awards: TED Public Procurement, EU and EEA

Public tenders from all 27 EU member states plus Norway, Iceland and Liechtenstein, fetched from TED (Tenders Electronic Daily), the official EU journal for public procurement. You get one clean row per notice with title, buyer, country, CPV codes, estimated value and currency, publication date, tender deadline, notice type and a link to the full notice on TED. With `noticeTypes: ["award"]` you get contract award notices instead: who won, the awarded value and how many tenders the buyer received.

Use it to watch for new calls for tenders in your field, to build a lead list of public buyers in the countries you sell to, or to analyse who buys what across Europe. Schedule a daily run with `dateFrom` and `dateTo` left empty and filter on your countries and CPV codes to get a simple tender alert.

### What is covered

TED publishes every procurement notice above the EU thresholds from the EU and the EEA. From 30 September to 2 October 2026, for example, TED published 5 470 open calls for tenders (the `competition` group) from these 30 countries, about 1 800 per weekday. Norway, Iceland and Liechtenstein publish through the EEA agreement. Smaller procurements below the thresholds are only published in national databases (for example Doffin in Norway, Hilma in Finland or the national portals in Germany and France) and are not included.

Notices from 2023 onwards use the eForms format that this actor reads, so `dateFrom` can be at earliest 2023-01-01.

#### Countries

Use the ISO 3166 alpha-2 code in `countries`. Leave the list empty to get all 30.

| Code | Country | Code | Country | Code | Country |
|---|---|---|---|---|---|
| `AT` | Austria | `FR` | France | `LV` | Latvia |
| `BE` | Belgium | `GR` | Greece | `MT` | Malta |
| `BG` | Bulgaria | `HR` | Croatia | `NL` | Netherlands |
| `CY` | Cyprus | `HU` | Hungary | `NO` | Norway |
| `CZ` | Czechia | `IE` | Ireland | `PL` | Poland |
| `DE` | Germany | `IS` | Iceland | `PT` | Portugal |
| `DK` | Denmark | `IT` | Italy | `RO` | Romania |
| `EE` | Estonia | `LI` | Liechtenstein | `SE` | Sweden |
| `ES` | Spain | `LT` | Lithuania | `SI` | Slovenia |
| `FI` | Finland | `LU` | Luxembourg | `SK` | Slovakia |

The filter is on the buyer's country. Notices from EU institutions or from countries outside the EU and EEA, which TED also publishes, are not included.

### Example from a real run

This is the input and the first rows of a run on the Apify platform on 3 October 2026 (run `pCVPwcPLo9a6Wwnft`, 150 rows in total). Nothing is edited except that only the first rows are shown.

Input:

```json
{
  "countries": [
    "DE",
    "FR",
    "SE"
  ],
  "dateFrom": "2026-10-01",
  "dateTo": "2026-10-03",
  "noticeTypes": [
    "competition"
  ],
  "maxResults": 150
}
```

Output (excerpt):

```json
[
  {
    "id": "681480-2026",
    "title": "Catering Betrieb der Mensa und des Kiosks im Internat Schloss Hansenberg",
    "titleLanguage": "deu",
    "buyer": "Land Hessen, vertreten durch das Hessische Competence Center -Beschaffungen-",
    "buyerCity": "Wiesbaden",
    "country": "DE",
    "countries": [
      "DE"
    ],
    "cpvCodes": [
      "55524000"
    ],
    "mainCpvCode": "55524000",
    "estimatedValue": null,
    "currency": null,
    "publicationDate": "2026-10-02",
    "deadline": "2026-10-12T12:00:00+02:00",
    "deadlineDate": "2026-10-12",
    "noticeType": "cn-standard",
    "noticeTypeGroup": "competition",
    "procedureType": "open",
    "contractNature": "services",
    "url": "https://ted.europa.eu/en/notice/-/detail/681480-2026",
    "source": "TED (Tenders Electronic Daily), Publications Office of the European Union",
    "license": "CC BY 4.0 / Commission Decision 2011/833/EU"
  },
  {
    "id": "681455-2026",
    "title": "Bussresor med förare",
    "titleLanguage": "swe",
    "buyer": "Uppsala universitet; Nordiska Afrikainstitutet; Institutet för arbetsmarknads- och utbildningspolitisk utvärdering",
    "buyerCity": "Uppsala",
    "country": "SE",
    "countries": [
      "SE"
    ],
    "cpvCodes": [
      "60172000",
      "34121000",
      "63515000",
      "60100000"
    ],
    "mainCpvCode": "60172000",
    "estimatedValue": 16000000,
    "currency": "SEK",
    "publicationDate": "2026-10-02",
    "deadline": "2026-10-27T00:00:00+01:00",
    "deadlineDate": "2026-10-27",
    "noticeType": "cn-standard",
    "noticeTypeGroup": "competition",
    "procedureType": "open",
    "contractNature": "services",
    "url": "https://ted.europa.eu/en/notice/-/detail/681455-2026",
    "source": "TED (Tenders Electronic Daily), Publications Office of the European Union",
    "license": "CC BY 4.0 / Commission Decision 2011/833/EU"
  }
]
```

### Contract awards: who won and for how much

Set `noticeTypes` to `["award"]` to get contract award notices (eForms subtypes `can-standard` and `can-social`). Each row then also carries the winning suppliers, the total awarded value, the number of tenders received and the date of the award decision. The fields are filled from the award section of the notice and are `null` when the buyer did not publish them, for example when a procedure ended without a contract or the value is confidential.

This is the input and two of the rows from a run on the Apify platform on 7 October 2026 (run `GsvEJIdYyIezH3jUA`, 20 rows, 3.4 seconds). The rows are shown exactly as the actor returned them. 16 of the 20 rows had at least one winner and 13 had an awarded value; the others were procedures closed without a winner or awards where the buyer did not publish the value.

Input:

```json
{
  "noticeTypes": ["award"],
  "countries": ["SE"],
  "maxResults": 20
}
```

Output (two rows):

```json
[
  {
    "id": "692753-2026",
    "title": "Partneringledare i projekt om- utbyggnad av Norsa avloppsreningsverk, Köping",
    "titleLanguage": "swe",
    "buyer": "Västra Mälardalens Energi och Miljö AB",
    "buyerCity": "KÖPING",
    "country": "SE",
    "countries": [
      "SE"
    ],
    "cpvCodes": [
      "71310000"
    ],
    "mainCpvCode": "71310000",
    "estimatedValue": 5000000,
    "currency": "SEK",
    "publicationDate": "2026-10-07",
    "deadline": null,
    "deadlineDate": null,
    "noticeType": "can-standard",
    "noticeTypeGroup": "award",
    "procedureType": "restricted",
    "contractNature": "services",
    "awardedValue": 5000000,
    "awardedCurrency": "SEK",
    "winnerNames": [
      "VBHR - vi bygger hållbara relationer AB"
    ],
    "winnerCountries": [
      "SE"
    ],
    "numberOfTenders": 2,
    "awardDate": "2026-09-04",
    "url": "https://ted.europa.eu/en/notice/-/detail/692753-2026",
    "source": "TED (Tenders Electronic Daily), Publications Office of the European Union",
    "license": "CC BY 4.0 / Commission Decision 2011/833/EU"
  },
  {
    "id": "691976-2026",
    "title": "Framtagande av vägplan samt förfrågningsunderlag för utförandeentreprenad avseende trafiksäkerhetshöjande åtgärder väg 63 Stjärnfors - Kopparberg inom Ljusnarsbergs kommun, Örebro län",
    "titleLanguage": "swe",
    "buyer": "Trafikverket Myndighet",
    "buyerCity": "BORLÄNGE",
    "country": "SE",
    "countries": [
      "SE"
    ],
    "cpvCodes": [
      "71311000",
      "71310000"
    ],
    "mainCpvCode": "71311000",
    "estimatedValue": 4500000,
    "currency": "SEK",
    "publicationDate": "2026-10-07",
    "deadline": null,
    "deadlineDate": null,
    "noticeType": "can-standard",
    "noticeTypeGroup": "award",
    "procedureType": "open",
    "contractNature": "services",
    "awardedValue": 3496745,
    "awardedCurrency": "SEK",
    "winnerNames": [
      "AFRY Infrastructure AB"
    ],
    "winnerCountries": [
      "SE"
    ],
    "numberOfTenders": 10,
    "awardDate": "2026-09-15",
    "url": "https://ted.europa.eu/en/notice/-/detail/691976-2026",
    "source": "TED (Tenders Electronic Daily), Publications Office of the European Union",
    "license": "CC BY 4.0 / Commission Decision 2011/833/EU"
  }
]
```

`estimatedValue` is what the buyer expected when the procedure started; `awardedValue` is what the award notice says the contracts are worth. For framework agreements the awarded value is usually the maximum value of the framework, not what has been bought. `winnerNames` lists every supplier that got a contract in the notice, so a framework agreement with several suppliers gives several names.

Only organisation names and countries are taken from the winners. Contact persons, e-mail addresses, phone numbers and registration numbers of the suppliers are not fetched.

Use the `awards` view in the dataset (or `?view=awards` in the dataset API) for a table with buyer, title, winners, awarded value, currency and country.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `countries` | array | all 30 | Buyer countries as ISO codes, for example `DE`, `FR`, `SE`. See the table above. |
| `dateFrom` | string | six days before `dateTo` | First publication date, `YYYY-MM-DD`. |
| `dateTo` | string | today | Last publication date (inclusive). At most 366 days per run. |
| `noticeTypes` | array | `["competition"]` | `competition`, `planning`, `award` and/or `result`. See below. |
| `cpvCodes` | array | none | Only notices with at least one of these CPV codes. Trailing zeros match the whole category, so `72000000` (IT services) also matches `72221000`. The check digit is optional. |
| `keywords` | string | none | Full text search in the notice. Several words are searched as a phrase. |
| `maxResults` | integer | `50` | Maximum number of notices, newest first. 1 to 10 000. |
| `onlyNew` | boolean | `false` | Return only notices that earlier runs with the same input did not deliver. See "Monitoring and scheduling". |

A run with empty input returns the 50 newest open competitions from all 30 countries published in the last seven days.

#### Notice types

| Group | What it means | eForms subtypes |
|---|---|---|
| `competition` | Open calls you can bid on now | `cn-standard`, `cn-social`, `cn-desg`, `qu-sy`, `subco`, `pin-cfc-standard`, `pin-cfc-social` |
| `planning` | Planned procurements and market consultations | `pin-only`, `pin-buyer`, `pin-rtl`, `pin-tran`, `pmc` |
| `award` | Contract award notices: who won and for how much | `can-standard`, `can-social` |
| `result` | All result notices: contract awards plus design contest results, transport awards, contract modifications and voluntary transparency notices | `can-standard`, `can-social`, `can-desg`, `can-tran`, `can-modif`, `veat` |

`award` is the one to use when you want winners and values. `result` is wider; the award fields are filled for those notices too when TED has them. `noticeTypeGroup` in the output shows the group you asked for, so a `can-standard` notice is `award` in an award run and `result` in a result run.

Example input: IT and software tenders in the five Nordic countries published in September 2026.

```json
{
  "countries": ["SE", "NO", "DK", "FI", "IS"],
  "dateFrom": "2026-09-01",
  "dateTo": "2026-09-30",
  "noticeTypes": ["competition"],
  "cpvCodes": ["72000000", "48000000"],
  "maxResults": 500
}
```

Example input: construction work tendered in Germany and France in the last seven days.

```json
{
  "countries": ["DE", "FR"],
  "noticeTypes": ["competition"],
  "cpvCodes": ["45000000"],
  "maxResults": 1000
}
```

Keywords work best in the buyer's own language, since most notices are written in the language of the country: `Reinigung` finds more German cleaning contracts than `cleaning`, and `nettoyage` more French ones. Many notices from smaller countries also have an English title.

### Output

| Field | Description |
|---|---|
| `id` | TED publication number, for example `681455-2026` |
| `title` | Title of the procurement as published by the buyer |
| `titleLanguage` | Language of the title (ISO 639-2, for example `swe`, `eng`) |
| `buyer` | Name of the contracting authority. Joint procurements list all buyers separated by `; ` |
| `buyerCity` | City of the (first) buyer |
| `country` | Country of the (first) buyer, ISO 3166 alpha-2 |
| `countries` | All buyer countries |
| `cpvCodes` | All CPV codes in the notice |
| `mainCpvCode` | Main CPV code of the procedure |
| `estimatedValue` | Estimated value excluding VAT, or the sum of the lots when the total is missing and all lots use the same currency. `null` if the buyer did not publish a value |
| `currency` | Currency of `estimatedValue`, for example `EUR`, `SEK`, `PLN`, `CZK`, `NOK` |
| `publicationDate` | Publication date in TED, `YYYY-MM-DD` |
| `deadline` | Earliest deadline for tenders across the lots, ISO 8601 with time zone. `null` for notices without a deadline (awards, most prior information notices) |
| `deadlineDate` | Date part of `deadline` |
| `noticeType` | eForms notice subtype, for example `cn-standard` |
| `noticeTypeGroup` | `competition`, `planning`, `award` or `result` |
| `procedureType` | For example `open`, `restricted`, `neg-w-call`, `comp-dial` |
| `contractNature` | `services`, `supplies` or `works` |
| `awardedValue` | Award notices: total value of the awarded contracts excluding VAT (the notice total, or the sum of the lot results when the total is missing). `null` when not published and for other notice types |
| `awardedCurrency` | Currency of `awardedValue` |
| `winnerNames` | Award notices: names of the winning organisations. `null` when no contract was awarded |
| `winnerCountries` | Countries of the winners, ISO 3166 alpha-2 |
| `numberOfTenders` | Number of tenders received (the highest number for a single lot when the notice has several lots) |
| `awardDate` | Date of the award decision, or the date the contract was concluded when no decision date is given. Earliest date across the lots |
| `url` | Link to the full notice on ted.europa.eu |
| `source`, `license` | Attribution for the data |

```json
{
  "id": "692799-2026",
  "title": "Vernieuwen van de trambaan in eigen bedding tussen de Kolegemstraat en de eindhalte Wondelgem, t.h.v. de R4",
  "titleLanguage": "nld",
  "buyer": "Vlaamse Vervoermaatschappij De Lijn",
  "buyerCity": "Mechelen",
  "country": "BE",
  "countries": [
    "BE"
  ],
  "cpvCodes": [
    "45234120"
  ],
  "mainCpvCode": "45234120",
  "estimatedValue": null,
  "currency": null,
  "publicationDate": "2026-10-07",
  "deadline": "2026-11-09T11:00:00+01:00",
  "deadlineDate": "2026-11-09",
  "noticeType": "cn-standard",
  "noticeTypeGroup": "competition",
  "procedureType": "open",
  "contractNature": "works",
  "awardedValue": null,
  "awardedCurrency": null,
  "winnerNames": null,
  "winnerCountries": null,
  "numberOfTenders": null,
  "awardDate": null,
  "url": "https://ted.europa.eu/en/notice/-/detail/692799-2026",
  "source": "TED (Tenders Electronic Daily), Publications Office of the European Union",
  "license": "CC BY 4.0 / Commission Decision 2011/833/EU"
}
```

This row is the first one from a run with empty input on 7 October 2026 (run `jEtQg3u4gEuNWRp2O`, 50 rows). The award fields are `null` for open competitions and planning notices.

### Monitoring and scheduling

Set `onlyNew` to `true` to use the actor for recurring monitoring. The actor then remembers which notices it has delivered for the same input, in a named key-value store in your Apify account (`nightwave-state-eu-public-procurement`, one record per input). Each run returns and charges only notices that earlier runs did not deliver. The first run returns everything in the selection. A run without news finishes successfully with 0 rows.

A notice is identified by its TED publication number. The default date range is the last seven days, so a daily run looks at a week of notices and returns the ones it has not delivered before. Set `maxResults` above the number of notices your search normally gets in a week, otherwise only the newest notices are checked.

`onlyNew` and `maxResults` are not part of the remembered input, so you can change them without starting over. Changing any other field starts a fresh state. To start over with the same input, delete the record in the key-value store.

Example: a daily run at 07:00 that returns new IT tenders (CPV 72000000) from the Nordic countries. In Apify Console, open **Schedules**, create a schedule with the cron expression `0 7 * * *` and add this actor with the input below.

```json
{
  "countries": ["SE", "NO", "DK", "FI"],
  "cpvCodes": ["72000000"],
  "noticeTypes": ["competition"],
  "onlyNew": true,
  "maxResults": 200
}
```

The same schedule through the Apify API:

```sh
curl -X POST "https://api.apify.com/v2/schedules?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"name": "daily-eu-public-procurement", "cronExpression": "0 7 * * *", "timezone": "Europe/Stockholm", "isEnabled": true, "isExclusive": true,
       "actions": [{"type": "RUN_ACTOR", "actorId": "nightwave-owner~eu-public-procurement",
                    "runInput": {"contentType": "application/json; charset=utf-8", "body": "<the input above as a JSON string>"}}]}'
```

Example: a weekly overview of who wins IT contracts (CPV 72000000) in Sweden, Norway and Denmark. Schedule it with the cron expression `0 8 * * 1` (Mondays at 08:00) and this input. `onlyNew` works the same way for award notices: each run returns the awards that earlier runs did not deliver.

```json
{
  "countries": ["SE", "NO", "DK"],
  "cpvCodes": ["72000000"],
  "noticeTypes": ["award"],
  "onlyNew": true,
  "maxResults": 200
}
```

Connect a webhook or an integration (Slack, e-mail, Google Sheets) to the actor in Apify Console if you want the new rows sent somewhere when the run finishes.

### Good to know

- **Personal data is left out.** The actor does not fetch the contact person, e-mail or phone fields that some notices contain. E-mail addresses and phone numbers that a buyer has written into a title are replaced with `[removed]`. Open the TED link for the buyer's official contact details.
- `estimatedValue` is what the buyer estimated when the notice was published. The value of the signed contracts is in `awardedValue`, which only award notices have.
- TED publishes new notices on weekdays, so a run for a Saturday or Sunday returns no rows.
- Requests are retried three times on network errors, rate limits and server errors. A rejected search or a response in an unexpected format stops the run with a clear message instead of storing broken rows.
- The run log shows the exact TED expert query, which you can paste into the search on ted.europa.eu to compare.

### Use cases

- A daily tender alert: filter on your countries and CPV codes, run every morning with `onlyNew: true` and send new notices to Slack or e-mail with an Apify integration.
- Build a list of public buyers that procure what you sell, with `buyer`, `buyerCity` and `country`, for account planning.
- Track deadlines: sort the open calls for tenders in your field by `deadlineDate` in a spreadsheet.
- Competitor tracking: run with `noticeTypes: ["award"]` and your CPV codes to see which suppliers win in your field, at what value and against how many tenders.
- Market analysis: count notices and estimated values per CPV code and country over a period with `dateFrom` and `dateTo`.
- Feed a bid management tool or CRM with the TED link and the structured fields instead of copying notices by hand.

### FAQ

**How often is the data updated?**
Every run reads the TED API live. New notices appear in TED when the Publications Office of the EU publishes them, normally in a batch every working day.

**What does 1 000 rows cost?**
4 USD (0.004 USD per notice, event `tender`, the same for award notices), plus Apify platform usage, which is a fraction of a cent per run. `maxResults` caps how many notices a run returns.

**Can I schedule it?**
Yes. Leave `dateFrom` and `dateTo` empty, set `onlyNew: true` and add the actor to an Apify schedule. See "Monitoring and scheduling" above.

**Can I use the data commercially?**
Yes. TED data is reusable under the Commission's reuse policy (Decision 2011/833/EU) and CC BY 4.0, with attribution to the Publications Office of the European Union.

### Data source and license

The data comes from the public [TED Search API](https://docs.ted.europa.eu/api/latest/search.html) (`POST https://api.ted.europa.eu/v3/notices/search`), which needs no API key. TED is run by the Publications Office of the European Union. Reuse of TED data is allowed under [Commission Decision 2011/833/EU](https://eur-lex.europa.eu/eli/dec/2011/833/oj) on the reuse of Commission documents, and the TED datasets on [data.europa.eu](https://data.europa.eu/data/datasets/ted-csv) are published under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Credit the source as "TED, Publications Office of the European Union" when you publish the data. Every row carries `source` and `license` for that purpose. The actor reshapes the notices (selected fields, deduplicated codes, summed lot values) but does not change their content.

This actor is not affiliated with the European Union or the Publications Office.

### Pricing

Pay per result: 0.004 USD per row returned (event `tender`, also for award notices), which is 4 USD per 1 000 notices. Apify bills platform usage on top as usual. It is small: the example run above returned 150 rows and used 0.0011 USD of platform usage, and the award run on 7 October 2026 returned 20 rows for 0.00035 USD. `maxResults` caps how many rows a run returns, so you always know the highest possible cost.

### Contact

Built and maintained by Nightwave AB. Questions, bugs and feature requests: kontakt@nightwave.se

### På svenska

Actorn hämtar offentliga upphandlingar från alla 27 EU-länder samt Norge, Island och Liechtenstein ur TED, EU:s officiella databas för upphandlingar över EU:s tröskelvärden. Varje upphandling blir en rad med titel, köpare, land, CPV-koder, uppskattat värde och valuta, publiceringsdatum, sista anbudsdag, notistyp och länk till TED.

- Filtrera på land (landskod, till exempel SE, DE eller FR; tom lista betyder alla 30), publiceringsdatum, CPV-koder (72000000 träffar hela IT-kategorin), sökord och notistyp (pågående upphandlingar, förhandsannonser, tilldelningsbeslut eller alla resultat).
- Med `noticeTypes: ["award"]` får du tilldelningsbeslut: vilka leverantörer som vann (`winnerNames`, `winnerCountries`), kontraktens värde (`awardedValue`, `awardedCurrency`), antal anbud (`numberOfTenders`) och datum för beslutet (`awardDate`). Fälten är tomma (`null`) när köparen inte har publicerat uppgiften.
- Upphandlingar under tröskelvärdena finns bara i nationella databaser och ingår inte.
- Kontaktpersoners namn, e-post och telefonnummer tas inte med.
- Källa: TED, Europeiska unionens publikationsbyrå. Fri återanvändning enligt kommissionens beslut 2011/833/EU och CC BY 4.0, med källhänvisning.
- Med `onlyNew: true` levereras bara upphandlingar som tidigare körningar med samma input inte har levererat, vilket passar för daglig bevakning (se "Monitoring and scheduling").
- Pris: 0,004 USD per upphandling (4 USD per 1 000) plus Apifys plattformsanvändning.
- Kontakt: kontakt@nightwave.se

# Actor input Schema

## `countries` (type: `array`):

Buyer countries to include, as ISO codes, for example \["SE", "NO"]. Leave empty for all 30 EU and EEA countries.

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

First publication date, YYYY-MM-DD, for example "2026-10-01". Defaults to six days before the end date, so the default run covers the last seven days. Earliest 2023-01-01.

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

Last publication date (inclusive), YYYY-MM-DD, for example "2026-10-03". Defaults to today. At most 366 days per run.

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

competition: open calls for tenders you can bid on (contract notices, qualification systems, subcontracting). planning: prior information and market consultations. award: contract award notices (can-standard, can-social) with the winning supplier, awarded value and number of tenders, for example to see who won an IT framework agreement and for how much. result: all result notices, that is award notices plus design contest results, transport awards, contract modifications and voluntary transparency notices. For example \["award"]. Defaults to competition.

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

Optional. Only notices with at least one of these CPV codes, for example \["72000000"]. Trailing zeros match the whole category: 72000000 (IT services) also matches 72221000. The check digit is optional (72000000-5 works).

## `keywords` (type: `string`):

Optional. Full text search in the notice, for example "cloud services" or "Reinigung". Several words are searched as a phrase. Notices are published in the buyer's language, so words in that language often find more.

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

Maximum number of notices to return, newest first, for example 50. Each notice is one billable result. Defaults to 50.

## `onlyNew` (type: `boolean`):

For scheduled runs. When true, notices that an earlier run with the same input already delivered are skipped and not charged, so a daily run returns only notices published since the last run (among the newest maxResults). The first run returns everything. Defaults to false.

## Actor input object example

```json
{
  "countries": [
    "SE",
    "NO",
    "DK",
    "FI"
  ],
  "dateFrom": "2026-10-01",
  "dateTo": "2026-10-03",
  "noticeTypes": [
    "award"
  ],
  "cpvCodes": [
    "72000000",
    "48000000"
  ],
  "keywords": "cloud services",
  "maxResults": 50,
  "onlyNew": true
}
```

# Actor output Schema

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

All rows produced by the run, as JSON. Open in Apify Console or download via the dataset API.

## `awards` (type: `string`):

The same rows in the awards view: buyer, title, winners, awarded value and country. Use it with noticeTypes award or result.

# 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 = {
    "countries": [
        "SE"
    ],
    "noticeTypes": [
        "competition"
    ],
    "maxResults": 50,
    "onlyNew": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("nightwave-owner/eu-public-procurement").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 = {
    "countries": ["SE"],
    "noticeTypes": ["competition"],
    "maxResults": 50,
    "onlyNew": False,
}

# Run the Actor and wait for it to finish
run = client.actor("nightwave-owner/eu-public-procurement").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 '{
  "countries": [
    "SE"
  ],
  "noticeTypes": [
    "competition"
  ],
  "maxResults": 50,
  "onlyNew": false
}' |
apify call nightwave-owner/eu-public-procurement --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nightwave-owner/eu-public-procurement"
        }
    }
}
```

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/qZbcTtaaGsA0LfQmj/builds/lsNFW8t3c2Kt5mYcW/openapi.json
