Discover/Doffin API
live

Doffin APIdoffin.no

Access Norwegian public procurement notices from Doffin. Search tenders, fetch full notice details, and retrieve CPV category and location code hierarchies.

Endpoint health
verified 6d ago
get_location_codes
search_tenders
get_tender_detail
get_cpv_codes
4/4 passing latest checkself-healing
Endpoints
4
Updated
22d ago

What is the Doffin API?

The Doffin API provides 4 endpoints for querying Norway's national public procurement database. With search_tenders you can filter notices by keyword, CPV code, publication date range, and notice type, receiving paginated results alongside facet counts. Separate endpoints return full notice detail, the complete CPV code hierarchy, and a hierarchical tree of Norwegian location codes.

Try it
Page number for pagination.
Number of results per page.
Search keyword to match against tender titles and descriptions.
Comma-separated notice type filter values.
Publication date upper bound in ISO 8601 format (e.g. '2026-01-01T00:00:00.000Z').
Comma-separated CPV code IDs to filter by (e.g. '72000000,45000000').
Sort order for results.
Publication date lower bound in ISO 8601 format (e.g. '2023-01-01T00:00:00.000Z').
Comma-separated status filter values.
Comma-separated location IDs to filter by (e.g. 'NO08,NO0A'). Use get_location_codes to discover valid IDs.
Comma-separated contract nature filter values.
api.parse.bot/scraper/8f7b91a3-1162-48ab-ae3d-83fd76676daa/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X POST 'https://api.parse.bot/scraper/8f7b91a3-1162-48ab-ae3d-83fd76676daa/search_tenders' \
  -H 'X-API-Key: $PARSE_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "page": "1",
  "limit": "5",
  "query": "IT",
  "sort_by": "RELEVANCE",
  "statuses": "ACTIVE"
}'
Python SDK · recommended

Typed, relational, agent-ready

A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.

  • Fully typed · autocompletes
  • Objects link to objects
  • Typed errors & pagination

Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:

uv add parse-sdk
uv run parse init
uv run parse add --marketplace doffin-no-api

uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.

"""Doffin.no — Norwegian public procurement notices. Bounded, re-runnable."""
from parse_apis.doffin_no_api import Doffin, Sort, Status, NoticeType, TenderNotFound

client = Doffin()

# List CPV codes (procurement categories) — single page, capped.
for cpv in client.cpvcodes.list(limit=3):
    print(cpv.id, cpv.label)

# Get the full location tree for Norway.
tree = client.locations.get_tree()
print(tree.name, f"({len(tree.children)} regions)")

# Search active IT tenders, sorted by newest publication date.
tender = client.tendersummaries.search(
    query="IT", statuses=Status.ACTIVE, sort_by=Sort.PUBLICATION_DATE_DESC, limit=1
).first()

# Drill into full detail from the summary.
if tender:
    try:
        detail = tender.details()
        print(detail.heading, detail.notice_type, detail.publication_date)
    except TenderNotFound as exc:
        print(f"Tender gone: {exc}")

print("exercised: cpvcodes.list / locations.get_tree / tendersummaries.search / details")
All endpoints · 4 totalmissing one? ·

Search for procurement notices (tenders) with various filters. Returns paginated results with facets for filtering.

