Skip to content

DOCUMENTATION

From a key to the first answer.

Start here: create an account, get a key and make the first call. Each API has its own reference with parameters, responses and error codes, generated from the contract the API actually serves.

The field lists are not the important part. The caveats are: what a value does not mean. Read an empty section together with source status and coverage; it does not establish absence of hazard.

API version
1.14.0
Sections
223
Fields
3,379
Runnable in the demo
168
Contents

Getting started

  1. Create an account. Create account — the same account as for every Approach service.
  2. Get a trial key under Account → Datakilde: the trial has 100 requests that count as lookups, over 14 days, with the open fields from the demo. The key is shown once: keep it in the APPROACH_API_KEY environment variable on your server, never in browser code or source control.
  3. Make the first call. Search is free and does not count as a lookup. The answer is address candidates; let the user choose, and use the address_id from there.
    curl --fail-with-body --silent --show-error \
      -H "X-API-Key: $APPROACH_API_KEY" \
      'https://api.approach.no/api/v1/addresses/search?q=Storgata+1'
  4. Read the coordinates. Every search candidate, and the address object at the top of every address profile (also from /resolve), carries the point in two systems: lat and lon in WGS84 degrees for maps and geocoding, and easting_utm33 and northing_utm33 in metres, EPSG:25833, which are Kartverket's authoritative coordinates. coordinate_system in the response names the UTM system. The address_details section carries the same four fields.
    curl --fail-with-body --silent --show-error \
      -H "X-API-Key: $APPROACH_API_KEY" \
      'https://api.approach.no/api/v1/addresses/search?q=Storgata+1' \
      | jq '.candidates[] | {address_id, lat, lon, easting_utm33, northing_utm33}'

Try it without a key

The response below is what the API returned just now — not a sample that was correct once. Every section has the same button on its own page.

The same call in your language

The same four languages and the same code as the playground on the account page. The key is read from the environment.

curl --fail-with-body --silent --show-error \
  -H "X-API-Key: $APPROACH_API_KEY" \
  'https://api.approach.no/api/v1/addresses/search?q=Storgata+1'

Reading the answer

Every section carries its own status and freshness. Branch on them before using a value: available means the source answered with records, not_found that the source was asked and held nothing for the address, unavailable that the section could not be read, and restricted that the key has no grant for it. An empty section is not an absence in the world. Every value explained.

Keys and sign-in

Your account session renews automatically during session checks for up to seven days after sign-in. Then sign in again. Signing out ends that session; resetting your password ends all sessions.

API keys are separate from your sign-in and do not refresh automatically. Use Rotate on the account page: you get a new key, and the old one keeps working for 24 hours so you can swap it in. To stop the old key at once, choose that in the same dialog. Sign-out and password changes do not revoke API keys. If a key may have leaked, revoke it immediately.

Keys belong to the person who created them, even when using the company agreement. Before that person leaves or deletes their account, have another administrator create a replacement key, update and test the integration, then revoke the old key.

For an error, include the time, endpoint, HTTP status and Request ID from Usage & logs. Never send API keys or passwords.

Company pilot and new data

Start with one use case and five priority fields. Agree 20–50 test addresses, data access and a suitable allowance with us before building your prototype. The standard trial does not unlock every catalogue field.

Tell us which fields are missing, how often they need updating and how you intend to use them. New sources and improved coverage are prioritised by need, quality and usage rights; the catalogue describes what is available now.

Contact us about a pilot, new data or support

From an AI assistant (MCP)

The hosted MCP server offers address search, lookups, the catalogue and series as tools. Use an MCP client that supports an HTTP endpoint with a custom Authorization header. The server uses the same key and grants as the API; it cannot widen them.

URL: https://mcp.approach.no/mcp
Authorization: Bearer $APPROACH_API_KEY

Use a key from Account → Datakilde. No npm package has been published yet; the OpenAPI document can be used to generate a regular API client.

The APIs

A Datakilde key can reach several APIs when both section access and the product plan allow it. Projects has dedicated keys. A key is not a subscription; purchased capacity does not unlock agreement-gated fields.

APIWhat it providesKey and accessMeasured inContract
AddressesAddress and property lookups, 223 sectionsDatakilde key · address sectionslookupOpenAPI
CompaniesCompany lookups by organisation numberSame key · company sectionslookupOpenAPI
Company watchAlerts for companies you watch, by webhookSame key · separate watch subscriptionwatched company per monthOpenAPI
RegionsMunicipal and county dataSame key · region sectionslookupOpenAPI
Series32 open time seriesSame key · separate series allowancestarted 1 000 data pointsOpenAPI
Data productsReady answers for an address, a list or a whole areaSame key · address sections and product plancellOpenAPI
SwedenA point in Sweden: municipality, flood maps, wells, protected nature and warningsSame key · Sweden capabilitylookupOpenAPI
ModelsApproach's calculations for an address or a point: noise, natural hazards and moreSame key · models capabilitylookup per modelOpenAPI
ProjectsSourced project proposals in the account workspaceDedicated Projects key · active subscriptionprofile reads · separate monthly allowanceWorkspace

