RFP & Tender Monitor — Bid/No-Bid Fit Scoring avatar

RFP & Tender Monitor — Bid/No-Bid Fit Scoring

Pricing

from $28.50 / 1,000 fit scored basics

Go to Apify Store
RFP & Tender Monitor — Bid/No-Bid Fit Scoring

RFP & Tender Monitor — Bid/No-Bid Fit Scoring

Monitor public tenders on TED (EU), UK Find a Tender and SAM.gov. Each new notice is scored bid, maybe or no-bid against your capabilities, certifications, regions and contract size, with the reason, a fit score, eligibility flags and deadline risk. $33 per 1,000 new tenders.

Pricing

from $28.50 / 1,000 fit scored basics

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

4 days ago

Last modified

Share

Monitor public tenders on TED, UK Find a Tender and SAM.gov and get every new one scored bid, maybe or no-bid against your firm: the call with its reason, a fit score from 0 to 100, what would rule you out, and how tight the deadline is. Describe what your firm does once, run it on a schedule, and it only shows you what is new.

The scoring is a rules engine reading the published notice, not a model, and it never opens the attached documents. Buyers often leave out the contract value and sometimes the deadline, so expect null in both.

InputYour firm's profile, plus keywords and CPV or NAICS codes
OutputOne row per new or changed tender, with a bid, maybe or no-bid call and the reason
Ceiling1,000 notices per source per run
Speed35 to 80 seconds a run for TED and UK together
Account neededNone for TED and UK. SAM.gov needs your own free key
Price$33.00 per 1,000 new tenders ($0.003 to find each one, $0.03 to score it), flat on every plan, plus $0.01 per source checked and $0.25 per digest. The free plan's $5 a month covers about 150

🔍 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, certifications and eligibility at 0.15 each, and contract value at 0.1. A few things force a no-bid on their own, whatever the score, and they are the ones a bid team would check first: the deadline has passed, the country is 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 call each and a personal key allows roughly ten calls a day, so leave it off unless you have a higher-quota key.

📋 What data you get from each public tender

What you getField
The notice: title, buyer, country, summary and linktitle, buyer, country, summary, url
A stable id and the portal it came fromid, source
CPV or NAICS codesclassification
Contract value and currency, when the buyer published onevalue
Publication date and deadlinepublished, deadline
New, or seen before with changed contentis_new, is_changed
Bid, maybe or no-bid, with the reason in plain wordsfit.bid_recommendation
The fit score and the sub-scores behind itfit.fit_score, fit.score_breakdown
What would rule you out, and the requirements found in the textfit.eligibility_flags, fit.mandatory_requirements
Days left against a typical preparation timefit.deadline_risk

▶️ How to monitor public tenders

  1. Open RFP & Tender Fit Monitor and click Try for free.
  2. Fill in Vendor capability profile: 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 (days) and Max results per source.
  5. Click Start. When it looks right, schedule it and point Webhook URL (optional) at your Slack.

💰 How much does it cost to monitor public tenders?

$0.033 per new tender: $0.003 when it is found and $0.03 when it is scored. That is $33.00 per 1,000, flat on every Apify plan. The free plan's $5 a month covers about 150 new tenders, fewer with the digest on.

EventPrice
Tender found$0.003
Tender fit-scored$0.03
Source checked, each source each run$0.01
Ranked digest written$0.25

A tender you have already seen is not found or scored again. One whose content changed is scored again, at $0.03. A source that fails is not charged. The AI scoring line in the Store's price list never fires: every score comes from the rules engine.

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.

If you set a maximum charge for a run, it stops where the next charge would not fit, and the run's status says so.

