Nordic Public Tenders (Norway, Finland, Sweden)
Pricing
from $44.00 / 1,000 tender results
Nordic Public Tenders (Norway, Finland, Sweden)
Collects public procurement notices from Norway (Doffin), Finland (Hilma) and Sweden (TED) into one normalised English schema. Actively maintained. · More no-code data tools → datatools-hub.vercel.app
Pricing
from $44.00 / 1,000 tender results
Rating
0.0
(0)
Developer
Fredrik Hansson
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
The only Apify Actor that collects public procurement notices from all three Nordic countries — Norway, Finland and Sweden — into one normalised, English‑keyed schema.
It pulls directly from the official, open government APIs (no HTML scraping):
Source (countries) | API | Covers | Auth |
|---|---|---|---|
ted | TED Search API v3 (EU Tenders Electronic Daily) | 🇸🇪 Sweden + 🇫🇮 Finland — current above‑threshold notices | none |
doffin | Doffin Public API (DFØ / anskaffelser.no) | 🇳🇴 Norway — all notices | DOFFIN_API_KEY |
hilma | Hilma AVP‑Read API (hankintailmoitukset.fi) | 🇫🇮 Finland — historical (pre‑2024) & below‑threshold | HILMA_API_KEY |
Why Finland appears in two sources. Finland switched to the EU eForms standard in 2023, so current Finnish above‑threshold tenders are now published to TED (covered by the
tedsource — no key needed). Hilma's open search index holds the pre‑2024 history and smaller national notices. Picktedfor fresh Finnish tenders,hilmafor the archive. Each output record'scountryfield (SE/FI/NO) tells you which country it belongs to, regardless of source.
Every notice — regardless of source language — comes out in the same shape, with the original title preserved and an English translation (titleEn). That makes the output immediately usable for cross‑border analysis, by both humans and AI agents.

