NAV APInav.no ↗
Search and retrieve job listings from Norway's official NAV job board. Filter by county, sector, remote work, and more. Full job details via UUID lookup.
What is the NAV API?
The NAV.no API provides access to job listings from arbeidsplassen.nav.no, Norway's official public job board, through 3 endpoints. Use search_jobs to run full-text queries across the Norwegian labor market with filters for location, sector, and remote options. Use get_job_detail to fetch the full description, structured metadata, and similar job recommendations for any specific listing identified by its UUID.
curl -X GET 'https://api.parse.bot/scraper/ab1a4dc6-c874-4fb4-b6b6-4be87c791e61/search_jobs?q=engineer&from=0&size=5' \ -H 'X-API-Key: $PARSE_API_KEY'
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 nav-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.
"""Walkthrough: NAV Job Board SDK — search Norwegian jobs, filter by sector, drill into details."""
from parse_apis.nav_job_board_api_norway import NavJobs, Sort, Sector, Extent, EngagementType, JobNotFound
client = NavJobs()
# Search for engineering jobs sorted by publication date, capped at 5 results.
for job in client.jobsummaries.search(query="engineer", sort=Sort.PUBLISHED, limit=5):
print(job.title, job.business_name, job.published)
# Drill into the first full-time private-sector result for full details.
hit = client.jobsummaries.search(extent=Extent.HELTID, sector=Sector.PRIVAT, limit=1).first()
if hit:
detail = hit.details()
print(detail.description[:200], detail.page_details)
# Fetch a job by UUID directly and inspect similar recommendations.
try:
full_job = client.jobs.get(uuid="49ada326-6f93-4c94-8811-d62546939bc8")
for sim in full_job.similar_jobs:
print(sim.title, sim.url)
except JobNotFound as exc:
print(f"Job not found: {exc.uuid}")
# Discover available filter options (sectors, counties, engagement types).
filters = client.filteroptions.get()
print(filters.aggregations)
print("exercised: jobsummaries.search / hit.details / jobs.get / filteroptions.get")
Full-text search over Norwegian job listings with filters for location, sector, engagement type, extent, and remote work. Returns paginated results ordered by relevance or publication date. Offset-based pagination via 'from' parameter; each result carries a UUID usable with get_job_detail for the full listing text.
| Param | Type | Description |
|---|---|---|
| q | string | Search query term (e.g. 'engineer', 'sykepleier'). Omitting returns all listings. |
| from | integer | Pagination offset (number of results to skip). |
| size | integer | Number of results per page (max 100). |
| sort | string | Sort order for results. |
| extent | string | Filter by work extent. |
| remote | string | Filter by remote work options (e.g. 'Hybridkontor', 'Hjemmekontor ikke mulig', 'Ikke oppgitt'). |
| sector | string | Filter by sector. |
| counties | string | Filter by county (e.g. 'OSLO', 'VESTLAND', 'AKERSHUS'). |
| published | string | Filter by publication recency (e.g. 'now-3d' for last 3 days, 'now-7d' for last 7 days). |
| municipals | string | Filter by municipality (e.g. 'OSLO', 'BERGEN', 'TRONDHEIM'). |
| engagementType | string | Filter by engagement type. |
{
"type": "object",
"fields": {
"took": "integer, query time in milliseconds",
"total": "object with value (integer count) and relation (string)",
"results": "array of job listing objects each containing uuid, title, businessName, published, expires, locationList, status, _score, and more"
},
"sample": {
"data": {
"took": 104,
"total": {
"value": 238,
"relation": "eq"
},
"results": [
{
"_id": "49ada326-6f93-4c94-8811-d62546939bc8",
"uuid": "49ada326-6f93-4c94-8811-d62546939bc8",
"title": "Manufacturing engineer",
"_score": 20.97,
"status": "ACTIVE",
"expires": "2026-08-26T00:00:00+02:00",
"employer": {
"name": "MONIL AS"
},
"published": "2026-02-26T00:03:49.813+01:00",
"businessName": "Monil AS",
"locationList": [
{
"city": "OSLO",
"county": "OSLO",
"country": "NORGE",
"municipal": "OSLO"
}
]
}
]
},
"status": "success"
}
}About the NAV API
Searching Job Listings
The search_jobs endpoint accepts a free-text query via the q parameter and supports offset-based pagination through from and size (up to 100 results per page). Results can be sorted by relevance or publication date. Filters include counties (e.g. OSLO, VESTLAND), sector, extent (full/part time), remote (e.g. Hybridkontor, Hjemmekontor ikke mulig), and more. Each result in the results array includes a uuid, title, businessName, published, expires, locationList, status, and a relevance _score. The response also returns total (with a value count) and took (query time in milliseconds).
Job Detail Lookup
The get_job_detail endpoint takes a single required uuid parameter, obtainable from search_jobs results. It returns four top-level fields: metadata (structured employer and location data from the search index), description (the full job description text), page_details (key-value pairs such as Stillingstittel, Type ansettelse, and Sektor), and similar_jobs (an array of related listings each with a uuid, title, and url). This endpoint is the right choice when you need the complete listing content beyond what search results expose.
Discovering Filter Values
Before constructing filtered search_jobs calls, the get_facets endpoint returns the full set of available aggregation buckets with counts — covering counties, sector, extent, engagementType, remote, education, experience, workLanguage, and others. This is useful for building dynamic filter UIs or verifying that a filter value is currently active in the index before querying against it.
The NAV API is a managed, monitored endpoint for nav.no — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when nav.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 nav.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.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate Norwegian job listings by county using the
countiesfilter andtotal.valuecounts for regional labor market analysis - Build a job alert system by polling
search_jobswith a keyword query and checkingpublisheddates on new results - Populate a multilingual job board by fetching full
descriptiontext viaget_job_detailfor listings filtered byworkLanguage - Analyze demand for remote work in Norway by filtering
search_jobswithremote=Hybridkontoror similar values fromget_facets - Generate job recommendation feeds by extracting
similar_jobsarrays returned fromget_job_detail - Identify hiring trends across sectors by iterating
get_facetsaggregation counts forsectorandengagementTypeover time
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 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.
Does NAV have an official public developer API for job listings?+
What does get_facets return, and why is it useful before calling search_jobs?+
counties, sector, engagementType, extent, remote, education, and experience. Because filter values like county codes or remote labels must match exact strings used in the index, calling get_facets first lets you confirm valid values and their current counts before passing them as parameters to search_jobs.Does the search_jobs endpoint support date-range filtering to retrieve only recently posted listings?+
published field is returned in each result and the get_facets response includes a published aggregation bucket, but search_jobs does not currently expose a direct date-range input parameter. The API covers full-text search, location, sector, extent, and remote filters. You can fork it on Parse and revise to add a date-range filter endpoint.Does the API cover job listings outside Norway or in languages other than Norwegian?+
workLanguage is one of the facet categories returned by get_facets, suggesting some listings specify their working language. Listings for positions outside Norway are not part of this data source.Is there a limit on the number of results search_jobs can return per call?+
size parameter accepts a maximum of 100 results per request. To retrieve more listings, increment the from offset parameter across successive calls. The total.value field in the response tells you the full count of matching documents so you can determine how many pages to paginate through.