Nordic Public Tenders (Norway, Finland, Sweden) avatar

Nordic Public Tenders (Norway, Finland, Sweden)

Pricing

from $44.00 / 1,000 tender results

Go to Apify Store
Nordic Public Tenders (Norway, Finland, Sweden)

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

Fredrik Hansson

Maintained by Community

Actor 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)APICoversAuth
tedTED Search API v3 (EU Tenders Electronic Daily)🇸🇪 Sweden + 🇫🇮 Finland — current above‑threshold noticesnone
doffinDoffin Public API (DFØ / anskaffelser.no)🇳🇴 Norway — all noticesDOFFIN_API_KEY
hilmaHilma AVP‑Read API (hankintailmoitukset.fi)🇫🇮 Finland — historical (pre‑2024) & below‑thresholdHILMA_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 ted source — no key needed). Hilma's open search index holds the pre‑2024 history and smaller national notices. Pick ted for fresh Finnish tenders, hilma for the archive. Each output record's country field (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.

Nordic Public Tenders (Norway, Finland, Sweden) — input and sample output

Quick start

  1. Fill in the input — set the fields in the input tab (prefilled with a working example).
  2. Click Start — the Actor runs and writes one record per item to the dataset.
  3. 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).

FieldTypeDefaultDescription
countriesstring[]["doffin","hilma","ted"]Which sources to query: ted (current SE + FI), doffin (NO), hilma (historical FI).
keywordsstring—Free‑text search applied to each source (e.g. "cloud services").
cpvCodesstring[]—CPV codes to filter by (e.g. ["72000000"] for IT services).
publishedFromstring (ISO date)7 days agoOnly notices published on/after this date.
publishedTostring (ISO date)todayOnly notices published on/before this date.
onlyOpenbooleantrueOnly tenders whose submission deadline is still in the future.
maxResultsinteger100Max notices delivered across all sources (one charge per delivered notice).
translateTitlesbooleantrueTranslate 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:

FieldTypeDescription
idstringStable unique id, prefixed by source (e.g. ted:677811-2026).
sourcestringdoffin | hilma | ted.
countrystringISO alpha‑2 buyer country: NO | FI | SE.
titlestringTitle in the original language.
titleEnstring | nullEnglish title (equals title when already English; OpenAI translation otherwise; null if translation was skipped/failed).
buyerNamestring | nullContracting authority / buyer name.
buyerOrgNumberstring | nullBuyer organisation number (NO org.nr / FI Y‑tunnus / national reg. no).
cpvCodesstring[]CPV classification codes.
estimatedValuenumber | nullEstimated contract value, if published.
currencystring | nullISO‑4217 currency of estimatedValue.
publishedDatestring | nullPublication date (ISO‑8601).
deadlinestring | nullSubmission / tender deadline (ISO‑8601).
noticeTypestring | nullNotice type (contract notice, award, prior information, …).
procedureTypestring | nullProcedure type (open, restricted, negotiated, …).
descriptionstring | nullDescription in the original language.
urlstring | nullCanonical 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.
  • titleEn is always English when available, so you can filter/rank on it directly without language detection.
  • id is globally unique and source‑prefixed; use it for de‑duplication across runs.
  • url always 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:

VariableRequiredPurpose
DOFFIN_API_KEYFor Norway (doffin)Doffin Public API subscription key (Ocp-Apim-Subscription-Key). Free from the DFØ developer portal.
HILMA_API_KEYFor 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_KEYFor translationEnables English title translation via OpenAI. If unset, non‑English titles are delivered with titleEn: null.
DOFFIN_BASE_URLOptionalOverride 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 SUMMARY key‑value record.
  • Retries with backoff. Every HTTP call retries transient failures (HTTP 429 and 5xx, network errors) with exponential backoff and jitter, honouring Retry-After when 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=... # Norway
export HILMA_API_KEY=... # Finland
export 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 manifest
input_schema.json Input schema (the INPUT_SCHEMA)
dataset_schema.json Dataset view / table layout
src/
main.ts Orchestration, budgeting, charging, de-dup
types.ts Shared types incl. the normalised Tender schema
utils.ts Resilient fetch (retry/backoff), rate limiter, helpers
translate.ts Batched English title translation via OpenAI
sources/
doffin.ts Norway — Doffin Public API
hilma.ts Finland — Hilma AVP-Read API
ted.ts Sweden — TED Search API v3

License

ISC.