RFP & Tender Fit Monitor — Bid/No-Bid Scoring & Alerts
Watch TED, UK Find a Tender and SAM.gov for new tenders. You get a bid/no-bid fit score, deadlines and eligibility flags.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
sources,keywords,cpvCodes(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.03 per fit scored basic = $30 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Fit scored basic | Fit scored basic | $0.03 |
| Digest generated | Digest is generated | $0.25 |
| Fit scored AI | Fit scored AI | $0.08 |
| Source checked | The source was checked | $0.01 |
| Tender found | A tender was found | $0.003 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-06-09, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
sources | Which official procurement feeds to check. Valid values: TED (EU), UK_FTS (UK Find a Tender), SAM_GOV (US). TED and UK_FTS are keyless; SAM_GOV needs a free SAM.gov API key in 'samApiKey', if omitted, that source is skipped with a clear message. Unknown values are ignored. | array |
keywords | Free-text terms describing the work you do (matched against notice title/description). Used to filter TED/UK and to inform fit scoring. | array |
cpvCodes | Common Procurement Vocabulary codes to match (e.g. 72000000 = IT services). Filters TED server-side and UK client-side. Leave empty to rely on keywords. | array |
naicsCodes | North American Industry Classification codes for SAM.gov (e.g. 541512 = Computer Systems Design). One query per code (max 3 used) to respect SAM.gov rate limits. | array |
vendorProfile | Your firm's profile, this is what each tender is scored AGAINST. capabilities/certifications are arrays of strings; eligibleRegions is country codes (e.g. GB, US, PL) or empty for no region restriction; min/maxContractValue are numbers or null; smallBusiness is true/false. | object |
generateFitScore | Run the bid/no-bid fit engine on each new tender. This is the product, leave on. | boolean |
onlyNewSinceLastRun | Emit only tenders that are new or changed versus the previous scheduled run (deltas, not dumps). Turn off to re-emit the full current window every run. | boolean |
lookbackDays | How far back to fetch each run. The state store dedupes, so a generous window safely catches late-indexed notices. | integer |
maxResultsPerSource | Cap on notices fetched per source per run. Set this comfortably above the number of notices your keyword/CPV filter typically yields in the look-back window, so the full window is captured each run. A cap far below the window's volume can surface a different subset run-to-run (TED has no stable tiebreaker among same-day notices), fine for niche filters, but raise it for very broad ones. | integer |
weeklyDigest | Write a fit-ranked HTML + Markdown digest to the Key-Value Store (keys DIGEST.html / DIGEST.md), the artifact a bid team reads. | boolean |
webhookUrl | If set, POST a compact JSON run summary here when the run finishes (e.g. a webhook.site URL, Slack/Make/Zapier inbound hook). | string |
samApiKey | Free public API key from a personal SAM.gov account (Account Details -> Public API Key). Required only if SAM_GOV is in 'sources'. Stored as a secret. | string |
fetchSamDescriptions | SAM.gov descriptions require a second API call each and a personal key allows only ~10 calls/day. Leave OFF unless you have a higher-quota key. | boolean |
stateStoreName | Named Key-Value Store that holds the monitor's per-source snapshot across scheduled runs (this is what makes onlyNewSinceLastRun work). Leave as default unless you run several independent monitors and want isolated state. | string |
What you get
A structured dataset — each result includes fields like:
buyerclassificationcountrydeadlinefitidis_changedis_newpublishedrequirements_textsourcesummarytitleurlfit.fit_scorefit.bid_recommendation.decisionvalue.amountExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
4 ready-to-run use cases
TED EU Tenders for IT and Cybersecurity, Fit Scored
CPV 72000000 notices from TED with buyer, country, deadline, value and a fit score against what your team actually does. No key needed for TED.
SAM.gov API Bid Monitor by NAICS Code
New federal solicitations matched on NAICS 541512 and 541511, each scored go or no-go against your vendor profile. Needs a free SAM.gov API key.
Government Tender Alerts for UK Consultancy Work
Management consultancy and PMO notices from Find a Tender, each with buyer, deadline, value and a rules-based fit score against your profile.
UK Find a Tender and TED: Marketing Agency Contracts
Advertising, branding and digital communications notices from both registers, deduped, scored, and posted to your webhook if you paste one in.
Related tools in Monitors & Alerts
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Structured Product Price & Stock Monitor — JSON-LD / Shopify
Track product price and stock from a store's own JSON-LD or Shopify data. Restock, price-drop and sale alerts into Slack or Discord. No API key.
Google Reviews Monitor — Multi-Location Alerts & Reports
Watch Google reviews for every location on a schedule. Get only the new ones, rating-drop alerts in Slack and AI reply drafts. $1.00 per 1,000 reviews.
YouTube Channel Monitor — New Upload Tracker
Watch YouTube channels and get only their new uploads: title, URL, publish date, views, thumbnail. $0.01 per new video.
App Review Triage Monitor — App Store & Google Play Alerts
Sort new App Store and Google Play reviews into bugs, billing and feature requests. Get alerts on rating drops in Slack. $0.40 per 1,000 reviews.
SaaS Competitor Monitor: Pricing, Changelog & Positioning
Track a competitor's SaaS pricing, changelog and positioning on a schedule. You get only what changed, sent to Slack. $0.01 per page checked.
Where this tool sits
- Categories
- Monitors & Alerts
RFP & Tender Fit Monitor: new public tenders, scored bid or no-bid against your firm
Describe what your firm does once, then run this on a schedule. It reads TED (EU), UK Find a Tender and SAM.gov, keeps track of what it has already shown you, and scores each new notice against your capabilities, certifications, regions and contract-value band. Every row carries a bid, maybe or no-bid call with the reason, plus the deadline and how tight it is.
The scoring is a deterministic rules engine, not a model.
| Input | Your capability profile, plus keywords and CPV or NAICS codes |
| Output | One row per new or changed tender, with a bid/no-bid call |
| Ceiling | 1,000 notices per source per run |
| Account needed | None for TED and UK. SAM.gov needs your own free key |
| Price | $0.03 per tender scored, flat on every plan |
🎯 What RFP & Tender Fit Monitor does
Each run fetches the look-back window from every source you picked, drops anything it has shown you before, and scores what is left. State lives in a named key-value store on your own account, so the dedupe survives between scheduled runs. Records stay there for 90 days after they were last seen.
The score is weighted: capability match counts most at 0.4, then classification codes at 0.2, then certifications and eligibility at 0.15 each, then contract value at 0.1. A few things force a no-bid on their own regardless of the score, and they are the ones a bid team would check first: the deadline has already passed, the country sits outside your eligible regions, or a mandatory certification is one you do not hold. A bid with a very tight deadline is downgraded to maybe.
fetchSamDescriptions is off for a reason. SAM.gov descriptions need a second API call each and a personal key allows roughly ten calls a day, so leave it off unless you have a higher-quota key.
📥 What you give it
{
"sources": ["TED", "UK_FTS"],
"keywords": ["managed IT services", "cybersecurity"],
"cpvCodes": ["72000000"],
"vendorProfile": {
"capabilities": ["managed IT", "cloud migration", "helpdesk"],
"certifications": ["ISO 27001"],
"eligibleRegions": ["GB", "IE"],
"minContractValue": 50000,
"maxContractValue": 5000000,
"smallBusiness": true
},
"lookbackDays": 7,
"weeklyDigest": false
}
| Field | What the run uses if you leave it | What it is |
|---|---|---|
sources | TED and UK_FTS | TED, UK_FTS, SAM_GOV. The first two need nothing. Unknown values are ignored. |
vendorProfile | box starts with an example | The thing every tender is scored against. Capabilities and certifications are lists of words, eligibleRegions country codes or empty for anywhere, value bounds numbers or null. |
keywords | box starts with four IT terms | What you do, in plain words. Filters TED and UK, and feeds the score. |
cpvCodes | box starts at 72000000 | EU and UK procurement codes. TED filters on them at source, UK after the fetch. |
naicsCodes | box starts at 541512 | US codes for SAM.gov. One query per code, first three used. |
generateFitScore | true | The whole point. Leave it on. |
onlyNewSinceLastRun | true | Emit deltas rather than the whole window again. |
lookbackDays | 7 | How far back to fetch, 1 to 365. The store dedupes, so a generous window is safe. |
maxResultsPerSource | 100 | Cap per source per run, up to 1,000. Set it above what your filter usually returns in the window. |
weeklyDigest | true | Writes a fit-ranked digest to the key-value store. It is billed on every run it is on. |
webhookUrl | empty | Posts a compact run summary when the run finishes. Slack, Make and Zapier hooks all work. |
samApiKey | none | Your own free SAM.gov public key, stored as a secret. Only needed for SAM_GOV. |
fetchSamDescriptions | false | Costs a second SAM.gov call per notice. |
stateStoreName | rfp-tender-fit-monitor-state | The named store holding the baseline. Change it only to run several independent monitors. |
📤 What you get back
A real row from a recent run, with the long text fields trimmed:
{
"id": "TED:647141-2026",
"title": "Germany – Software package and information systems – 31 101: 414",
"buyer": "Universitätsklinikum Ulm Bereich IV 2 Vergabemanagement und Projekteinkauf Vergabestelle",
"source": "TED",
"country": "DEU",
"classification": ["48000000", "48218000"],
"value": { "amount": null, "currency": null },
"published": "2026-09-21",
"deadline": "2026-10-09",
"url": "https://ted.europa.eu/en/notice/-/detail/647141-2026",
"summary": "Der Bereich IV Wirtschaft und Logistik des Universitätsklinikums Ulm beabsichtigt ...",
"is_new": true,
"is_changed": false,
"fit": {
"fit_score": 68,
"bid_recommendation": {
"decision": "bid",
"reason": "Pursue: good overall alignment with your profile."
},
"mandatory_requirements": [],
"eligibility_flags": [],
"deadline_risk": {
"days_left": 18,
"typical_prep_days": 20,
"level": "medium",
"note": "18 day(s) left vs ~20 typically needed ..."
},
"score_breakdown": {
"sub_scores": { "capability": 0.5, "classification": 0.6, "certification": 1, "value": 0.6, "eligibility": 1 },
"matched_capabilities": [],
"matched_keywords": []
},
"scoring_method": "rules",
"scoringEngine": "basic"
}
}
| Field | What it is |
|---|---|
id | Source prefix plus the notice number, like TED:647141-2026. Stable, so use it as your key. |
fit.fit_score | 0 to 100. Read it next to the decision, not instead of it. |
fit.bid_recommendation.decision | bid, maybe or no-bid, with the reason in plain words. |
fit.deadline_risk | Days left against a 20-day preparation assumption, and a level of high, medium, low or unknown. |
fit.eligibility_flags | What would rule you out, such as a certification you do not hold. |
value.amount | null on a great many notices, because the buyer did not publish one. |
deadline | Also null more often than you would hope. Check the source page when it is. |
summary, title | In the language the buyer published in, not translated. |
is_new, is_changed | New to your baseline, or seen before with changed content. |
🧾 Reading the output
Every dataset row is a real tender. There are no sample or diagnostic rows here, so nothing needs filtering out.
Two artifacts land in the run's key-value store:
| Key | What it is |
|---|---|
DIGEST.html and DIGEST.md | The fit-ranked digest, which is the thing a bid team actually reads. Written when weeklyDigest is on. |
RUN_SUMMARY | Which sources answered, how many notices each returned, and the error text for any source that failed. Check this first when a run looks light. |
A source that fails does not stop the others and does not fail the run. It shows up in RUN_SUMMARY with its reason, and it is not charged.
▶️ How to run it
1. Open RFP & Tender Fit Monitor and click Try for free. 2. Fill in Your firm: what you can do, what you are certified for, which countries, what size of contract. 3. Put your trade words into Keywords and your CPV or NAICS codes beside them. 4. Turn Generate ranked digest off for a first test, then set Look-back window and Max results per source. 5. Click Start. When it looks right, schedule it and point Webhook URL at your Slack.
💰 How much does it cost?
$0.03 per tender fit-scored. Flat on every Apify plan, no volume tiers. Alongside it:
| Event | Price |
|---|---|
| Tender fit-scored | $0.03 |
| Tender found | $0.003 |
| Source checked | $0.01 |
| Ranked digest written | $0.25 |
The digest is billed on every run it is switched on, including a run that found nothing new. It is on by default, so turn it off for daily runs and leave it on for the weekly one. A tender you have already seen is not scored again and not charged again.
💡 What people use it for
- A daily sweep with the digest off, so a bid team sees only what is new and only pays for that.
- A weekly ranked digest that lands in an inbox as an HTML page, already sorted by fit.
- Filtering a very broad CPV code down to what your certifications actually let you win, using
eligibility_flags.
- Catching deadline risk early:
deadline_risk.levelflags the notices that arrived too late to
answer properly.
- Feeding a CRM through the webhook, keyed on
id, so nothing is chased twice.
🚧 What it does not do
- Three sources, not every portal. TED, UK Find a Tender and SAM.gov.
- It does not read attached documents. Scoring works on the notice title, summary and codes that
the portal publishes.
- No translation. A Bulgarian notice is scored and delivered in Bulgarian.
value.amountanddeadlineare oftennull, because buyers leave them out. The score handles
a missing value rather than guessing one.
- Changing your
vendorProfiledoes not re-score tenders already in the baseline. To rescore,
turn onlyNewSinceLastRun off for one run, or point stateStoreName at a fresh name.
- SAM.gov needs your own free key, and a personal key's daily quota is small.
- A cap well below what your filter returns can surface a different subset each run, because TED
does not order same-day notices predictably. Raise maxResultsPerSource for broad filters.
- It recommends, it does not decide. The score is a rules engine reading published text.
🧭 Which procurement tool do you need?
| If you want | Use |
|---|---|
| EU, UK and US tenders scored against your firm | This one |
| US city, county and school-district bids | US Local Bid Portals Scraper |
| US company filings and financials | SEC EDGAR Scraper |
| Contact details for a list of company websites | Contact Details Scraper |
❓ Questions people ask
Do I need any accounts? Not for TED or UK Find a Tender. SAM.gov needs a free public API key from your own SAM.gov account, and it is stored as a secret.
How does it know what is new? A named key-value store on your account holds the baseline per source. That is what onlyNewSinceLastRun reads, and it keeps records for 90 days after they were last seen.
Can I run two different profiles? Yes. Give each one its own stateStoreName so their baselines stay apart.
Why is my run so cheap some days and not others? You pay per tender scored, and a quiet day in your keywords is a quiet run. The digest is the fixed part, so switch it off when you do not need it.
Is any of the scoring done by AI? No. Every score comes from the rules engine, and that is what the price covers.
Is this legal? These are official public procurement notices, published by TED, the UK government and SAM.gov for exactly this purpose. Buyer contact names can appear in a notice summary and are personal data under GDPR. Apify's write-up on scraping and the law is a sensible starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID, and read RUN_SUMMARY in the run's key-value store first: it names which source failed and why.