TED Nordic Tenders – Public Procurement Scraper
Pricing
$3.00 / 1,000 tender notices
TED Nordic Tenders – Public Procurement Scraper
Scrape new public procurement tenders for Sweden, Norway, Denmark, Finland and Iceland from TED. Filter by country, CPV code, keyword or contract type. Get buyer, value, deadline, CPV labels and document links as JSON, CSV or Excel. Daily tender alerts with only-new mode. $3 per 1,000 tenders.
Pricing
$3.00 / 1,000 tender notices
Rating
0.0
(0)
Developer
Madeform
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
TED Nordic Tenders – public procurement scraper for Sweden, Norway, Denmark, Finland and Iceland
TED Nordic Tenders collects new public procurement contract notices (tenders) for Sweden, Norway, Denmark, Finland and Iceland from the official TED Search API (Tenders Electronic Daily) and saves them as clean, structured rows with buyer, CPV codes, estimated value and tender deadline. It is made for bid teams and suppliers who want a daily or weekly list of new Nordic tenders, filtered by country, CPV code, keyword or contract type. Rows include the CPV code with a plain-English label, place of performance, days left until the deadline and links to the procurement documents, the submission page and the notice PDF/XML. With Only new tenders switched on, scheduled runs return only what you have not received before. The easiest way to try it: open the Actor and click Start. The default input fetches Swedish tenders from the last 7 days (max 100), and users on Apify's free plan get up to 50 tenders per run.
Why bid teams use it
- The Nordic public sector in one feed: Swedish, Norwegian, Danish, Finnish and Icelandic tenders published in TED, from the official TED Search API. No TED account, no API key and no proxies needed.
- Ready to act on: plain-English CPV labels, days left to the deadline, estimated value, and direct links to the procurement documents and the submission page (for example the buyer's e-procurement platform).
- Daily tender alerts without duplicates: with
onlyNew, each tender is returned and billed once per filter. - Simple pricing: $3.00 per 1,000 tenders, nothing to pay when a run finds no tenders.
- Personal data minimised: contact names, e-mail addresses, phone numbers and Nordic personal identity numbers are removed.
Bidding outside the Nordics too? TED Europe Tenders covers all 30 EU/EEA countries with the same fields.
Use cases
- Bid discovery (offentliga upphandlingar, anbud): every morning, get new Nordic calls for tender in your CPV codes, with deadlines and document links.
- B2G sales leads: see which municipalities, regions and agencies are buying what, and at what estimated value, and feed it into your CRM.
- Tender alerts in Slack, e-mail or Teams: combine a daily schedule with Make, Zapier or n8n.
- Market analysis: compare tender volumes by country, CPV sector, contract type or region (NUTS) over time.
- AI agents and LLM pipelines: let an assistant find, filter and summarise relevant tenders (see "Use it with AI agents" below).
- Pay-as-you-go tender monitoring: for small firms that follow a few sectors and don't want a tender-portal subscription.
Example: a daily list of new tenders in Google Sheets
An IT consultancy wants to know every morning which Swedish and Norwegian authorities have published new tenders in CPV 72000000 (IT services). They set countries to ["SE", "NO"] and cpvCodes to ["72000000"], switch on onlyNew, schedule the Actor to run once a day, and connect the dataset to Google Sheets. Each morning the sheet gets new rows only, with the buyer, title, estimated value, days left until the deadline and links to the documents and the notice on TED, so the team can decide quickly which tenders to bid on.
How to use TED Nordic Tenders
- Open the Actor in Apify Console and choose the buyer countries (SE, NO, DK, FI, IS).
- Optional: add CPV codes (for example
72000000), a keyword or a contract type, and choose the publication period (last day, 7 days, 30 days or custom dates). Without a period the Actor uses the last 7 days. - Set
maxResultsand click Start. For scheduled runs, switch on Only new tenders since the last run. - Open the Output tab to view the tenders as a table, or download them as JSON, CSV or Excel. You can also read them through the Apify API.
- Optional: create a schedule so the Actor runs every day (see below).
What you get
Only contract notices (calls for tender; form types cn-standard, cn-social, cn-desg). The Actor does not return award notices, winners, tenderers, prior-information notices or contact details.
Input
| Field | Description |
|---|---|
countries | Buyer countries: SE, NO, DK, FI, IS. Default ["SE"]. |
datePreset | last1d (yesterday and today), last7d (default), last30d or custom. |
publishedFrom / publishedTo | Publication dates, YYYY-MM-DD. Needed for custom; when filled in they override the period. Default: the last 7 days. |
cpvCodes | Optional 8-digit CPV codes. Matched by hierarchy prefix (72000000 matches all 72… codes). |
keywords | Optional full-text search in the notice. |
contractNature | Optional: works, supplies, services. Empty means all. |
onlyOpen | Skip tenders whose deadline has already passed. Default false. Tenders with no stated deadline are kept. |
onlyNew | Return only tenders not delivered by an earlier run with the same filters. Default false. |
maxResults | 1–10,000, default 100. Free plan: at most 50 per run. |
The whole publication period is fetched, however many tenders match: the Actor asks TED for one publication day at a time, so a 30-day window over all five countries is not cut off at TED's limit of 600 notices per sorted search. Without onlyNew, the newest publication day comes first, so maxResults keeps the most recent tenders.
If an input value is wrong (for example a CPV code with fewer than 8 digits or an unknown country), the run stops at once with a message that shows a valid example. If nothing matches, the run ends as succeeded with a message that suggests how to widen the search.
Example output
These rows come from a real run with the default input (Sweden, last 7 days) on 28 October 2026 (run MNItmbSA0i5q5nRoe, 50 rows on the free plan). The table shows the most important columns of five of them; values are unchanged.
| publicationNumber | buyerName | title | mainCpvDescription | estimatedValue | currency | tenderDeadline | daysUntilDeadline |
|---|---|---|---|---|---|---|---|
| 747805-2026 | Skatteverket | Konsulttjänst för behovsanalys och kravställning inom kontinuerligt lärande | Systems consultancy services | 5000000 | SEK | 2026-11-11T22:59:59Z | 14 |
| 748343-2026 | Marks kommun | Beslutsstödsystem | IT services: consulting, software development, Internet and support | 20000000 | SEK | 2026-11-30T23:59:59+02:00 | 33 |
| 745661-2026 | Telge Inköp AB | Mät- och karttjänster, Katrineholm och Flens kommun | Architectural, construction, engineering and inspection services | 16000000 | SEK | 2026-11-06T23:59:59+02:00 | 9 |
| 748031-2026 | Liseberg AB | Storköksutrustning - Reparationer, service och underhåll | Repair and maintenance services | 8000000 | SEK | 2026-11-30T22:59:59Z | 33 |
| 745367-2026 | Verket för innovationssystem | Sanktionskontroll | Financial analysis and accounting software package | 4000000 | SEK | 2026-11-24T23:59:59+02:00 | 27 |
A whole row as JSON (same run). daysUntilDeadline is counted when the row is fetched.
{"publicationNumber": "748343-2026","publicationDate": "2026-10-28","noticeType": "cn-standard","title": "Beslutsstödsystem","titleEnglish": "Sweden – IT services: consulting, software development, Internet and support – Beslutsstödsystem","description": "Kommunen avser att upphandla ett beslutstödssystem för analys, uppföljning och visualisering av verksamhetsdata. Systemet ska ge chefer och beslutsfattare tillgång till aktuella och tillförlitliga beslutsunderlag samt kunna integreras med kommunens befintliga system. Upphandlingen omfattar leverans, implementering, utbildning, support och förvaltning av en säker, användarvänlig och skalbar lösning.","buyerName": "Marks kommun","buyerCountry": "SE","buyerCity": "Kinna","cpvCodes": ["72000000","48441000","48812000","72250000"],"estimatedValue": 20000000,"currency": "SEK","tenderDeadline": "2026-11-30T23:59:59+02:00","participationRequestDeadline": "2026-11-30T23:59:59+02:00","procedureType": "open","tedUrl": "https://ted.europa.eu/en/notice/-/detail/748343-2026","source": "TED – Tenders Electronic Daily, European Union, https://ted.europa.eu","retrievedAt": "2026-10-28T11:26:17.987Z","buyerWebsite": "https://www.mark.se/","contractNature": "services","cpvDescriptions": ["IT services: consulting, software development, Internet and support","Financial analysis software package","Financial information systems","System and support services"],"mainCpvCode": "72000000","mainCpvDescription": "IT services: consulting, software development, Internet and support","placeOfPerformanceCountries": ["SE"],"placeOfPerformanceCity": "Kinna","nutsCodes": ["SE232"],"daysUntilDeadline": 33,"documentsUrl": "https://annonser.clira.io/upphandling/59216751-a9a2-4693-8a17-2ec87819f270","submissionUrl": "https://annonser.clira.io/upphandling/59216751-a9a2-4693-8a17-2ec87819f270","pdfUrl": "https://ted.europa.eu/en/notice/748343-2026/pdf","xmlUrl": "https://ted.europa.eu/en/notice/748343-2026/xml","officialLanguages": ["SWE"]}
More rows: examples/sample-output.json.
Output fields
One row per notice. The fields from the first version keep their names and meaning; the new fields are added after them.
| Field | Meaning |
|---|---|
publicationNumber, publicationDate, noticeType | TED notice number, publication date, notice type. |
title, titleEnglish, description | Title in the buyer's language, English notice title, short description (max 500 characters, sanitized). |
buyerName, buyerCountry, buyerCity | The contracting authority, its country (ISO 2-letter) and city. |
cpvCodes | CPV codes. |
estimatedValue, currency | Estimated total value, when the notice states one. |
tenderDeadline, participationRequestDeadline | Deadline for tenders, and for requests to participate (restricted and negotiated procedures). |
procedureType | For example open. |
tedUrl, source, retrievedAt | Link to the notice on TED, attribution and the time the notice was fetched from TED. |
cpvDescriptions | Official English labels of the CPV codes, in the same order as cpvCodes. null where a code is not in the vocabulary. |
mainCpvCode, mainCpvDescription | The first CPV code and its label. |
contractNature | works, supplies or services. |
placeOfPerformanceCountries, placeOfPerformanceCity, nutsCodes | Where the contract is performed: countries (ISO 2-letter), city or area as written in the notice, NUTS region codes (for example SE110). |
buyerWebsite | Website of the buyer organisation. |
daysUntilDeadline | Whole days from retrieval to the earlier of the two deadlines. Negative if it has passed, null if no deadline is stated. |
documentsUrl, submissionUrl | Where the procurement documents are published and where tenders are submitted (usually the buyer's e-procurement platform, which can require a free registration). |
pdfUrl, xmlUrl | The notice as PDF (English if available) and XML on TED. |
officialLanguages | Official language(s) of the notice as TED returns them: three-letter codes such as SWE, FIN, DAN. |
URL fields that contain an e-mail address (@ or mailto:) are set to null; the rest of the row is kept.
How much does it cost to scrape TED tenders?
The Actor uses pay per event pricing: $3.00 per 1,000 tender notices ($0.003 per saved row). One tender row saved equals one billed event, and a run that finds nothing costs nothing.
Example: a run that saves 1,000 tenders costs $3.00. A run that saves 100 tenders (the default maximum) costs $0.30, and a daily onlyNew run that finds 20 new tenders costs $0.06.
| Typical setup | Tenders saved | Cost |
|---|---|---|
| One test run with the default input | up to 100 | up to $0.30 |
| Daily alert for IT services (CPV 72000000) in Sweden and Norway (239 tenders in the 30 days to 27 Oct 2026) | about 240 a month | about $0.72 a month |
| All Swedish tenders, weekly (344 in the week 21–27 Oct 2026) | about 1,500 a month | about $4.50 a month |
| One-off export of 5,000 Nordic tenders | 5,000 | $15.00 |
The figures are examples. You pay only for the tenders that are actually saved, and you can cap the cost of any run with Maximum cost per run in the run options.
Free plan: users on Apify's free plan get at most 50 tenders per run. For plans and platform credits, see Apify pricing.
No double billing with onlyNew: with the same filters, a tender is returned and billed once. Later runs skip it.
Schedule it and connect it
- Schedule: run the Actor every day or week with Apify schedules. For a daily list, combine the schedule with
onlyNew. - API: start runs and read the dataset through the Apify API.
- Integrations: send new rows to other tools through Apify integrations, for example Make, Zapier, n8n or Slack.
- Google Sheets: use the Actor Google Sheets Import & Export to write the dataset to a spreadsheet.
- Export: download the dataset as JSON, CSV or Excel.
Use it from your code: cURL, Python and JavaScript
You can start TED Nordic Tenders and read the results through the Apify API. Get your API token in Apify Console under Settings → API & Integrations and set it as the environment variable APIFY_TOKEN. The snippets below were run against this Actor on 28 October 2026.
cURL: start a run, wait for it and get the rows in one request. The synchronous endpoint waits up to 5 minutes, so use it for small and medium runs.
curl -X POST "https://api.apify.com/v2/acts/madeform~ted-nordic-tenders/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"countries":["FI"],"datePreset":"last7d","maxResults":20}'
Python (pip install apify-client, tested with version 3.4):
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("madeform/ted-nordic-tenders").call(run_input={"countries": ["SE", "NO"],"cpvCodes": ["72000000"],"datePreset": "last7d","maxResults": 50,})for item in client.dataset(run.default_dataset_id).iterate_items():print(item["publicationNumber"], item["buyerName"], item["tenderDeadline"])
With apify-client 1.x or 2.x, call() returns a dict: use run["defaultDatasetId"] instead of run.default_dataset_id.
JavaScript / TypeScript (npm install apify-client, tested with version 2.25):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('madeform/ted-nordic-tenders').call({countries: ['SE', 'NO'],cpvCodes: ['72000000'],datePreset: 'last7d',maxResults: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) console.log(item.publicationNumber, item.buyerName, item.tenderDeadline);
The API tab on this Actor's page has more examples and the full OpenAPI definition.
Use it with AI agents (MCP)
TED Nordic Tenders also works as a tool for AI assistants and agents through the Apify MCP server. Add this server URL to Claude, Cursor, VS Code or any other MCP client, and sign in with your Apify account when asked:
https://mcp.apify.com?tools=madeform/ted-nordic-tenders
Then ask in plain language, for example: "Find open IT services tenders from Swedish and Norwegian public buyers published in the last 7 days and list them by deadline, with buyer, estimated value and document link." The agent fills in the input (countries, cpvCodes, datePreset, onlyOpen, maxResults), runs the Actor and reads the rows. Agent runs are billed exactly like normal runs, one event per saved row.
FAQ
Is it legal to use TED data?
TED data is published by the Publications Office of the European Union and may be reused under Commission Decision 2011/833/EU. The Actor modifies the data (see "Data source and licence" below). You are responsible for how you use the output.
How up to date is the data?
Every run fetches the notices live from the TED Search API. The Actor does not keep its own archive, so the result depends on what TED has published for your date range at the time of the run. Each row has a retrievedAt timestamp.
Which tenders are covered?
Contract notices published in TED where the buyer is in one of the selected Nordic countries. National procurements below the EU thresholds are usually not included, because they generally do not have to be published in TED. Award notices, winners and contact details are not collected.
What do I get on the free plan?
Up to 50 tenders per run. Pricing for paid usage is $3.00 per 1,000 tenders.
Does the data contain personal data?
The Actor requests only a fixed list of fields and removes e-mail addresses, telephone numbers and personal identity numbers from free text. Notices may still contain personal data, for example names in free text. See "Minimised personal data" below.
How does "only new" work?
With onlyNew the Actor remembers how far the last run got and returns only tenders published after that point. It stores the last publication date and the publication numbers it has already handled on that date, nothing else, in a key-value store named ted-nordic-tenders-state in your own Apify account. The memory is kept per filter: a different combination of countries, CPV codes, keywords, contract types or onlyOpen has its own history, so one schedule does not affect another. The first run with a given filter uses your publication period. After that the period is ignored and the run continues after the last tender delivered, oldest publication day first. If a run stops early (maxResults, the free plan limit or your maximum charge), the next run continues where it ended and skips nothing. To start over, delete the key state-… in that store.
How do I filter by CPV code?
Add one or more 8-digit codes to cpvCodes. Matching is by hierarchy prefix, so 72000000 matches all IT services codes starting with 72.
Can I connect it to Google Sheets, Make or Zapier?
Yes. See "Schedule it and connect it" above. You can also use the Apify API.
Can I see who won a tender?
No. The Actor returns contract notices only, not award notices or winners.
How is this different from searching on TED?
TED's website is made for reading notices one at a time. This Actor turns them into uniform rows with English CPV labels, deadlines in days and direct document links, remembers what you have already received, and sends the result to a spreadsheet, your CRM, an API client or an AI agent on a schedule.
Can I get the tenders in Slack or by e-mail?
Yes. Schedule the Actor with onlyNew and connect the run to Slack, e-mail, Make, Zapier or n8n through Apify integrations. Each new tender then reaches you once.
Can I use it from my own code or an AI agent?
Yes. See "Use it from your code" and "Use it with AI agents (MCP)" above.
Minimised personal data
The Actor is built to keep personal data to a minimum:
- It asks the TED API only for a fixed whitelist of fields. Contact names, e-mail addresses, telephone numbers, winners and tenderers are never requested, and only contract notices (no award notices) are collected. The buyer's website is the organisation's, never an e-mail address.
- The only state kept between runs (
onlyNew) is a date and publication numbers. It holds no notice data. - Free text (title, description, buyer name, city) is scrubbed of e-mail addresses (including obfuscated forms such as
name(at)example.se), telephone numbers and Nordic personal identity numbers. Names that follow words such as "contact person", "kontaktperson" or "yhteyshenkilö" are removed as well. Removed parts are replaced by[removed].
Notices may still contain personal data (for example names in free text). You are the controller for your use of the output. Check your legal basis (typically legitimate interest), your information duties under GDPR Art. 14 and your retention period. Do not use the data for direct marketing to individuals.
Data storage: Apify stores datasets in AWS us-east-1 (USA) under Apify's Data Processing Addendum with Standard Contractual Clauses (SCC); see Apify's shared responsibility model. If you need to keep the data in the EU, export it and delete the dataset after the run.
Data source and licence
Source: TED – Tenders Electronic Daily, Publications Office of the European Union, © European Union, reused under Commission Decision 2011/833/EU. Retrieved via the TED Search API on the date given in each row's retrievedAt field. See the TED legal notice.
The data is modified. Contact details and identity numbers are removed and replaced by [removed], contact names after keywords are removed, and descriptions are shortened to 500 characters. Fields are reformatted (dates, values, country codes). The original notice is the one at tedUrl on TED.
This Actor is an independent tool. It is not affiliated with, endorsed by or operated by the European Union or the Publications Office of the EU.
More from Madeform
- TED Europe Tenders – public tenders from all 30 EU/EEA countries, same fields and filters, $3.00 per 1,000 tenders.
- Trafikverket Disruptions – Swedish road incidents, roadworks, rail disruptions and train delays from Trafikverket open data, $1.00 per 1,000 rows.