SFOLN

Catalogue / Company & lead intelligence

Public Tenders Search – EU TED, UK & US

sfoln/public-tenders-search · Lead generation, News, Automation On request

Search government tenders and contract awards in EU TED, UK Contracts Finder, UK Find a Tender and USAspending by keyword, CPV code, country and date. One row per notice: buyer, value, CPV, deadline, status, awarded supplier, link. $2 per 1,000 notices.

About

What it does

Find government tenders and contract awards in EU TED, UK Contracts Finder, UK Find a Tender and USAspending with one search, by keyword, CPV code, country, region and date. Each notice is one clean row in the same shape whatever the source: title, buyer, country, CPV codes, estimated or awarded value with currency, procedure, publication date, deadline, open/closed/awarded status, winning suppliers and the link to the notice. Built for bid teams, sales prospecting, market research and AI agents that track public procurement. $2 per 1,000 notices.

Price

Price per delivered record

EventPricePer 1,000Charged for
Tender notice
tender
$0.002$2 / 1,000One procurement notice delivered: an EU TED, UK Contracts Finder or UK Find a Tender notice (call for tenders, award, prior information) or a USAspending contract award.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~public-tenders-search/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["cybersecurity"],"maxResultsPerQuery":5}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/public-tenders-search"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~public-tenders-search/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Find 5 open public tenders for "cybersecurity" published in the last 30 days in Germany and the UK, with buyer, estimated value, deadline and link.

Input

Input fields

Search public procurement notices (calls for tenders and contract awards) in EU TED, UK Contracts Finder, UK Find a Tender and USAspending. Each notice is one dataset row; each search also gets one summary record.

