# Tender & RFP Matcher — Bid/No-Bid Scoring (`egeusta/tender-rfp-opportunity-matcher`) Actor

Score tender and RFP datasets against your capabilities, regions, contract band, and certifications. Every bid/no-bid result includes a transparent breakdown and missing requirements.

- **URL**: https://apify.com/egeusta/tender-rfp-opportunity-matcher.md
- **Developed by:** [Ege Usta](https://apify.com/egeusta) (community)
- **Categories:** Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 opportunity scoreds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Tender & RFP Opportunity Matcher

Turn procurement records into explainable bid/no-bid decisions. The Actor accepts pasted opportunities or any accessible Apify dataset, scores each record against a factual company capability profile, and shows exactly which signals helped or blocked the match.

### Why this is different

This is not another portal scraper and it is not an opaque AI score. It is a source-agnostic decision layer that composes with tender scrapers already in Apify Store. Scores are deterministic and split into capabilities, sector, region, keywords, contract value, eligibility, and deadline. A stated certification that is absent from the company profile becomes a visible hard gap.

### Quick start

```json
{
  "companyProfile": {
    "capabilities": ["cloud infrastructure", "managed services", "migration"],
    "sectors": ["public sector"],
    "regions": ["Europe"],
    "certifications": ["ISO 27001"],
    "keywords": ["Kubernetes"]
  },
  "opportunities": [{
    "title": "Cloud migration and managed Kubernetes services",
    "buyer": "Example Agency",
    "deadline": "2026-09-15",
    "location": "Europe",
    "requiredCertifications": ["ISO 27001"]
  }]
}
```

### Output

Each paid `opportunity` row contains `relevanceScore`, `recommendation`, `scoreBreakdown`, `relevanceReasons`, `missingRequirements`, `urgency`, and `daysRemaining`, together with the original opportunity fields. A free `summary` row reports counts and charge-limit status.

### Input compatibility

Common aliases such as `issuer`/`buyer`, `summary`/`description`, `closingDate`/`deadline`, and `budget`/`estimatedValue` are normalized. For the strongest eligibility check, provide `requiredCertifications` as structured data.

### Pricing

The intended model is pay per event with platform usage included: a small run-start event plus one `opportunity-scored` event for each delivered score. Exact current prices are displayed in Apify Console and on the Store page; the Actor stops cleanly at the run's maximum charge.

### Limitations

The Actor does not discover or scrape tender portals. It does not verify that a buyer notice is authentic, that the company profile is truthful, or that every requirement was extracted into structured fields. It does not provide legal, procurement, financial, or commercial advice. Always review the official notice and eligibility documents before bidding.

No private sources, credentials, personal-data profiling, outreach automation, or CAPTCHA bypass are used.

# Actor input Schema

## `companyProfile` (type: `object`):

Capabilities are required. Add only facts you can substantiate; missing stated certifications become hard gaps.

## `opportunities` (type: `array`):

Paste normalized or semi-structured tender records. Use datasetId instead for another Actor's dataset.

## `datasetId` (type: `string`):

Read opportunity records from an accessible Apify dataset. Ignored when pasted opportunities are present.

## `minScore` (type: `integer`):

Hide lower-scoring records from the paid result dataset while keeping their counts in the summary.

## `includeNoBid` (type: `boolean`):

Keep rejected opportunities so teams can audit why they were filtered.

## `maxOpportunities` (type: `integer`):

Hard cap on opportunity records read and scored in one run.

## Actor input object example

```json
{
  "companyProfile": {
    "name": "Northstar Cloud",
    "capabilities": [
      "cloud infrastructure",
      "managed services",
      "migration"
    ],
    "sectors": [
      "technology",
      "public sector"
    ],
    "regions": [
      "Europe"
    ],
    "certifications": [
      "ISO 27001"
    ],
    "keywords": [
      "Kubernetes",
      "AWS"
    ]
  },
  "opportunities": [
    {
      "id": "RFP-2026-104",
      "title": "Cloud infrastructure migration and managed services",
      "buyer": "Example Public Agency",
      "description": "Migrate workloads and operate Kubernetes infrastructure across Europe.",
      "deadline": "2026-09-15",
      "location": "Europe",
      "estimatedValue": 250000,
      "currency": "EUR",
      "requiredCertifications": [
        "ISO 27001"
      ]
    }
  ],
  "minScore": 45,
  "includeNoBid": true,
  "maxOpportunities": 500
}
```

# 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 = {
    "companyProfile": {
        "name": "Northstar Cloud",
        "capabilities": [
            "cloud infrastructure",
            "managed services",
            "migration"
        ],
        "sectors": [
            "technology",
            "public sector"
        ],
        "regions": [
            "Europe"
        ],
        "certifications": [
            "ISO 27001"
        ],
        "keywords": [
            "Kubernetes",
            "AWS"
        ]
    },
    "opportunities": [
        {
            "id": "RFP-2026-104",
            "title": "Cloud infrastructure migration and managed services",
            "buyer": "Example Public Agency",
            "description": "Migrate workloads and operate Kubernetes infrastructure across Europe.",
            "deadline": "2026-09-15",
            "location": "Europe",
            "estimatedValue": 250000,
            "currency": "EUR",
            "requiredCertifications": [
                "ISO 27001"
            ]
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("egeusta/tender-rfp-opportunity-matcher").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 = {
    "companyProfile": {
        "name": "Northstar Cloud",
        "capabilities": [
            "cloud infrastructure",
            "managed services",
            "migration",
        ],
        "sectors": [
            "technology",
            "public sector",
        ],
        "regions": ["Europe"],
        "certifications": ["ISO 27001"],
        "keywords": [
            "Kubernetes",
            "AWS",
        ],
    },
    "opportunities": [{
            "id": "RFP-2026-104",
            "title": "Cloud infrastructure migration and managed services",
            "buyer": "Example Public Agency",
            "description": "Migrate workloads and operate Kubernetes infrastructure across Europe.",
            "deadline": "2026-09-15",
            "location": "Europe",
            "estimatedValue": 250000,
            "currency": "EUR",
            "requiredCertifications": ["ISO 27001"],
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("egeusta/tender-rfp-opportunity-matcher").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 '{
  "companyProfile": {
    "name": "Northstar Cloud",
    "capabilities": [
      "cloud infrastructure",
      "managed services",
      "migration"
    ],
    "sectors": [
      "technology",
      "public sector"
    ],
    "regions": [
      "Europe"
    ],
    "certifications": [
      "ISO 27001"
    ],
    "keywords": [
      "Kubernetes",
      "AWS"
    ]
  },
  "opportunities": [
    {
      "id": "RFP-2026-104",
      "title": "Cloud infrastructure migration and managed services",
      "buyer": "Example Public Agency",
      "description": "Migrate workloads and operate Kubernetes infrastructure across Europe.",
      "deadline": "2026-09-15",
      "location": "Europe",
      "estimatedValue": 250000,
      "currency": "EUR",
      "requiredCertifications": [
        "ISO 27001"
      ]
    }
  ]
}' |
apify call egeusta/tender-rfp-opportunity-matcher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,egeusta/tender-rfp-opportunity-matcher"
        }
    }
}

```

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/XOioRxlUMAIF2zfMY/builds/6APHhRKAGxFeHZqJ5/openapi.json
