# German Public Tenders (`subrosa/bund-tenders`) Actor

Returns current German public procurement notices from the service.bund.de tender feed and the EU TED search API, without contact persons.

- **URL**: https://apify.com/subrosa/bund-tenders.md
- **Developed by:** [Sub Rosa](https://apify.com/subrosa) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## German Public Tenders

Returns current German public procurement notices from two public sources: the service.bund.de tender feed, which carries federal, state and municipal calls for bids imported from the German e-procurement platforms, and the EU Tenders Electronic Daily (TED) search API, filtered to German contracting authorities and calls for competition. Each item carries the notice id and canonical URL, the title, the contracting authority as an organisation, its city where the source states one, the place of performance, the procedure type, the CPV codes, the publication time, the deadline for tenders, a short description, the notice type, the link to the procurement documents, and the country. Field values stay in the source language, German. The data is fetched logged out, as it stands at the moment of the run, with two requests to service.bund.de (its robots.txt, then the feed, thirty seconds apart, as that site's robots.txt asks) and one API call to TED for a default run of 150 items, which takes about 36 seconds, thirty of them the wait between those two requests. The `result` price is $0.004 per item, with a $0.02 charge per run.

No contact person is collected. German notices name an Ansprechpartner with a phone number and an email address; TED notices carry contact points with names, phones and emails; the service.bund.de feed sometimes appends a contact block to the authority's name. None of that is in the output: the extractor never requests the TED contact fields, cuts contact blocks off the authority name, and passes every text value through the house contact filter, which drops a sentence that carries an email address, a phone-shaped number or a person and leaves reference numbers alone. It is a filter, not a guarantee. See Limits and honesty and Legal below.

### Who uses it

- A bid manager at a construction, IT or facilities company who checks new tenders every morning: pulls both sources daily, filters `cpvCodes` and `placeOfPerformance` for the trades and regions they serve, sorts by `deadlineAt`, and opens `documentsUrl` or `url` for the ones worth a bid.
- A procurement analyst or a journalist tracking public spending: pulls `ted` with a `cpv` list over several weeks, keeps `contractingAuthority`, `authorityCity`, `procedureType` and `publishedAt`, and measures which authorities buy what, how often they use negotiated procedures, and how long they leave for bids.
- A developer building a tender alerting service: runs the Actor on a schedule with `query` set to a customer's keywords, deduplicates on `id` against the previous run, and sends the new notices with their `deadlineAt` to subscribers.

### Sample output

One real item from a real run, as JSON:

```json
{
    "id": "661404-2026",
    "url": "https://ted.europa.eu/de/notice/-/detail/661404-2026",
    "sourceUrl": "https://api.ted.europa.eu/v3/notices/search",
    "scrapedAt": "2026-09-26T11:48:12.773Z",
    "source": "ted",
    "title": "Deutschland – Technische Unterstützung – Stationsbetreuung an der Flugwetterwarte Frankfurt des Deutschen Wetterdienstes (DWD)",
    "contractingAuthority": "Deutscher Wetterdienst",
    "authorityCity": "Offenbach am Main",
    "placeOfPerformance": "Frankfurt am Main",
    "procedureType": "open",
    "cpvCodes": ["71356300"],
    "publishedAt": "2026-09-24T22:00:00.000Z",
    "deadlineAt": "2026-11-02T22:59:00.000Z",
    "description": "Stationsbetreuung an der Flugwetterwarte Frankfurt des Deutschen Wetterdienstes (DWD) gemäß Leistungsbeschreibung",
    "noticeType": "cn-standard",
    "documentsUrl": "https://www.evergabe-online.de/tenderdocuments.html?id=893489",
    "country": "DE"
}
```

Ten items, five from each source, including a negotiated procedure and an award notice from the feed, are in `sample.json`.

### Data dictionary

Every field is present on every item. Fields a source does not state are `null`, never missing and never an empty string.

| Field                  | Type           | Meaning                                                                                                                                                                                                                                            | Example                                                  |
| ---------------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `id`                   | string         | The source's own identifier. TED: the publication number. bund: the importing platform's code and the notice's file name from the notice path                                                                                                      | `"661404-2026"`, `"asp-198300"`                          |
| `url`                  | string         | Canonical notice page. TED: the German-language page on ted.europa.eu. bund: the notice page on service.bund.de                                                                                                                                    | `"https://ted.europa.eu/de/notice/-/detail/661404-2026"` |
| `sourceUrl`            | string         | Where the record was extracted from: the feed URL or the TED search endpoint                                                                                                                                                                       | `"https://api.ted.europa.eu/v3/notices/search"`          |
| `scrapedAt`            | string         | Extraction time, ISO 8601, UTC                                                                                                                                                                                                                     | `"2026-09-26T11:48:12.773Z"`                             |
| `source`               | string         | `bund` or `ted`                                                                                                                                                                                                                                    | `"ted"`                                                  |
| `title`                | string or null | Title in the source language, passed through the house contact filter (see Limits and honesty); reference numbers in titles stay. TED titles start with the country and the CPV label, as the source writes them                                   | `"Bodenbeschichtung 2. BA"`                              |
| `contractingAuthority` | string or null | The contracting authority (Vergabestelle, buyer) as an organisation, contact blocks and any `c/o` handling office cut off. TED: the first buyer when a notice names several                                                                        | `"Stadt Erlangen"`                                       |
| `authorityCity`        | string or null | City of the contracting authority. TED only; the feed does not state it                                                                                                                                                                            | `"Offenbach am Main"`                                    |
| `placeOfPerformance`   | string or null | Place of performance as the source gives it. bund: postcode and town (Erfüllungsort). TED: the procedure-level city when stated                                                                                                                    | `"91054 Erlangen"`                                       |
| `procedureType`        | string or null | TED procedure code: `open`, `restricted`, `neg-w-call`, `neg-wo-call`, `comp-dial`, `innovation`, `oth-single`, `oth-mult`. Null for bund                                                                                                          | `"neg-w-call"`                                           |
| `cpvCodes`             | array or null  | Distinct CPV codes, eight digits without the check digit. Null for bund, which the feed does not classify                                                                                                                                          | `["45215130", "42512300"]`                               |
| `publishedAt`          | string or null | Publication time, ISO 8601, UTC. bund: the feed's own timestamp. TED gives a calendar date with a Central European offset, so `publishedAt` is midnight of that date in that offset, and a 25 September notice reads `2026-09-24T22:00:00.000Z`    | `"2026-09-26T10:15:21.000Z"`                             |
| `deadlineAt`           | string or null | Deadline for tenders (Angebotsfrist), ISO 8601, UTC. bund: Berlin local time converted. TED: the earliest lot deadline for tenders, or for requests to participate when the procedure has no tender deadline yet. Null when the source states none | `"2026-10-27T09:30:00.000Z"`                             |
| `description`          | string or null | Short description in the source language, at most 500 characters, passed through the house contact filter sentence by sentence. TED only                                                                                                           | `"Ersatzbeschaffung Computertomograph"`                  |
| `noticeType`           | string or null | TED notice type code (`cn-standard`, `cn-social`, `cn-desg`, `pin-cfc-standard`, `subco` and others). bund: `Ausschreibung`, or `Vergebener Auftrag` for the award notices the feed also carries, which the source marks only by a title prefix    | `"cn-standard"`                                          |
| `documentsUrl`         | string or null | The procurement documents or the procedure page on the buyer's e-procurement platform, when the notice states one. TED only                                                                                                                        | `"https://www.subreport.de/E85775996"`                   |
| `country`              | string         | Always `DE`                                                                                                                                                                                                                                        | `"DE"`                                                   |

### Input

| Field                | Type             | Default                | Meaning                                                                                                                                                                                                                                                                                                                               |
| -------------------- | ---------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sources`            | array of strings | both                   | Any of `bund` (the service.bund.de tender feed) and `ted` (the TED search API, German buyers, calls for competition, newest first). `maxItems` is split evenly across the chosen sources, so a default run returns 75 of each.                                                                                                        |
| `query`              | string           | empty                  | Optional keyword. For `ted` it is sent as a full-text term to the search API. For `bund` it is a case-insensitive match on title, contracting authority and place of performance, applied after the feed is fetched, because service.bund.de's own search is disallowed by its robots.txt.                                            |
| `cpv`                | array of strings | empty                  | Optional CPV codes, with or without the check digit (`45000000`, `90500000-2`). Matching on TED is hierarchical, so `45000000` returns every construction notice; a short prefix such as `45` is padded to a division code. The feed carries no CPV codes, so when this list is set the `bund` source is skipped and the log says so. |
| `maxItems`           | integer          | 150                    | Stop after this many items, shared evenly across the chosen sources. The feed holds about 500 current notices; TED pages up to 15,000 per query, 250 per call. When one source runs out, items already fetched from the other fill the remainder.                                                                                     |
| `proxyConfiguration` | object           | Apify datacenter proxy | Standard Apify proxy settings. Datacenter proxies are sufficient for both sources.                                                                                                                                                                                                                                                    |

### Pricing

Pay per event, two events. `actor-start`: $0.02, once per run, covers the fixed overhead of starting. `result`: $0.004 per item, that is $4 per 1,000 items. Items are pushed and charged in the same step, so a run never delivers more items than it charges for, and a run stops cleanly when your maximum charge is reached. A default run of 150 items costs $0.62.

Measured platform cost: the default run makes four requests, two robots.txt fetches, the feed and one TED call, about 1.0 MB in all (the feed is 356 KB and holds 500 notices; a TED page of 75 notices is about 680 KB, most of it the per-language links the API returns whether asked or not), and the crawler runs for about 33 seconds inside a 36 second process, thirty of them waiting out the service.bund.de crawl delay, so the compute cost is dominated by idle time. Scaled to 1,000 items that is one feed request plus two to four TED calls of 250 notices, roughly 5 to 10 MB and ten seconds of crawl time, which at Apify's list prices ($0.40 per compute unit at 1 GB of memory, $0.20 per GB of transfer) is about $0.005 per 1,000 items. The $4 price is therefore roughly 800 times the platform cost, well above the house floor of three times.

Free allowance: Apify's free plan carries $5 of usage a month. At these prices that covers eight default runs of 150 items ($0.62 each, $4.96 in all), or about 1,240 items across fewer, larger runs, before a paid plan is needed.

### Limits and honesty

- The feed is the whole of the service.bund.de source. The portal's search form, its per-search feeds and its notice pages sit under paths its robots.txt disallows or asks to be fetched no faster than one request every 30 seconds, so this Actor reads the public tender feed only, once per run, thirty seconds after reading robots.txt, and takes what the feed states: title, contracting authority, place of performance, publication time and deadline. Procedure type, CPV codes, description and the documents link are on the notice pages and are null for bund items. The feed holds about 500 current notices, newest first; a run asking for more than that from `bund` stops at the feed's end and says so in the log.
- The feed mixes in award notices. The source's own tender feed carries a few "Vergebener Auftrag" items marked only by that title prefix; they are returned with `noticeType` set to `Vergebener Auftrag` rather than silently dropped, and their `deadlineAt` is the original bid deadline, already past.
- TED is limited to calls for competition by German buyers. The query is `buyer-country=DEU AND form-type=competition`, scope ACTIVE (deadline not yet passed), latest version of each notice only, newest first. Planning notices, award notices and modifications are not returned; a notice whose deadline has passed is not returned either. Notices from German buyers below the EU thresholds do not appear on TED at all; that is what the feed is for.
- `publishedAt` for TED is a date, not a time. The API gives the calendar date of the OJ S issue with an offset; it is expressed as midnight in that offset, in UTC. Filter on the day, not the hour.
- `deadlineAt` is the earliest deadline across lots. A multi-lot procedure with different deadlines per lot reports the earliest; the notice page has the rest.
- The contact filter works by shape, not by counting digits. A phone number is recognised by the way phone numbers are written (`+49 30 ...`, `030 / ...`, `Tel.: ...`), so reference numbers, dates, year ranges and house numbers in titles and descriptions stay as written (`020-26-00277`, `Z25-5-2026-0009`, `22+24`). The filter drops a whole sentence when it carries an email address, a phone-shaped number, an honorific (`Herr`, `Dr.`), a role word followed by a name, or a licence number, and it also drops a parenthesis holding two capitalised words, which in German is sometimes a place or a product (`(Landkreis Stade)`, `(Geschirr Porzellan)` go). It is a filter, not a guarantee: a person named in a form the filter does not recognise can come through, and a sentence the filter reads as contact data goes even when it was not.
- Names are organisations only. `contractingAuthority` is the buyer as an organisation; a project name that happens to carry a person's name (a school named after someone) is the project's name and stays.
- Field values are German. Titles, authority names, places and descriptions stay in the source language; codes (`procedureType`, `noticeType`) are TED's English codes.
- Not collected, on purpose: contact persons, phone and fax numbers, email addresses, the buyer's street address and website, tenderer and subcontractor details, estimated values, award criteria, lot structures beyond the earliest deadline, and the notice text beyond the short description.
- The sources change. TED versions its API (v3 now; v2 stays until v4 exists) and the feed is generated by the portal's content system. When either changes shape, the daily test fails, the house status page shows this Actor as under maintenance, a fix ships, and the changelog records it.
- Running locally without an Apify login: set `proxyConfiguration` to `{ "useApifyProxy": false }` in the input, otherwise the SDK tries the Apify proxy without credentials.

### Legal

Sources assessed and not used. evergabe-online.de answers a plain request with a cookie wall (HTTP 400, "Cookies benötigt", checked 2026-09-26) and is out under Rule 1. The Deutsches Vergabeportal (dtvp.de) shows notices logged out, but its terms for bidders (https://dtvp.de/agb-unternehmen, Stand April 2026) say "Unzulässig sind systematische Abrufe der Auftragsbekanntmachungen sowie der Vergabeunterlagen um damit eigene kommerzielle Angebote anzubieten oder diese damit anzureichern", which is exactly the use a listed dataset is, so it is out. The service.bund.de search form is under a path its robots.txt disallows and is not fetched.

Robots, service.bund.de. The file at https://www.service.bund.de/robots.txt was checked on 2026-09-26. Its single `User-agent: *` group disallows `/Content/DE/Behoerden/Suche/`, `/Content/DE/Stellen/Suche/`, `/Content/DE/Ausschreibungen/Suche/` and `/SiteGlobals/` (allowing three asset folders under it), and sets `Crawl-delay: 30`. The tender feed at `/Content/Globals/Functions/RSSFeed/RSSGenerator_Ausschreibungen.xml` is under none of those paths and is allowed. This Actor makes two requests to service.bund.de per run, robots.txt and then the feed, thirty seconds apart: the crawler's `sameDomainDelaySecs` is set to the site's Crawl-delay of 30, and the robots.txt fetch is counted as the first access to the host, so the wait holds by construction rather than by hope. The delay is kept per registrable domain, so TED, on another host, does not wait behind the bund fetch; the setting is crawler-wide, though, so TED's own pages are also spaced thirty seconds apart, which a default run (one TED call) never notices. The disallowed search form, its per-search feeds and the `/IMPORTE/` notice pages are never fetched. The crawler reads robots.txt again at the start of every run, under the declared identity, and skips anything that has since become disallowed.

Terms, service.bund.de. The portal is published by the Bundesverwaltungsamt (Impressum, https://www.service.bund.de/Content/DE/Service/Impressum/impressum\_node.html). Its "Rechtliche Hinweise" say under Urheberrecht: "Das Copyright für Texte und Bilder liegt bei eigenen Inhalten beim Bundesverwaltungsamt. Bei den Inhalten anderweitiger Anbieter verbleibt das Copyright bei der einstellenden Behörde. Auf dem Portal zur Verfügung gestellte Texte, Textteile, Grafiken, Tabellen oder Bildmaterialien dürfen, soweit diese urheberrechtlich geschützt sind, ohne vorherige Zustimmung des Bundesverwaltungsamtes nicht vervielfältigt, nicht verbreitet und nicht ausgestellt werden." The same page says the portal is "als reine Bekanntmachungsplattform analog einer Litfaßsäule konzipiert" and that the contracting authorities are responsible for the notices they place. The RSS page (https://www.service.bund.de/Content/DE/Service/RSS/rss\_node.html) offers the tender feed to anyone, says that for subscribing "keine Registrierung oder Anmeldung mit einer E-Mail-Adresse erforderlich" ist (no registration or sign-in with an email address is needed), and calls the feeds "pro bono"-Dienste and secondary publication channels that should not be the only channel one relies on. The house holds no account there and never logs in. The notices are public procurement notices that contracting authorities publish because procurement law requires it. The Impressum's reservation applies, in its own words, only "soweit diese urheberrechtlich geschützt sind", and public procurement notices are amtliche Bekanntmachungen: § 5 Abs. 1 UrhG (amtliche Werke) says "Gesetze, Verordnungen, amtliche Erlasse und Bekanntmachungen sowie Entscheidungen und amtlich verfaßte Leitsätze zu Entscheidungen genießen keinen urheberrechtlichen Schutz", so the notices themselves are outside the copyright the Impressum reserves. What this Actor takes from each feed entry is in any case the title, the authority's name, the place, the publication time and the deadline, which are the facts of an official notice, not editorial text. Germany has a database right (Urheberrechtsgesetz, sections 87a and following); the feed is the operator's own syndication channel, offered without registration and as a "pro bono" service for exactly this kind of machine reading, and the Actor takes at most the feed's own 500 entries, once per run. This Actor fetches only that logged-out public feed, at most 20 requests a minute across both sources and two at a time, under the declared identity `SubRosaBot/1.0` (`SubRosaBot/1.0 (+https://subrosa.dev/bots)` in full), with header generation off, no session pool and no cookies kept. If the Bundesverwaltungsamt asks the house to stop, in any form, the Actor is unpublished the same day and the changelog says why.

Robots and terms, TED. The API host https://api.ted.europa.eu has no robots.txt (404, checked 2026-09-26), so no path is disallowed there; the portal's own file at https://ted.europa.eu/robots.txt disallows dynamic search result URLs, and this Actor never fetches the portal, it only links to it. The TED developer documentation (https://docs.ted.europa.eu/api/latest/index.html) says: "TED API allows anonymous access to all services manipulating published notices (i.e., searching for or retrieving notices already published on TED)", and of the Search API (https://docs.ted.europa.eu/api/latest/search.html): "Note that this API is primarily targeted at data reusers and does not require authentication, making it openly accessible to any system or user." No key is used and none is needed. The TED legal notice (https://ted.europa.eu/en/legal-notice), implementing Commission Decision 2011/833/EU, says: "Unless otherwise noted, the procurement notices published in the Supplement to the Official Journal of the European Union can be freely reused, for commercial or non-commercial purposes." The site's editorial content is under CC BY 4.0 and its metadata under CC0 1.0; the TED logo may not be used, and this Actor does not use it. The API's own documentation sets no rate limit; this Actor makes one call per 250 notices, thirty seconds apart when a run needs more than one (the same per-domain delay the service.bund.de Crawl-delay sets, applied to every host), never more than 20 requests a minute, under the same declared identity.

Personal data. TED notices carry contact points for the buyer, the documents provider, the review body and others, each with a person's name, phone, fax and email (the API fields named `organisation-person-*`, `touchpoint-tel-*`, `touchpoint-fax-*`, `organisation-email-*`, `touchpoint-contact-point-*`, `organisation-street-*`); this Actor never requests any of them. Its field list is the fifteen fields in `src/extract.js`, none of which names a person. The service.bund.de notice pages show an Ansprechpartner with phone and email; those pages are not fetched, and where the feed itself appends a contact block to the Vergabestelle (a street address, "Tel.:", "Fax:", "E-Mail:", "Internet:") or names the office handling the procedure after "c/o", everything from the first such marker on is cut before output, so the organisation's name and, at most, its postal address remain. Every text value then passes through the house contact filter, `stripContactProse` from the shared scrub module, which drops a sentence carrying an email address, a phone-shaped number, an honorific or a role word followed by a name; it is a filter, not a guarantee, and the Limits section above says what it catches and what it costs. The only names returned are the names of contracting authorities, which are organisations; under the house ruling on government records, the place of performance is the record and stays.

You. A buyer who holds an account at any of these sources is bound by the terms they accepted there, and is responsible for whether and how they use this data. You are responsible for your downstream use of the output and for the law that applies to you, including the attribution the TED reuse notice asks for when TED data is republished.

### Changelog

- 2026-09-26: review fixes. `sameDomainDelaySecs` set to service.bund.de's Crawl-delay of 30 and the robots.txt fetch counted as the first access, so the feed follows robots.txt thirty seconds later. Contact scrubbing moved to the shared shape-based filter (`src/scrub.js`); reference numbers in titles (`020-26-00277`, `Z25-5-2026-0009`) are no longer cut. Legal section names § 5 UrhG. Tests use the shared module and invented fixtures.
- 2026-09-26: first release. Sources: service.bund.de tender feed and the TED search API (v3). evergabe-online.de rejected (cookie wall), dtvp.de rejected (terms forbid systematic retrieval for commercial offers).

### Support

Open an issue on the Actor's Issues tab. Replies within one day.

# Changelog

This Actor's version history is a separate document: https://apify.com/subrosa/bund-tenders/changelog.md

# Actor input Schema

## `sources` (type: `array`):

Which sources to read. bund is the service.bund.de tender feed (federal, state and municipal notices, one feed request per run). ted is the EU Tenders Electronic Daily search API, filtered to German contracting authorities and calls for competition. maxItems is shared evenly across the chosen sources.

## `query` (type: `string`):

Optional keyword. For ted it is sent as a full-text term to the TED search API. For bund it is applied after fetching, as a case-insensitive match on title, contracting authority and place of performance, because service.bund.de's own search is disallowed by its robots.txt. Leave empty for no filter.

## `cpv` (type: `array`):

Optional list of CPV codes, for example 45000000 or 90500000-2. Matching is hierarchical on TED, so 45000000 returns every construction notice. Short prefixes such as 45 are padded to a division code. The bund feed carries no CPV codes, so when this list is set the bund source is skipped and the log says so.

## `maxItems` (type: `integer`):

Stop after this many items, shared evenly across the chosen sources. The default is sized so the default run finishes in well under five minutes. The bund feed holds about 500 notices; TED can page up to 15,000 per query.

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

Apify proxy settings. Datacenter proxies are enough for both sources; residential proxies are not needed and cost more.

## Actor input object example

```json
{
  "sources": [
    "bund",
    "ted"
  ],
  "query": "",
  "cpv": [],
  "maxItems": 150,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

# 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 = {
    "sources": [
        "bund",
        "ted"
    ],
    "query": "",
    "cpv": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("subrosa/bund-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 = {
    "sources": [
        "bund",
        "ted",
    ],
    "query": "",
    "cpv": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("subrosa/bund-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 '{
  "sources": [
    "bund",
    "ted"
  ],
  "query": "",
  "cpv": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call subrosa/bund-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,subrosa/bund-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/DvChuBEglqxV7UW4A/builds/kpu77L1HF4oggvQnT/openapi.json