The datasets API (whole tables with incremental sync) has its own access and, for now, only its OpenAPI contract.

Project opportunities · pilot

A separate public endpoint exposes 11 curated examples from Oslo municipality’s 2026 budget proposal. This is neither a national nor a continuously updated feed. Every response identifies the source as a proposal, and each project links to its supporting PDF page.

GET/api/v1/opportunitiesno key required

Optional parameters: q (name or sector), municipality_code (four digits) and limit (1–50, default 25). The response contains source, total and projects. Amounts are proposed annual allocations in NOK, not contract values or confirmed funding.

curl "https://api.approach.no/api/v1/opportunities?municipality_code=0301&limit=10"

View sourced examples

Datakilde Projects · account workspace

This is a different source and API surface: a sourced slice of Oslobygg KF’s 2027 investment proposal. The workspace requires an active Projects subscription and dedicated Projects keys. Address API keys do not grant access. Its API base is /v1/datakilde/projects/api; the public 2026 pilot above is not a preview of this feed.

Open the Projects workspace

Authentication

Send the key in the X-API-Key header on every call. Keys are issued per organisation with explicit per-section grants; a package never grants access to a new source. A call without a valid key gets 401 with a WWW-Authenticate header, and a reason field saying why the key was refused.

X-API-Key: $APPROACH_API_KEY

Keep the key on your server. Browser code, mobile apps and source control are where keys leak from. /access shows what your key may read and when access expires.

What counts as a lookup

A lookup is one address (or one company or region) per organisation per calendar day, Oslo time. Fetching an address’s profile, two of its sections and its history on the same day is one lookup. Only successful (2xx) responses count: a failure on our side, a 429 or a 4xx is never counted.

CallCounts?
GET /addresses/{id}, /{id}/sections/{s}, /{id}/historyyes, per address
GET /companies/{id}, /{id}/sections/{s}yes, per company
GET /regions/{id}, /{id}/sections/{s}yes, per region
GET /addresses/search, POST /addresses/resolve, /propertiesno, free
/access, /usage, /catalog, /openapi.jsonno, free
Series, data products, company watchtheir own units, see each API

The self-service trial includes 100 counted address lookups over 14 days. In self-service trial and prepaid access, test calls do not spend that allowance but have a daily cap. Contracted business subscriptions may have different test limits and may count test lookups beyond a free monthly allowance after billing starts. Test keys use the same API and data, not a separate test environment. A lookup where more than 20% of the requested sections failed on our side is not counted; X-Request-Billing then says not_billed_partial_failure. Pricing and bundles.

Limits

Each grant has a number of requests per minute (the trial has 60). X-RateLimit-Limit, -Remaining and -Reset are on the responses; past the limit the API answers 429 rate_limit_exceeded with Retry-After in seconds. Wait that long before retrying. A new key does not give a new limit or a new allowance: both belong to the organisation.

When the allowance is spent, the API answers 402 with a code saying why: request_allowance_exhausted, monthly_safety_cap_reached or product_plan_required. X-Request-Budget and X-Request-Budget-Remaining show where you stand. Every error code · Every response header

Pagination

Both section and property endpoints paginate. Send next_cursor as cursor with the same filters. Section cursors bind to an address and section; property cursors bind to a property. Source-checked property pagination also requires matrikkelenhet_id. A cursor used anywhere else gets 400 invalid_cursor.

Status and freshness

Each section answers for itself. A failing section does not take the rest with it, and the response-level partial says at least one could not be read. The two fields you must branch on are status and freshness.

status

ValueMeaning
availableThe source answered and there is at least one record on this page.
not_foundThe source was queried and returned no records for this address. For spatial layers this only describes the locally loaded dataset and its coverage, not every mapped area or an absence of hazard. Sections that map areas (the district, concession or service area an address lies in) also carry reason, from not_found_reasons, saying what the absence means; they never substitute the nearest area.
restrictedThe calling credential has no grant for this section. No records are returned and none were read.
unavailableThe section could not be read. error says why: source_not_loaded means the table has not been collected yet, source_empty means it was collected and holds no rows anywhere (a warning feed with no active warning is empty, not broken), source_read_access_missing means the API role cannot read it, source_timeout means the query did not finish, source_schema_outdated means a collector has not yet upgraded the table. None of these say anything about the address.

freshness

ValueMeaning
cachedThe records carry a source timestamp within the section's maximum age.
liveRetrieved directly from the source for this lookup. This describes retrieval, not the age or completeness of the source records.
staleThe records carry a source timestamp older than the section's maximum age. They are still returned; deciding whether that matters is yours.
unverifiedThe records carry no source timestamp, so their age is unknown. Not a claim that they are current.