# Tender Signal Harvester (`seeb/tender-signal-harvester`) Actor

Extract tender, RFP, solicitation, deadline, buyer, budget, category, and qualification signals from public procurement pages or pasted notices.

- **URL**: https://apify.com/seeb/tender-signal-harvester.md
- **Developed by:** [Techionik](https://apify.com/seeb) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 1,000 tender signals

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 Signal Harvester

Extract tender, RFP, solicitation, deadline, buyer, budget, category, and qualification signals from public procurement pages or pasted notices.

Tender Signal Harvester is for teams that need to qualify public-sector and enterprise procurement opportunities quickly. Instead of saving a generic page summary, it turns each public notice into a row that highlights the buyer, deadline, contract value, supplier requirements, and the next action a sales or bids team should review.

This actor is designed for focused marketplace research runs. You can give it public URLs, paste copied source text, or combine both. URL fetching is useful for public HTML pages; pasted text is useful when a site uses heavy JavaScript, login walls, CAPTCHA, or restrictive anti-bot controls that should not be bypassed.

### Who Uses It

- Bid teams and proposal writers
- B2B sales teams watching public procurement
- Agencies finding implementation opportunities
- Market researchers tracking funded projects
- Vendors monitoring RFP deadlines

### What It Extracts

- `opportunityTitle` - Tender, RFP, RFQ, solicitation, or procurement opportunity title.
- `buyerName` - Public buyer, agency, city, ministry, university, or department issuing the opportunity.
- `tenderType` - Tender format such as RFP, RFQ, bid, solicitation, grant, award, or contract notice.
- `deadline` - Submission, closing, due, or questions deadline found in the source.
- `budgetOrValue` - Visible budget, contract value, award value, or spend estimate.
- `procurementStage` - Buyer-stage signal such as open tender, questions due, site visit, award expected, or closed notice.
- `category` - Likely procurement category such as IT services, healthcare, construction, facilities, security, or professional services.
- `eligibilitySignal` - Supplier qualification, preference, region, certification, or eligibility rule.
- `contactEmail` - Procurement or buyer contact email when visible.
- `sourceUrl` - Original URL or synthetic URL for pasted notice text.
- `leadPriority` - Priority based on deadline, value, stage, and fit indicators.
- `evidenceText` - Short source sentence supporting the extracted opportunity.

### Why This Actor Is Useful

Tender pages are often long, inconsistent, and full of administrative wording. This actor highlights the parts a commercial team needs first: buyer, due date, budget, qualification rules, category, and evidence.

### Input

- `startUrls` - Public pages to fetch and analyze.
- `sourceTexts` - Optional pasted source snippets for pages that are blocked, login-gated, JavaScript-heavy, or easier to collect manually.
- `maxPagesPerStartUrl` - Same-domain crawl depth for each URL. Use a low value for precise runs.
- `maxConcurrency` - Parallel request count.
- `proxyConfiguration` - Optional Apify Proxy settings for public pages that rate-limit normal requests.

### Example Input

```json
{
    "startUrls": [
        {
            "url": "https://sam.gov/search/"
        }
    ],
    "sourceTexts": [
        "City of Lakes Procurement Office RFP 24-118 seeks a cloud document management vendor. Submission deadline August 30, 2026. Estimated contract value $250,000. Questions due August 12. Open competitive solicitation for municipal IT services in Minnesota. Contact procurement@cityoflakes.gov."
    ],
    "maxPagesPerStartUrl": 2,
    "maxConcurrency": 2
}
```

### Example Output

```json
{
    "opportunityTitle": "RFP 24-118 cloud document management vendor",
    "buyerName": "City of Lakes Procurement Office",
    "tenderType": "RFP",
    "deadline": "August 30, 2026",
    "budgetOrValue": "$250,000",
    "procurementStage": "open competitive solicitation",
    "category": "IT services",
    "eligibilitySignal": "Questions due August 12",
    "contactEmail": "procurement@cityoflakes.gov",
    "sourceUrl": "pasted://tender-1",
    "leadPriority": "high",
    "evidenceText": "Submission deadline August 30, 2026. Estimated contract value $250,000."
}
```

### How It Works

1. The actor normalizes every URL and pasted text item.
2. Public URLs are fetched with a browser-like user agent and a clear timeout.
3. HTML pages are converted into readable page text while scripts, styles, iframes, and hidden noise are removed.
4. The actor applies Tender Signal Harvester-specific extraction rules rather than a generic page-summary template.
5. Only rows with useful actor-specific information are saved to the dataset.
6. A run summary is saved to the key-value store for quick review.

### Practical Workflows

- Build a daily spreadsheet of qualified RFPs.
- Route high-value tenders to proposal owners.
- Watch public procurement portals for deadlines and qualification rules.
- Enrich CRM accounts with active buying signals.

### Reliability Notes

- Best results come from public HTML pages or pasted snippets that visibly contain the target signal.
- For JavaScript-heavy sites, paste the relevant text or use URLs that return readable HTML.
- The actor does not bypass logins, paywalls, CAPTCHA, private systems, or website restrictions.
- Some fields may be empty when the source does not contain that information.
- Use smaller crawl limits for broad portals and larger limits only for well-structured sites.

### Limitations

- This actor extracts public or user-provided visible text only.
- It is not a legal-access tool for restricted procurement portals, private retailer dashboards, closed review platforms, account-only changelogs, or internal documentation.
- Results should be reviewed before making procurement, legal, inventory, engineering, or sales decisions.

### Search Keywords

tender signal harvester, tender signal harvester, opportunity title, buyer name, tender type, deadline, budget or value, procurement stage, category, eligibility signal, contact email, source url, lead priority, evidence text

# Actor input Schema

## `startUrls` (type: `array`):

Add public tender/RFP pages or paste procurement notice text. Use pasted text for portals that block automated requests.

## `sourceTexts` (type: `array`):

Optional pasted snippets. Use this for blocked pages, login-gated portals you can view manually, newsletters, exported notes, or copied page sections.

## `maxPagesPerStartUrl` (type: `integer`):

How many same-domain pages to analyze from each start URL. Keep this low for focused, low-cost runs.

## `maxConcurrency` (type: `integer`):

How many pages to analyze at the same time.

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

Optional proxy settings. Use Apify Proxy for public pages that rate-limit normal datacenter requests.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://sam.gov/search/"
    },
    {
      "url": "https://www.contractsfinder.service.gov.uk/Search"
    }
  ],
  "sourceTexts": [
    "City of Lakes Procurement Office RFP 24-118 seeks a cloud document management vendor. Submission deadline August 30, 2026. Estimated contract value $250,000. Questions due August 12. Open competitive solicitation for municipal IT services in Minnesota. Contact procurement@cityoflakes.gov.",
    "Ministry of Health tender notice invites bids for telehealth platform implementation across regional clinics. Closing date 2026-09-15. Budget up to GBP 420,000. Eligible suppliers must show ISO 27001 certification and healthcare deployment references."
  ],
  "maxPagesPerStartUrl": 3,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

