Public Tenders Feed (unofficial TED + SAM.gov) avatar

Public Tenders Feed (unofficial TED + SAM.gov)

Pricing

$3.00 / 1,000 notice results

Go to Apify Store
Public Tenders Feed (unofficial TED + SAM.gov)

Public Tenders Feed (unofficial TED + SAM.gov)

Unofficial search of newly published public-procurement notices from the EU TED Search API, plus US SAM.gov opportunities when you supply your own API key. One normalized row per notice.

Pricing

$3.00 / 1,000 notice results

Rating

0.0

(0)

Developer

Olalekan Johnson

Olalekan Johnson

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Search newly published public-procurement notices and save one normalized row per notice.

This Actor is unofficial. It is not affiliated with, endorsed by, or maintained by the Publications Office of the European Union, TED, the European Commission, the U.S. General Services Administration, or SAM.gov.

TED is queried through the official Search API (POST https://api.ted.europa.eu/v3/notices/search), which needs no API key. SAM.gov is optional. When you select it, the Actor calls the official Get Opportunities API with the public API key you paste into samGovApiKey. The key is a secret input. It is sent only to api.sam.gov and is not written to the dataset or the log.

Default run

The prefilled input searches TED only, for the keyword software, from yesterday through today in the Europe/Brussels calendar, and stops at 10 notices. On 23 October 2026 that run returned 10 TED notices published that day, in a little over a second.

A keyword match is TED full text. A common word can appear in notices whose main subject is something else. Add a CPV code such as 72 when you want the IT-services branch.

Input

FieldRequiredDefaultWhat it does
keywordsNo["software"]TED searches stemmed full text (FT~). SAM.gov searches the opportunity title only, which is the filter the Opportunities API provides. An empty list searches by the other filters alone.
cpvCodesNoemptyEU CPV codes for TED. 72000000, 72000000-1, or a prefix such as 72. A prefix matches that branch. SAM.gov ignores these.
naicsCodesNoemptyExactly 6 digits. Sent to SAM.gov as ncode. Shorter codes are rejected because SAM.gov does not treat them as prefixes. TED ignores these.
countriesNoemptyISO alpha-2 or alpha-3 buyer country (FR, DEU, SWE). TED filters buyer-country. SAM.gov runs when the list is empty or includes US / USA, and is skipped otherwise.
dateFrom, dateToNoyesterday and today, Europe/BrusselsInclusive publication days, YYYY-MM-DD. The window can cover at most 365 days.
noticeTypesNoevery type in the windowTED codes such as cn-standard and can-social. SAM.gov letters such as o (solicitation), k (combined), p (pre-solicitation), r (sources sought), s (special notice), a (award). A code is sent only to the source that uses it.
maxResultsNo10Stop after this many saved notices, from 1 to 1000.
sourcesNo["ted"]ted, sam, or both. sam requires samGovApiKey.
onlyNewNofalseSkip ids saved by an earlier run. See below.
samGovApiKeyFor SAM.govemptyYour own SAM.gov public API key.
{
"keywords": ["software"],
"sources": ["ted"],
"maxResults": 10,
"onlyNew": false
}

Output

Each dataset item has the same fields for both sources: source, noticeId, title, buyer, country, classificationScheme, classificationCodes, value, currency, publicationDate, deadline, noticeType, url, attribution.

value and currency are null when the source did not publish an amount. On TED, the amount is the procedure estimate when TED sends one, otherwise the first lot estimate. On SAM.gov, the amount is the award amount, in USD, when the record has one.

This row is one of the 10 notices from the default run on 23 October 2026:

{
"source": "ted",
"noticeId": "736753-2026",
"title": "Suomi – Tietotekniset palvelut: neuvonta, ohjelmistojen kehittäminen, Internet ja tuki – Palvelimien turvasäilö",
"buyer": "Meidän IT ja talous Oy",
"country": "FIN",
"classificationScheme": "CPV",
"classificationCodes": ["72000000"],
"value": 450000,
"currency": "EUR",
"publicationDate": "2026-10-23",
"deadline": "2026-11-23",
"noticeType": "cn-standard",
"url": "https://ted.europa.eu/en/notice/-/detail/736753-2026",
"attribution": "Procurement notice from the Supplement to the Official Journal of the European Union (TED). © European Union, 1998-2026. Reuse is permitted for commercial or non-commercial purposes. https://ted.europa.eu/en/legal-notice"
}

The title is the notice's official language when TED provides it. The URL is the English TED notice page when TED provides that link. A SAM.gov row uses source sam, classificationScheme NAICS, and a https://sam.gov/opp/{noticeId}/view URL with no API key in it.

Pricing

Charge one notice-result event for each notice saved. Suggested price: $0.003 per notice. At that price, a default run of 10 notices costs $0.03, and a full run of 1,000 notices costs $3.00.

EventWhen it is chargedSuggested price
notice-resultOne notice written to the dataset$0.003
apify-actor-startNot usedDo not add this event
apify-default-dataset-itemNot usedDo not add this event

Notices that were already seen in onlyNew mode are not charged. When the run reaches the user's maximum charge, saving stops.

On Apify, set the pricing model to pay per event before publishing:

  1. Add the custom event notice-result at $0.003 and mark it as the primary event.
  2. Remove apify-default-dataset-item and apify-actor-start, so a saved notice is billed once.
  3. Set the minimum run charge to $0.003, which is one notice.
  4. Leave Actor permissions on Limited. This Actor only reads its input and writes its own dataset and, when onlyNew is on, the named store public-tenders-feed-state.

Local runs log that charging was ignored, because pay-per-event pricing exists only on the platform. The notices are still saved.

Only new notices

Turn on onlyNew for a scheduled watch. The Actor loads notice ids from the named key-value store public-tenders-feed-state, record seen-notice-ids, skips those ids, and appends the ids it saves. The record keeps the most recent 20,000 ids.

The first run with onlyNew on saves the current matches and remembers them. A later run can finish with an empty dataset when nothing new was published. That is a successful run. Leave onlyNew off in the default input so the Apify daily test, which replays that input, keeps receiving notices.

Limits

  • maxResults is at most 1,000. The date window is at most 365 days, matching the longest postedFrom / postedTo range SAM.gov accepts.
  • TED fair use, from the Publications Office, allows 700 HTTP requests in the last minute and 600 notice views or downloads in 6 minutes. This Actor calls the Search API only. It does not download notice XML, PDF, or HTML. It waits 0.35 seconds between TED calls, asks for at most 50 notices per page, and stops after 20 pages.
  • TED returns at most the fields needed for the normalized row, with onlyLatestVersions on, newest publication date first.
  • SAM.gov quotas belong to your key. A basic non-federal key is about 10 requests per day and resets at midnight UTC. A key with a SAM.gov role is about 1,000 per day. This Actor sends at most 8 SAM.gov requests per run, at least 1 second apart, and at most 100 records per request. One run can combine at most 8 keyword × NAICS searches before pagination.
  • SAM.gov returns the latest active version of an opportunity. The public API has no full-text parameter, so keywords filter the title.
  • The signed notice on TED, and the notice page on SAM.gov, remain the authentic text. Amounts are omitted when the source does not publish them. A TED value can be an estimate for the whole procedure or, when that figure is absent, the first lot.

Attribution and licence

Procurement notices in the Supplement to the Official Journal of the European Union can be reused for commercial or non-commercial purposes, unless a notice says otherwise. © European Union, 1998-2026. The editorial content of the TED website is licensed under CC BY 4.0: reuse requires credit and a note of changes. SIMAP metadata is dedicated under CC0. SIMAP logos are not used.

Source: TED legal notice.

Changes this Actor makes to TED search fields: it keeps a single title and buyer string in the notice's official language when that text exists, otherwise English; it trims timestamps to a calendar day without shifting the timezone; it deduplicates CPV codes; and it keeps the procedure estimate when TED sends one, otherwise the first lot estimate. It does not reproduce TED web pages.

SAM.gov opportunity records are U.S. federal government data retrieved through the Get Opportunities Public API. Use of that API is subject to SAM.gov's own terms and to the quota on your key. Each SAM.gov row carries a short attribution string. The Actor does not follow description URLs that would need the API key appended.

Run locally

Python 3.12.

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt -r requirements-dev.txt
.venv/bin/pytest
APIFY_LOCAL_STORAGE_DIR=./storage .venv/bin/python -m src

With no INPUT.json in the local key-value store, the run uses the default TED search. Results are written under storage/datasets/default/.

$RUN_LIVE=1 .venv/bin/pytest tests/test_live.py

The live test calls TED with the default input and expects a non-empty dataset. Unit tests mock HTTP and do not call the network.

Build and deploy with the Apify CLI from this directory (apify push). The image is apify/actor-python:3.12. Memory default is 512 MB.