FINN.no Jobs Scraper icon

FINN.no Jobs Scraper

Scrape active FINN.no job listings by search filters or URL. Extract 30+ fields including full descriptions, employer details, deadlines, contacts,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

FINN.no Jobs Scraper at a glance

FINN.no Jobs Scraper is a ready-to-run Apify actor from abotapi for collecting jobs data. Its documented output includes id, url, title, employer and city, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.50 per 1,000 results on the Apify Free plan and from $0.80 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Jobs, Ecommerce, Lead Generation
Region
Europe
Pricing
$1.50 per 1,000 results (Free plan), from $0.80 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
24 options

Scrape active FINN.no job listings by search filters or URL. Extract 30+ fields including full descriptions, employer details, deadlines, contacts, languages, sectors, industries, keywords and apply URLs.

What FINN.no Jobs Scraper can do

  • 30+ fields per ad, not just the search card. Full HTML and plain-text description, employer address and homepage, deadline, contact persons, working languages, sector, industries and the apply URL.
  • Two ways to scrape. Build a search from keyword, location, employment type, industry, occupation, sector, working language and posted-since filters, or paste any finn.no/job URL, including a single /job/ad/ link, and every result page is collected automatically.
  • Post-filter for sponsored cards. Drop "Betalt plassering" placements with one checkbox, applied to both a built search and a pasted URL's results.
  • Per-search budget. A multi-keyword run splits the item cap across every keyword instead of exhausting it on the first one.
  • Daily change monitoring. Turn on Incremental mode to get only the listings that are new or changed on each scheduled run, with unchanged and expired tracking available as opt-ins.
  • Resume an interrupted crawl. Paste a previous run or dataset ID to continue a large walk without re-collecting what's already saved, or let the actor recover automatically after a platform migration.

Choose what to collect

These inputs let you configure FINN.no Jobs Scraper - Listings, Employers & Contacts. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch mode = pick keywords + location + filters below. URL mode = paste any finn.no/job URL refined in a browser (recommended for filters not exposed below).

Choices: search, url

queriesarraySearch mode only, ignored in URL mode. Free-text search terms (e.g. "developer", "sykepleier", "prosjektleder"). One scrape per keyword; leave empty to browse without a keyword filter. Combine with location + employment type for narrower results.
locationstringSearch mode only, ignored in URL mode. Either one of these place names: Norge, Norway, Oslo, Akershus, Vestland, Bergen, Trøndelag, Trondheim, Rogaland, Stavanger, or a Finn.no hierarchical location code from the URL ?location= param (format ..[.], for example 0.20001 for Norge, 1.20001.20061 for Oslo, 1.20001.20003 for Akershus). Any other name stops the run with an error that lists these names. For other places, open finn.no/job, click a location filter, and copy the code from the URL. Leave empty to search Norway-wide.
employmentTypestringSearch mode only, ignored in URL mode: a pasted URL carries its own extent/manager_role parameter, and the actor reads the employment type back out of that URL instead. Filter by Finn.no employment scope: fulltime = Heltid (extent=3947), parttime = Deltid (extent=3942), management = Lederstillinger (manager_role=6702). "any" walks the unfiltered /job/search page.

Choices: any, fulltime, parttime, management

