TED, SAM.gov & Grants Bid Alerts Scraper avatar

TED, SAM.gov & Grants Bid Alerts Scraper

Pricing

from $0.50 / 1,000 results

Go to Apify Store
TED, SAM.gov & Grants Bid Alerts Scraper

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 $0.50 / 1,000 results

Rating

0.0

(0)

Developer

太郎 山田

太郎 山田

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

3

Monthly active users

3 days ago

Last modified

Share

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, recommended actions, award-watch hints, rebid signals, and explicit warnings when a source is missing a key or degraded.

Store Quickstart

  • Start with jurisdictions: "eu" for a TED-only bid-alert run that requires no external key.
  • Use keywords, cpvCodes, daysAhead, and minValue to 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:

  1. meta.executiveSummary - current queue size, top buyers, review urgency, and source mix.
  2. notices[] - one normalized tender or grant row per opportunity.
  3. alerts[] - deadline, status, closing-soon, award-watch, or rebid events when enabled.
  4. 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 next actions 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

WhoWhy
Business development teamsTurn TED and federal opportunity noise into one shortlist of current bids worth opening today
Capture / bid managersSpot deadline pressure, strategic-value tenders, award-watch rows, and rebid hints in one queue
Public-sector consultantsKeep a reusable buyer/framework watchlist without maintaining source-specific scrapers
RevOps / automation teamsPush recurring procurement summaries into CRM, Slack, webhook routers, or internal dashboards
Grants teamsAdd closing-soon and status-delta alerts once the TED starter lane is already useful

Input

FieldTypeDefaultDescription
jurisdictionsstring"eu"Keep eu for the first success path. Add grants next, then us once you have a SAM.gov key.
keywordsstring"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.
watchTermsstringAdd after the first useful run to highlight buyers, incumbents, frameworks, or competitor names.
cpvCodesstring"72000000,72220000"Starter TED filter for software / IT services.
naicsCodesstring"541512,541519"Optional SAM.gov filter for the US federal expansion lane.
minValuenumber100000Hide lower-value notices when an estimate exists so the starter queue stays commercially relevant.
daysAheadinteger21Keep the first run focused on near-term deadlines.
maxItemsPerSourceinteger40Tighter first-run cap so proof stays cheap and reviewable.
deliverystring"dataset"Start with dataset. Move to webhook after the queue and downstream schema are validated.
includeAwardedbooleanfalseLeave 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:

FieldTypeWhy it matters
meta.executiveSummaryobjectTells you whether the run is stable, watch, or action_needed, plus top buyers, top opportunities, and next actions
meta.warningsarrayMakes skipped, partial, throttled, or degraded source conditions explicit
meta.upgradeGuidanceobjectPreserves the TED-first lane and only nudges toward SAM, grants, recurring delivery, or adjacent workflows when signals are meaningful
noticesarrayNormalized tender / grant rows with daysUntilDeadline, estimatedValue, signalTags, lanePriority, and recommendedAction
alertsarrayRecurring 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 conceptStable output surfaceCompatibility note
procurement_summarymeta.executiveSummary, with upgrade context in meta.upgradeGuidanceSummary fields stay under meta so existing dataset consumers keep working.
opportunity_recordeach row in notices[]Normalized TED / SAM.gov / grants rows keep source, noticeId, title, buyer, deadlineAt, estimatedValue, signalTags, lanePriority, and recommendedAction.
alert_eventeach row in alerts[] plus per-notice alertEvents for grants deltasRecurring 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 questionProof assetWhat it proves
"Will the cheapest first run already surface useful work?"store-input.example.json + sample-output.example.jsonThe 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.jsonCurrent 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 payloadNo — 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 ApifyClient
client = 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?

  1. Reveal the replacement key in your SAM.gov account's Public API Key / Account Details area.
  2. Rotate it locally and resync the Apify task in one step:
$npm run rotate:sam-key -- SAM-REPLACEMENT-KEY
  1. Recheck with npm run canary:check and npm 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.

Upgrade into adjacent procurement workflows only when the shortlist proves useful:

Pricing & Cost Control

Pay Per Event:

  • actor-start: flat fee per run, defined in store-ops/pricing-plan.json and the Apify pricing tab.
  • dataset-item: per-output-item event, defined in store-ops/pricing-plan.json and 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, and maxItemsPerSource=40 for 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.

⭐ Was this helpful?

If this actor saved you time, please leave a ★ rating on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.

Bug report or feature request? Open an issue on the Issues tab of this actor.

Supplier Enrichment Follow-Up

After finding opportunities, awards, or rebid signals, use Industrial Supplier Intelligence to enrich known supplier websites into procurement-ready profiles with capabilities, certifications, locations, contact pages, confidence, and explicit PPE billing fields.

Use Public Vendor Registry Intelligence when the next step is vendor onboarding evidence: registration portals, supplier requirements, documents, eligibility language, and public contact paths.

Adjacent Public-Data Research

For pharma / biotech / CRO competitive intelligence using a different public-data source, see ClinicalTrials.gov Sponsor Pipeline Scraper — same B2B research / investment / public-data buyer cluster, different data source (NIH ClinicalTrials.gov API v2 with sponsor canonicalization and differential event rows).

Premium Report Pack

Use these premium report actors when a raw dataset is ready to become a buyer-facing audit, watch summary, or agency deliverable. All three keep sourceDatasetId as advanced-only; first runs should use pasted input, URLs, demo mode, and reportTier.

Recommended flow from this actor: run the current extraction/check first, export the useful dataset or copy the relevant URLs, then choose entry, premium, or bundle in the report actor with maxChargeUsd as the safety cap.

RFP / Rebid Report Follow-Up

When an opportunity shortlist needs buyer-facing analysis, use Public RFP Rebid Watch Report. Paste public notice or award text first; keep sourceDatasetId for advanced workflows. Start with snapshot ($9), move to rebid_timing ($29) only when incumbent, recompete, deadline, or award evidence is present. The $79 watch summary remains proof-gated.