RFP & Tender Monitor — Bid/No-Bid Fit Scoring
Pricing
from $30.00 / 1,000 fit scored basics
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
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.
| 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
- Open RFP & Tender Fit Monitor and click Try for free.
- Fill in Your firm: what you can do, what you are certified for, which countries, what size of contract.
- Put your trade words into Keywords and your CPV or NAICS codes beside them.
- Turn Generate ranked digest off for a first test, then set Look-back window and Max results per source.
- 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, turnonlyNewSinceLastRunoff for one run, or pointstateStoreNameat 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
maxResultsPerSourcefor 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.