FINN Jobs Scraper: Norway Job Ads, Employers
Pricing
from $0.90 / 1,000 jobs
FINN Jobs Scraper: Norway Job Ads, Employers
FINN jobb ads across Norway with the full ad page, by keyword, place, FINN's job filters, employer or link, read past FINN's 2,500 ad cap, no login. Rows: job title, employer, org number, søknadsfrist, sector, skills, apply system, salary benchmark add-on. Monitor alerts, pay per job, Excel, API.
Pricing
from $0.90 / 1,000 jobs
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
FINN Jobs Scraper: Norway Job Ads, Employers
FINN jobs scraper for FINN jobb, Norway's largest job board: search FINN's job ads by keyword, by place, by FINN's own job filters, by employer account, by a pasted FINN job search link or by job ad link and FINN code, and get every job as one row with its full ad page: job title and FINN's normalised job title, employer and organisation number, place and map point, published time, application deadline (søknadsfrist) or "Snarest", positions, full or part time, sector, industries, occupations, skills, keywords, FINN's own summary, the description and the apply link. Add FINN's salary benchmark for each job title, name the employer's own application system behind FINN's apply button, and mark the jobs FINN also sells as paid placements. A search past FINN's 50 page cap (2,500 ads) is split by place and by full or part time so the run reads past the cap, and a free coverage row per search says how many ads and positions FINN counts and what was read. No login, no cookies. A monitor delivers only jobs it never delivered before, with updated and removed jobs if you like, and can send them to Telegram, Slack, Discord, WhatsApp or your own webhook.
Who uses it: recruiters and staffing agencies watching new jobs in a field or a county, sales teams looking for employers that are hiring, labour market and salary analysts, job seekers who want an alert for one search, and teams feeding FINN job data into their own sheets, apps or AI agents.
Quick start
- Open the Input tab and type Keywords (
sykepleier,utvikler,elektriker) or leave them empty to search every FINN job, and pick Places (Oslo,Bergen,Trøndelag). - Narrow it with FINN's job filters: Occupations or Industries, Full or part time, Employment type, Sector, Home office, Education, Work experience, Working language, Manager role, Application deadline within.
- Or paste FINN links: job search pages into Job search links, job ad links or FINN codes into Job ad links or FINN codes, or give Employer account ids to read every job of one employer.
- Turn on the add-ons you want (Add FINN's salary benchmark, Resolve the apply link, Mark paid placements), set Maximum jobs and click Start. Download the rows as JSON, CSV or Excel, or read them through the Apify API.
The prefilled input reads 20 jobs in Oslo. To receive new jobs only, give the run a Monitor name and schedule it (daily or more often).
What you get
One row per job (type: "listing", vertical: "jobs"), one coverage row per search (type: "search"), free status rows for
anything that could not be delivered (type: "status"), a run summary (type: "summary"), and in a monitor with Track
changes a row per job that left FINN (type: "removed"). Every job row carries its full ad page, read for each job and
included in the Job price.
Every fill figure below is measured on real FINN answers saved during the build spike of 2026-10-22: 276 FINN job ad pages and 17
NAV ad pages (the ads FINN copies from NAV), read by this Actor's own ad page parser. The 276 pages hold 255 distinct FINN ads;
figures given "of 255" were counted on those with this Actor's own row builder. A field FINN does not show for a job is null.
On every job row
| Field | What it is | Filled (measured) |
|---|---|---|
adId, url, title | the FINN code, the job ad's link, the job title (the heading when the ad gives no job title) | 276 of 276 |
jobTitle, heading | the job title the employer gave, the ad's heading | 255 and 255 of 255 |
occupationTitle | FINN's normalised job title (the key of the salary benchmark) | 241 of 276 FINN ads; 0 of 17 NAV ads |
employerName, companyOrgNumber | the employer and its Norwegian organisation number | 276 and 276 of 276 |
companyId | FINN's employer account id (use it in Employer account ids) | 255 of 255 |
companyWebsite, companyLogo, companyAddress | the employer's website, logo and address | website 262, logo 267 of 276 |
employerDescription, employerProfileUrl | the employer's own text, FINN's employer profile page | 221 and 222 of 255 |
publishedAt, editedAt, status | published time, last change, active | published time 276 of 276 |
deadline, deadlineText, deadlineAsap | the deadline date (søknadsfrist), its text, true when the ad says "Snarest" | date 210, text 216 of 276; "Snarest" 76 of 255 |
positions, duration, sector | positions, Fast, Engasjement or another employment type, Privat or Offentlig | 276 of 276 |
extent, jobType | Heltid or Deltid, and FINN's job type (FULLTIME, PARTTIME, MANAGEMENT) | extent 236 of 255 (183 full time, 53 part time; the 19 management ads give none) |
industries, occupations | FINN's industries and occupation fields | 276 of 276 |
skills, skillsDetail, keywords | the skills (with their requirement level) and keywords | skills 259, keywords 216 of 276 |
finnSummary | FINN's own summary of the ad | 273 of 276 |
description, descriptionText | the job text as served and as plain text | 276 of 276 |
workLanguage, remote | working language, home office | 133 and 79 of 276 |
streetAddress, postalCode, postalName, municipality, county | where the job is | street 205, county 276 of 276 |
latitude, longitude | the map point | 275 of 276 |
applyUrl, easyApply | FINN's apply link, and whether it is FINN's easy apply ("Enkel søknad") | apply link 276 of 276; easy apply 48 of 255 |
salary, salaryType, salaryExtra | the salary as the ad states it | 5 of 276 (few FINN job ads state one) |
leadershipCategory, startDate | manager level, start date | 15 of 255; start date 0 of 276 |
videoUrl, externalAdId, sourceUrl | a video, the employer's own ad id, the original ad of a NAV ad | 36 and 181 of 255; source link 16 of 16 distinct NAV ads |
jobSource | FINN for FINN's own job ads, NAV for the NAV ads FINN shows beside them | every row |
contacts | contact persons (name, title, phone, mobile, e-mail) | 275 of 276, only with Include personal data |
searchKey, searchLabel, source, position, monitorName, runId, scrapedAt, change, possibleRepostOf | which search delivered the row, search or link, its place in the search, monitor and run facts | every row; change with Track changes |
With Extract contacts from texts (and Include personal data): emails, phoneNumbers, websites, socialProfiles. With
Include raw search row: raw.
The add-on fields
| Field | With | What it is | Measured |
|---|---|---|---|
salaryBenchmark, salaryBenchmarkStatus | Add FINN's salary benchmark | FINN's salary figures for the job's normalised title: median, average, lowerQuartile, upperQuartile, sampleCount, dataQuality, dataSource (LOCAL, or SSB with the SSB occupation group in ssbOccupation), similarTitles, the salary page url; yearly salaries in kroner | every one of the 222 normalised titles seen is a title FINN's salary pages list; 20 of 20 live titles gave figures |
applyTargetUrl, applyTargetHost, applySystem, applyTargetStatus | Resolve the apply link (easy apply and NAV ads always) | the employer's own application page and system: Webcruiter, Recman, Teamtailor, Jobbnorge, ReachMee, HR-manager, Easycruit and others, FINN Enkel søknad, or Own site | 30 of 30 FINN apply redirects named an outside target; 48 of 255 FINN ads are easy apply; 15 of 16 distinct NAV ads name their target on the page |
paidPlacement | Mark paid placements | true on a job FINN also sells in its paid slot ("Betalt plassering") of that search, false on the search's other jobs, null when the slot could not be read and on ad link rows | 1 of 16 paid ads seen stood on organic pages 1 to 3 of its search |
Example rows
A job read from its ad link with the apply link resolved (shortened; personal data off; from a FINN ad page saved on 2026-10-22, built by this Actor's own parser and row builder):
{"type": "listing", "vertical": "jobs", "adId": "479293217", "title": "Rådgjevar", "jobTitle": "Rådgjevar","occupationTitle": "Prosjektplanlegger", "employerName": "Vestland fylkeskommune", "companyOrgNumber": "974783223","companyId": "8678037", "companyWebsite": "https://vestlandfylke.no", "employerProfileUrl": "https://www.finn.no/job/company/11646","status": "active", "publishedAt": "2026-10-22", "location": "Bergen", "municipality": "Bergen", "county": "Vestland","positions": 1, "deadline": "2026-11-06", "deadlineText": "06.11.2026", "deadlineAsap": false,"jobType": "FULLTIME", "extent": "Heltid", "duration": "Engasjement", "sector": "Offentlig","industries": ["Event og arrangementer", "Konsulent og rådgivning", "Offentlig administrasjon"],"occupations": ["Rådgivning", "Samfunnsviter", "Konsulent"], "remote": "Delvis hjemmekontor", "workLanguage": ["Norsk"],"skills": ["Eventplanlegging", "Nynorsk", "Engelsk", "Saksbehandle søknader"], "salary": null,"applyUrl": "https://www.finn.no/job-apply/479293217/apply", "applyTargetHost": "candidate.webcruiter.com","applySystem": "Webcruiter", "applyTargetStatus": "known", "jobSource": "FINN", "contacts": null,"source": "link", "detailsIncluded": true}
The salary benchmark of the title "Sykepleier" (FINN's salary page saved on 2026-10-22, read by this Actor's own parser):
{"jobTitle": "Sykepleier", "slug": "sykepleier", "median": 620000, "average": 622345,"lowerQuartile": 568662, "upperQuartile": 678000, "sampleCount": 8100, "currency": "NOK", "period": "year","dataQuality": "EXCELLENT", "dataSource": "LOCAL", "ssbOccupation": null,"similarTitles": ["Fagansvarlig Sykepleier", "Oversykepleier", "Helsesykepleier", "Spesialsykepleier"]}
The coverage row of each search (free)
Each search gets one free row: the filters sent (filtersSent), FINN's own count of ads (adsOnFinn) and of positions
(unitsOnFinn; one ad can offer several positions), FINN's order (order), the slices, pages and rows read, the jobs met and
delivered, how many were left out and by which filter (filteredOutBy), how many a monitor already knew (knownToMonitor), the
ads still beyond reach (adsBeyondReach), whether the search was read to its end (complete) and why it stopped (stoppedBy).
With Mark paid placements it also carries paidPlacement: whether the paid slot was read, the paid ad's FINN code and whether
it stood among the search's own results.
How much does it cost to scrape FINN jobs?
You pay per event, with Apify's store discounts by plan. A job's full ad page is included in the Job price, and so are the apply link and the paid placement mark.
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Job (one job row, its full ad page included) | $0.94 per 1,000 | $0.94 per 1,000 | $0.94 per 1,000 | $0.90 per 1,000 |
| Results page (one search page read that brings new jobs; in a monitor every page read) | $0.70 per 1,000 | $0.64 per 1,000 | $0.58 per 1,000 | $0.50 per 1,000 |
| Salary benchmark (add-on, one per distinct job title per run) | $0.0042 each | $0.00385 each | $0.0035 each | $0.003 each |
| Actor start (once per run) | $0.0049 | $0.0049 | $0.0049 | $0.0049 |
Platinum and Diamond plans pay the Gold price. The Actor start is a flat fee per run, with no plan discount.
The Store pricing card shows these prices per 1,000 events: "$0.94 / 1,000" on the Job row means one job costs $0.00094, under a tenth of a cent, and "$4.20 / 1,000" on the Salary benchmark row means one salary benchmark costs $0.0042, under half a cent.
- Job is charged once per job delivered as a row, from a search, an employer account or a link. In a monitor with Track changes it is also charged per row delivered again because the job was updated, and per removed row; with Deliver unchanged jobs too, per unchanged row.
- Salary benchmark is charged only with Add FINN's salary benchmark on: once per distinct job title per run, on the first job that carries it; the other jobs of that title in the same run get the figures free, and a title FINN has no figures for is free.
- Results page is charged once per FINN search page the run reads that brings at least one job not met before in the run and inside the posted window (up to 50 jobs a page), whether those jobs are then delivered or left out by a word filter; in a monitor run (Monitor name set) on every page it reads, so a monitor pays for checking even on a day with nothing new. Free: a page with no such job (a search that finds nothing, a page of repeats or of jobs outside the posted window), a read that failed, a page FINN did not apply, the first page of a search split past FINN's cap, and the pages a run reads again after the platform restarted it. Ad links read no search page.
- Never billed: the ad page, the apply link read, the paid placement read, repeats in the run, jobs left out by a filter, NAV ads left out, jobs a monitor already delivered, an expired, removed or unknown ad, a refused setting, a search that finds nothing, coverage rows, status rows, the summary and every notification.
- Every run is charged the Actor start fee ($0.0049), also when it finds nothing (a keyword with no jobs, a filter FINN applies that no job passes, an input with nothing valid in it): for such a run only the start fee is charged. A word filter (Include keywords, Exclude keywords) is judged on each job's ad page, so a search whose jobs it all leaves out still pays the Results pages read, and nothing else.
- Example: 1,000 jobs from one search (20 pages of 50) cost $0.0049 (start) + 1,000 jobs ($0.94) + 20 results pages ($0.014) = $0.9589 on the Free plan; $0.0049 + $0.90 + $0.01 = $0.9149 on the Gold plan.
- Example with the salary benchmark on the Gold plan: 1,000 jobs from one search with 100 distinct job titles cost $0.0049 + 1,000 jobs ($0.90) + 20 results pages ($0.01) + 100 salary benchmarks ($0.30) = $1.2149. On the Free plan $0.0049 + $0.94 + $0.014 + $0.42 = $1.3789.
- Example: the prefilled run of 20 jobs in Oslo costs $0.0049 + 20 jobs ($0.0188) + 1 results page ($0.0007) = $0.0244 on the Free plan, $0.0049 + $0.018 + $0.0005 = $0.0234 on the Gold plan.
- Example of a daily monitor of one search on the Gold plan, with the default window of 100 rows (2 pages of 50) and 10 new jobs: start ($0.0049) + 2 results pages ($0.001) + 10 jobs ($0.009) = $0.0149. A day with nothing new: $0.0059.
- Example of a monitor of 50 employer accounts with up to 50 jobs each (one page each) on the Gold plan, on a day with nothing new: $0.0049 + 50 results pages ($0.025) = $0.0299.
Measured on the platform:
- The prefilled run (20 jobs in Oslo): about 30 seconds.
- 300 jobs from one search: 6 to 12 minutes; 2,600 jobs from one search split past FINN's 2,500 cap: about 51 minutes.
- 200 jobs with the salary benchmark, the apply target and the paid placement on: about 8 minutes, 113 distinct job titles.
- A link list whose ads FINN no longer shows stops after a short budget of free reads and charges only the start fee.
Measured on the evening and night of 2026-10-22, Norway time; on FINN's busy daytime hours a job can take a few seconds longer to read (the price per job does not change).
Input
The Actor has 69 settings; every one is in the Input tab with its own help text.
| Setting | What it does |
|---|---|
keywords | Search words, each its own search (up to 300, 100 characters each). FINN matches words in the title and the ad text. Left empty, every FINN job is searched. |
jobTypes | all (the default), parttime, management, nav (the NAV job ads FINN shows beside its own). |
employerIds | FINN employer account ids (the companyId of a job row), each its own search of every job of that account (up to 300). |
searchUrls | FINN job search links (https://www.finn.no/job/search?...), read with all their filters (up to 300). |
adUrls | Job ad links or FINN codes (up to 5,000), each read with its full ad page. An expired, removed or unknown ad is a free status row. |
locations | Counties, municipalities or districts by FINN's Norwegian name (Oslo, Bergen, Trøndelag, Utlandet for abroad) or value. Several places are one search. |
latitude, longitude, radiusKm | FINN's own map radius around a point in Norway (1 to 500 km). |
occupations or industries | FINN's occupation fields (IT utvikling, Helse) or industries (Helse og omsorg, IT); never both in one run. |
extents, employmentTypes, sectors, remoteOptions | Heltid or Deltid; Fast, Vikariat, Engasjement, Lærling and the other types; Privat, Offentlig and the other sectors; Kun hjemmekontor, Delvis hjemmekontor, Ingen hjemmekontor. |
educationLevels, experienceLevels, workingLanguages, managerRoles | Fagbrev, Høyskole/universitet, høyere nivå and the other levels; Ingen erfaring, Junior, Erfaren, Leder; Norsk or Engelsk; Leder, Fagleder, Direktør. |
deadlineWithin | oneDay, threeDays, oneWeek: FINN's own application deadline filter. Jobs whose deadline is "Snarest" have no date and are left out by it. |
postedToday, includeNavAds | FINN's "Nye i dag"; the NAV ads FINN shows beside its own (left out free unless on, or the nav job search is chosen). |
attributeFilters | Any other filter of FINN's job search by its name or Norwegian label: {"education": ["Fagbrev"], "home_office": ["Delvis hjemmekontor"]}. |
postedAfter, postedWithinHours | A date (YYYY-MM-DD, Norway time) or a number of hours, checked on every row. |
includeKeywords, requireAllKeywords, excludeKeywords, titleOnly, excludeAdIds | Words a job must hold (one or all) or must not hold, in the title only if you like; FINN codes you already have. A job left out is free. |
maxItems, maxItemsPerSearch, maxPagesPerSearch, maxRowsPerSearch | Paid rows per run (default 100), rows per search, pages per search (50 jobs a page), rows read per search (a monitor's window, 100 by default). |
includeSalaryBenchmark, resolveApplyTarget, markPaidPlacements | The three add-ons (below). |
includePersonalData, includeRawData | The personal data switch, FINN's own search row. |
descriptionFormat, descriptionMaxLength, compactOutput, excludeEmptyFields, extractContacts, phoneExtractionMode | Description asServed, text or markdown; a length cut; core fields only; empty fields left out; e-mails, phones, websites and social profiles found in the job texts. |
monitorName, resetMonitor, trackChanges, emitUnchanged, markReposts, skipReposts | The monitor (below). |
telegramBotToken, telegramChatId, slackWebhookUrl, discordWebhookUrl, whatsappAccessToken, whatsappPhoneNumberId, whatsappTo, webhookUrl, webhookSecret, webhookHeaders, notificationLimit, notifyOnlyChanges | Free notifications of the jobs a run delivered (below). |
failIfIncomplete, maxFailedRequestsPercent, proxyConfiguration, requestsPerSecond, maxConcurrency, maxRequestRetries | Fail the run when a search is incomplete or too many reads failed; your own proxy links; the pace (0.2 to 2 requests a second, default 1), requests in flight (1 to 4, default 4), retries (0 to 5, default 2). |
A run reads at most 300 searches (job searches times employer ids times keywords, plus search links). An input needs at least
one keyword, job search (jobTypes, all for every FINN job), place or other filter, employer id, search link or ad link: an empty
input is refused with a free row (only the run's start fee is charged). Pasting links in the Console? Clear the prefilled Places first:
a place or another filter given next to links alone (no keyword, job search or employer id) is refused with a free row, so a run
never reads a search you did not ask for.
Example inputs
Full time nursing jobs in Trøndelag:
{ "keywords": ["sykepleier"], "locations": ["Trøndelag"], "extents": ["Heltid"], "maxItems": 100 }
English speaking IT jobs in Oslo with hybrid home office, with the apply system named:
{ "locations": ["Oslo"], "occupations": ["IT utvikling"], "workingLanguages": ["Engelsk"],"remoteOptions": ["Delvis hjemmekontor"], "resolveApplyTarget": true, "maxItems": 200 }
Every job of one employer account, with FINN's salary benchmark:
{ "employerIds": ["8678037"], "includeSalaryBenchmark": true, "maxItems": 500 }
Public sector jobs whose deadline falls within a week:
{ "sectors": ["Offentlig"], "deadlineWithin": "oneWeek", "maxItems": 300 }
Every filter is checked
Every named filter is resolved against the search's own FINN filter list. A value the list does not offer (an occupation, a place,
a sector) is a free row that lists the values it does offer, and the search delivers nothing: an unknown value never widens a
search. Every page FINN answers must echo back exactly the filters sent; a filter FINN dropped in silence makes that page a free
search_not_applied row and the search delivers nothing more.
Past FINN's 2,500 ad cap
FINN serves at most 50 pages of one search, 2,500 ads at 50 a page, while all FINN jobs together counted about 13,776 ads for
27,807 positions on 2026-10-22 (5,160 more NAV ads). When FINN counts more ads than that and you want more, the search is split
into slices by FINN's own counts: by place, then by full or part time. A slice still past the cap is split again. A job met in an
earlier slice is skipped free. The coverage row says how many slices were read and how many ads stayed beyond reach
(adsBeyondReach), and a search is complete only when its slices met about every ad FINN counted.
NAV ads come after FINN's own in FINN's order, so with NAV ads left out a walk ends where the NAV ads begin.
Employer accounts
Each id in Employer account ids is a search of every job that FINN account posted, with your other filters applied. FINN's
account filter also covers the account's sister accounts, so one staffing group posting under several employer names comes back
whole. The id is the companyId of any job row of that employer.
Salary benchmark (add-on)
With Add FINN's salary benchmark on, each job whose normalised job title (occupationTitle) is a title FINN's salary pages list
gets that title's figures in salaryBenchmark: median, average, lower and upper quartile, number of salaries (sampleCount), data
quality and data source. The figures are yearly salaries in kroner reported by FINN's users (dataSource: "LOCAL"); where too few
reported, FINN shows Statistics Norway's figure for the occupation group (dataSource: "SSB", with ssbOccupation). The salary
page is read once per distinct title per run, and the Salary benchmark is billed once per title, on the first job that carries it.
The free text job title and the occupation names are never used to guess a title: a job without a listed normalised title gets
salaryBenchmark: null and salaryBenchmarkStatus says why (noTitle, titleNotListed, noData, failed, notRead), free.
Apply target (add-on)
FINN's apply button on most FINN ads is a redirect. With Resolve the apply link on, the Actor reads that redirect once per FINN
job that has one, without following it, and names the target: applyTargetUrl, applyTargetHost and applySystem (Webcruiter,
Recman, Teamtailor, Jobbnorge, ReachMee, HR-manager, Easycruit and others, or Own site for an employer's or agency's own page).
FINN may count that read as a click on its apply button; the target page itself is never opened. Easy apply jobs (
FINN Enkel søknadPaid placements (add-on)
FINN sells a paid slot ("Betalt plassering") in its job searches. With Mark paid placements on, the Actor reads that slot
once per search (not on the NAV job search) and sets paidPlacement: true on a job row FINN also sells there. FINN rotates the slot,
so a run sees one paid ad per search. A paid ad that is not among the search's own results is not delivered.
Monitor: only new jobs, with updates, removals and alerts
Give the run a Monitor name and schedule it. Each run reads the window of every search (Rows read per search, 100 by
default), pays a Results page per page it reads, and delivers only the jobs this monitor never delivered before; each is delivered
and billed once per monitor, and the ones it knows are free, so repeated runs never bill the same new job twice. FINN answers job searches in
its own order, and a new job can sit deeper in the search than the window: give a busy search a window that holds the whole search
(the coverage row's adsOnFinn), and the coverage row sets newAdsMayLieBeyond whenever the window did not. With Track
changes, a known job comes again when its title, place or status changed (updated), and a job the monitor delivered is reported
once as a removed row when it is gone from its complete searches and its page shows it removed or expired (held back when more
than half and more than 5 are missing at once). Mark reposts marks a new job whose title and employer match one the monitor
delivered (possibleRepostOf); Skip reposts leaves them out free. Reset the monitor starts it empty. One monitor name
belongs to one set of settings: a run with other settings under the same name reads nothing and says why. A monitor remembers up to
60,000 jobs.
Notifications are free and list the jobs the run delivered, in a monitor run or any other: Telegram through your own bot (up to
Jobs per notification jobs, default 10, at most 30, then a line naming the rest), one Slack, Discord or WhatsApp Cloud API
message listing up to that many jobs, and a webhook that receives up to 1,000 rows per run in JSON batches of 100, signed with HMAC
SHA-256 (header x-signature-sha256) when you give a secret, with up to 10 headers of your own. Notify changes only leaves new
jobs out. A failed notification gets a free status row and never fails the run.
A monitor for new developer jobs in Oslo, with updates and a Telegram alert:
{ "keywords": ["utvikler"], "locations": ["Oslo"], "monitorName": "oslo-dev-jobs", "trackChanges": true,"telegramBotToken": "YOUR_BOT_TOKEN", "telegramChatId": "YOUR_CHAT_ID" }
Free status rows
Nothing is billed for a FINN code or job ad link that FINN no longer shows or shows as expired, a refused setting or list item (a
free row names it by its position and says why), a filter value FINN does not offer, a search FINN did not apply, a search that
finds nothing (its coverage row says adsOnFinn: 0), or a search or link the run did not reach. A run writes up to 20 such rows
plus one per billed event (and at most 200 of one kind); the summary counts all of them.
Personal data
With Include personal data off (the default), every contact person (contacts: names, titles, phone and mobile numbers,
e-mail addresses) is null, and so are the contacts found in the job texts (Extract contacts from texts). Turning the switch on
adds them. The employer's data (name, organisation number, account id, address, website, logo) is business data and always
delivered. Titles and descriptions are delivered exactly as FINN serves them, so a job's own text can name a person or give a phone
number. You are responsible for a lawful use of personal data, GDPR included.
How long a run takes
FINN is read through Apify's datacenter proxy on one sticky session, at about one request a second with up to 4 in flight by default (job ad pages are read on 4 lanes). Each search page brings up to 50 jobs, and each job is one more read, its ad page, so a run's length grows with its jobs; the add-ons add one read per apply redirect, per distinct salary title and per search. Measured run times are in the pricing section above.
When FINN refuses a request, the Actor pauses and asks once more on the same address; a second refusal in a row (two requests refused together count as two) stops the run's reads with a free status row. It never switches to fresh addresses to get past a refusal. Failed reads and refusals are never billed: you pay per job delivered, so a slow FINN hour does not raise the price of a job. A request FINN leaves without any answer is given up after about 50 seconds on a fresh connection; after three such requests the run's reads stop with a free status row, and an add-on (salary benchmark, apply target, paid placement) FINN leaves unanswered twice is not asked again in that run (its fields stay empty). What was delivered stays delivered, and every search or link not reached is free and counted.
What this Actor does NOT do
- No other part of FINN. Only FINN's job ads (FINN jobb): no Torget, cars or homes.
- No sort order. FINN's robots.txt asks robots not to send its sort parameter, so searches are read in FINN's default order (the coverage row names it). A pasted link with a sort is read in FINN's order. Posted within and Posted on or after do not need an order: they check each row's own date.
- No occupations and industries together. FINN's robots.txt asks robots not to combine them; the run refuses that input with a free row.
- No login, no applying, no candidate data. No FINN account, saved searches or CVs; no application is sent and no apply form or apply target page is opened.
- No salary for every job. The benchmark covers only jobs whose normalised job title FINN's salary pages list, and
salaryis what the job ad itself states (5 of 276 measured FINN ads state one). - No employer pages. FINN's employer page shows nothing the job ad page lacks (name, description, website, logo), so it is not
read;
employerProfileUrllinks it. - No employer LinkedIn page. FINN shows no social link for an employer; a LinkedIn address written in the job text is
delivered in
socialProfileswith Extract contacts from texts and the personal data switch on. - No paid ads outside the results. A paid placement that is not among a search's own results is not delivered, since its own row cannot prove every filter of the search.
- No NAV ads by default. The NAV ads FINN shows beside its own are NAV's own ads, open on NAV's site; they are left out free
unless Include NAV job ads is on or the
navjob search is chosen. - No expired jobs as rows. An expired or removed ad is a free status row, never a billed job.
- No export to Notion or other apps. Use Apify's integrations (below) to send the rows on.
- No unpaid crawling. A run stops with a status row when its unpaid work (pages whose jobs were all filtered out or already
delivered, missing ads, the reads that check a search's filters) passes a small budget (USD 0.0004 plus a share of every billed
event): narrow the search or loosen the filters checked on each row. A list of job ad links whose first links are expired or
unknown stops the same way after about 30 of them in a row, before any job is delivered (measured on the platform: 40 expired
links before 10 live ones stopped after 30 reads; an unknown ad's read costs time that no job pays for): put live links first, or read old links in a run of their own; the links not read are free and counted in the
summary (
notReached).
Use it from an AI agent (MCP)
AI agents can run this Actor as a tool through Apify's MCP server: connect your MCP client to https://mcp.apify.com and add
automation_craft/finn-jobs-scraper to its tools. The agent then sends the same input as above (for example
{"keywords": ["elektriker"], "locations": ["Bergen"], "maxItems": 20}) and reads the rows back. For agents, set compactOutput
(only the core fields on each row) and excludeEmptyFields, keep maxItems small, and read the coverage row (type: "search") to
see whether a search was read to its end and how many ads FINN counts.
API and integrations
Run it and get the rows in one call (replace YOUR_TOKEN):
curl -X POST "https://api.apify.com/v2/acts/automation_craft~finn-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": ["elektriker"], "locations": ["Bergen"], "extents": ["Heltid"], "maxItems": 100}'
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('automation_craft/finn-jobs-scraper').call({ locations: ['Oslo'], workingLanguages: ['Engelsk'], includeSalaryBenchmark: true, maxItems: 50 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter((x) => x.type === 'listing'));
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("automation_craft/finn-jobs-scraper").call(run_input={"keywords": ["lærer"], "locations": ["Oslo"], "monitorName": "oslo-teachers"})jobs = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "listing"]
The Actor also runs from n8n, Make and Zapier through their Apify integrations, and on a schedule in the Apify Console.
FAQ
How do I scrape FINN jobs?
Type keywords or pick places and FINN's job filters, or paste a FINN job search link, set Maximum jobs and start the run: no code, no login and no proxy setup. Each job comes as one row with its full ad page (employer, organisation number, deadline, occupations, skills, apply link), as JSON, CSV or Excel or through the Apify API.
Is there a FINN.no jobs API?
FINN's own API is open only to businesses with an agreement with FINN. This Actor works as one for public FINN job ads: call it
through the Apify API with keywords, filters, employer account ids, search links or FINN codes and read the rows back as JSON, in
one call with run-sync-get-dataset-items.
How do I get alerts for new FINN jobs?
Give the run a Monitor name and schedule it: each run delivers only the jobs this monitor never delivered before and can send them to Telegram, Slack, Discord, WhatsApp or your own webhook at no extra charge, with no FINN account. A monitor run pays a Results page per search page it checks, so a day with nothing new costs the start fee plus those reads.
Can I see the salary for a FINN job?
The ad's own salary is in salary when the ad states one, which few FINN job ads do (5 of 276 measured). With Add FINN's
salary benchmark on, a job whose normalised title FINN's salary pages list also gets that title's median, average, quartiles and
number of salaries, billed once per distinct title per run.
How do I find English speaking jobs in Norway on FINN?
Set Working language to Engelsk, add Places and any other job filter, and the run delivers only the FINN jobs whose ad
gives English as a working language. workLanguage on each row lists the languages the ad gives.
Why does this Actor run with limited permissions?
It needs nothing more: it writes only to its own run's dataset and key-value store, and a monitor keeps its memory in a named key-value store it creates itself. Limited permissions keep your other Apify data out of its reach.
Changelog
- 0.1 (2026-10-22): first release: FINN job ads with their full ad page by keyword, place, FINN's job filters, employer account, search link or FINN code; searches split past FINN's 2,500 ad cap with a free coverage row; the salary benchmark, apply target and paid placement add-ons; a monitor with updates, removals, reposts and free notifications; contact persons behind the personal data switch. Full history in the Changelog tab.
More data tools by Automation Craft
- FINN.no Scraper: Torget, Cars, Homes and Jobs
- LinkedIn Jobs Scraper - No Login, Real Dates
- LinkedIn Job Details Scraper - By URL or Job ID
- SEEK Job Scraper: Australia & New Zealand Jobs
- Rippling Jobs Scraper & API - Pay, Descriptions
- willhaben Scraper: Immobilien, Cars, Jobs & Ads
- Marktplaats Scraper: Ads, Cars, Sellers & Alerts
- Gumtree Scraper: UK, Australia, South Africa Ads