orakel
Docs navigation

Canonical

GET /api/procurement

Norwegian public procurement notices from Doffin. Cursor-paginated.

Updated 2026-04-23

Data source: Doffin. Norwegian coverage only.

Request

GET /api/procurement

Parameter Type Required Description
orgNumber string no Contracting authority org number.
q string no Case-insensitive match against title.
cpvCode string no CPV code or prefix (e.g. 72 for IT services). Matches on cpvCodes array.
noticeType string no Doffin notice type (e.g. ANNOUNCEMENT_OF_COMPETITION).
status string no ACTIVE, EXPIRED, or other Doffin-supplied values.
minValue number no Inclusive lower bound on estimatedValue (NOK).
maxValue number no Inclusive upper bound.
deadlineAfter ISO date no Return notices whose deadline is at or after this timestamp.
sort "publishedDate" | "deadline" | "estimatedValue" | "title" no Default publishedDate.
order "asc" | "desc" no Default desc.
limit integer no 1–100. Tier-capped. Default 20.
cursor string no Pagination cursor from prior response.

Response

{
  "data": [
    {
      "id": "clx...",
      "noticeId": "2026-107304",
      "orgNumber": "974760673",
      "title": "Kjøp av skyplattform",
      "noticeType": "ANNOUNCEMENT_OF_COMPETITION",
      "estimatedValue": 12500000,
      "deadline": "2026-05-20T12:00:00Z",
      "url": "https://www.doffin.no/notices/2026-107304"
    }
  ],
  "nextCursor": "clx...",
  "hasMore": true
}

The full row includes cpvCodes[], status, publishedDate, buyer contact fields, and url — a direct link to the notice on doffin.no, derived from noticeId. Full field list in the Doffin source page.

Examples

curl

curl -H "Authorization: Bearer $ORAKEL_KEY" \
  "https://orakel.cloud/api/procurement?cpvCode=72&status=ACTIVE"

JavaScript

const res = await fetch(
  "https://orakel.cloud/api/procurement?cpvCode=72&status=ACTIVE",
  { headers: { Authorization: `Bearer ${process.env.ORAKEL_KEY}` } },
);
const { data, nextCursor, hasMore } = await res.json();

Error modes

Status Meaning Action
400 Invalid parameters Inspect details[]
401 Missing or invalid API key Check the Authorization header
429 Rate or quota exceeded Back off
500 Query failed Retry

Rate limits

Per-key RPM per tier. Cursor-depth guard (50 pages / 5 min) applies as on company search.

Typical use cases

  • Sales leads: watch new CPV-72 notices for IT prospects.
  • Competitive monitoring: filter by a competitor's orgNumber to see awards.
  • Pipeline sizing: sum estimatedValue by status across a time range.