industrystringSearch mode only, ignored in URL mode. Finn.no industry code (e.g. 14 = Barn, skole og undervisning; 11 = IT; 9 = Helse og omsorg; 6 = Bygg og anlegg; 1 = Akademi, forskning. Open a Finn.no SERP, pick an industry, and copy the code from ?industry=.
occupationstringSearch mode only, ignored in URL mode. Finn.no occupation/job-function code from ?occupation=. More specific than industry. Look in a Finn.no SERP URL after picking a job function.
sectorstringSearch mode only, ignored in URL mode. Limit by employer sector.

Choices: any, private, public

Show 17 more inputs
More input fields
InputWhat it controls
workLanguagestringSearch mode only, ignored in URL mode. Workplace working language. Maps to Finn.no ?workLanguage= filter.

Choices: any, norwegian, english, swedish, danish, other

publishedSincestringSearch mode only, ignored in URL mode. Limit to ads posted within the last N days.

Choices: any, 1, 3, 7, 14, 30

sortBystringSearch mode only, ignored in URL mode: a pasted URL keeps whatever ?sort= it already carries. How Finn.no orders the SERP. "Default" is Finn's relevance ranking.

Choices: default, published_desc, deadline_asc

urlsarrayURL mode only, ignored in Search mode. One or more finn.no/job URLs. Examples: https://www.finn.no/job/search?q=developer or https://www.finn.no/job/ad/461652761 (single ad). Legacy /job//search.html URLs are auto-canonicalized to the working /job/search?extent= form so pagination works. Multi-URL supported; each URL pages forward independently. The Search mode fields above (keywords, location, employment type, industry, occupation, sector, working language, posted since, sort) are ignored here, because the pasted URL already carries its own filters. Skip sponsored placements, in the Filters section below, still applies to what a pasted URL returns.
skipSponsoredbooleanApplies in BOTH search mode and URL mode. Drop "Betalt plassering" cards (paid promotions). Applied after fetch as a client-side filter, so it also removes sponsored cards from the results of a pasted finn.no/job search URL.
maxPagesintegerHow many SERP pages to walk per query × employment-type combination (or per pasted URL). Each page returns up to ~50 listings. Leave empty (or 0) to walk every result page until Finn.no has no more.
maxListingsintegerStop after this many listings across all searches. 0 = unlimited (still bounded by maxPages).
fetchDetailsbooleanWhen ON, fetch full ad details: full HTML description, deadline, employer details, sector, industries, working languages, contact persons, keywords, and apply URL. SERP cards already carry id, title, employer, location, and posted date, so simple feeds work fine with this OFF. Default ON for richer output. Each delivered listing whose detail page is read is charged as one detail-page event on top of the per-result charge; listings whose detail page is refused, and listings incremental mode suppresses as unchanged, are not charged.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each search/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and detail settings, different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max listings capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayOptional list of output field names (for example employer or keywords) whose changes should NOT make a listing count as UPDATED. The fields are still returned in the output; they are only left out of the comparison. Adding or removing a field here does not mark tracked listings as UPDATED; later real changes are compared under the current list. Leave empty to compare every field.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID
urlURL (link)
titleTitle
employerEmployer
cityCity
postalCodeZIP
streetAddressStreet
latitudeLat
longitudeLng
datePostedPosted
applicationDeadlineDeadline
employmentFormForm
Show 28 more fields
employmentTypeType
sectorSector
industriesIndustries
jobFunctionFunction
workingLanguagesLanguages
applyUrlApply (link)
sponsoredSponsored
scrapedAtScraped
salarySalary
numberOfPositionsPositions
labelsLabels
searchKeySearch key
keywordsKeywords
contactPersonsContacts
employerUrlEmployer URL
employerLogoLogo
employerHomepageEmployer homepage
addressCountryCountry
lastModifiedModified
datePostedEpochMsPosted (ms)
applicationDeadlineEpochMsDeadline (ms)
descriptionHtmlDescription HTML
descriptionTextDescription
changeTypeChange type (incremental mode) (text)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
detailFetcheddetailFetched

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "id": "471234567",
  "idInt": 471234567,
  "url": "https://www.finn.no/job/ad/471234567",
  "title": "Backend-utvikler",
  "subtitle": "Bygg skyplattformer for norske kunder",
  "employer": "Nordlys Data AS",
  "employerUrl": "https://www.example-employer.no/",
  "employerHomepage": "https://www.example-employer.no/",
  "employerLogo": "https://images.finncdn.no/dynamic/default/0000/0/0/000000_0000000000.png",
  "streetAddress": "Storgata 12",
  "postalCode": "0150",
  "city": "Oslo",
  "addressCountry": "NO",
  "locationDisplay": "Oslo",
  "locationLink": "https://www.finn.no/job/search?location=1.20001.20061",
  "latitude": 59.9139,
  "longitude": 10.7522,
  "datePosted": "2026-02-08",
  "datePostedEpochMs": 1770508800000,
  "relativePosted": "2 dager siden",
  "applicationDeadline": "2026-03-10",
  "applicationDeadlineEpochMs": 1773100800000,
  "applicationDeadlineRaw": "10.03.2026",
  "lastModified": "2026-02-09T14:00:00.000+02:00",
  "lastModifiedEpochMs": 1770638400000,
  "employmentForm": "Fast",
  "employmentType": [
    "FULL_TIME"
  ],
  "employmentTypeRequested": "fulltime",
  "sector": "Privat",
  "industries": [
    "IT",
    "Telekommunikasjon"
  ],
  "jobFunction": "Systemutvikling",
  "internalJobTitle": "Backend Engineer II",
  "workingLanguages": [
    "Norsk",
    "Engelsk"
  ],
  "contactPersons": [
    {
      "name": "Kari Fjeldstad",
      "phones": [
        "+4791234567"
      ],
      "emails": [
        "kari.fjeldstad@example-employer.no"
      ]
    }
  ],
  "keywords": [
    "backend",
    "kotlin",
    "cloud"
  ],
  "applyUrl": "https://www.example-employer.no/careers/471234567",
  "descriptionHtml": "<p>Full HTML ad description goes here.</p>",
  "descriptionText": "Full ad description as plain text goes here.",
  "breadcrumb": [
    "FINN",
    "Jobb",
    "Sok",
    "Oslo"
  ],
  "sponsored": false,
  "scrapedAt": "2026-02-10T08:00:00.000Z"
}