FieldTypeDefaultMeaning
keywordsarray—Keywords
What to look for, one search per line (e.g. "cybersecurity", "cloud migration"); a multi-word keyword is searched as a phrase. Leave empty to list notices by CPV codes, countries or regions only. Accounts on the Apify free plan can process up to 10 items per run (searches) and 20 notices per search.
cpvCodesarray—CPV codes
Common Procurement Vocabulary codes (8 digits) applied to every search; a code matches its sub-codes (72000000 = all IT services). USAspending has no CPV codes.
countriesarray—Countries
Buyer countries as ISO codes (DE, FR, GB, US) or English names; EU means the 27 member states. Empty: every country of every source. Sources outside these countries are not searched.
regionsarray—Regions
Places of performance: NUTS codes for EU notices (DE21, FR10), UK regions (London, Scotland, North West…) or UK NUTS codes (UKI, UKM) for both UK services, US states for USAspending (US-CA, US-VA).
daysBackinteger30Published in the last N days
Notices published in the last N days (counting today). Ignored when publishedFrom is set. Range 1–3650.
publishedFromstring—Published from
Earliest publication date (YYYY-MM-DD). Overrides daysBack.
publishedTostring—Published until
Latest publication date (YYYY-MM-DD, default today).
statusstring"all"Status
open: calls for tenders still accepting tenders or requests to participate; awarded: contract award notices; all: both (plus prior information notices). One of "all", "open", "awarded".
sourcesarray—Sources
Where to search: ted (EU Tenders Electronic Daily), uk-contracts-finder, uk-find-a-tender, usaspending (US federal contract awards). Leave empty for all sources that cover the chosen countries.
maxResultsPerQueryinteger25Max notices per search
How many notices each search returns at most, newest first, shared fairly between the sources. Range 1–1000.
deduplicatebooleantrueSkip notices already delivered in this run
A notice found by several keywords is delivered (and charged) once, for the first search.
maxItemsinteger50Max searches
Safety cap on how many searches (keywords) are processed in this run; the rest are reported as ignored. Range 1–1000.
concurrencyinteger2Concurrency
Searches processed in parallel. The UK sources are rate-limited for the whole run, so more rarely helps. Range 1–4.
includeRawbooleanfalseInclude raw source records
Attach the source's unmodified notice record to every row (larger output).
Example input
{
  "keywords": [
    "cybersecurity"
  ],
  "maxResultsPerQuery": 5
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The search (keyword, or CPV / country filter) this record belongs to.
recordTypestringRecord type
tender (one notice; charged) or summary (one per search: counts, sources, warnings; never charged).
positionintegerPosition
Rank of the notice in its search's results (1 = first; grouped by source, newest first).
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record (present only when charged).
chargedCountintegerEvents charged
Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
sourcestringSource
Notice rows: ted, uk-contracts-finder, uk-find-a-tender or usaspending. Summary records: the sources searched (ted+uk-contracts-finder+…).
fetchedAtstringFetched at
ISO timestamp.
noticeIdstringNotice id
The source's id, unique within the source: TED publication number, Contracts Finder notice id, Find a Tender notice id, USAspending generated award id (CONT_AWD_…).
referenceNumberstring | nullReference
The buyer's or platform's reference number, when published (USAspending: the award id / PIID).
noticeTypestringNotice type
tender (call for competition), award, planning (prior information / pipeline) or other.
titlestring | nullTitle
Notice title (TED: English when the buyer published one, else the original language).
descriptionstring | nullDescription
Plain-text excerpt of the description (at most 600 characters).
buyerstring | nullBuyer
Contracting authority or awarding agency.
countrystring | nullCountry
Buyer country, ISO 3166-1 alpha-2.
regionstring | nullRegion
NUTS code (EU/UK), UK region (Contracts Finder) or US state of the place of performance or the buyer.
cpvCodesarrayCPV codes
Common Procurement Vocabulary codes, main code first.
classificationsarrayClassifications
[{ scheme: CPV | NAICS | PSC, code, description }] (USAspending: NAICS and PSC).
valuenumber | nullValue
Estimated contract value (tenders) or awarded amount (awards).
currencystring | nullCurrency
ISO currency code of value.
valueTypestring | nullValue type
estimated or awarded.
procedureTypestring | nullProcedure
Procedure (open, restricted, negotiated with prior call…; Find a Tender's wording; USAspending's award type).
publishedAtstring | nullPublished
Publication date (YYYY-MM-DD) or timestamp.
deadlinestring | nullDeadline
Deadline for tenders (or requests to participate), date or timestamp.
tenderStatusstringTender status
open, closed, awarded, planned, cancelled or unknown.
awardedSuppliersarrayAwarded to
Winning suppliers (awards).
contractStartstring | nullContract start
Start of the contract period, when given.
contractEndstring | nullContract end
End of the contract period, when given.
urlstring | nullURL
The notice page on the source's website.
submissionUrlstring | nullSubmission URL
Where tenders are submitted or the documents are published, when given.
keywordstring | nullKeyword
Summary records: the keyword searched (null for a CPV / country listing).
resultsDeliveredintegerNotices delivered
Summary records: notices delivered (and charged) for the search.
stopReasonstringStop reason
Summary records: limit, free_plan, end, budget, aborted or error.
sourcesSearchedarraySources searched
Summary records: the sources asked.
sourceTotalsobjectMatches per source
Summary records: matches each source reported (or returned), null when it failed.
duplicatesSkippedintegerDuplicates skipped
Summary records: notices skipped because an earlier search of the run delivered them (not charged).
errorobjectError
{ code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream codes: http_error (with the source's HTTP status), timeout, network, tls_error, invalid_json, too_large, rate_limit, server, client, invalid_response, not_found; invalid_input.
warningsarrayWarnings
Notes about this record: sources that failed or were skipped, scan limits, free-plan or budget limits, skipped duplicates.
rawobjectRaw
The source's unmodified notice record (only with includeRaw).
Example record
{
  "input": "cybersecurity",
  "recordType": "tender",
  "position": 1,
  "noticeId": "707412-2026",
  "referenceNumber": "PPP0DJ-536/6194/2026/11",
  "noticeType": "tender",
  "title": "Aanstelling sociaal secretariaat",
  "description": "IVM is een intercommunale die een erkend sociaal secretariaat wil aanstellen …",
  "buyer": "Intergemeentelijke opdrachthoudende Vereniging voor huisvuilverwerking Meetjesland (IVM)",
  "country": "BE",
  "region": "BE233",
  "cpvCodes": [
    "79211110"
  ],
  "classifications": [
    {
      "scheme": "CPV",
      "code": "79211110",
      "description": null
    }
  ],
  "value": null,
  "currency": null,
  "valueType": null,
  "procedureType": "open",
  "publishedAt": "2026-10-13",
  "deadline": "2026-12-08T11:18:00+01:00",
  "tenderStatus": "open",
  "awardedSuppliers": [],
  "contractStart": "2028-01-01",
  "contractEnd": "2031-12-31",
  "url": "https://ted.europa.eu/en/notice/-/detail/707412-2026",
  "submissionUrl": "https://www.publicprocurement.be",
  "status": "ok",
  "charged": true,
  "chargedEvent": "tender",
  "source": "ted",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

FAQ

Questions

Which countries are covered?
EU TED covers all EU member states plus EEA and some neighbouring countries (calls for tenders above the EU thresholds, awards and prior information notices). UK Contracts Finder and Find a Tender cover the United Kingdom. USAspending covers US federal contract awards. Pick countries with ISO codes (DE, FR, GB, US), names or EU; sources outside them are not searched.
Can I get open US federal solicitations?
Not yet: open US federal opportunities are published on SAM.gov, which needs an API key or its bulk extract. For the US the Actor returns new federal contract awards from USAspending (who won what, for how much).
How do I monitor new tenders?
Schedule the Actor daily with `daysBack: 1` (or 2 to be safe) and `status: "open"`, and attach a webhook or an integration to send new rows to Slack, a CRM or a sheet.

Machine-readable

This page for agents