TED, SAM.gov & Grants Bid Alerts Scraper
Pricing
from $3.00 / 1,000 results
TED, SAM.gov & Grants Bid Alerts Scraper
Start with a TED-only quickstart, then scrape TED tenders, SAM.gov opportunities, and grants notices into one public-sector bid-alert dataset with deadlines, buyers, values, award watch, rebid watch signals, and webhook-ready summaries.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
naoki anzai
Maintained by CommunityActor stats
1
Bookmarked
7
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
✅ Reliability note (June 2026): Infrastructure upgraded June 2026 — any run failures from an account capacity limit in early May 2026 are fully resolved. Runs are now stable. If you tried this actor in early May and hit a failure, please give it another run — it works smoothly now.
Run the next report
Keep the workflow inside public procurement research:
- Government Tender & Grants Alert Report monitors matched TED, Grants.gov, UK, World Bank, and optional SAM.gov opportunities.
- GovCon Recompete & Incumbent Watch turns public award history into recompete, incumbent, spend-shift, and concentration reports.
See Also
These two report paths complete the public-procurement workflow. Keep the first queue narrow, then run a report or export only for the buyer watch that needs deeper review.
Scrape TED tenders, SAM.gov opportunities, and Grants.gov notices into one public-sector bid-alert dataset. Each run returns buyer names, deadlines, estimated values, signal tags, award-watch hints, rebid signals, and explicit warnings when a source is missing a key or degraded.
Store Quickstart
{"jurisdictions": "eu","keywords": "cloud,cybersecurity,IT services","cpvCodes": "72000000,72220000","daysAhead": 21,"maxItemsPerSource": 40,"minValue": 100000,"delivery": "dataset"}
- Start with
jurisdictions: "eu"for a TED-only bid-alert run that requires no external key. - Use
keywords,cpvCodes,daysAhead, andminValueto keep the first dataset focused. - Add
jurisdictions: "us"when you have a SAM.gov API key. - Add
jurisdictions: "grants"for Grants.gov funding notices and deadline/status alerts. - Set
delivery: "webhook"only after the dataset shape is trusted.
Runtime: Node.js 20+. Use dryRun: true to validate inputs without dataset writes or webhook delivery.
Second-pillar upsell ladder
Start with the TED-only quickstart. Add SAM.gov, grants, award watch, rebid watch, and webhook routing only when the initial bid-alert queue is useful enough to justify broader coverage.
What You Get
A normal run returns:
meta.executiveSummary- current queue size, top buyers, review urgency, and source mix.notices[]- one normalized tender or grant row per opportunity.alerts[]- deadline, status, closing-soon, award-watch, or rebid events when enabled.warnings[]/errors[]- missing API keys, skipped sources, throttling, or degraded upstream responses.
Key Features
- 📋 Summary-first procurement queue — Executive summary, top opportunities, top buyers, and review signals before raw notice scrolling
- 🇪🇺🇺🇸🎯 Multi-source public-sector coverage — TED first, then SAM.gov and Simpler.Grants.gov when the starter lane proves useful
- 🚨 Bid-alert prioritization — Deadline pressure, value, award/rebid phrasing, and watch-term hits roll into the review queue
- 🔁 Recurring watch workflows — Award watch, rebid watch, grants deadline/status deltas, and buyer/incumbent monitoring
- ⚠️ Honest degraded behavior — Missing keys, throttled sources, and zero-result lanes show up as warnings instead of fake completeness
- 📡 Dataset or webhook delivery — Keep validation low-friction with dataset output, then route action-needed rows downstream
Use Cases
| Who | Why |
|---|---|
| Business development teams | Turn TED and federal opportunity noise into one shortlist of current bids worth opening today |
| Capture / bid managers | Spot deadline pressure, strategic-value tenders, award-watch rows, and rebid hints in one queue |
| Public-sector consultants | Keep a reusable buyer/framework watchlist without maintaining source-specific scrapers |
| RevOps / automation teams | Push recurring procurement summaries into CRM, Slack, webhook routers, or internal dashboards |
| Grants teams | Add closing-soon and status-delta alerts once the TED starter lane is already useful |
Input
| Field | Type | Default | Description |
|---|---|---|---|
| jurisdictions | string | "eu" | Keep eu for the first success path. Add grants next, then us once you have a SAM.gov key. |
| keywords | string | "cloud,cybersecurity,IT services" | Starter search terms for TED titles and future SAM/grants expansion. Keep them narrow enough that the first queue feels reviewable. |
| watchTerms | string | — | Add after the first useful run to highlight buyers, incumbents, frameworks, or competitor names. |
| cpvCodes | string | "72000000,72220000" | Starter TED filter for software / IT services. |
| naicsCodes | string | "541512,541519" | Optional SAM.gov filter for the US federal expansion lane. |
| minValue | number | 100000 | Hide lower-value notices when an estimate exists so the starter queue stays commercially relevant. |
| daysAhead | integer | 21 | Keep the first run focused on near-term deadlines. |
| maxItemsPerSource | integer | 40 | Tighter first-run cap so proof stays cheap and reviewable. |
| delivery | string | "dataset" | Start with dataset. Move to webhook after the queue and downstream schema are validated. |
| includeAwarded | boolean | false | Leave off for starter/open-opportunity runs. Enable once award watch or rebid monitoring matters. |
Input Example
{"jurisdictions": "eu","keywords": "cloud,cybersecurity,IT services","cpvCodes": "72000000,72220000","daysAhead": 21,"maxItemsPerSource": 40,"minValue": 100000,"delivery": "dataset"}
Input Examples
Example: Federal IT services in Q3
{"sources": ["sam.gov"],"query": "IT services","postedAfter": "2026-07-01","noticeType": ["Solicitation","Combined Synopsis/Solicitation"],"maxResults": 50}
Example: EU TED contract awards
{"sources": ["ted-eu"],"query": "construction services","noticeType": ["Contract award notice"],"minValueEur": 1000000,"maxResults": 50}
Example: Grants.gov small-business RFPs
{"sources": ["grants-gov"],"categories": ["Health","Education"],"setAside": "Small Business","maxResults": 50}
Output
The actor returns a summary-first payload with four top-level surfaces:
| Field | Type | Why it matters |
|---|---|---|
meta.executiveSummary | object | Tells you whether the run is stable, watch, or action_needed, plus top buyers, top opportunities, and source-derived review signals |
meta.warnings | array | Makes skipped, partial, throttled, or degraded source conditions explicit |
meta.upgradeGuidance | object | Preserves the TED-first lane and only nudges toward SAM, grants, recurring delivery, or adjacent workflows when signals are meaningful |
notices | array | Normalized tender / grant rows with daysUntilDeadline, estimatedValue, signalTags, lanePriority, and a source-derived recommendedAction review cue |
alerts | array | Recurring delta events such as deadline_changed, status_changed, or closing_soon |
PPE compatibility map
The PPE names are compatibility labels for the existing public payload; they do not replace the stable JSON keys buyers already consume. Dataset delivery attaches the opportunity_record event name to each notices[] row through Actor.pushData(row, "opportunity_record"); procurement_summary and alert_event remain additive compatibility surfaces under meta and alerts[].
| PPE concept | Stable output surface | Compatibility note |
|---|---|---|
procurement_summary | meta.executiveSummary, with upgrade context in meta.upgradeGuidance | Summary fields stay under meta so existing dataset consumers keep working. |
opportunity_record | each row in notices[] | Normalized TED / SAM.gov / grants rows keep source, noticeId, title, buyer, deadlineAt, estimatedValue, signalTags, lanePriority, and recommendedAction. |
alert_event | each row in alerts[] plus per-notice alertEvents for grants deltas | Recurring grants deadline/status/closing-soon events remain additive; empty starter runs still return alerts: []. |
Compatibility guardrail: the actor continues to return top-level meta, errors, notices, and alerts. It does not emit top-level procurement_summary, opportunity_record, or alert_event aliases, so current integrations are not forced through a rename.
Output Example
{"meta": {"generatedAt": "2026-04-23T11:48:39.536Z","now": "2026-04-23T11:48:37.305Z","warnings": [],"executiveSummary": {"overallStatus": "action_needed","brief": "Tracked 40 tender / grant notice(s) this run. 1 notice(s) need same-day bid review. Source mix: 40 TED.","recommendedCadence": "daily","trackedNoticeCount": 40,"immediateReviewCount": 1,"strategicValueCount": 14,"sourceMix": {"ted": 40}}},"notices": [{"source": "ted","noticeId": "c97dfecb-0cf9-4ba7-800d-685dbd87bbda","title": "Sweden – IT services: consulting, software development, Internet and support – Upphandling - IT-konsulttjänster ramavtal","buyer": "Transportstyrelsen","deadlineAt": "2026-04-23T22:00:00.000Z","estimatedValue": 736000000,"urgencyLevel": "critical","signalTags": ["urgent_deadline","strategic_value"],"lanePriority": "now","recommendedAction": "Triage before the deadline"}],"alerts": []}
The fuller starter payload is in sample-output.example.json.
Proof buyers can inspect
| Buyer question | Proof asset | What it proves |
|---|---|---|
| "Will the cheapest first run already surface useful work?" | store-input.example.json + sample-output.example.json | The starter lane is real: 40 TED notices, 1 same-day review, and 14 strategic-value rows from the exact quickstart input |
| "Does the recurring production surface actually work live?" | live-proof.example.json | Current canary and contract checks passed on the live task surface, with a sanitized sample from a 117-result recurring run |
| "Will missing paid sources be hidden?" | warnings[], errors[], and meta.upgradeGuidance in the payload | No — skipped, partial, throttled, or degraded source conditions are surfaced explicitly instead of being treated as complete coverage |
API Usage
Run this actor programmatically using the Apify API. Replace YOUR_API_TOKEN with your token from Apify Console → Settings → Integrations.
cURL
curl -X POST "https://api.apify.com/v2/acts/taroyamada~procurement-intel-actor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{ "jurisdictions": "eu", "keywords": "cloud,cybersecurity,IT services", "cpvCodes": "72000000,72220000", "daysAhead": 21, "maxItemsPerSource": 40, "minValue": 100000, "delivery": "dataset" }'
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("taroyamada/procurement-intel-actor").call(run_input={"jurisdictions": "eu","keywords": "cloud,cybersecurity,IT services","cpvCodes": "72000000,72220000","daysAhead": 21,"maxItemsPerSource": 40,"minValue": 100000,"delivery": "dataset"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('taroyamada/procurement-intel-actor').call({"jurisdictions": "eu","keywords": "cloud,cybersecurity,IT services","cpvCodes": "72000000,72220000","daysAhead": 21,"maxItemsPerSource": 40,"minValue": 100000,"delivery": "dataset"});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Tips & Limitations
- Start TED-only before you add SAM.gov or grants. That is the lowest-support path and the best first proof.
- SAM.gov and grants are additive, not required. If a source is skipped, throttled, or returns zero rows, the actor keeps the run honest through
warnings/errors. - Watch terms work best after the starter lane already produces useful buyers or frameworks. Otherwise they add noise before they add insight.
- Grants deadline/status alerts rely on saved state, so recurring runs matter more than one-off tests.
- Use dataset delivery first. Promote to webhook only after you trust the row shape and internal routing schema.
FAQ
What is the best first run?
Use store-input.example.json unchanged: TED-only, dataset delivery, no SAM.gov key, and a tight 21-day window.
What happens if SAM.gov or grants are unavailable?
The actor does not pretend coverage is complete. It returns the useful sources it could fetch, then surfaces explicit warnings or source errors for the missing lane.
How do I rotate the SAM.gov API key without breaking the scheduled task?
- Reveal the replacement key in your SAM.gov account's Public API Key / Account Details area.
- Rotate it locally and resync the Apify task in one step:
$npm run rotate:sam-key -- SAM-REPLACEMENT-KEY
- Recheck with
npm run canary:checkandnpm run contract:test:live.
When should I enable award watch or rebid watch?
After the starter or recurring TED queue already proves useful. Those workflows are best when you care about incumbent movement, renewals, or follow-on phrasing more than net-new open bids.
How are duplicates handled?
The actor normalizes notices and deduplicates them across comparable identifiers so recurring queues stay cleaner when similar records appear across sources.
Can I schedule recurring bid alerts?
Yes. The current live-proof.example.json comes from the production task / schedule surface, and the actor is designed for daily or weekly recurring runs.
Pricing & Cost Control
Pay Per Event:
actor-start: flat fee per run, defined instore-ops/pricing-plan.jsonand the Apify pricing tab.dataset-item: per-output-item event, defined instore-ops/pricing-plan.jsonand the Apify pricing tab.
Apify Store pricing is usage-based, so spend mainly follows how many notices you return and when you expand from the TED-first starter lane into broader source coverage or delivery routing. Check the live Apify pricing tab before publishing customer-facing estimates.
- Keep
jurisdictions="eu",daysAhead=21, andmaxItemsPerSource=40for the cheapest proof path. - Tighten keywords, CPV codes, NAICS filters, or watch terms before you raise the per-source cap.
- Add SAM.gov or grants only when the starter queue is already useful enough to justify a broader source mix.
- Keep
delivery="dataset"until humans trust the row shape; use webhook routing once the queue is stable.
No subscription required — you only pay for what you use.