Government Tenders Scraper: SAM.gov & TED Europe avatar

Government Tenders Scraper: SAM.gov & TED Europe

Pricing

from $8.00 / 1,000 results

Go to Apify Store
Government Tenders Scraper: SAM.gov & TED Europe

Government Tenders Scraper: SAM.gov & TED Europe

Scrapes US federal contract opportunities (SAM.gov) and EU public procurement notices (TED) into one unified schema. Search by keyword, NAICS or CPV code, or paste portal URLs. Full statements of work as clean Markdown for LLM use, ISO 8601 UTC deadlines, and buyer contact details.

Pricing

from $8.00 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

All-in-One Government Tenders & Procurement Scraper

Scrapes public procurement opportunities from SAM.gov (US federal contract opportunities) and TED — Tenders Electronic Daily (EU public procurement) and returns them in one unified schema.

Search by keyword, by industry code (NAICS for the US, CPV for the EU), or just paste portal URLs — each one is routed to the right portal automatically. Every row comes back with the same 46 fields, whichever side of the Atlantic it came from.

Public data only. No account, no login and no API key required on either portal.

Why one Actor instead of two

The two portals have almost nothing in common mechanically: different ID formats, different industry taxonomies, different date encodings, different ways of expressing what a contract is worth — and TED publishes every title and description in up to 24 languages at once.

They have exactly one thing in common: a public body saying what it intends to buy.

If you sell to governments, you want one table of live tenders. Which jurisdiction an opportunity happens to sit in is not something you chose, and reconciling two ID schemes, two date formats and two industry taxonomies is the genuinely hard part of the job. This Actor does that once, rather than handing you the same problem twice.

Why use this actor

  • No account, no login, no API key on either portal
  • Full statements of work as clean Markdown — ready to drop straight into an LLM prompt for bid/no-bid triage, requirement extraction or summarisation
  • Named procurement officers with real email addresses — the contracting officer and their alternate, not a generic inbox
  • Every deadline as a true ISO 8601 UTC timestamp, so US and EU tenders sort correctly against each other in one list
  • One identical schema across both portals — no per-source branching in your pipeline
  • Attachment listings, set-aside status, place of performance, estimated values and award winners
  • Stable JSON output for pipelines, databases and spreadsheets; automatic retries; export to JSON/CSV/Excel

How it works

  1. You give it keywords, industry codes, or URLs pasted from either portal.
  2. Each input is routed to the portal that can actually answer it — a NAICS code goes to SAM.gov, a CPV code goes to TED, keywords go to both.
  3. It pages through every matching notice, then fetches each one in full to pull the complete statement of work, the contacts and the exact dates.
  4. Every notice is folded into one schema, with descriptions converted to clean Markdown and all dates standardised to UTC.

No scrapers, browsers or blocks to babysit.

InputGoes toExample
keywordsBoth["software development", "cyber security"]
naicsCodesSAM.gov["541511"] (Custom Computer Programming)
cpvCodesTED["72000000"] (IT services)
industryCodesSplit automatically["541511", "72000000"]
noticeTypesBoth, translated["solicitation", "award"]
setAsidesSAM.gov["SBA", "8A", "SDVOSBC"]
pscCodesSAM.gov["7G21", "D302"]
buyerCountriesTED["DEU", "FRA", "POL"]
placeOfPerformanceStatesSAM.gov["VA", "CA"]
startUrlsRouted by the URLa search URL, a notice URL, or a bare ID

Mixed industry codes just work. Put 541511 and 72000000 in one industryCodes list and the NAICS code is sent to SAM.gov while the CPV code goes to TED — neither is sent to the portal that cannot read it.

Supported URL and ID forms

PortalSearch URLSingle notice
SAM.govhttps://sam.gov/search/?index=opp&naics=541511https://sam.gov/opp/<32-char-id>/view
TEDhttps://ted.europa.eu/en/search/result?...https://ted.europa.eu/en/notice/547033-2026/html

Bare IDs work too: a 32-character SAM.gov notice ID, or a TED publication number like 547033-2026. So does the shorthand sam:<id> / ted:<id>.

Input