📥 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", "IRL"],
"minContractValue": 50000,
"maxContractValue": 5000000,
"smallBusiness": true
},
"lookbackDays": 7,
"weeklyDigest": false
}
FieldDefaultWhat it is
sourcesTED and UK_FTSTED, UK_FTS, SAM_GOV. The first two need nothing. An unknown value is skipped and listed as failed in RUN_SUMMARY.
vendorProfilenone; the box starts with an exampleWhat every tender is scored against. Capabilities and certifications are lists of words, value bounds numbers or null. Add cpvCodes or naicsCodes in here too if you want codes to count in the score.
keywordsnone; the box starts with four IT termsWhat you do, in plain words. Filters TED and UK, and feeds the score.
cpvCodesnone; the box starts at 72000000EU and UK procurement codes. TED filters on them at source, UK after the fetch.
naicsCodesnone; the box starts at 541512US codes for SAM.gov. One query per code, first three used.
generateFitScoretrueThe whole point. Leave it on: switch it on after runs without it and the next run scores, and charges for, every tender in the window, including ones it does not show you again.
onlyNewSinceLastRuntrueRows for new and changed tenders only. Off, the whole window comes back, with scores already paid for reused.
lookbackDays7How far back to fetch, 1 to 365. The store dedupes, so a generous window is safe.
maxResultsPerSource100Cap per source per run, up to 1,000. Set it above what your filter usually returns in the window.
weeklyDigesttrueWrites a fit-ranked digest to the key-value store. Billed on every run it is on.
webhookUrlemptyPosts a short run summary when the run finishes. Slack, Make and Zapier hooks all work.
samApiKeynoneYour own free SAM.gov public key, stored as a secret. Only needed for SAM_GOV.
fetchSamDescriptionsfalseCosts a second SAM.gov call per notice.
stateStoreNamerfp-tender-fit-monitor-stateThe named store holding the baseline. Change it only to run several independent monitors.

Country codes, read this before setting regions. TED notices carry three-letter codes such as DEU or IRL, while UK rows say GB and SAM.gov rows US. The region check compares them as written, so list each country both ways, as in ["GB", "IE", "IRL"], or a TED tender from a country you serve can come back no-bid.

📤 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"
}
}
FieldHow to read it
idSource prefix plus the notice number, like TED:647141-2026. Stable, so use it as your key.
fit.fit_score0 to 100. Read it next to the decision, not instead of it.
fit.bid_recommendation.decisionbid, maybe or no-bid, with the reason in plain words.
fit.deadline_riskDays left against a 20-day preparation assumption, and a level of high, medium, low, expired or unknown.
fit.eligibility_flagsWhat would rule you out, such as a certification you do not hold.
countryThree letters on TED rows, two on UK and SAM.gov rows.
value.amountnull on a great many notices, because the buyer did not publish one.
deadlineAlso null more often than you would hope. Check the source page when it is.
summary, titleIn the language the buyer published in, not translated.

🧾 Reading the output

Every dataset row is a real tender. There are no sample or diagnostic rows, so nothing needs filtering out.

Two artifacts land in the run's key-value store:

KeyWhat it is
DIGEST.html and DIGEST.mdThe fit-ranked digest, which is the thing a bid team actually reads. Written when weeklyDigest is on.
RUN_SUMMARYWhich sources answered, how many notices each returned, and the error 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.

💡 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.
  • Cutting a very broad CPV code down to what your certifications actually let you win, using eligibility_flags.
  • 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 title, summary and codes the portal publishes.
  • No translation. A Bulgarian notice is scored and delivered in Bulgarian.
  • Changing your vendorProfile does not re-score tenders already in the baseline. To rescore, turn onlyNewSinceLastRun off for one run, or point stateStoreName at a fresh name.
  • Editing keywords or codes starts a fresh baseline. Every tender in the window is new again, and charged again.
  • 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.
  • Dami's Studio is independent and is not affiliated with TED, Find a Tender or SAM.gov.

🧭 Which procurement tool do you need?

If you wantUse
EU, UK and US federal tenders scored against your firmThis one
US city, county, state and school-district bidsUS Local Bid Portals Scraper
US federal grant opportunitiesUS Federal Grants Scraper
Who won past US federal contracts, and for how muchUSASpending Federal Awards Scraper
A European buyer's or rival's company register recordNorth Data Scraper
US company filingsSEC EDGAR Scraper

❓ Questions people ask

Do I need an account to monitor tenders?

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 which tenders are 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 does a quiet day still cost something?

You pay per tender found and scored, and a quiet day in your keywords is a quiet run. The fixed parts are the source checks and the digest, so switch the digest 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.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/rfp-tender-fit-monitor. Either way the run happens on your Apify account at the same price.

These are public procurement notices, published by TED, the UK government and SAM.gov. Buyer contact names can appear in a summary and are personal data under GDPR. Apify's write-up on the legality of web scraping 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.