Input
ParamTypeDescription
pageintegerPage number for pagination.
limitintegerNumber of results per page.
querystringSearch keyword to match against tender titles and descriptions.
typesstringComma-separated notice type filter values.
pub_tostringPublication date upper bound in ISO 8601 format (e.g. '2026-01-01T00:00:00.000Z').
cpv_idsstringComma-separated CPV code IDs to filter by (e.g. '72000000,45000000').
sort_bystringSort order for results.
pub_fromstringPublication date lower bound in ISO 8601 format (e.g. '2023-01-01T00:00:00.000Z').
statusesstringComma-separated status filter values.
locationsstringComma-separated location IDs to filter by (e.g. 'NO08,NO0A'). Use get_location_codes to discover valid IDs.
contract_naturesstringComma-separated contract nature filter values.
Response
{
  "type": "object",
  "fields": {
    "hits": "array of tender summary objects with id, buyer, heading, description, type, status, deadline, publicationDate",
    "facets": "object containing available filter options with counts",
    "activeFacets": "object showing currently active filter selections",
    "numHitsTotal": "integer total number of matching results",
    "numHitsAccessible": "integer maximum accessible results (capped at 1000)"
  },
  "sample": {
    "data": {
      "hits": [
        {
          "id": "2025-116485",
          "type": "ANNOUNCEMENT_OF_INTENT",
          "buyer": [
            {
              "id": "4c4f51be27b9d9b28b1bc80b42eb4921",
              "name": "Øvre Romerike Innkjøpssamarbeid",
              "organizationId": "933649768"
            }
          ],
          "status": null,
          "heading": "Intensjonskunngjøring – anskaffelse av Gemini VA og Gemini Portal+",
          "allTypes": [
            "ANNOUNCEMENT_OF_INTENT",
            "RESULT"
          ],
          "deadline": null,
          "issueDate": "2025-11-10T10:40:43Z",
          "sentToTed": true,
          "locationId": [
            "anyw"
          ],
          "description": "anskaffelse av Gemini VA og Gemini Portal+",
          "estimatedValue": null,
          "publicationDate": "2025-11-11",
          "placeOfPerformance": [
            "Ikke stedbunden"
          ],
          "procurementStrategicLabels": []
        }
      ],
      "facets": {
        "type": {
          "items": [
            {
              "id": "COMPETITION",
              "total": 19147
            }
          ]
        },
        "status": {
          "items": [
            {
              "id": "EXPIRED",
              "total": 15403
            }
          ]
        }
      },
      "activeFacets": {
        "type": {
          "items": []
        },
        "buyer": {
          "items": []
        }
      },
      "numHitsTotal": 35442,
      "numHitsAccessible": 1000
    },
    "status": "success"
  }
}

About the Doffin API

Searching and Filtering Procurement Notices

The search_tenders endpoint accepts a range of optional filters: query matches against tender titles and descriptions, cpv_ids accepts comma-separated CPV codes (e.g. 72000000,45000000), pub_from and pub_to bound results by ISO 8601 publication dates, and types filters by notice type (e.g. COMPETITION, ANNOUNCEMENT_OF_COMPETITION). Results are sorted by RELEVANCE, PUBLICATION_DATE_DESC, or PUBLICATION_DATE_ASC. Each page of results includes a hits array of tender summaries — covering id, buyer, heading, description, type, status, deadline, and publicationDate — along with facets showing available filter breakdowns and numHitsTotal for the full match count. Accessible results are capped at 1000 regardless of total hits.

Full Notice Detail

Passing a notice reference ID (e.g. 2025-116485) to get_tender_detail returns the complete record for that notice. The response includes structured eform sections containing the granular fields that make up the notice, buyer objects with IDs and names, noticeType, heading, description, and award information where available. Notice IDs are obtained from search_tenders results.

Reference Code Lookups

get_cpv_codes returns the full CPV (Common Procurement Vocabulary) tree used across EU and Norwegian procurement. Each node carries an id (e.g. 03000000), a stem, a human-readable label, and a children array for nested subcategories. get_location_codes returns the Norwegian geographic hierarchy from country (NO0) down to county level, with each node carrying an id, name, level integer, parent reference, and children array. These two lookups are useful for building filter UIs or mapping codes returned in tender results to readable labels.

Reliability & maintenanceVerified

The Doffin API is a managed, monitored endpoint for doffin.no — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when doffin.no changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.

This isn't an official doffin.no API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.

