Canonical
Doffin
Norwegian public procurement notices — tenders and contract awards.
Source: Doffin (Database for offentlige innkjøp — Digitaliseringsdirektoratet) Data: Public procurement notices (tenders and contract awards) for Norwegian government and public-sector buyers License: NLOD 2.0 (Norwegian Licence for Open Government Data) Attribution required: Yes — credit "Doffin" or "Database for offentlige innkjøp" Link: https://www.doffin.no Update cadence: Daily incremental sync
What it is
Doffin is Norway's central database for public-sector procurement. Every notice published by a Norwegian buyer above the relevant threshold — and many below it — appears here, from initial tender through contract award. Larger procurements also cross-publish to TED (the EU's Tenders Electronic Daily).
Orakel ingests notices daily and links each one to the buyer's company record by orgNumber where possible. Each notice keeps its full upstream payload in rawData so downstream consumers can look up fields Orakel hasn't modelled natively.
Fields provided
| Field | Type | Notes |
|---|---|---|
noticeId |
string | Doffin's stable identifier. Unique. |
orgNumber |
string | Buyer's 9-digit org number when Doffin supplied it in matchable form; null otherwise. See gotchas. |
contractingAuthority |
string | Buyer name as published |
title |
string | Notice heading |
description |
string | Long-form notice text |
cpvCodes |
string[] | CPV (Common Procurement Vocabulary) codes describing the goods or services |
noticeType |
string | e.g. tender notice, contract award, prior information notice |
estimatedValue |
float | Estimated contract value as published |
currency |
string | Currency of estimatedValue |
publishedDate |
date | When Doffin first published |
issueDate |
date | When the buyer issued the notice |
deadline |
date | Submission deadline for tenders |
locationIds |
string[] | NUTS or municipality codes for the place of performance |
status |
string | Upstream status (active, awarded, cancelled, etc.) |
rawData |
json | Full upstream payload for anything not modelled above |
syncedAt |
datetime | Last time Orakel refreshed the notice |
url |
string | Direct link to the notice on doffin.no. Derived from noticeId (pattern: https://www.doffin.no/notices/{noticeId}), not stored. Present on API responses, not on the DB row. |
Note: procurement notices are not keyed on (country, orgNumber) in the Orakel schema — they have their own noticeId primary identifier and reference the buyer's orgNumber as a plain string column.
Endpoints that surface this data
GET /api/procurement— cursor-paginated search over all notices. Supported filters:orgNumber,q(free-text in title),cpvCode,noticeType,status,minValue,maxValue,deadlineAfter. Sort and order configurable.
Limitations
- Buyer matching is best-effort. Doffin publishes buyer org numbers in a range of formats; Orakel normalises spaces and validates the 9-digit shape, but notices that fail validation keep
orgNumber = null. - Supplier-side matching (who won a contract award) isn't modelled as a relation on the notice. Where the information exists it sits inside
rawData. - Historical depth depends on Doffin's own archival. Expect reliable coverage for roughly the last three to five years.
- Notices and awards are separate records. A single procurement typically produces a tender notice and, later, one or more award notices — join them via
rawDataor the buyer and title if you need the full arc.
Gotchas
- Doffin org IDs sometimes arrive with embedded spaces —
"940 101 808"— which Orakel strips at import. If you're comparing raw Doffin exports to Orakel records, normalise spaces first. - Larger procurements also appear in TED (the EU-wide procurement database). The TED identifier is typically available inside
rawData; Orakel doesn't expose it as a first-class field. estimatedValuereflects the buyer's estimate at publication time. The actual contract value in the eventual award notice can differ substantially — don't treat the estimate as a forecast.statusvalues come straight from Doffin. They aren't a closed enum; new statuses can appear without a schema change.