# TED Tender Monitor – New EU Public Tenders & Award Alerts (`puchus-monitoring/ted-tender-monitor`) Actor

Monitors EU public tenders on TED (Tenders Electronic Daily) with simple filters (keywords, CPV codes, countries, value) and outputs only what is new since the last run: new tenders, corrigenda, deadline changes, awards with winner and value, and deadline reminders.

- **URL**: https://apify.com/puchus-monitoring/ted-tender-monitor.md
- **Developed by:** [Andres Garcia](https://apify.com/puchus-monitoring) (community)
- **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/actors/running/actors-in-store.md#pay-per-usage

## 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

## TED Tender Monitor – New EU Public Tenders & Award Alerts

Watch EU public tenders on **TED (Tenders Electronic Daily)**, the official EU procurement journal, and get **only what is new since your last run**: new tenders that match your keywords, CPV codes, countries and minimum value, plus the life of the tenders you follow — corrigenda, deadline changes, awards (with winner and value) and a reminder before the deadline.

Schedule it every morning and receive the news by email, Slack or Google Sheets. When nothing happened, the run outputs nothing and costs almost nothing.

> **Launch: free for the first weeks.** While the Actor is new you only pay the small Apify platform usage of each run. See [Pricing](#pricing).

> This Actor is an independent tool, not affiliated with or endorsed by the European Union or the Publications Office. It uses the official, public TED Search API (no login, no scraping of web pages). Source of the data: TED – Tenders Electronic Daily, © European Union. Procurement notices may be reused for commercial and non-commercial purposes (Commission Decision 2011/833/EU).

### What problem does it solve?

Thousands of notices are published on TED every working day. If you bid for public contracts, or advise companies that do, you need to know:

- which **new tenders** of your sector were published in your countries;
- when a tender you are preparing gets a **corrigendum** or its **deadline moves**;
- **who won** a tender and for how much;
- that a deadline is **a few days away**.

Searching TED by hand every day is slow, and most tools return the same full list of notices on every run, so you still have to work out what is new.

### How is it different from a TED scraper?

|                       | Typical TED scraper               | TED Tender Monitor                                                                                                        |
| --------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Output on every run   | Every notice of the search, again | Only notices and changes since the previous run                                                                           |
| Run with nothing new  | Same rows again                   | Empty dataset (and no event charges)                                                                                      |
| Links between notices | None                              | Follows each tender: contract notice → corrigendum → award                                                                |
| Deadline changes      | You compare by hand               | `DEADLINE_CHANGED` with old and new deadline                                                                              |
| Awards                | Separate search                   | `AWARDED` with winner and awarded value, for the tenders you follow (or for every matching award with `includeAllAwards`) |
| Reminders             | No                                | `DEADLINE_SOON` N days before the deadline                                                                                |
| Query                 | TED expert query syntax           | Simple fields: keywords, CPV codes, countries, minimum value                                                              |

Each monitor keeps its state (notices already seen and tenders followed) in a named key-value store in your Apify account, so every run is compared with the previous run of the same monitor.

### Who uses it

- **SMEs and companies that bid**: new tenders of their sector and countries, every morning.
- **Tender consultancies**: one monitor per client.
- **B2B sales teams**: who wins the tenders of their market (awards with winner and value).
- **Analysts and journalists**: follow a sector or a buyer.

### Events

| `eventType`        | When                                                                                                                              | Extra fields                                                                                             |
| ------------------ | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `NEW_TENDER`       | A contract notice or prior information notice that matches your filters and was not seen before. The tender is then **followed**. | `deadline`, `estimatedValue`, `currency`                                                                 |
| `CORRIGENDUM`      | A change notice was published for a followed tender (without deadline change).                                                    | `newValue`: change description published by the buyer, or the TED change reason code (e.g. `update-add`) |
| `DEADLINE_CHANGED` | A change notice moved the submission deadline of a followed tender. One row per notice (it replaces `CORRIGENDUM`).               | `oldValue`, `newValue`: previous and new deadline                                                        |
| `AWARDED`          | An award notice was published for a followed tender (or, with `includeAllAwards`, for any tender matching your filters).          | `awardedTo`, `awardedValue`, `awardedCurrency`                                                           |
| `DEADLINE_SOON`    | A followed tender, not yet awarded, has `deadlineAlertDays` days or fewer left. Sent **once** per tender.                         | `newValue`: whole days left                                                                              |

Corrigenda and awards are reported for the tenders this monitor found as `NEW_TENDER`, even when the new notice no longer matches your keywords or value (the Actor asks TED for every notice of the procedures it follows).

### Input

| Field               | Type             | Default  | Description                                                                                                                                                          |
| ------------------- | ---------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `monitorName`       | string           | required | Name of this monitor, e.g. `cleaning-spain`. Runs with the same name are compared with each other.                                                                   |
| `keywords`          | array of strings | –        | Words or phrases searched in the title and description, in any language (`limpieza`, `cleaning services`).                                                           |
| `cpvCodes`          | array of strings | –        | CPV codes or prefixes: `90910000` or `909` (everything under 909).                                                                                                   |
| `buyerCountries`    | array of strings | all      | ISO alpha-3 codes of the buyer's country: `ESP`, `PRT`, `FRA`, `DEU`… (`ES`, `PT`… are accepted too).                                                                |
| `noticeTypes`       | array            | all four | `contract-notice`, `corrigendum`, `award`, `prior-information`. Must include `contract-notice` or `prior-information`, or `award` with `includeAllAwards`.           |
| `minEstimatedValue` | number           | –        | Minimum estimated value in **euros** for new tenders. Other currencies are converted with approximate rates. Tenders that do not publish a value are still reported. |
| `deadlineAlertDays` | integer          | `7`      | Days before the deadline for `DEADLINE_SOON`. `0` disables it.                                                                                                       |
| `lookbackDays`      | integer          | `7`      | First run only: how many days back to report as new.                                                                                                                 |
| `maxNoticesPerRun`  | integer          | `500`    | Safety limit of new notices read per run; the next run continues where this one stopped.                                                                             |
| `includeAllAwards`  | boolean          | `false`  | Also report every award notice matching your filters, even for tenders this monitor did not follow: who wins contracts in your sector, and for how much.             |

At least one of `keywords`, `cpvCodes` or `buyerCountries` is required. A notice matches when it contains **any keyword or any CPV code**, **and** its buyer is in one of the countries.

```json
{
    "monitorName": "limpieza-espana",
    "keywords": ["limpieza", "cleaning services"],
    "cpvCodes": ["909"],
    "buyerCountries": ["ESP"],
    "minEstimatedValue": 50000,
    "deadlineAlertDays": 7,
    "lookbackDays": 7
}
```

**The first run** reports the notices of the last `lookbackDays` days as `NEW_TENDER` (tenders whose deadline already passed are skipped). Later runs continue from the last processed publication date (with a one-day overlap, de-duplicated), so you never get the same notice twice.

### Output

Each dataset item is one event (examples with fictitious buyers and companies):

```json
{
    "eventType": "NEW_TENDER",
    "noticeId": "701234-2026",
    "procedureId": "3f2a9c10-1111-4c2e-9d55-0a1b2c3d4e5f",
    "noticeType": "cn-standard",
    "title": "Servicio de limpieza de edificios municipales",
    "titleEn": "Spain – Cleaning services – Servicio de limpieza de edificios municipales",
    "description": "Limpieza de los edificios municipales y colegios públicos del Ayuntamiento…",
    "descriptionEn": null,
    "language": "spa",
    "buyerName": "Ayuntamiento de Ejemplo",
    "buyerCountry": "ESP",
    "cpvCodes": ["90910000", "90919200"],
    "estimatedValue": 480000,
    "currency": "EUR",
    "deadline": "2026-11-09T14:00:00+01:00",
    "awardedTo": null,
    "awardedValue": null,
    "awardedCurrency": null,
    "oldValue": null,
    "newValue": null,
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/701234-2026",
    "publicationDate": "2026-10-12",
    "detectedAt": "2026-10-12T06:00:00.000Z",
    "monitorName": "limpieza-espana"
}
```

A deadline change of a followed tender (other fields as above):

```json
{
    "eventType": "DEADLINE_CHANGED",
    "noticeId": "712345-2026",
    "procedureId": "3f2a9c10-1111-4c2e-9d55-0a1b2c3d4e5f",
    "deadline": "2026-11-16T14:00:00+01:00",
    "oldValue": "2026-11-09T14:00:00+01:00",
    "newValue": "2026-11-16T14:00:00+01:00",
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/712345-2026"
}
```

An award:

```json
{
    "eventType": "AWARDED",
    "noticeId": "790001-2027",
    "procedureId": "3f2a9c10-1111-4c2e-9d55-0a1b2c3d4e5f",
    "awardedTo": "Limpiezas Ejemplo, S.L.",
    "awardedValue": 455000,
    "awardedCurrency": "EUR"
}
```

`title`/`description` are in the original language of the notice; `titleEn` is the English title published by TED and `descriptionEn` the English description when the buyer provided one. Descriptions are cut at 1,000 characters (open `noticeUrl` for the full notice). `deadline` is the earliest deadline among the lots.

Export the dataset as JSON, CSV, Excel or HTML, or read it with the Apify API. The **Tender events** view in the Output tab shows the main columns as a table. At the end of each run the log shows a summary: notices checked, events by type and errors.

### How to run it every day

1. Open the Actor in Apify Console, fill in the input and click **Save as a new task** (e.g. "Cleaning tenders Spain").
2. Go to **Schedules** → **Create new schedule**, choose **every day at 07:00** (cron `0 7 * * *`, your time zone) or only working days (`0 7 * * 1-5`), add the task and save.
3. Keep the same `monitorName` in the task: that name links each run to the previous one. Use one task (and one monitor name) per client or topic.

TED publishes a new edition of its journal every working day (Monday to Friday), so one run per morning is enough.

### Slack, email and Google Sheets

Use Apify integrations on the task:

- **Email**: task → **Integrations** → **Gmail**: send an email after each successful run with the dataset attached (CSV or Excel).
- **Slack**: task → **Integrations** → **Slack**: post a message to a channel after each run, with a link to the dataset.
- **Google Sheets**: use Zapier, Make or n8n (their Apify app can start on a finished run and read its dataset items) to append every event to a sheet, or the **Google Drive** integration to save each run's dataset as a file.
- **Failure alerts**: in the task's monitoring settings, add an alert for failed runs.

Because the dataset only contains news, you can send it as it is: an empty dataset means nothing happened.

### Pricing

> **Launch period: free for the first weeks.** After it, the Actor switches to the pay-per-event prices below. Apify notifies every user at least 14 days before a pricing change.

| Event          | When                                     | Price                 |
| -------------- | ---------------------------------------- | --------------------- |
| Actor start    | Once per run (charged by Apify)          | Minimal               |
| `tender-event` | Each row in the dataset (any event type) | $0.006 ($6 per 1,000) |

**You pay only for what we tell you.** A run without news charges only the start. The platform usage is small: no browser, 256 MB of memory, a few seconds per run.

Example: a typical filter with about 10 events per day → 300 events per month → **about $1.80 per month**. If you set a maximum cost per run, the Actor stops cleanly when it is reached and reports the remaining events in the next run, so nothing is lost.

### FAQ

**Why do I get a corrigendum or award for a tender that no longer matches my keywords?**
Once a tender was reported as `NEW_TENDER`, the monitor follows the whole procedure, whatever the later notices say. That is the point of following it.

**Do I get awards of tenders I never followed?**
Only if you turn on `includeAllAwards`. By default `AWARDED` is sent for the tenders this monitor reported before. With `includeAllAwards: true`, every award notice that matches your keywords, CPV codes and countries is reported as `AWARDED` (once). To watch only awards, e.g. to see which competitors win in your market, set `"noticeTypes": ["award"]` and `"includeAllAwards": true`. `minEstimatedValue` applies to the estimated value, or to the awarded value when the notice has no estimate.

**What happens with notices without an estimated value?**
They are reported even if you set `minEstimatedValue` (many buyers do not publish it, and dropping them would hide real tenders). Values in other currencies (PLN, CZK, SEK…) are converted to euros with approximate rates, only for the filter.

**Which notices are covered?**
Every notice published on TED since eForms became mandatory (October 2023) can be followed through its procedure identifier. Older notices have no procedure identifier: they can be reported as new but not followed. Prior information notices are reported as `NEW_TENDER` but TED does not link them to a procedure.

**What happens if TED is down or changes its API?**
The run fails with a clear message and the saved state is not touched, so you will not lose notices or receive false alerts. This includes API errors, a search returning 0 notices for large countries on working days, and notices with empty titles or buyers in more than 20% of cases.

**How do I start over?**
Use a new `monitorName`, or delete the key-value store `ted-monitor-<your monitor name>` in **Storage**.

**Does it download tender documents (PDFs)?**
No. It works with the notice data. Open `noticeUrl` for the full notice and the links to the procurement documents.

**I found a problem or need a field.**
Open an issue in the **Issues** tab.

***

### En español: licitaciones públicas de España y la UE

#### Cómo encontrar códigos CPV

El CPV (Vocabulario Común de Contratos Públicos) clasifica qué se compra. Es jerárquico: `90000000` incluye todo lo que empieza por `90`.

1. Busca en TED una licitación parecida a las que te interesan y mira su código CPV (aparece en el anuncio).
2. O consulta la lista oficial: [CPV en TED](https://ted.europa.eu/en/simap/cpv) (descargable en Excel) o el navegador por sector de TED (*Browse by business sector*).
3. Pon el prefijo más corto que represente tu sector: `909` en vez de `90910000` si te interesan todos los servicios de limpieza. No hace falta el dígito de control (`90910000-9` vale igual que `90910000`).

#### Ejemplos por sector

| Sector                    | `cpvCodes` | `keywords` (opcional)           |
| ------------------------- | ---------- | ------------------------------- |
| Limpieza de edificios     | `909`      | `limpieza`, `cleaning services` |
| Software y servicios TI   | `72`, `48` | `software`, `desarrollo`        |
| Obras de construcción     | `45`       | –                               |
| Mantenimiento de jardines | `7731`     | `jardinería`, `zonas verdes`    |
| Seguridad y vigilancia    | `7971`     | `vigilancia`                    |
| Comedores y catering      | `555`      | `comedor`, `catering`           |
| Material sanitario        | `33`       | –                               |
| Consultoría de empresa    | `79`       | `consultoría`                   |

Ejemplo para una empresa de limpieza que trabaja en España y Portugal, solo contratos de más de 50.000 €:

```json
{
    "monitorName": "limpieza-iberia",
    "keywords": ["limpieza", "limpeza", "cleaning services"],
    "cpvCodes": ["909"],
    "buyerCountries": ["ESP", "PRT"],
    "minEstimatedValue": 50000
}
```

#### Avisos por email cada mañana

1. Guarda tu input como tarea (**Save as a new task**).
2. En **Schedules**, crea una programación diaria a las 7:00 (`0 7 * * 1-5` para días laborables, zona horaria Europe/Madrid) con esa tarea.
3. En la tarea, **Integrations** → **Gmail**: elige "Run succeeded" y adjunta el dataset en CSV o Excel.

Cada mañana recibirás solo las licitaciones nuevas, las correcciones, los cambios de plazo, las adjudicaciones y los avisos de plazo de las licitaciones que sigues. Si no hay novedades, el dataset llega vacío.

#### Coste mensual de ejemplo

El lanzamiento es **gratis las primeras semanas**. Después, 0,006 $ por fila (evento) y nada por las ejecuciones sin novedades (salvo el arranque mínimo de Apify):

| Uso                                                        | Eventos al mes | Coste aproximado |
| ---------------------------------------------------------- | -------------- | ---------------- |
| Una pyme, un sector y un país (≈10 eventos/día)            | 300            | 1,80 $/mes       |
| Filtro amplio (≈30 eventos/día)                            | 900            | 5,40 $/mes       |
| Consultora con 5 clientes (5 monitores de ≈10 eventos/día) | 1.500          | 9 $/mes          |

#### Preguntas frecuentes

**¿La primera ejecución devuelve resultados?**
Sí: devuelve como `NEW_TENDER` las licitaciones de los últimos `lookbackDays` días (7 por defecto) cuyo plazo no ha vencido. Las siguientes ejecuciones solo traen novedades.

**¿Busca en todos los idiomas?**
Las palabras clave se buscan en el título y la descripción de los anuncios en cualquier idioma, pero tal cual las escribes: pon las variantes que necesites (`limpieza`, `limpeza`, `nettoyage`). El título en inglés que publica TED incluye la descripción del CPV, así que una palabra clave en inglés (`cleaning services`) también encuentra anuncios de otros idiomas de ese sector.

**¿Incluye la Plataforma de Contratación del Sector Público?**
No: solo TED, donde se publican las licitaciones que superan los umbrales europeos (y muchas que no). Las licitaciones pequeñas que solo están en plataformas nacionales no aparecen.

**¿Qué pasa si una licitación cambia de plazo varias veces?**
Recibes un `DEADLINE_CHANGED` por cada anuncio de corrección que lo mueva, con el plazo anterior y el nuevo. El aviso `DEADLINE_SOON` se envía una sola vez por licitación.

**¿Cuánto tiempo sigue una licitación?**
Hasta 365 días después de su plazo de presentación (hay adjudicaciones que se publican 9 meses después del plazo). Las adjudicaciones posteriores no se notifican, salvo que actives `includeAllAwards`.

**¿Puedo ver a quién se adjudican los contratos de mi sector?**
Sí: activa `includeAllAwards` y pon `"noticeTypes": ["award"]`. Recibirás cada adjudicación que cumpla tus filtros con el adjudicatario (`awardedTo`) y el importe (`awardedValue`). En una prueba real, limpieza (CPV 909) en España dio 27 adjudicaciones en 7 días.

# Actor input Schema

## `monitorName` (type: `string`):

Identifier of this monitor, e.g. "cleaning-spain". The saved state is separated by this name: runs with the same name are compared with each other. Use one name per client or topic.

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

Words or phrases searched in the title and description of the notices, in any language (e.g. "limpieza", "cleaning services"). A notice matches if it contains ANY keyword OR any of the CPV codes below. Multi-word keywords are searched as phrases; words are stemmed by TED.

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

Common Procurement Vocabulary codes, e.g. "90910000" (cleaning services). Prefixes are accepted: "909" matches every code starting with 909. Codes are hierarchical, so 90900000 also includes 90910000, 90911000, etc.

## `buyerCountries` (type: `array`):

Countries of the contracting authority, as ISO 3166-1 alpha-3 codes (e.g. "ESP", "PRT", "FRA", "DEU"). Empty = all countries.

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

Which kinds of notices you want to hear about. Contract notices and prior information notices are reported as NEW_TENDER; corrigenda (CORRIGENDUM, DEADLINE_CHANGED) and awards (AWARDED) are reported for the tenders this monitor already follows. Empty = all four.

## `minEstimatedValue` (type: `number`):

Only report new tenders whose estimated value is at least this amount in euros. Values in other currencies are converted with approximate rates. Tenders that do not publish an estimated value are still reported. Empty = no minimum.

## `deadlineAlertDays` (type: `integer`):

Send one DEADLINE_SOON event when a followed tender has this many days or fewer left to submit offers. 0 disables the alert.

## `lookbackDays` (type: `integer`):

Only used on the first run of a monitor: how many days back to report as NEW_TENDER. Later runs continue from the last processed publication date.

## `maxNoticesPerRun` (type: `integer`):

Safety limit on the number of notices read from TED in one run. If it is reached, the next run continues where this one stopped.

## `includeAllAwards` (type: `boolean`):

Also report award notices (AWARDED) that match your filters for tenders this monitor did not follow, e.g. to see which companies win contracts in your sector. Requires "award" in the notice types (or leaving them empty). Off by default: awards are then reported only for tenders this monitor found earlier.

## Actor input object example

```json
{
  "monitorName": "cleaning-spain",
  "keywords": [
    "limpieza",
    "cleaning services"
  ],
  "cpvCodes": [
    "909"
  ],
  "buyerCountries": [
    "ESP"
  ],
  "deadlineAlertDays": 7,
  "lookbackDays": 7,
  "maxNoticesPerRun": 500,
  "includeAllAwards": false
}
```

# Actor output Schema

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

No description

# 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 = {
    "monitorName": "cleaning-spain",
    "keywords": [
        "limpieza",
        "cleaning services"
    ],
    "cpvCodes": [
        "909"
    ],
    "buyerCountries": [
        "ESP"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("puchus-monitoring/ted-tender-monitor").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 = {
    "monitorName": "cleaning-spain",
    "keywords": [
        "limpieza",
        "cleaning services",
    ],
    "cpvCodes": ["909"],
    "buyerCountries": ["ESP"],
}

# Run the Actor and wait for it to finish
run = client.actor("puchus-monitoring/ted-tender-monitor").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 '{
  "monitorName": "cleaning-spain",
  "keywords": [
    "limpieza",
    "cleaning services"
  ],
  "cpvCodes": [
    "909"
  ],
  "buyerCountries": [
    "ESP"
  ]
}' |
apify call puchus-monitoring/ted-tender-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,puchus-monitoring/ted-tender-monitor"
        }
    }
}
```

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/RptZfwXHqd7lBMdpX/builds/NrDdygtP2aFffLjRW/openapi.json
