# Tender Match Finder (`axetl_industries/tender-match-finder`) Actor

Find South African public tenders that match what your business actually does, with explainable scores, deadlines, buyer details, and official source links.

- **URL**: https://apify.com/axetl\_industries/tender-match-finder.md
- **Developed by:** [Izak Botes](https://apify.com/axetl_industries) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5,000.00 / 1,000 tender searches

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Match Finder

Find South African public tenders that match what your business actually does.

### What it does

Tell Tender Match Finder what your business provides. It searches current South African public procurement notices, ranks opportunities for relevance, and explains why each result matched. Results include closing dates, buyer information, public values where available, official source links, and evidence-backed match reasons.

### Who it is for

- South African suppliers and service businesses
- bid and tender teams
- procurement researchers
- agencies and business-development workflows
- API and automation users

### How it works

The Actor retrieves approved public National Treasury procurement records, normalizes and deduplicates them, removes expired or excluded notices, and applies a deterministic capability match. It does not submit bids, contact buyers, or access authenticated procurement systems.

### Input

```json
{
  "business_capabilities": ["website development", "IT support"],
  "regions": ["Gauteng", "National"],
  "keywords": [],
  "exclude_keywords": [],
  "minimum_days_remaining": 3,
  "maximum_results": 10,
  "lookback_days": 60
}
```

Describe the products or services your business can deliver. Regions, additional keywords, exclusions, deadline window, and result count are optional. The Actor uses a bounded approved source; input cannot provide arbitrary URLs.

### Output

Each matched opportunity includes:

- opportunity and public OCDS identifiers
- title, buyer, region, publication date, closing date, and days remaining
- public value and currency when available
- categories, public document links, and official source URL
- `match.score`, `match.level`, and `match.confidence`
- matched capabilities, matched terms, reasons, and potential mismatches
- conservative requirement signals based on observable source text
- source system, record hash, license, and attribution

The default dataset contains one row per returned match. The run output also contains a summary, errors, and the full machine-readable result object.

### How matching works

Matching is deterministic and uses bounded weighted signals: capability coverage, title overlap, description/category overlap, optional keyword coverage, region fit, usable-deadline fit, and exclusion matches. Scores are capped at 0-100 and are intended to rank relevance to the capabilities supplied for that run.

### Match score limitations

`Strong match` and `Possible match` describe relevance signals only. A match score is not an eligibility score, win probability, compliance determination, procurement advice, or guarantee of an award. A detected requirement signal is an evidence-based text observation, not a statement that a legal or procurement requirement definitely applies. Verify important details against the official notice and documents.

### Official data source

Data originates from the [South African National Treasury Transparency Portal](https://data.etenders.gov.za/) and its [OCDS JSON API](https://ocds-api.etenders.gov.za/swagger/v1/swagger.json). The portal describes the dataset as a public-beta compilation of information shared with Treasury; availability and completeness depend on the source records.

### Source attribution

Tender Match Finder preserves the official source URL, OCID or release identifier, licence information, and source attribution in each result where supplied. It is not the tender issuer, is not affiliated with National Treasury, and does not claim legal certification of reuse rights. Customers should verify current details at the official source.

### Limitations

- South Africa only in this MVP.
- Public procurement records only; no private portals or authenticated systems.
- No tender submission, bidding, buyer contact, outreach, OCR, attachment download, or legal, procurement, or tax advice.
- Results depend on the availability and completeness of the official source.
- Requirement signals are conservative observations; missing data remains unknown.
- Linked documents are not automatically downloaded or deeply analysed.
- The Actor does not determine eligibility or predict tender success.

### Pricing

This Actor uses pay-per-event pricing. Each successful search costs $5 and returns up to 25 ranked tender matches. If no matching tenders are found, there is no search charge.

- A `tender-search` event is emitted exactly once for a successful non-empty bounded search report.
- Invalid input, source failures, internal failures, expired or filtered notices, irrelevant notices, and zero-match runs do not generate a `tender-search` event.
- Platform usage is included in the event price where supported by Apify's pay-per-event model. There is no subscription or hidden external API charge.

### Privacy

Business capability inputs are used to perform the requested match. The Actor does not collect credentials, private profiles, personal-data enrichment, or authenticated procurement content. Customer inputs # Tender Match Finder

Find South African public tenders that match what your business does.

### What it does

Searches public National Treasury procurement records, filters current notices, ranks relevance to your capabilities, and returns explainable matches, deadlines, buyers, values where available, official links, and provenance.

### Input

Provide business capabilities, regions, keywords, exclusions, a deadline window, and up to 25 results.

### Output

Structured JSON contains match scores, levels, reasons, requirement signals, source attribution, and official source URLs. Scores indicate relevance only; they do not prove eligibility or award likelihood.

### Pricing

Each successful search costs $5 and returns up to 25 ranked tender matches. If no matching tenders are found, there is no search charge. Invalid input, source failure, internal failure, expired or filtered records, and irrelevant or zero-match searches do not emit the 'tender-search' event. Platform usage is included.

### Limits and privacy

South Africa only. Public procurement data only. No bidding, buyer contact, outreach, OCR, legal advice, authenticated access, or private data. Verify important details at the official source.

### Support

Review the bounded errors and official source link for a result. Contact the publisher through Apify Issues for reproducible technical problems.# Tender Match Finder

Find South African public tenders that match what your business does.

### What it does

Ranks current public National Treasury notices against your capabilities and returns explainable matches, deadlines, buyers, official links, and provenance.

### Input and output

Provide capabilities, regions, keywords, exclusions, deadline window, and up to 25 results. JSON includes match scores and reasons; scores indicate relevance, not eligibility or award likelihood.

### Pricing

Each successful search costs $5 and returns up to 25 ranked tender matches. Zero-match, invalid, failed, source-error, or internal-error searches emit no tender-search event. Platform usage is included.

South Africa only. Public data only. Verify details at the official source.

# Actor input Schema

## `business_capabilities` (type: `array`):

Describe the products or services you can deliver. Use plain language.

## `regions` (type: `array`):

Optional provinces or National. Leave empty to search all South African regions.

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

Optional words that should increase relevance.

## `exclude_keywords` (type: `array`):

Optional words that should exclude a notice from results.

## `minimum_days_remaining` (type: `integer`):

Only return notices with at least this many days before the closing date.

## `maximum_results` (type: `integer`):

Maximum number of matched opportunities to return.

## `lookback_days` (type: `integer`):

How far back the public source may be queried for current notices.

## Actor input object example

```json
{
  "business_capabilities": [
    "website development",
    "IT support"
  ],
  "regions": [],
  "keywords": [],
  "exclude_keywords": [],
  "minimum_days_remaining": 3,
  "maximum_results": 10,
  "lookback_days": 60
}
```

# Actor output Schema

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

Ranked tender matches in the default dataset.

## `summary` (type: `string`):

Counts and retrieval metadata for this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("axetl_industries/tender-match-finder").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("axetl_industries/tender-match-finder").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 '{}' |
apify call axetl_industries/tender-match-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axetl_industries/tender-match-finder"
        }
    }
}

```

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/63e9XOSl8DrF2meX7/builds/pv9Y1RBIjj0gIuTQr/openapi.json