Quick start
- Fill in the input — set the fields in the input tab (prefilled with a working example).
- Click Start — the Actor runs and writes one record per item to the dataset.
- Get your data — export to JSON, CSV or Excel, or pull it via the API.
Why this Actor exists
Each Nordic country publishes tenders through its own portal, in its own language, with its own API conventions, field names and quirks. If you want "all open IT tenders in the Nordics this week", you normally have to integrate three different APIs, reconcile three different schemas, and read three different languages.
This Actor does that for you and emits one flat record per notice, in English, ready to drop into a spreadsheet, a database, a RAG index, or an LLM prompt.
Use cases
- Bid discovery — find open tenders you can respond to, filtered by CPV code, keyword and deadline.
- Market research — track what the Nordic public sector is buying, across countries, over time.
- Sales prospecting to the public sector — identify buyers (contracting authorities), their org numbers, and what they procure, to build a pipeline.
- Feeding AI agents — the normalised English schema is designed to be consumed by LLMs and autonomous agents without per‑source glue code.
Data sources — official & open
All data originates from official, publicly operated procurement APIs. Nothing is scraped from web pages. Norway (Doffin) and Finland (Hilma) require a free API key from their respective government developer portals; Sweden's data comes from the EU's TED Search API, which needs no key. The Actor is a thin, well‑behaved client over these APIs: it respects rate limits, retries transient failures with backoff, and never hammers a source.
Input
All fields are optional except that at least one source must be selected (defaults to all three).
| Field | Type | Default | Description |
|---|---|---|---|
countries | string[] | ["doffin","hilma","ted"] | Which sources to query: ted (current SE + FI), doffin (NO), hilma (historical FI). |
keywords | string | — | Free‑text search applied to each source (e.g. "cloud services"). |
cpvCodes | string[] | — | CPV codes to filter by (e.g. ["72000000"] for IT services). |
publishedFrom | string (ISO date) | 7 days ago | Only notices published on/after this date. |
publishedTo | string (ISO date) | today | Only notices published on/before this date. |
onlyOpen | boolean | true | Only tenders whose submission deadline is still in the future. |
maxResults | integer | 100 | Max notices delivered across all sources (one charge per delivered notice). |
translateTitles | boolean | true | Translate non‑English titles to English with OpenAI (needs OPENAI_API_KEY). |
Example input
{"countries": ["doffin", "hilma", "ted"],"keywords": "cloud","cpvCodes": ["72000000"],"publishedFrom": "2026-09-24","publishedTo": "2026-10-01","onlyOpen": true,"maxResults": 200,"translateTitles": true}
Output
One dataset item per notice, in a single normalised English schema:
| Field | Type | Description |
|---|---|---|
id | string | Stable unique id, prefixed by source (e.g. ted:677811-2026). |
source | string | doffin | hilma | ted. |
country | string | ISO alpha‑2 buyer country: NO | FI | SE. |
title | string | Title in the original language. |
titleEn | string | null | English title (equals title when already English; OpenAI translation otherwise; null if translation was skipped/failed). |
buyerName | string | null | Contracting authority / buyer name. |
buyerOrgNumber | string | null | Buyer organisation number (NO org.nr / FI Y‑tunnus / national reg. no). |
cpvCodes | string[] | CPV classification codes. |
estimatedValue | number | null | Estimated contract value, if published. |
currency | string | null | ISO‑4217 currency of estimatedValue. |
publishedDate | string | null | Publication date (ISO‑8601). |
deadline | string | null | Submission / tender deadline (ISO‑8601). |
noticeType | string | null | Notice type (contract notice, award, prior information, …). |
procedureType | string | null | Procedure type (open, restricted, negotiated, …). |
description | string | null | Description in the original language. |
url | string | null | Canonical public URL of the human‑readable notice. |
Example output item
{"id": "ted:677811-2026","source": "ted","country": "SE","title": "Sverige – IT-konsulttjänster – Ramavtal","titleEn": "Sweden – IT consulting services – Framework agreement","buyerName": "Höglandsförbundet","buyerOrgNumber": "2220001412","cpvCodes": ["72300000", "72220000"],"estimatedValue": 65000000,"currency": "SEK","publishedDate": "2026-10-01T00:00:00.000Z","deadline": "2026-11-03T23:59:00.000Z","noticeType": "cn-standard","procedureType": "open","description": "Ramavtal avseende IT-konsulttjänster ...","url": "https://ted.europa.eu/sv/notice/-/detail/677811-2026"}
Notes for AI‑agent consumers
- The schema is stable and flat — every record has the same keys regardless of source. Missing values are
null, never absent. titleEnis always English when available, so you can filter/rank on it directly without language detection.idis globally unique and source‑prefixed; use it for de‑duplication across runs.urlalways points at the official public notice page.
Environment variables / secrets
Set these as Actor secrets (Apify Console → Actor → Settings → Environment variables), or in a local .env when running with apify run:
| Variable | Required | Purpose |
|---|---|---|
DOFFIN_API_KEY | For Norway (doffin) | Doffin Public API subscription key (Ocp-Apim-Subscription-Key). Free from the DFØ developer portal. |
HILMA_API_KEY | For Finnish history (hilma) | Hilma AVP‑Read subscription key (Ocp-Apim-Subscription-Key). Free from the hankintailmoitukset.fi developer portal (subscribe to the avp-read product). Not needed for current Finnish tenders — those come from ted. |
OPENAI_API_KEY | For translation | Enables English title translation via OpenAI. If unset, non‑English titles are delivered with titleEn: null. |
DOFFIN_BASE_URL | Optional | Override the Doffin API base URL (defaults to https://api.doffin.no/public/v2). |
Sweden/TED needs no key.
If a required key for a selected source is missing, that source fails gracefully and the others still run — see Error handling.
Pricing — pay per result
This Actor uses pay‑per‑event pricing. A single event, tender-result, is charged once per delivered notice. If a run delivers 80 notices, you are charged for 80 tender-result events. Runs that deliver nothing (no matches) incur no result charges.
Error handling & resilience
- Independent sources. Each source runs in isolation. If Doffin is down or its key is missing, Hilma and TED still return results — the failure is logged clearly and recorded in the run's
SUMMARYkey‑value record. - Retries with backoff. Every HTTP call retries transient failures (HTTP 429 and 5xx, network errors) with exponential backoff and jitter, honouring
Retry-Afterwhen provided. - Rate limits respected. Hilma notices are fetched one‑by‑one through the notice read endpoint with throttling between calls. TED paging uses iteration tokens with low concurrency.
- Translation never blocks delivery. If a translation batch fails, those notices are still delivered with
titleEn: null.
A per‑run SUMMARY record (in the default key‑value store) reports how many notices each source returned and any source‑level errors.
Run it locally
npm install# Provide secrets (TED needs none)export DOFFIN_API_KEY=... # Norwayexport HILMA_API_KEY=... # Finlandexport OPENAI_API_KEY=... # title translation (optional)# Put your input in storage/key_value_stores/default/INPUT.json, then:apify run
Or run the compiled code directly without the Apify CLI:
$npm run build && node dist/main.js
Results are written to the default dataset (storage/datasets/default).
Project layout
.actor/actor.json Actor manifestinput_schema.json Input schema (the INPUT_SCHEMA)dataset_schema.json Dataset view / table layoutsrc/main.ts Orchestration, budgeting, charging, de-duptypes.ts Shared types incl. the normalised Tender schemautils.ts Resilient fetch (retry/backoff), rate limiter, helperstranslate.ts Batched English title translation via OpenAIsources/doffin.ts Norway — Doffin Public APIhilma.ts Finland — Hilma AVP-Read APIted.ts Sweden — TED Search API v3
License
ISC.
Related actors
- Nordic Company Registry (Norway, Finland) — Official company-registry data from Norway (Brønnøysund) and Finland (PRH) in one
- Nordic Tender Matcher (AI) — AI agent that scores Norwegian, Finnish and Swedish public tenders against your company
- Argus — Autonomous Intelligence Agent — Describe a mission in plain English; Argus plans what to watch, gathers from public