# EU, UK & Development Bank Tender Monitor (`ovular_cappuccino/global-tender-monitor`) Actor

Discover public tender, bid, procurement, and RFP opportunities from EU TED, UK Contracts Finder, UNGM, and World Bank Procurement Notices. Returns clean, scored dataset records ready for export, CRM workflows, and AI analysis.

- **URL**: https://apify.com/ovular\_cappuccino/global-tender-monitor.md
- **Developed by:** [Rean Opperman](https://apify.com/ovular_cappuccino) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.90 / 1,000 tender records

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

## EU, UK & Development Bank Tender Monitor

Find public-sector tender, procurement, bid, and RFP opportunities from EU, UK, UNGM, and World Bank open procurement sources, then return clean, scored records that are ready for CSV export, dashboards, CRM enrichment, or AI analysis.

This Actor is designed for sales teams, bid managers, procurement analysts, lead-generation agencies, and consultants who need a fast way to discover relevant EU, UK, UN, and development-bank opportunities without checking several portals by hand.

### What it searches

Current MVP sources:

- **EU TED** — European public procurement notices
- **UNGM Procurement Opportunities** — United Nations and international organisation opportunities
- **World Bank Procurement Notices** — development-project procurement notices
- **UK Contracts Finder** — UK government procurement opportunities

SAM.gov is not included because it requires approved API access. Additional public sources can be added behind the same output schema.

### What you get

For each matching tender, the Actor returns a normalized dataset item with:

- source portal and country/region
- tender title and buyer/agency
- short description
- published date and closing date where available
- estimated value and currency where available
- matched keywords
- simple fit score from `0` to `100`
- source URL for opening the original notice
- source-specific raw data for deeper inspection

The default dataset view is sorted around fields that matter for triage: fit score, title, buyer, country, source, closing date, value, matched keywords, and source URL.

### Common use cases

- **RFP alerting:** Run daily searches for phrases such as `cybersecurity`, `software development`, `cleaning services`, or `solar installation`.
- **Sales prospecting:** Feed procurement leads into a CRM or spreadsheet for outreach.
- **Bid/no-bid triage:** Use fit scores, deadline dates, buyer names, and source links to quickly decide what deserves human review.
- **Market intelligence:** Track which public buyers are publishing opportunities in a category.
- **AI analyst workflows:** Send structured tender records into downstream summarisation, enrichment, or notification pipelines.

### Example input

```json
{
  "keywords": ["software", "IT services", "cybersecurity"],
  "excludeKeywords": ["training only", "internship"],
  "maxResults": 50,
  "minFitScore": 20,
  "publishedFrom": "2026-07-01T00:00:00Z"
}
````

### Input options

- `keywords` — Required. One or more words or phrases to search for.
- `excludeKeywords` — Optional. Skip notices containing these words or phrases.
- `maxResults` — Maximum number of normalized records to return. Default: `50`.
- `minFitScore` — Minimum score to include in the output. Use `1` for broad discovery, or `20+` for tighter results.
- `publishedFrom` / `publishedTo` — Optional ISO datetime filters. Currently applied where the source supports it. If `publishedFrom` is left blank, the Actor defaults to the last 30 days so results stay useful for opportunity monitoring.

### Example output item

```json
{
  "source": "UNGM Procurement Opportunities",
  "country": "Global",
  "sourceRecordId": "123456",
  "title": "Provision of software development and support services",
  "buyer": "United Nations agency",
  "description": "Request for proposal | Reference ABC/2026/001 | Global",
  "publishedDate": "2026-07-06T00:00:00",
  "closingDate": "2026-08-05T23:59:00+00:00",
  "valueAmount": null,
  "valueCurrency": null,
  "matchedKeywords": ["software"],
  "fitScore": 60,
  "documents": [],
  "sourceUrl": "https://www.ungm.org/Public/Notice/123456"
}
```

### Practical notes

- This Actor discovers and normalizes public tender notices. It does **not** submit bids, bypass access controls, log into private portals, or guarantee that a result is commercially suitable.
- Public procurement portals can change their formats or temporarily rate-limit access. The Actor is built to keep running where possible and return results from working sources even if one source has a temporary issue.
- Fit score is a triage helper, not a legal or commercial recommendation. Always review the original notice before acting.

### Suggested search phrases

Try targeted phrases rather than only broad words:

- `software development`
- `IT services`
- `cybersecurity`
- `construction supervision`
- `solar installation`
- `security services`
- `medical equipment`
- `data platform`

### Output format

Results are written to the default Apify dataset. You can export them as JSON, CSV, Excel, XML, RSS, or HTML using Apify's standard dataset export tools.

# Actor input Schema

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

Tender, bid, procurement, or RFP keywords to search for. Use precise phrases for better results, e.g. software development, cybersecurity, security services.

## `excludeKeywords` (type: `array`):

Skip notices containing any of these words or phrases, e.g. training only, internship, grant.

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

Maximum number of tender records to output after deduplication and scoring.

## `minFitScore` (type: `integer`):

Only output records with this fit score or higher. Use 1 for broad discovery, 20+ for tighter triage.

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

Optional ISO datetime filter, e.g. 2026-07-01T00:00:00Z. If blank, defaults to the last 30 days where source filtering supports it.

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

Optional ISO datetime filter, e.g. 2026-07-31T23:59:59Z. Applied where the source supports published-date filtering.

## Actor input object example

```json
{
  "keywords": [
    "software",
    "IT services",
    "cybersecurity"
  ],
  "excludeKeywords": [
    "training only"
  ],
  "maxResults": 50,
  "minFitScore": 20
}
```

# Actor output Schema

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

Normalized public tender, procurement, bid, and RFP opportunity records from EU TED, UNGM, World Bank, and UK Contracts Finder.

# 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 = {
    "keywords": [
        "software",
        "IT services",
        "cybersecurity"
    ],
    "excludeKeywords": [
        "training only"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ovular_cappuccino/global-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 = {
    "keywords": [
        "software",
        "IT services",
        "cybersecurity",
    ],
    "excludeKeywords": ["training only"],
}

# Run the Actor and wait for it to finish
run = client.actor("ovular_cappuccino/global-tender-monitor").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 '{
  "keywords": [
    "software",
    "IT services",
    "cybersecurity"
  ],
  "excludeKeywords": [
    "training only"
  ]
}' |
apify call ovular_cappuccino/global-tender-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EU, UK & Development Bank Tender Monitor",
        "description": "Discover public tender, bid, procurement, and RFP opportunities from EU TED, UK Contracts Finder, UNGM, and World Bank Procurement Notices. Returns clean, scored dataset records ready for export, CRM workflows, and AI analysis.",
        "version": "0.1",
        "x-build-id": "lGkxhVVmu8cS8gImE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ovular_cappuccino~global-tender-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ovular_cappuccino-global-tender-monitor",
                "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/ovular_cappuccino~global-tender-monitor/runs": {
            "post": {
                "operationId": "runs-sync-ovular_cappuccino-global-tender-monitor",
                "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/ovular_cappuccino~global-tender-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-ovular_cappuccino-global-tender-monitor",
                "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",
                "required": [
                    "keywords"
                ],
                "properties": {
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Tender, bid, procurement, or RFP keywords to search for. Use precise phrases for better results, e.g. software development, cybersecurity, security services.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "excludeKeywords": {
                        "title": "Exclude keywords",
                        "type": "array",
                        "description": "Skip notices containing any of these words or phrases, e.g. training only, internship, grant.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of tender records to output after deduplication and scoring.",
                        "default": 50
                    },
                    "minFitScore": {
                        "title": "Minimum fit score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Only output records with this fit score or higher. Use 1 for broad discovery, 20+ for tighter triage.",
                        "default": 20
                    },
                    "publishedFrom": {
                        "title": "Published from",
                        "type": "string",
                        "description": "Optional ISO datetime filter, e.g. 2026-07-01T00:00:00Z. If blank, defaults to the last 30 days where source filtering supports it."
                    },
                    "publishedTo": {
                        "title": "Published to",
                        "type": "string",
                        "description": "Optional ISO datetime filter, e.g. 2026-07-31T23:59:59Z. Applied where the source supports published-date filtering."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
