# Public Tenders Scraper — TED EU, UK FTS & US SAM.gov RFP (`logiover/global-public-tenders-scraper`) Actor

Aggregate live government tenders & RFPs from EU TED (27 states), UK Find-a-Tender, US SAM.gov in one normalized feed. Filter by keyword, country, CPV/NAICS, contract nature, value, deadline. Official open APIs — no proxy. For bid teams, RFP agencies, gov-contracting and procurement intel.

- **URL**: https://apify.com/logiover/global-public-tenders-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Global Public Tenders & RFP Scraper — EU TED, UK Find-a-Tender, US SAM.gov

Aggregate live **government tenders, RFPs and contract opportunities** from **EU TED (Tenders Electronic Daily, all 27 EU member states + Norway + Switzerland), UK Find-a-Tender service and US SAM.gov** in one normalized JSON feed.

Built on official open APIs — **no proxy, no scraping, no anti-bot fight**. Filter by keyword, country, CPV / NAICS procurement code, contract nature (works / supplies / services), procedure type, buyer name, value range, deadline and publication date.

Perfect for **government contractors**, **bid management teams**, **RFP-as-a-service agencies**, **defense / IT consulting firms**, **management consultants chasing public-sector work**, and **procurement intelligence platforms**.

---

### 🚀 What does this Tenders scraper do?

| Source | What you get | Coverage |
|--------|--------------|----------|
| **TED EU** (`ted_eu`) | Every public-procurement notice published in the EU Official Journal — open calls, award notices, prior information notices, contract modifications | All 27 EU member states + Norway + Switzerland · ~3M notices / year · €2.4 trillion annual public procurement |
| **UK Find-a-Tender** (`uk_fts`) | All UK central + local government contracts above the WTO GPA threshold (~£139k for goods/services, £5.4m for works), in Open Contracting Data Standard (OCDS) format | England, Wales, Scotland, Northern Ireland · ~80k notices / year |
| **US SAM.gov** (`sam_gov`) | Every federal contract opportunity, sources-sought notice, presolicitation, award and special notice | US federal government · ~30k active opportunities |

Every record is normalized into the **same schema** — same field names, same units, same ISO date format — so you can filter, dedupe and ship straight to a CRM, BI tool, or Slack alert.

---

### 💡 Use cases

- **Bid teams** — daily digest of every IT-services tender in DACH + UK + US delivered into Slack
- **Procurement-intelligence SaaS** — bulk-backfill historical contracts to seed search / analytics
- **Government-contractor lead-gen** — feed every "open" notice into HubSpot with deadline countdown
- **Defense / IT consulting** — track every notice with CPV `72*` (IT) across the EU + UK + NAICS `541511/541512` in the US
- **Grant / EU funding consultancies** — sweep TED daily for relevant calls
- **M&A and competitive intel** — see which contractors are being awarded what, and at what value
- **Press / policy research** — TED contains every public-sector contract above WTO thresholds in the EU; great for transparency reporting

---

### ⚙️ Input configuration

#### Common (apply to all sources)

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `sources` | `string[]` | `["ted_eu","uk_fts"]` | Which portals to query. Mix any of `ted_eu`, `uk_fts`, `sam_gov`. |
| `keywords` | `string[]` | `[]` | Free-text terms matched against title + description per source. Each term triggers a separate query per source. |
| `publishedFrom` | `string` | last 7 days | Earliest publication date (`YYYY-MM-DD`). |
| `publishedTo` | `string` | today | Latest publication date (`YYYY-MM-DD`). |
| `maxResultsPerSource` | `integer` | `1000` | Hard cap per source. `0` = unlimited (auto-paginates until exhausted). |
| `language` | `string` | `"eng"` | Preferred language for TED multilingual fields (titles, descriptions, buyer names). Falls back to any available language. |

