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

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

Pricing

from $30.00 / 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

Watch public tender portals for work you can bid on. It reads TED (EU), UK Find a Tender and SAM.gov. Every new notice is scored against your capabilities, regions and contract-value band. You get a BID/NO-BID call and a fit score. Plus eligibility flags and deadlines. $0.03 per tender fit-scored.

Pricing

from $30.00 / 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

a day ago

Last modified

Share

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.

InputYour capability profile, plus keywords and CPV or NAICS codes
OutputOne row per new or changed tender, with a bid/no-bid call
Ceiling1,000 notices per source per run
Account neededNone 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
}
FieldWhat the run uses if you leave itWhat it is
sourcesTED and UK_FTSTED, UK_FTS, SAM_GOV. The first two need nothing. Unknown values are ignored.
vendorProfilebox starts with an exampleThe 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.
keywordsbox starts with four IT termsWhat you do, in plain words. Filters TED and UK, and feeds the score.
cpvCodesbox starts at 72000000EU and UK procurement codes. TED filters on them at source, UK after the fetch.
naicsCodesbox starts at 541512US codes for SAM.gov. One query per code, first three used.
generateFitScoretrueThe whole point. Leave it on.
onlyNewSinceLastRuntrueEmit deltas rather than the whole window again.
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. It is billed on every run it is on.
webhookUrlemptyPosts a compact 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.

📤 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"
}
}
FieldWhat it is
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 or unknown.
fit.eligibility_flagsWhat would rule you out, such as a certification you do not hold.
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.
is_new, is_changedNew 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:

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 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:

EventPrice
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.level flags 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.amount and deadline are often null, because buyers leave them out. The score handles a missing value rather than guessing one.
  • 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.
  • 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 wantUse
EU, UK and US tenders scored against your firmThis one
US city, county and school-district bidsUS Local Bid Portals Scraper
US company filings and financialsSEC EDGAR Scraper
Contact details for a list of company websitesContact 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.