No description

## `rawJson` (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 = {
    "startUrls": [
        {
            "url": "https://sam.gov/search/"
        },
        {
            "url": "https://www.contractsfinder.service.gov.uk/Search"
        }
    ],
    "sourceTexts": [
        "City of Lakes Procurement Office RFP 24-118 seeks a cloud document management vendor. Submission deadline August 30, 2026. Estimated contract value $250,000. Questions due August 12. Open competitive solicitation for municipal IT services in Minnesota. Contact procurement@cityoflakes.gov.",
        "Ministry of Health tender notice invites bids for telehealth platform implementation across regional clinics. Closing date 2026-09-15. Budget up to GBP 420,000. Eligible suppliers must show ISO 27001 certification and healthcare deployment references."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seeb/tender-signal-harvester").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 = {
    "startUrls": [
        { "url": "https://sam.gov/search/" },
        { "url": "https://www.contractsfinder.service.gov.uk/Search" },
    ],
    "sourceTexts": [
        "City of Lakes Procurement Office RFP 24-118 seeks a cloud document management vendor. Submission deadline August 30, 2026. Estimated contract value $250,000. Questions due August 12. Open competitive solicitation for municipal IT services in Minnesota. Contact procurement@cityoflakes.gov.",
        "Ministry of Health tender notice invites bids for telehealth platform implementation across regional clinics. Closing date 2026-09-15. Budget up to GBP 420,000. Eligible suppliers must show ISO 27001 certification and healthcare deployment references.",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("seeb/tender-signal-harvester").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 '{
  "startUrls": [
    {
      "url": "https://sam.gov/search/"
    },
    {
      "url": "https://www.contractsfinder.service.gov.uk/Search"
    }
  ],
  "sourceTexts": [
    "City of Lakes Procurement Office RFP 24-118 seeks a cloud document management vendor. Submission deadline August 30, 2026. Estimated contract value $250,000. Questions due August 12. Open competitive solicitation for municipal IT services in Minnesota. Contact procurement@cityoflakes.gov.",
    "Ministry of Health tender notice invites bids for telehealth platform implementation across regional clinics. Closing date 2026-09-15. Budget up to GBP 420,000. Eligible suppliers must show ISO 27001 certification and healthcare deployment references."
  ]
}' |
apify call seeb/tender-signal-harvester --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/0kuu258LuGGX1pzJ7/builds/ss4vbFw29A7K7prWv/openapi.json
