Catalog / Tenders & public contracts
TENDERS & PUBLIC CONTRACTS · EUROPEAN UNION
TED EU Tenders — EU Public Procurement Notices
Scrape EU public procurement notices from TED (Tenders Electronic Daily) for any country, CPV code, notice type or publication window.
About this data
Scrape EU public procurement notices from TED (Tenders Electronic Daily) for any country, CPV code, notice type or publication window. One row per notice with buyer, deadline, estimated and awarded value, lots, winners and document links. Daily new-only feed, JSON/CSV/Excel export.
From the actor’s Apify Store listing. The per-call endpoint may return a bounded subset; its own description is below.
Buy per call over x402
One endpoint at api.ssh.autos. Each call is one JSON POST, paid in USDC with no account or API key, and answered in the same HTTP response.
POST /v1/eu/ted/tenders
Fetch one results page with up to 20 TED procurement notices from the current 30-day search window.
Filter by words, buyer countries, CPV codes, notice type or open bids.
Records include notice IDs, titles and descriptions, buyers and cities, countries, contract and notice types, publication dates, CPV codes and source/PDF links.
Deadlines, estimated or awarded values and winner names appear when published.
No detail pages are requested.
Input
Send a JSON body to POST https://api.ssh.autos/v1/eu/ted/tenders.
| Field | Type | Required | Notes |
|---|---|---|---|
query | string | optional | up to 200 characters |
countries | array of strings | optional | up to 5 items |
cpvCodes | array of strings | optional | up to 5 items |
noticeTypes | array of strings | optional | each one of planning, competition, dir-awa-pre, result, cont-modif; up to 5 items |
openForBidsOnly | boolean | optional | default false |
maxResults | integer | optional | 1–20; default 10 |
Returned fields
The answer is JSON: records, a list of up to 20, and summary, the run status and counts. Each record has these 40 fields; a field the source does not publish comes back null.
40 fields per record
| Field | Type | Notes |
|---|---|---|
tenderKey | string | Unique key: source:notice:noticeId (e.g. ted.europa.eu:notice:745235-2026). One row per notice. |
noticeId | string | TED publication number, e.g. 745235-2026. |
noticeVersion | integer | Version of the notice as published. |
procedureId | string | Procedure identifier shared by all notices of one procurement (planning, contract notice, award). |
ojsNumber | string | Official Journal S issue, e.g. 208/2026. |
titleLanguage | string | Language of title, TED's 3-letter code (eng, deu, fra...). |
titleEnglish | string | TED's English headline: country, main CPV description and title. |
buyer | string | Name of the (first) contracting authority. |
buyers | array of strings | All contracting authorities on the notice. |
buyerCity | string | City of the (first) buyer. |
country | string | Buyer country, ISO 3166-1 alpha-3 (e.g. DEU). |
buyerCountries | array of strings | All buyer countries (alpha-3). |
placeOfPerformanceCountries | array of strings | Countries where the contract is performed (alpha-3). |
cpvCodes | array of strings | All CPV codes on the notice (8 digits, no check digit), unique. |
mainCpvCode | string | Main CPV code of the procedure. |
contractNature | string | works, supplies, services or combined. |
procedureType | string | TED procedure code, e.g. open, restricted, neg-w-call. |
procedureTypeLabel | string | Procedure type in plain English. |
noticeType | string | TED notice type code, e.g. cn-standard, can-standard, pin-only. |
noticeTypeLabel | string | Notice type in plain English. |
formType | string | Stage: planning, competition, dir-awa-pre, result or cont-modif. |
isOpenForBids | boolean | True for a contract notice with at least one lot whose tender deadline is still ahead at scrape time. |
publishedAt | string | Publication date on TED, YYYY-MM-DD. |
dispatchedAt | string | Date the buyer sent the notice, YYYY-MM-DD. |
bidDeadline | string | Earliest deadline for tenders across lots, ISO 8601 with the buyer's offset (or YYYY-MM-DD when no time is given). |
lastBidDeadline | string | Latest deadline for tenders across lots (equals bidDeadline for single-lot notices). |
requestDeadline | string | Earliest deadline for requests to participate (restricted procedures), YYYY-MM-DD. |
estimatedValue | number | Estimated value of the procurement excluding VAT (the sum of lot estimates when no total is given). |
estimatedValueCurrency | string | Currency of estimatedValue (ISO 4217). |
awardedValue | number | Total value awarded, on result and modification notices. |
awardedValueCurrency | string | Currency of awardedValue (ISO 4217). |
winners | array of strings | Names of the winning tenderers on result notices, unique. |
lotsCount | integer | Number of lots. |
url | string | Notice page on ted.europa.eu (English). |
pdfUrl | string | Official PDF of the notice (English). |
documentUrl | string | Where the buyer publishes the procurement documents. |
submissionUrl | string | Where tenders are submitted. |
sourceQuery | string | The filters that produced this row ('latest' for an empty input). |
source | string | Always ted.europa.eu. |
scrapedAt | string | When the row was collected, ISO 8601 UTC. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/eu/ted/tenders -m POST -b '{"countries": ["DE"], "maxResults": 5}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
What is and isn’t charged
You pay the call price for
- An answer, including a definitive “not found” or an empty result.
- Confirmed no matches returns records: [] (charged: it is an answer).
Free
- Invalid input (422), busy (503), source failure (502), timeout (504) and calls whose client hung up are never charged.
- Invalid input and source failures are not charged.
Prefer a subscription? Run it on Apify
This data source is a public actor on the Apify Store: TED EU Tenders Scraper — EU Public Procurement Notices. Run it with your Apify account and plan for larger, scheduled or exported runs; it may offer more input options than the per-call endpoint.
How x402 payment works
- Your client sends the request. The API answers
402 Payment Requiredwith the price and where to pay. - The client pays from its own wallet: USDC on Base or Solana over x402, or over MPP on Tempo. No account, sign-up or API key.
- The client retries with the payment attached and gets the JSON answer in the same call. You are only charged for answers.
The AgentCash CLI in the example does all three steps for you and pays from your AgentCash wallet. Any x402 or MPP client works the same way.
Machine-readable: openapi.json · llms.txt