Last verified
6d ago
Latest check
4/4 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Monitor new Norwegian government tenders matching specific CPV codes for a given product or service category.
  • Build a tender alert system that polls search_tenders filtered by pub_from to catch notices published since the last check.
  • Enrich procurement analytics pipelines with full notice details including buyer identity and structured eForm sections from get_tender_detail.
  • Map tender results to readable category names by cross-referencing cpv_ids against the get_cpv_codes hierarchy.
  • Visualize procurement activity by Norwegian region using location codes from get_location_codes alongside tender search results.
  • Aggregate open competition notices by deadline to prioritize which tenders to bid on across multiple procurement categories.
  • Identify frequent government buyers by extracting and counting buyer objects across a filtered set of search_tenders results.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min

One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.

Frequently asked questions
Does Doffin have an official developer API?+
Doffin does not currently publish a documented public developer API. The data exposed by this API reflects what is available on the Doffin website at doffin.no.
How does pagination work in `search_tenders`, and is there a cap on results?+
Use the page and limit parameters to paginate through results. The response includes numHitsTotal (total matching notices) and numHitsAccessible, which is capped at 1000. Even if a search matches more than 1000 notices, only the first 1000 are accessible through pagination. Narrowing filters — such as tighter date ranges or specific CPV codes — helps stay within that window.
Does `get_tender_detail` return awarded contract values or supplier names?+
The endpoint returns structured eform sections that include award information where it exists in the notice. However, not all notices carry award data — availability depends on the notice type and what the contracting authority has published. The noticeType field in the response helps identify whether an award should be present.
Can I filter `search_tenders` by geographic location (region or county)?+
The current search_tenders inputs do not include a location filter parameter. Location codes are retrievable via get_location_codes, but they are not yet wired as a search filter. You can fork this API on Parse and revise it to add location-based filtering to the search endpoint.
Are historical tenders from before 2023 accessible through the search endpoint?+
The pub_from parameter accepts any ISO 8601 date, so older notices can be queried if they exist in the Doffin database. In practice, the depth of historical data depends on what Doffin has indexed. For very old notices not returned by search, there is no separate historical archive endpoint. You can fork this API on Parse and revise it to add a dedicated historical lookup if Doffin exposes that data via another route.
Page content last updated . Spec covers 4 endpoints from doffin.no.
Related APIs in Government PublicSee all →
tenders.gov.uk API
Search and access UK government public procurement notices, tenders, and contract opportunities in real-time, with the ability to retrieve detailed notice information and browse standardized classification codes. Get comprehensive procurement data in structured formats to analyze tender patterns and find relevant contracting opportunities.
evergabe-online.de API
Search and retrieve public tender opportunities from Germany's e-Vergabe platform by keywords, contract types, CPV codes, and publication dates. Access detailed tender information and discover the latest procurement opportunities across construction and other sectors.
offenevergaben.at API
Search and explore Austrian public procurement contracts, including details about contracting authorities, suppliers, and product categories. Track government spending by accessing comprehensive information about individual contracts, the organizations that issue them, and the vendors that supply them.
biddingo.com API
Search and filter government procurement bids and RFPs across different regions and categories to find relevant opportunities. Access detailed project descriptions and bid information to help you discover and evaluate contracting opportunities that match your business needs.
nav.no API
Search and browse job listings from Norway's official job board with detailed filtering by location, sector, education level, and other criteria. Get comprehensive job details and explore available opportunities across the Norwegian labor market.
vergabe.rib.de API
Search and retrieve tender information, award notices, and EU prior information from the RIB eVergabe platform to stay updated on procurement opportunities and contract awards. Get detailed tender specifications and the latest news to monitor bidding opportunities and market developments.
portalcompraspublicas.com.br API
Search and access detailed information about public tenders, bids, and procurement documents from Brazilian municipalities and states. Retrieve tender items, clarification logs, winner details, and all related documentation to monitor and analyze public purchasing activity across Brazil.
kulturdirektoratet.no API
Search for Norwegian arts grants and funding schemes, view detailed information about specific grant programs, and look up funding decisions from the Arts Council. Browse the complete Kulturdirektoratet site to discover available grants, eligibility requirements, and past award decisions.