#### TED EU (`ted_eu`) — specific

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `tedCountries` | `string[]` | `[]` | ISO **alpha-3** buyer-country codes: `DEU`, `FRA`, `ITA`, `ESP`, `NLD`, `POL`, `BEL`, `AUT`, `SWE`, `DNK`, `FIN`, `IRL`, `PRT`, `GRC`, `CZE`, `ROU`, `HUN`, `NOR`, `CHE`, etc. |
| `tedCpvCodes` | `string[]` | `[]` | **Common Procurement Vocabulary** codes. Prefix match supported — `72` returns all IT codes, `45` all construction. |
| `tedContractNature` | `string[]` | `[]` | `works` / `supplies` / `services`. |
| `tedNoticeTypes` | `string[]` | `[]` | Notice type codes: `cn-standard`, `can-standard`, `pin-only`, `cn-social`, `can-modif`, etc. |

#### UK Find-a-Tender (`uk_fts`) — specific

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `ukKeywords` | `string` | `""` | Optional keyword override (UK API supports a single string). |

#### SAM.gov (`sam_gov`) — specific

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `samGovApiKey` | `string` | `""` | **Required** if `sam_gov` is enabled. Free, request at https://sam.gov/profile/details (Account Details → API Keys). |
| `samGovNaicsCodes` | `string[]` | `[]` | NAICS industry codes — `541511` (custom software), `541512` (IT consulting), `541330` (engineering services). |
| `samGovNoticeTypes` | `string[]` | `[]` | `p` (Presolicitation), `o` (Solicitation), `k` (Combined Synopsis), `r` (Sources Sought), `a` (Award), `s` (Special). |

---

### 📦 Output schema (normalized across all sources)

| Field | Description | Example |
|-------|-------------|---------|
| `source` | `"ted_eu"`, `"uk_fts"`, or `"sam_gov"` | `"ted_eu"` |
| `noticeId` | Source-native notice identifier | `"334744-2026"` |
| `noticeType` | Native type code | `"cn-standard"` |
| `noticeSubtype` | Sub-classification | `"can-standard"` |
| `title` | Notice title (preferred-language) | `"Germany – Industry specific software package..."` |
| `titleAllLanguages` | TED multilingual title object | `{"eng":"...","fra":"...","deu":"..."}` |
| `description` | Long description | `"Beschaffung einer Softwarelösung zur..."` |
| `buyerName` | Contracting authority name | `"ITSCare GmbH"` |
| `buyerCountry` | ISO alpha-3 (TED), alpha-2 (UK/SAM) | `"DEU"` |
| `buyerCity` | Buyer city | `"Berlin"` |
| `buyerEmail` | Contact email if published | `"procurement@..."` |
| `placeOfPerformance` | Country / region codes | `["DEU","BAV"]` |
| `procurementType` | `works` / `supplies` / `services` | `"supplies"` |
| `procedureType` | Procedure type code | `"open"` |
| `cpvCodes` | CPV codes (TED / UK) | `["48100000","72240000"]` |
| `naicsCodes` | NAICS codes (SAM.gov) | `["541511"]` |
| `estimatedValueAmount` | Estimated value | `250000` |
| `estimatedValueCurrency` | Currency | `"EUR"` |
| `publishedDate` | ISO date | `"2026-05-18"` |
| `deadlineDate` | Submission deadline | `"2026-06-15T17:00:00"` |
| `lastUpdated` | Last revision timestamp | `"2026-05-18T08:21:42+01:00"` |
| `noticeUrl` | Source notice URL | `"https://ted.europa.eu/.../334744-2026"` |
| `documentUrls` | Linked tender docs | `["https://.../document.pdf"]` |
| `language` | Notice language | `"eng"` |
| `ocidGlobalId` | OCDS global ID (UK) | `"ocds-h6vhtk-069aa3"` |
| `setAside` | Set-aside program (SAM.gov) | `"SBA"` |
| `responseUrl` | Where to submit / view | `"https://..."` |
| `rawSource` | Full raw source payload | `{...}` |
| `scrapedAt` | UTC scrape timestamp | `"2026-05-18T07:30:00Z"` |

---

### 🧪 Example inputs

#### 1. Daily IT-services watch across the EU + UK

