# SAP Tender Radar: English Procurement Alerts (`andersen_brothers_consulting/sap-tender-radar`) Actor

Find SAP tenders across TED, BOAMP and UK feeds. Get English notices, fit signals, bid briefs, deadline reminders, and new or changed alerts.

- **URL**: https://apify.com/andersen_brothers_consulting/sap-tender-radar.md
- **Developed by:** [Yassin Bahri](https://apify.com/andersen_brothers_consulting) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SAP Tender Radar: English SAP tender leads and daily alerts

Find public contracts that mention SAP software, see why each one matched, and decide which notices deserve your bid team's time. SAP Tender Radar is built for small and medium SAP consultancies that need a focused daily watch rather than another broad procurement database.

It returns structured English records through an Apify Dataset. Run it once for a shortlist or schedule it daily to receive only new notices, material changes, and approaching-deadline reminders.

### What you get

- **SAP-specific discovery.** Detects products and skills such as S/4HANA, SuccessFactors, Ariba, ABAP, Fiori, BTP and SAP BI. Each row says whether SAP appeared in the title or only in the details.
- **English reading copy.** Titles, matching excerpts and selection-criteria excerpts are translated to English when a supported model is available. Original text and source language remain in the record for verification.
- **A bid brief.** Signals, cautions, unknowns and a next action help you decide what to review. Add your SAP skills, minimum preparation time and maximum contract size to personalize the brief.
- **A repeatable watch.** Monitor mode keeps history for your private watch ID and emits `NEW`, `UPDATED`, `DEADLINE_CHANGED`, `AWARDED` and 7/2/1-day `DEADLINE_REMINDER` events when applicable.
- **A route back to the source.** Rows include the official notice URL and any document or submission links exposed by the feed.

The bid brief is a first-pass aid. It does not certify eligibility or replace reading the tender documents.

### Try a focused scan

Paste this into the Actor input and adjust the countries and skills:

```json
{
  "mode": "scan",
  "sources": ["TED", "BOAMP"],
  "daysBack": 7,
  "countries": ["DEU", "FRA"],
  "companySkills": ["S/4HANA", "SuccessFactors"],
  "minLeadDays": 10,
  "maxResults": 25
}
```

Open the run's **Output** tab to review the `Opportunities` and `Bid details` views. Download the Dataset as JSON, CSV or Excel, or use its API URL in your own workflow.

Example from a TED notice published on 23 October 2026 (selected fields):

```json
{
  "title": "SAP SuccessFactors cloud subscriptions",
  "buyer": "BARMER",
  "source": "TED",
  "sourceUrl": "https://ted.europa.eu/en/notice/733794-2026/html",
  "sourceLanguage": "deu",
  "translationProvider": "argos",
  "sapProducts": ["SuccessFactors"],
  "matchScope": "title",
  "bidDeadline": "2026-11-23",
  "bidTriage": {
    "priority": "high",
    "positiveSignals": ["SAP is named in the tender title", "31 days remain to prepare a bid"],
    "unknowns": ["Estimated contract value is not published in this feed"],
    "nextAction": "Open the official documents and make a bid/no-bid decision"
  }
}
```

### Set up a daily watch

1. Save a Task with `mode` set to `monitor` and a private `watchId` of at least 16 characters. Keep that ID and the filters unchanged for the same watch.
2. Schedule the Task daily in Apify. The first run establishes the baseline and returns the current matches.
3. Later runs return new or changed opportunities, plus deadline reminders at 7, 2 and 1 days where a known open deadline reaches those marks.
4. Connect the Task to an Apify webhook or integration if you want to route new Dataset items into email, Slack, Sheets, a CRM or another system.

Example monitor input:

```json
{
  "mode": "monitor",
  "watchId": "choose-your-own-long-private-watch-id",
  "sources": ["TED", "BOAMP"],
  "daysBack": 7,
  "companySkills": ["S/4HANA", "ABAP"],
  "maxResults": 100
}
```

Use a different private ID for each customer or saved search. The watch ID is an input secret; do not put a real one into a public Task description.

### Sources and coverage

| Feed | Scope | Selection |
| --- | --- | --- |
| [TED Search API](https://docs.ted.europa.eu/api/latest/search.html) | Official EU and related procurement notices | On by default |
| [France BOAMP API](https://www.boamp.fr/pages/api-boamp/) | French national notices, including procedures below EU publication thresholds | On by default |
| [UK Find a Tender](https://www.find-tender.service.gov.uk/apidocumentation/1.0/GET-ocdsReleasePackages) | UK public procurement releases | Optional |
| [UK Contracts Finder](https://www.contractsfinder.service.gov.uk/apidocumentation) | UK contract opportunities | Optional |

Every run queries the selected public feeds live. UK feeds have a shorter default lookback because broad windows can be large and rate limited. BOAMP matching currently searches notice titles. A feed that reaches the configured page cap fails clearly rather than presenting a truncated scan as complete. This Actor does not cover every national procurement portal.

### Reading a result

| Field | Meaning |
| --- | --- |
| `source`, `sourceUrl` | Public feed and official notice link |
| `stage`, `bidDeadline`, `daysUntilDeadline` | Planning, open or awarded status and known deadline |
| `sapProducts`, `workTypes`, `matchScope` | Detected SAP area, work type and title/detail match |
| `bidTriage` | Fit signals, cautions, unknowns, priority and next action |
| `bidChecklist`, `reminderDates` | Tasks to verify and upcoming reminder dates |
| `evidence`, `requirements` | English excerpts from the public notice |
| `changeType`, `changedFields` | Why a monitor run delivered this row |
| `sourceLanguage`, `translationProvider`, `originalTitle` | Translation audit fields |

Values and requirements are left empty when the feed does not state them. A `high` priority means an explicit SAP title match with an open deadline and no configured constraint warning; it is **not** a confirmed bid recommendation.

### Translation choices

The default offline translator is Argos. It needs no API key but downloads a language model when first translating a language; that can make a first run slower. Some languages or texts may lack a working Argos model. Those notices are skipped and logged rather than emitted with untranslated text labeled as English.

The default run has 2 GB allocated because multilingual offline translation needs both memory and CPU. A 12-notice test across German, French, Slovenian and Spanish completed in about five minutes on Apify; actual time varies with notice length, languages and model downloads. The initial input searches 7 days and returns up to 3 results for a quick trial. Increase `maxResults` for a fuller feed.

Choose `deepl` for broader and generally stronger business translation. Supply `deeplApiKey` as a secret input or set `DEEPL_API_KEY` as a secret environment variable. DeepL charges for characters separately from Apify. Organization names remain as officially published proper names.

### Important limits

- Full tender attachments and later amendments are not parsed. Review eligibility, lot scope, deadlines, time zones and submission instructions in the official documents before bidding.
- A notice with several lots may not have a single reliable value or deadline; ambiguous fields stay blank.
- Automated SAP matching can include an incidental mention or miss an unusual product name. Use the evidence field to verify fit.
- Buyer activity counts refer only to the fetched window.
- Source availability, publication delays and rate limits can affect freshness. This Actor does not promise exhaustive coverage.

Independent product; not affiliated with SAP SE, TED, BOAMP or UK procurement services. Source URLs and source-license labels are included in the Dataset. For problems or suggested SAP terms and sources, use the Actor's **Issues** tab.

# Actor input Schema

## `mode` (type: `string`):

Scan returns a full feed. Monitor returns only new and changed procedures since the previous run for this watch ID.

## `watchId` (type: `string`):

For monitor mode, use a long unique secret and keep it unchanged on scheduled runs. This separates your history from other users.

## `daysBack` (type: `integer`):

Search notices published during this many recent days.

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

TED and France BOAMP run by default. Add the UK feeds for UK opportunities; they have a shorter lookback and may rate limit broad scans.

## `nationalDaysBack` (type: `integer`):

UK feeds publish many notices, so they use a shorter lookback. Schedule daily to avoid gaps.

## `nationalMaxPages` (type: `integer`):

Raise this for longer UK lookbacks. The Actor fails clearly if a feed exceeds the cap.

## `countries` (type: `array`):

Optional ISO 3166-1 alpha-3 country codes, e.g. DEU, FRA, NLD. Leave empty for all.

## `modules` (type: `array`):

Optional filters, e.g. S/4HANA, SuccessFactors, Ariba, ABAP. Leave empty for all.

## `companySkills` (type: `array`):

Optional. Used in the bid brief to explain skill matches or gaps, without hiding opportunities.

## `minLeadDays` (type: `integer`):

Flag tenders with less preparation time than your team needs.

## `maxContractValue` (type: `integer`):

Optional size flag for your bid/no-bid review; enter a currency below. Unknown values are never treated as a match.

## `budgetCurrency` (type: `string`):

Required if maximum contract size is set, e.g. EUR or GBP.

## `requireTitleMatch` (type: `boolean`):

Show only notices whose main title names SAP, S/4HANA, SuccessFactors, ABAP, or Fiori. Turn off to include broader projects that mention SAP in the details.

## `includePlanning` (type: `boolean`):

Include prior information and market consultation notices, which are early signals rather than open bids.

## `includeAwards` (type: `boolean`):

Include completed awards for competitor and buyer intelligence.

## `translationProvider` (type: `string`):

Argos runs offline but downloads language models on first use. DeepL needs an API key and offers higher quality.

## `deeplApiKey` (type: `string`):

Required only when DeepL is selected. You can also set DEEPL_API_KEY as an Actor secret.

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

Higher scores return fewer, more explicit SAP matches.

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

Start with three results for a quick trial. Raise this for a broader watch; larger multilingual runs can take several minutes.

## `maxPages` (type: `integer`):

Safety cap. Increase for wide date ranges so results are complete.

## Actor input object example

```json
{
  "mode": "scan",
  "daysBack": 7,
  "sources": [
    "TED",
    "BOAMP"
  ],
  "nationalDaysBack": 3,
  "nationalMaxPages": 30,
  "countries": [],
  "modules": [],
  "companySkills": [],
  "minLeadDays": 7,
  "requireTitleMatch": false,
  "includePlanning": true,
  "includeAwards": false,
  "translationProvider": "argos",
  "minScore": 60,
  "maxResults": 3,
  "maxPages": 20
}
```

# Actor output Schema

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

Dataset rows from this run. Monitor runs include only new, changed, and deadline reminder events.

# 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("andersen_brothers_consulting/sap-tender-radar").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("andersen_brothers_consulting/sap-tender-radar").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 andersen_brothers_consulting/sap-tender-radar --silent --output-dataset

```

## MCP server setup

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

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/4LV5waeMzzTM0QBLR/builds/AMk1XMuaAVeMnUjPF/openapi.json