{
"sources": ["sam", "ted"],
"keywords": ["software development"],
"industryCodes": ["541511", "72000000"],
"noticeTypes": ["solicitation"],
"activeOnly": true,
"publishedWithinDays": 30,
"deadlineWithinDays": 45,
"includeDescription": true,
"includeAttachments": true,
"maxItemsPerQuery": 200,
"tedLanguage": "eng",
"tedScope": "ALL",
"samSort": "-modifiedDate",
"maxConcurrency": 6,
"minRequestInterval": "0.15",
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
FieldTypeDescription
sourcesarrayWhich portals to search: sam, ted, or both. Pasted URLs always go to the portal they name.
startUrlsarraySAM.gov / TED search or notice URLs, or bare notice IDs.
keywordsarrayFree-text terms, combined with OR. Searched on both portals.
industryCodesarrayMixed NAICS and CPV codes; split automatically by shape.
naicsCodesarrayUS industry codes. SAM.gov only.
cpvCodesarrayEU Common Procurement Vocabulary codes. TED only.
noticeTypesarraysolicitation, presolicitation, sources-sought, award, special-notice, justification, modification, surplus-sale. Translated into each portal's own codes.
activeOnlybooleanRestrict SAM.gov to notices still open. Default true.
publishedWithinDaysintegerOnly notices published in the last N days. 0 disables.
deadlineWithinDaysintegerOnly notices closing within the next N days. 0 disables.
setAsidesarrayUS small-business set-aside codes. SAM.gov only.
pscCodesarrayUS Product Service Codes. SAM.gov only.
organizationIdsarrayRestrict to a buying agency. SAM.gov only.
placeOfPerformanceStatesarrayTwo-letter US state codes. SAM.gov only.
placeOfPerformanceCountriesarrayThree-letter country codes. SAM.gov only.
buyerCountriesarrayThree-letter country codes of the EU buyer. TED only.
tedExpertQuerystringA raw TED expert-search expression, replacing every other TED filter.
includeDescriptionbooleanFetch full statements of work. Strongly recommended — see Notes. Default true.
includeAttachmentsbooleanAlso list solicitation attachments. SAM.gov only. Default false.
includeRawUpstreambooleanAttach each portal's original record under rawUpstream. Default false.
maxItemsPerQueryintegerCap per portal per query. 0 means no cap. Default 200.
tedScopestringALL, ACTIVE, or LATEST.
tedLanguagestringPreferred language for TED titles and descriptions.
tedOnlyLatestVersionsbooleanOne row per notice rather than every revision. Default true.
samSortstringResult ordering for SAM.gov.
samPageSizeintegerNotices per SAM.gov request. Default 100.
maxConcurrencyintegerTotal simultaneous requests. Default 6.
minRequestIntervalstringSeconds between request starts. Default 0.15.
proxyConfigurationobjectResidential proxy recommended.

Output

Three record types share the dataset, told apart by recordType: TENDER (one per notice), SEARCH_SUMMARY (one per query) and ERROR.

A US tender (SAM.gov)

{
"_input": "criteria:SAM.gov",
"_source": "SAM.gov-api",
"_scrapedAt": "2026-08-21T20:12:15Z",
"recordType": "TENDER",
"tenderId": "ab5de2004b3a4549819300908e5f3ee1",
"source": "SAM.gov",
"sourceJurisdiction": "US",
"title": "Request for Solutions (RFS): Autonomous Coding (AC) and Automated Appeals & Denials Management (ADM)",
"agency": "DEFENSE HEALTH AGENCY",
"agencyDepartment": "DEPT OF DEFENSE",
"agencyPath": ["DEPT OF DEFENSE", "DEFENSE HEALTH AGENCY (DHA)", "DEFENSE HEALTH AGENCY"],
"procurementType": "Solicitation",
"procurementTypeCode": "o",
"procedureType": null,
"contractNature": null,
"deadlineDate": "2026-08-28T14:00:00Z",
"deadlineDateRaw": "2026-08-28T10:00:00-04:00",
"deadlineDatePrecision": "datetime",
"deadlineDatesAllLots": [],
"deadlineTimeZone": "America/New_York",
"publishedDate": "2026-08-21T15:19:04Z",
"lastModifiedDate": "2026-08-21T15:19:04Z",
"archiveDate": "2026-09-27T00:00:00Z",
"estimatedValue": null,
"estimatedValueCurrency": null,
"estimatedValueBasis": null,
"url": "https://sam.gov/opp/ab5de2004b3a4549819300908e5f3ee1/view",
"descriptionMarkdown": "August 21, 2026: Responses to submitted questions are now available in the attached document, 'ACADM Phase 1 QA 082126'.\n\n**Request for Solutions (RFS): Autonomous Coding (AC) and Automated Appeals & Denials Management (ADM)**\n\n**Opportunity Overview**\n\nThe Defense Healthcare Management Systems Modernization (DHMSM) Program Management Office … ",
"descriptionTruncated": false,
"descriptionSource": "detail",
"industryCodeSystem": "NAICS",
"industryCodes": ["541511"],
"classificationCode": "DA01",
"setAside": null,
"setAsideLabel": null,
"solicitationNumber": "HT0038RFSACADM",
"noticeStatus": "open",
"isActive": true,
"isCanceled": false,
"buyerCountry": "USA",
"placeOfPerformance": {
"city": "Rosslyn", "state": "Virginia", "stateCode": "VA",
"country": "UNITED STATES", "countryCode": "USA", "zip": null
},
"contacts": [
{ "name": "Sharjeel Javaid", "title": null, "email": "sharjeel.j.javaid.civ@health.mil", "phone": null, "fax": null, "type": "primary" },
{ "name": "Dominique Brown", "title": null, "email": "dominique.u.brown.civ@health.mil", "phone": null, "fax": null, "type": "secondary" }
],
"submissionUrl": null,
"attachments": [
{ "name": "ACADM Phase 1 QA 082126.pdf", "type": "file", "mimeType": ".pdf", "sizeBytes": 217079, "accessLevel": "public", "postedDate": "2026-08-21T15:19:04Z", "url": "https://sam.gov/api/prod/opps/v3/opportunities/resources/files/5aa0ab25da0f424d91318cf10ecfb981/download" }
],
"awardee": null,
"language": "eng"
}

An EU tender (TED)

{
"_input": "criteria:TED",
"_source": "TED-api",
"_scrapedAt": "2026-08-21T20:12:14Z",
"recordType": "TENDER",
"tenderId": "506441-2026",
"source": "TED",
"sourceJurisdiction": "EU",
"title": "Zakup in poraba impulzov za telefonsko številko 080 2002 za potrebe Enotnega kontaktnega centra",
"agency": "MINISTRSTVO ZA NOTRANJE ZADEVE IN JAVNO UPRAVO",
"agencyDepartment": null,
"agencyPath": [],
"procurementType": "Contract notice",
"procurementTypeCode": "cn-standard",
"procedureType": "Open",
"contractNature": "Services",
"deadlineDate": "2026-08-24T09:00:00Z",
"deadlineDateRaw": "2026-08-24T11:00:00+02:00",
"deadlineDatePrecision": "datetime",
"deadlineDatesAllLots": ["2026-08-24T00:00:00Z"],
"deadlineTimeZone": null,
"publishedDate": "2026-07-22T00:00:00Z",
"lastModifiedDate": "2026-07-21T00:00:00Z",
"archiveDate": null,
"estimatedValue": null,
"estimatedValueCurrency": null,
"estimatedValueBasis": null,
"url": "https://ted.europa.eu/en/notice/-/detail/506441-2026",
"descriptionMarkdown": "Zakup in poraba impulzov za telefonsko številko 080 2002 za potrebe Enotnega kontaktnega centra",
"descriptionTruncated": false,
"descriptionSource": "search-row",
"industryCodeSystem": "CPV",
"industryCodes": ["64200000"],
"classificationCode": "64200000",
"setAside": null,
"setAsideLabel": null,
"solicitationNumber": "77d80d06-21c9-4f08-8846-e0da4b6702d4",
"noticeStatus": "open",
"isActive": true,
"isCanceled": false,
"buyerCountry": "SVN",
"placeOfPerformance": {
"city": "Ljubljana", "state": null, "stateCode": null,
"country": null, "countryCode": "SVN", "zip": null, "allCountryCodes": ["SVN"]
},
"contacts": [
{ "name": "MINISTRSTVO ZA NOTRANJE ZADEVE IN JAVNO UPRAVO", "title": null, "email": "gp.mnz@gov.si", "phone": "01 428 40 00", "website": "https://www.gov.si/drzavni-organi/ministrstva/ministrstvo-za-notranje-zadeve-in-javno-upravo", "city": "Ljubljana", "country": "SVN", "type": "buyer" }
],
"submissionUrl": "https://ejn.gov.si/ponudba/pages/aktualno/aktualno_jnc_podrobno.xhtml?zadevaId=77151",
"attachments": [],
"awardee": null,
"language": "slv"
}

Tender fields

FieldTypeDescription
tenderIdstringSAM.gov notice ID, or TED publication number.
sourcestringSAM.gov or TED.
sourceJurisdictionstringUS or EU.
titlestringThe procurement title.
agencystringThe buying entity — the specific office, not just the parent department.
agencyDepartmentstringTop-level department (SAM.gov).
agencyPatharrayFull agency hierarchy, department down to buying office.
procurementTypestringReadable notice type, e.g. Solicitation, Contract notice, Award Notice.
procurementTypeCodestringThe portal's own code.
procedureTypestringOpen, Restricted, Competitive dialogue… (TED).
contractNaturestringWorks, Services or Supplies (TED).
deadlineDatestringResponse deadline as ISO 8601 UTC. Multi-lot EU notices report the earliest.
deadlineDateRawstringThe deadline as the portal published it, in local time with offset.
deadlineDatePrecisionstringdatetime when a real time was published, date when only a day was, none when no deadline exists.
deadlineDatesAllLotsarrayEvery per-lot deadline, for multi-lot EU notices.
deadlineTimeZonestringNamed timezone, where the portal gives one.
publishedDatestringPublication date, ISO 8601 UTC.
lastModifiedDatestringLast update, ISO 8601 UTC.
archiveDatestringWhen the notice auto-archives (SAM.gov).
estimatedValuenumberContract value where published.
estimatedValueCurrencystringISO currency code.
estimatedValueBasisstringWhere the number came from — a procedure estimate, an awarded total, or a sum of per-lot estimates.
urlstringPublic link to the notice.
descriptionMarkdownstringThe full statement of work, as clean Markdown.
descriptionTruncatedbooleantrue only if you disabled full descriptions and the text was clipped.
descriptionSourcestringWhether the text came from the full notice or the list row.
industryCodeSystemstringNAICS or CPV.
industryCodesarrayIndustry codes in that system.
classificationCodestringPSC code (US) or main CPV code (EU).
setAside / setAsideLabelstringSmall-business set-aside code and its full name (US).
solicitationNumberstringThe buyer's own reference number.
noticeStatusstringopen, closed, awarded, archived or cancelled — one vocabulary for both portals.
isActivebooleanStill accepting responses (deadline-aware).
isCanceledbooleanWithdrawn by the buyer.
buyerCountrystringThree-letter country code.
placeOfPerformanceobjectWhere the work happens: city, state, country, postcode.
contactsarrayProcurement officers: name, email, phone, role.
submissionUrlstringDirect link to the bidding portal, where published.
attachmentsarraySolicitation documents: name, type, size, download link.
awardeeobjectWinner name, unique entity ID, award number and date, on award notices.
languagestringLanguage the title and description are in.

Search summary

One per query, so you always know whether you got everything:

{
"recordType": "SEARCH_SUMMARY",
"source": "SAM.gov",
"queryLabel": "SAM.gov[keywords=cyber security]",
"totalMatchingUpstream": 2237,
"returnedCount": 3,
"pagesFetched": 1,
"requestsMade": 4,
"filtersApplied": { "keywords": ["cyber security"], "activeOnly": true, "deadlineWithinDays": 45 },
"descriptionsFetched": true,
"attachmentsFetched": false,
"resultWindowCapped": false,
"maxItemsPerQuery": 3,
"completeness": "capped-by-maxItemsPerQuery",
"notes": []
}

completeness is one of complete, partial, capped-by-maxItemsPerQuery or capped-by-upstream-window, and filtersApplied shows exactly which filters actually took effect — so a small result set is never ambiguous.

Notes & limits

  • Leave includeDescription on. SAM.gov's result rows carry only the first 250 characters of the statement of work. Turning it off makes runs faster and cheaper, but the descriptions are clipped — and the Actor tells you so, via descriptionTruncated on the row and a note on the summary.
  • SAM.gov returns at most 10,000 notices per query. That is the portal's own limit, not the Actor's. When a query matches more, the run stops cleanly at 10,000 and sets resultWindowCapped: true with the real total in totalMatchingUpstream. Split the query — by industry code, notice type or date window — to reach the rest. TED has no such limit.
  • A search that names only EU codes will not search SAM.gov (and vice versa), because the portal cannot filter on the other side's taxonomy and would otherwise return its entire notice corpus narrowed only by date. You get an explicit ERROR row explaining what to add, instead of thousands of irrelevant rows.
  • Estimated values are frequently absent on US notices. SAM.gov publishes a value only on award notices; open solicitations have no such field. This is the portal's behaviour, not a gap in extraction.
  • TED notices may not be in English. Titles and descriptions are resolved to your preferred language, then English, then whatever the notice actually has — a national-only notice keeps its original language rather than coming back blank. The language field always tells you which you got.
  • Date-only fields keep their calendar date rather than being shifted by a timezone, so a notice TED published on 22 July reports 22 July.
  • Residential proxy is recommended for scheduled runs.