Ways to use this data

  • Recruiters and staffing agencies: track competing job ads for a role, and compare deadlines, sectors, employment forms and ad requirements across employers.
  • Job boards and aggregators: mirror Finn.no job listings into your own search index, newsletter or alert feed.
  • Market and labor researchers: measure which sectors, industries and locations are hiring, and how demand shifts week to week.
  • Norwegian-language NLP teams: build labeled datasets of real job ad text for classification, extraction or search-ranking models.
  • HR and compliance analytics teams: monitor a defined set of employers' own postings for consistency and changes over time.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does FINN.no Jobs Scraper return?

The documented output for FINN.no Jobs Scraper includes id, url, title, employer, city, zip, street and lat. Availability of each field depends on the source page and the selected mode.

How much does FINN.no Jobs Scraper cost?

It costs $1.50 per 1,000 results on the Apify Free plan and from $0.80 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated listings, and unchanged ones are suppressed and not billed unless you turn on "Emit unchanged".

Why did my run return an empty dataset instead of failing?

If no Finn.no page could be loaded at all, the run ends as FAILED with a message that names a connection problem, so it is never mistaken for an empty search. If some pages loaded but a search returned nothing, the run finishes normally and its status message distinguishes a genuinely empty search (zero matches for your filters) from unreadable pages or a page layout change. Check the message and retry. An ad or page that Finn.no itself reports as gone (HTTP 404, for example an expired ad or an unknown location code) is skipped with a clear log line and counted as pagesNotFound in the run summary; it is not treated as a connection problem, and a run made only of such pages ends with a "not found" status message instead of a failure. The run does still fail outright for a few input problems unrelated to blocking: a location that is neither a supported place name nor a Finn.no location code (the error lists the accepted names), an unreadable resumeFromRunId, combining it with incrementalMode on a search that already has saved state, or the actor's connection setup itself failing at startup.

Does Resume work for a full search, or only for pasted single-ad URLs?

Both. Pasting a previous run or dataset ID into resumeFromRunId skips every listing already collected there, whether you're resuming a list of single ads or re-walking the same keyword search: an already-collected leading page is walked through rather than stopping the search immediately. If new ads have shifted into those same early pages since the earlier run, the walk can still end once it hits a page with no new listings at all, so resume soon after the interruption for the most complete result.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of results into Notion, Linear or Airtable.

Ready to collect with FINN.no Jobs Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.