```json
{
  "sources": ["ted_eu", "uk_fts"],
  "keywords": ["software", "cloud", "cybersecurity"],
  "tedCpvCodes": ["72"],
  "publishedFrom": "2026-05-15",
  "publishedTo": "2026-05-18",
  "maxResultsPerSource": 500
}
````

#### 2. Construction tenders in Germany, France, Italy (this week)

```json
{
  "sources": ["ted_eu"],
  "tedCountries": ["DEU", "FRA", "ITA"],
  "tedCpvCodes": ["45"],
  "tedContractNature": ["works"],
  "publishedFrom": "2026-05-12",
  "publishedTo": "2026-05-18",
  "maxResultsPerSource": 2000
}
```

#### 3. UK central-government contracts mentioning AI

```json
{
  "sources": ["uk_fts"],
  "ukKeywords": "artificial intelligence",
  "publishedFrom": "2026-04-01",
  "publishedTo": "2026-05-18",
  "maxResultsPerSource": 500
}
```

#### 4. US federal IT-services opportunities + EU IT tenders

```json
{
  "sources": ["sam_gov", "ted_eu"],
  "samGovApiKey": "YOUR_KEY_HERE",
  "samGovNaicsCodes": ["541511", "541512", "541519"],
  "samGovNoticeTypes": ["o", "k", "r"],
  "tedCpvCodes": ["72"],
  "publishedFrom": "2026-05-01",
  "publishedTo": "2026-05-18"
}
```

#### 5. Historical backfill — every open call in Belgium from Q1 2026

```json
{
  "sources": ["ted_eu"],
  "tedCountries": ["BEL"],
  "tedNoticeTypes": ["cn-standard"],
  "publishedFrom": "2026-01-01",
  "publishedTo": "2026-03-31",
  "maxResultsPerSource": 0
}
```

#### 6. Multilingual TED with German titles

```json
{
  "sources": ["ted_eu"],
  "tedCountries": ["DEU", "AUT", "CHE"],
  "keywords": ["Beratung"],
  "language": "deu"
}
```

***

### 🧠 How it works

#### TED EU (api.ted.europa.eu/v3/notices/search)

- **POST** with an Expert-Search query string (`publication-date>=20260501 AND organisation-country-buyer=DEU AND notice-title=software`).
- Field-equality is a substring match by default; combined with `AND`, `OR`, `NOT`, parentheses.
- Pagination via `iterationNextToken` — actor follows tokens until the source is exhausted or the cap is reached.
- 500+ requestable fields including all `BT-*` and `OPP-*` codes per the eForms SDK.
- No authentication.

#### UK Find-a-Tender (www.find-tender.service.gov.uk/api/1.0)

- **GET** OCDS release packages filtered by `updatedFrom` / `updatedTo`.
- Output is full **Open Contracting Data Standard** JSON — parties, tender, items, value, documents.
- Pagination via `links.next` cursor.
- No authentication.

#### US SAM.gov (api.sam.gov/prod/opportunities/v2/search)

- **GET** with `api_key`, `postedFrom`, `postedTo`, `title`, `ncode`, `ptype` and offset pagination.
- Requires a **free API key** from sam.gov (public tier = 10 req/day, registered = 1,000 req/day).
- Returns full opportunity records with NAICS, set-aside, place of performance and contact info.

***

### 🛑 Limits & notes

- **TED** is the authoritative EU procurement source — but values are often missing in the notice (filled in only at award).
- **TED multilingual fields**: titles and descriptions are objects keyed by 3-letter ISO language codes. The normalized `title` / `description` picks your preferred language, with `titleAllLanguages` preserved for downstream pickers.
- **TED country codes** are **ISO alpha-3** (`DEU`, `FRA`), not alpha-2.
- **UK FTS** keyword filtering happens client-side after the OCDS package fetch (the API supports date filtering only).
- **SAM.gov** without an API key is effectively unusable (10 req / day). The actor skips it gracefully if no key is supplied.
- **CPV vs NAICS** — different classification systems. Use `cpvCodes` (TED + UK) and `naicsCodes` (SAM) appropriately.

***

### 💰 Pricing

Monetized via **pay-per-event** on Apify — pay per tender notice saved. All upstream APIs are free.

***

### ❓ FAQ

**How fresh is the data?**
All three sources are near-real-time. TED publishes new notices every working day at 5pm CET. UK FTS and SAM.gov update continuously throughout the day.

**Can I get the full XML / PDF of a tender?**
Yes — `documentUrls` and the `rawSource` field expose every linked document. For TED, links to PDF/HTML/XML in every EU language are inside `rawSource.links`.

**Does this cover sub-threshold contracts (small council purchases)?**
No. TED, UK FTS and SAM.gov only publish opportunities above their respective procurement thresholds. For sub-threshold UK contracts, see Contracts Finder (separate API, ask for that as a follow-up actor).

**Can I extend this to other portals (DACH bund.de, France BOAMP, India CPP, Brazil ComprasNet)?**
Yes — open an issue on the actor's Apify page with the portal name, and we'll evaluate adding it.

**What's the difference between this and existing tender scrapers?**
Most existing actors cover one country. This is **the only normalized, multi-country tender feed** — EU + UK + US in one schema.

***

### 🔗 Related actors

- `logiover/uk-companies-house-bulk-scraper` — enrich `buyerName` with company numbers + officers
- `logiover/website-contact-scraper` — pull supplier contact emails for outreach
- `logiover/sec-edgar-form-d-scraper` — combine US funding data with US tenders to find ripe new contractors
- `logiover/sitemap-to-url-crawler` — crawl a buyer's website for related solicitation docs

***

### 🆘 Support

Need another procurement portal added, or hitting a TED query that won't parse? Open an issue on the actor's Apify page.

# Actor input Schema

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

Which procurement portals to query. 'ted\_eu' covers all 27 EU member states + Norway + Switzerland (~3M notices/yr). 'uk\_fts' is the UK Find-a-Tender service (post-Brexit, >£139k public contracts). 'sam\_gov' is the US federal opportunities portal (requires a free API key from sam.gov).

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

Free-text terms matched against tender title and description. Each portal is queried separately for every keyword. Examples: \['cybersecurity', 'cloud migration'], \['software development'], \['road construction']. Leave empty to return all notices in the date range.

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

Earliest publication date in 'YYYY-MM-DD' format. Defaults to the last 7 days. Each source supports date filtering natively.

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

Latest publication date in 'YYYY-MM-DD' format. Defaults to today.

## `tedCountries` (type: `array`):

Restrict TED EU results to specific buyer-country codes (ISO alpha-3 uppercase, as used by TED). Examples: DEU (Germany), FRA (France), ITA (Italy), ESP (Spain), NLD (Netherlands), POL (Poland), BEL (Belgium), AUT (Austria), SWE (Sweden), DNK (Denmark), FIN (Finland), IRL (Ireland), PRT (Portugal), GRC (Greece), CZE (Czech Republic), ROU (Romania), HUN (Hungary), NOR (Norway), CHE (Switzerland). Leave empty for all EU + EEA countries.

## `tedCpvCodes` (type: `array`):

Common Procurement Vocabulary codes to filter TED notices. Examples: '72000000' (IT services), '45000000' (construction), '50000000' (repair/maintenance), '79000000' (business services). Prefix-match is supported by TED — passing '72' returns all IT-related codes.

## `tedContractNature` (type: `array`):

Filter TED notices by contract nature: 'works' (construction), 'supplies' (goods), 'services'. Leave empty for all three.

## `tedNoticeTypes` (type: `array`):

Filter TED by notice-type code (use the API's enum). Common: 'cn-standard' (open call), 'can-standard' (award notice), 'pin-only' (prior information), 'cn-social' (social/light regime), 'can-modif' (award modification). Leave empty for all types.

## `samGovApiKey` (type: `string`):

Personal SAM.gov API key — required if 'sam\_gov' is selected. Free, request at https://sam.gov/profile/details (Account Details → API Keys). Public tier ≈ 10 req/day; registered tier ≈ 1,000 req/day. Stored as Apify secret.

## `samGovNaicsCodes` (type: `array`):

Filter SAM.gov by NAICS industry codes (US standard). Examples: '541511' (custom software), '541512' (IT consulting), '541330' (engineering services). Leave empty for all.

## `samGovNoticeTypes` (type: `array`):

SAM.gov notice types. Common: 'p' (Presolicitation), 'o' (Solicitation), 'k' (Combined Synopsis/Solicitation), 'r' (Sources Sought), 'a' (Award Notice), 's' (Special Notice). Leave empty for all.

## `ukKeywords` (type: `string`):

If set, overrides 'keywords' when querying UK Find-a-Tender (UK API supports a single keyword string).

## `maxResultsPerSource` (type: `integer`):

Hard cap on tenders saved per source per run. Combined with the date range to keep run cost predictable. Set 0 for unlimited (auto-paginates until the source is exhausted).

## `language` (type: `string`):

TED returns titles, descriptions and buyer names in many EU languages. Pick the preferred language code to populate the normalized 'title' and 'description' fields. Falls back to any available language if the preferred one is missing.

## Actor input object example

```json
{
  "sources": [
    "ted_eu",
    "uk_fts"
  ],
  "keywords": [
    "software"
  ],
  "publishedFrom": "",
  "publishedTo": "",
  "tedCountries": [],
  "tedCpvCodes": [],
  "tedContractNature": [],
  "tedNoticeTypes": [],
  "samGovNaicsCodes": [],
  "samGovNoticeTypes": [],
  "ukKeywords": "",
  "maxResultsPerSource": 1000,
  "language": "eng"
}
```

# Actor output Schema

## `source` (type: `string`):

ted\_eu | uk\_fts | sam\_gov

## `noticeId` (type: `string`):

Source-specific ID

## `title` (type: `string`):

Notice title

## `buyerName` (type: `string`):

Contracting authority

## `buyerCountry` (type: `string`):

ISO country code

## `procurementType` (type: `string`):

works/supplies/services

## `estimatedValueAmount` (type: `string`):

Estimated contract value

## `estimatedValueCurrency` (type: `string`):

Value currency

## `publishedDate` (type: `string`):

Publication timestamp

## `deadlineDate` (type: `string`):

Submission deadline

## `noticeUrl` (type: `string`):

Source notice URL

## `cpvCodes` (type: `string`):

EU procurement codes

## `scrapedAt` (type: `string`):

Scrape timestamp

# 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": [
        "ted_eu",
        "uk_fts"
    ],
    "keywords": [
        "software"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/global-public-tenders-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": [
        "ted_eu",
        "uk_fts",
    ],
    "keywords": ["software"],
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/global-public-tenders-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "ted_eu",
    "uk_fts"
  ],
  "keywords": [
    "software"
  ]
}' |
apify call logiover/global-public-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/global-public-tenders-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Public Tenders Scraper — TED EU, UK FTS & US SAM.gov RFP",
        "description": "Aggregate live government tenders & RFPs from EU TED (27 states), UK Find-a-Tender, US SAM.gov in one normalized feed. Filter by keyword, country, CPV/NAICS, contract nature, value, deadline. Official open APIs — no proxy. For bid teams, RFP agencies, gov-contracting and procurement intel.",
        "version": "1.0",
        "x-build-id": "eGTxYlidcItC41HND"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~global-public-tenders-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-global-public-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/logiover~global-public-tenders-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-global-public-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/logiover~global-public-tenders-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-global-public-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sources": {
                        "title": "Sources to Query",
                        "type": "array",
                        "description": "Which procurement portals to query. 'ted_eu' covers all 27 EU member states + Norway + Switzerland (~3M notices/yr). 'uk_fts' is the UK Find-a-Tender service (post-Brexit, >£139k public contracts). 'sam_gov' is the US federal opportunities portal (requires a free API key from sam.gov).",
                        "default": [
                            "ted_eu",
                            "uk_fts"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Free-text terms matched against tender title and description. Each portal is queried separately for every keyword. Examples: ['cybersecurity', 'cloud migration'], ['software development'], ['road construction']. Leave empty to return all notices in the date range.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "publishedFrom": {
                        "title": "Published From (ISO date)",
                        "type": "string",
                        "description": "Earliest publication date in 'YYYY-MM-DD' format. Defaults to the last 7 days. Each source supports date filtering natively.",
                        "default": ""
                    },
                    "publishedTo": {
                        "title": "Published To (ISO date)",
                        "type": "string",
                        "description": "Latest publication date in 'YYYY-MM-DD' format. Defaults to today.",
                        "default": ""
                    },
                    "tedCountries": {
                        "title": "TED — Country Filter (ISO alpha-3)",
                        "type": "array",
                        "description": "Restrict TED EU results to specific buyer-country codes (ISO alpha-3 uppercase, as used by TED). Examples: DEU (Germany), FRA (France), ITA (Italy), ESP (Spain), NLD (Netherlands), POL (Poland), BEL (Belgium), AUT (Austria), SWE (Sweden), DNK (Denmark), FIN (Finland), IRL (Ireland), PRT (Portugal), GRC (Greece), CZE (Czech Republic), ROU (Romania), HUN (Hungary), NOR (Norway), CHE (Switzerland). Leave empty for all EU + EEA countries.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "tedCpvCodes": {
                        "title": "TED — CPV Codes",
                        "type": "array",
                        "description": "Common Procurement Vocabulary codes to filter TED notices. Examples: '72000000' (IT services), '45000000' (construction), '50000000' (repair/maintenance), '79000000' (business services). Prefix-match is supported by TED — passing '72' returns all IT-related codes.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "tedContractNature": {
                        "title": "TED — Contract Nature",
                        "type": "array",
                        "description": "Filter TED notices by contract nature: 'works' (construction), 'supplies' (goods), 'services'. Leave empty for all three.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "tedNoticeTypes": {
                        "title": "TED — Notice Type",
                        "type": "array",
                        "description": "Filter TED by notice-type code (use the API's enum). Common: 'cn-standard' (open call), 'can-standard' (award notice), 'pin-only' (prior information), 'cn-social' (social/light regime), 'can-modif' (award modification). Leave empty for all types.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "samGovApiKey": {
                        "title": "SAM.gov API Key (free)",
                        "type": "string",
                        "description": "Personal SAM.gov API key — required if 'sam_gov' is selected. Free, request at https://sam.gov/profile/details (Account Details → API Keys). Public tier ≈ 10 req/day; registered tier ≈ 1,000 req/day. Stored as Apify secret."
                    },
                    "samGovNaicsCodes": {
                        "title": "SAM.gov — NAICS Codes",
                        "type": "array",
                        "description": "Filter SAM.gov by NAICS industry codes (US standard). Examples: '541511' (custom software), '541512' (IT consulting), '541330' (engineering services). Leave empty for all.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "samGovNoticeTypes": {
                        "title": "SAM.gov — Notice Types",
                        "type": "array",
                        "description": "SAM.gov notice types. Common: 'p' (Presolicitation), 'o' (Solicitation), 'k' (Combined Synopsis/Solicitation), 'r' (Sources Sought), 'a' (Award Notice), 's' (Special Notice). Leave empty for all.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "ukKeywords": {
                        "title": "UK FTS — Keyword override",
                        "type": "string",
                        "description": "If set, overrides 'keywords' when querying UK Find-a-Tender (UK API supports a single keyword string).",
                        "default": ""
                    },
                    "maxResultsPerSource": {
                        "title": "Max Results Per Source",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on tenders saved per source per run. Combined with the date range to keep run cost predictable. Set 0 for unlimited (auto-paginates until the source is exhausted).",
                        "default": 1000
                    },
                    "language": {
                        "title": "Preferred Language (TED multilingual)",
                        "enum": [
                            "eng",
                            "fra",
                            "deu",
                            "spa",
                            "ita",
                            "nld",
                            "pol",
                            "swe",
                            "ces",
                            "por",
                            "ron",
                            "ell",
                            "fin",
                            "dan",
                            "hun",
                            "bul",
                            "tur"
                        ],
                        "type": "string",
                        "description": "TED returns titles, descriptions and buyer names in many EU languages. Pick the preferred language code to populate the normalized 'title' and 'description' fields. Falls back to any available language if the preferred one is missing.",
                        "default": "eng"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
