FINN.no Scraper avatar

FINN.no Scraper

Pricing

from $2.40 / 1,000 results

Go to Apify Store
FINN.no Scraper

FINN.no Scraper

FINN.no carries so much of Norway's used-goods trade that one search is close to the whole market, not a sample. Rows give price in kroner, locality, trade type and a retailer-or-private flag; give-aways (Gis bort) come back as zero, not a gap. No seller names or coordinates collected.

Pricing

from $2.40 / 1,000 results

Rating

0.0

(0)

Developer

Lowland Data

Lowland Data

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 days ago

Last modified

Share

In Norway, if something used is for sale, it is on FINN.no. Nothing else comes close, which means one FINN.no search is not a sample of the Norwegian market, it is close to the whole of it.

This actor sweeps FINN Torget and hands back structured rows instead of a screen: price in whole kroner with the currency taken from the listing, locality, trade type, posting timestamp, the seller's spec picks such as brand and condition, the site's own badges, photos at full resolution, and a retailer or private flag. Give-aways listed as Gis bort arrive as zero, not as gaps. Set a price band, a date window and newest-first sorting.

It runs, every time, and you can check that before you spend anything. lowlanddata.com/status/finn-no-scraper is this actor's public health record: every run of the last 30 days, the success rate, the daily canary, failures included. Full input/output reference on the tool page.

No login, no CAPTCHA solving, no private endpoints. The actor reads what FINN.no shows a logged-out visitor, paces its requests and stays on standard datacenter proxies - which is also why a scoped run finishes in seconds.

Quick start (30 seconds)

  1. Put what you'd type in the FINN search box into searchQuery, e.g. sykkel.
  2. Click Start. That's the whole minimum setup.
  3. When the run finishes, open the dataset's Overview tab for a clean table, or Export it as CSV/Excel/JSON.

Optional knobs: a price band in kroner and newest-first sorting for monitoring, and any input works on a daily Schedule.

What you can build with it

  • Watch a niche for underpriced listings. Run searchQuery: "el-sykkel" with priceMax: 15000 and sortBy: "date" hourly. Every new listing arrives with priceAmount parsed and give-aways (priceAmount: 0, "Gis bort") included.
  • Map second-hand prices by locality. Every listing carries its city: chart what the same bike costs in Oslo versus Bergen without touching a coordinate.
  • Track retailer vs. private supply. The sellerType flag tells you how much of any category is professional traders, market structure no FINN page shows you.
  • Filter by brand without opening a listing. attributes carries the seller's spec picks - brand, condition, whatever the category offers - so a brand filter is one column, not a title search.
  • Feed an AI agent or a pipeline. Every field is structured and predictable, and the site's nested data is flattened to plain columns, so an assistant can consume it directly with no parsing step.

What you get

Each listing is one dataset item:

{
"listingId": "474000001",
"url": "https://www.finn.no/recommerce/forsale/item/474000001",
"title": "Sykkel str 20",
"priceAmount": 600,
"currency": "NOK",
"postedAt": "2026-08-21T06:06:40.000Z",
"city": "Bødalen",
"tradeType": "Til salgs",
"sellerType": "private",
"attributes": { "brand": "Trek" },
"labels": ["private"],
"imageUrl": "https://images.finncdn.no/dynamic/default/item/474000001/original",
"imageUrls": ["https://images.finncdn.no/dynamic/default/item/474000001/sized"],
"adId": "474000001",
"adType": 67,
"listingType": "bap"
}

Field notes, so you know exactly what you are buying:

  • priceAmount is in whole kroner; 0 covers give-aways ("Gis bort"). Listings without a price carry no amount.
  • tradeType is the site's own label: "Til salgs" (for sale), "Gis bort" (give-away), "Ønskes kjøpt" (wanted ad).
  • attributes is whatever the seller picked from the category's spec fields, one key per spec. Which keys appear depends on the category - a bike has brand, a phone has model. Absent when the seller picked nothing.
  • labels are the site's own badges by id: retailer or private, plus the shipping and buy-now badges where a listing carries them.
  • imageUrl is the original photo; imageUrls the sized variants the site serves, up to eight.
  • city is locality-level. Seller names, shop names and map coordinates are not collected.
  • postedAt reflects publication or the seller's last bump.
  • adId, adType and listingType are FINN.no's own identifiers, for anyone reconciling against the site.

How much does it cost to scrape FINN.no?

$3.00 per 1,000 listings delivered, pay-as-you-go: no subscription, and you pay per result rather than per hour. A run that finds nothing still costs the $0.005 actor start. In plain dollars:

  • 100 listings ≈ $0.30, a daily niche watch.
  • 500 listings ≈ $1.50, a solid market snapshot.
  • A 2,500-listing crawl ≈ $7.50, a full query window, deduplicated.

The price is all-inclusive. Your runs' platform usage is covered by it, with no separate compute or proxy charges. Runs are fast: a scoped few-hundred-item run typically finishes in under ten seconds. Datacenter proxies are sufficient, no residential proxy surcharge needed.

Free-plan runs are limited to a sample of 5 items, enough to evaluate the output format against your real query.

Not technical? Let your AI assistant set it up

Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and follow the conversation:

Help me set up the "FINN.no Scraper" actor on Apify
(https://apify.com/lowlanddata/finn-no-scraper). Guide me one step at a time.
What I want to watch: [E.G. "electric bikes under 15000 kroner"]
Guide me to:
1. Propose my input values: searchQuery (what I'd type in the FINN search box),
an optional priceMin/priceMax band in kroner, sortBy "date" for newest-first
monitoring, and maxItems.
2. Create a free Apify account (apify.com), open the actor page, paste the values
into the Input form, and start a run.
3. Set up a daily Schedule in the Apify Console with the same input, plus an email
or Slack integration so new results reach me automatically.
4. Show me how to export results as CSV/Excel, or read them from the API if I code.
5. If the results are what I wanted, remind me at the end to leave a quick rating on the actor page, and to report anything broken or missing on its Issues tab.

Input

FieldDescription
searchQueryWhat you'd type in the FINN search box. Required, unless you only re-check listings through listingIds.
listingIdsRe-check listings you already know instead of searching: listing IDs (the number at the end of every listing address, the listingId of every row) or the listings' full addresses, one per line. Each is read from its own page with title, price, town, seller type, the full description and the photos the page carries. A listing that is gone from the site is skipped, named in the log and not billed. When given, the search fields are ignored. Up to 50.
priceMinOnly listings costing at least this many kroner.
priceMaxOnly listings costing at most this many kroner.
sortBydate (newest first, default), price_asc, price_desc, or relevance.
postedAfterOnly listings posted on or after this date (YYYY-MM-DD). Stops early with newest-first sorting.
postedBeforeOnly listings posted on or before this date (YYYY-MM-DD).
maxItemsStop after this many listings (default 1000).
proxyConfigurationProxy settings; keep Apify proxy enabled.

A run minimally needs a searchQuery or a list of listingIds; invalid combinations (like an inverted price band) fail immediately with the reason in the run's status message.

Re-checking listings you already have

Put their IDs (or their addresses) into listingIds and nothing else: the run reads each listing's own page and returns it as a row with the same field names as a search result - listingId, url, title, priceAmount, currency, city, sellerType, imageUrl, imageUrls - plus the full description the search page never carries; imageUrls holds the photos the listing's page renders, which can be fewer than the search response lists. A price change shows up as a new priceAmount; a listing that has been sold, has expired or was taken down is not on the site any more - the run skips it, says so in the log and the status, and does not bill it. Schedule such a run and you have a watch on the exact listings you care about. The fields that only the search response carries (postedAt, tradeType, labels, attributes, adType, listingType) are not on a listing's page and are absent from a row read this way.

Use it from your code

Run the actor and get items straight back with one HTTP call (fine for scoped runs up to ~5 minutes):

curl "https://api.apify.com/v2/acts/lowlanddata~finn-no-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-X POST -H "Content-Type: application/json" \
-d '{"searchQuery": "sykkel", "maxItems": 100}'

Node.js:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('lowlanddata/finn-no-scraper').call({
searchQuery: 'sykkel',
maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lowlanddata/finn-no-scraper").call(
run_input={"searchQuery": "sykkel", "maxItems": 100})
items = client.dataset(run["defaultDatasetId"]).list_items().items

For bigger crawls, start the run asynchronously and fetch the dataset when the finished-run webhook fires. Schedules (e.g. a daily price snapshot), webhooks and the Make/Zapier/n8n integrations all work out of the box: this is a standard Apify actor.

Use it with AI agents (MCP)

Claude, Cursor and other MCP-capable agents can run this scraper as a tool through Apify's hosted MCP server: the agent fills in the search itself, starts the run and reads the results, no glue code.

Claude Code:

$claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/finn-no-scraper"

Cursor or Claude Desktop (add a custom connector / MCP server with this URL):

https://mcp.apify.com?actors=lowlanddata/finn-no-scraper

Want the whole family at once? Point one connector at every tool in the EU Marketplaces bundle:

https://mcp.apify.com?actors=lowlanddata/kleinanzeigen-scraper,lowlanddata/marktplaats-scraper,lowlanddata/tweedehands-scraper,lowlanddata/olx-pl-scraper,lowlanddata/olx-ro-scraper,lowlanddata/olx-pt-scraper,lowlanddata/willhaben-scraper,lowlanddata/finn-no-scraper,lowlanddata/tori-fi-scraper,lowlanddata/blocket-se-scraper,lowlanddata/dba-dk-scraper,lowlanddata/gumtree-uk-scraper,lowlanddata/vinted-scraper,lowlanddata/bol-com-scraper,lowlanddata/subito-scraper,lowlanddata/bazos-cz-scraper,lowlanddata/bazos-sk-scraper,lowlanddata/olx-bg-scraper,lowlanddata/olx-ua-scraper,lowlanddata/willhaben-car-scraper,lowlanddata/kleinanzeigen-free-finds,lowlanddata/olx-listing-watch,lowlanddata/marktplaats-new-listing-alerts,lowlanddata/tweedehands-new-listing-alerts,lowlanddata/kleinanzeigen-deal-radar

Sign in with your Apify account when prompted. Runs are billed to it. Setup details per client: Apify MCP docs, or start from this actor's own MCP page: apify.com/lowlanddata/finn-no-scraper/api/mcp.

Prompts that work once connected:

  • "Search FINN.no for 'el-sykkel' under 15000 kroner and summarize the price distribution."
  • "Get the 100 newest 'iphone 15' listings from FINN and flag private sellers below the median price."
  • "Watch FINN for 'kajakk' and tell me when something under 3000 kroner appears."

Beyond the ~2,600-result window

FINN serves at most 50 pages per query (about 2,650 listings). The run reports honestly when a query is bigger than its window: split broad queries by price bands (priceMin/priceMax) across runs; overlapping runs merge cleanly on listingId.

Listing prices, titles and localities are public commercial information. This actor reads what FINN.no shows any logged-out visitor, never signs in, bypasses no anti-bot protection, and paces its requests so its load on the site is negligible. It does not collect seller names, shop names or map coordinates; the only seller-derived field is whether a listing comes from a retailer or a private person. Titles are the seller's own words, delivered as-is.

Norway applies the GDPR through the Personal Data Act, supervised by Datatilsynet. How you store and use the data once it is yours is governed by the law of your own jurisdiction.

This actor is an independent tool. It is not affiliated with, endorsed by or sponsored by FINN.no or its owners, and trademarks belong to their respective holders.

Is there a FINN.no API alternative?

FINN's public API programme is aimed at partners, not ad-hoc listing search. This actor is the practical alternative: the same listings as structured JSON through one HTTP call (run-sync-get-dataset-items), on a schedule, or as an MCP tool for AI agents.

Does FINN.no block scrapers?

This actor makes ordinary requests: paced, on standard datacenter proxies, load kept negligible. No CAPTCHA fights, no bot-wall cat-and-mouse, which is also why runs are fast and reliable enough for daily schedules. The health record above shows how that holds up day to day.

How do I monitor FINN.no prices?

Set sortBy: "date" with your query, cap maxItems to a page or two, and add a daily (or hourly) Schedule in the Apify Console with an email/Slack integration on the runs. Every new listing lands in your inbox with the price already parsed. The AI-assistant prompt above walks a non-technical user through exactly this setup. Even tighter: set postedAfter to yesterday's date: the dataset then contains only the new listings, nothing to dedupe on your side.

FAQ

Can I get seller names or phone numbers? No. The output says whether the seller is a retailer or a private person, and nothing else about them.

Does it cover cars, boats and property? This actor searches Torget (general goods). FINN's vehicle and property verticals carry different data: candidates for separate actors, done properly.

Can I get only the newest listings? Yes, set postedAfter to a date (yesterday, say) and the dataset contains only listings posted since then. With newest-first sorting the run stops paging as soon as it provably reaches older listings, so a daily watch stays fast and cheap.

How fresh is the data? Live at run time: every run queries FINN directly. For continuous freshness, schedule the actor.

Can I export to Excel or CSV? Yes, every dataset exports as CSV, Excel, JSON or XML from the Apify Console or API.

Does it work with Make, Zapier or n8n? Yes, it is a standard Apify actor; all platform integrations, webhooks and schedules apply.

Does FINN.no have a public API? Only a partner programme, nothing self-serve for listing search. This actor is the practical route to FINN Torget data as structured JSON.

Is it legal to scrape FINN.no? Listing prices, titles and localities are public commercial data, and the actor collects no seller identity. Norway applies the GDPR through the Personal Data Act; see the section above.

What is the price per listing? $1.99 buys 1,000 delivered listings, about 20 cents for a 100-listing watch, plus the $0.005 run start. A run that returns nothing costs only that start.

Can I get more than ~2,650 results for one search? Not in a single run, FINN stops at 50 pages per query. Run the same search several times with different priceMin/priceMax slices and dedupe on listingId.

Is there a bulk export for FINN listings? That is what a run is. Set maxItems to the size you need, up to the ~2,650-listing window per query, then export the dataset as CSV, Excel or JSON from the Console or read it over the API. Beyond one window, split by price band.

How do I sort FINN results by price instead of date? Pass sortBy: "price_asc" or "price_desc". Leave it out and you get newest-first, which suits monitoring.

Can I scrape only listings from the last week? Yes, set postedAfter to the date seven days back. Under newest-first sorting the run halts once it reaches older listings, so you never pay for pages you don't need.

Can I tell whether a FINN seller is a shop? Yes, without knowing who they are: sellerType flags retailer versus private. No shop name, no profile, just the category.

Why is there no exact location in the output? city gives you locality-level geography, enough for market maps; nothing finer is collected.

What is in attributes? The spec fields the seller filled in for that category - brand, condition, size, model - one key each, flattened so they land as ordinary columns in an export. Which keys appear depends entirely on the category and on what the seller picked.

What are labels? FINN.no's own badges on the listing, by id: retailer or private, plus the shipping and buy-now badges where a listing carries them.

How fast are runs? Typically under ten seconds for a few hundred items, which is why the synchronous run-sync-get-dataset-items endpoint works well here.

Is there a cap on results per run? Only maxItems (default 1,000), plus the free-plan sample limit of 5 items.

Can I evaluate it without a paid plan? Yes. A free-plan run returns up to 5 items from your own query, real data, real fields, no card required.

Does each listing include its photos? Yes. imageUrl is the original at full resolution; imageUrls is an array of the sized variants on FINN's CDN, up to eight.

What does "Gis bort" mean in the data? It is FINN's give-away label; those listings arrive with priceAmount: 0 so they stay visible in price analysis.

Can Claude or Cursor query FINN through this actor? Yes, add Apify's hosted MCP server and the agent can run searches and read the dataset itself. URLs and setup steps are in the MCP section.

A listing I scraped last week shows a new date. Why? Sellers can bump listings; postedAt reflects the latest bump, not only first publication.

Working the Nordic second-hand market? Same output discipline, same public health record:

Troubleshooting

The actor fails fast with the reason in the run's status message:

  • "priceMin must not be higher than priceMax.": swap the two values.
  • "The site blocked the run before any results could be fetched. This is usually temporary - retry in a few minutes.": a temporary block on the first request; a retry usually lands on a clean proxy session.
  • "... the site serves at most this many pages per query ...": the query is bigger than FINN's result window; add a price band for full coverage.
  • Fewer items than requested on a free plan: the 5-item free sample cap; run on a paid Apify plan for full results.

Support

Found an issue or missing a field you need? The fastest route is the actor's Issues tab - it is monitored and reports get fixed. For anything private, email contact@lowlanddata.com. This actor is actively maintained.

Working well for you? A rating on this page takes ten seconds and helps other buyers find it: it is also the clearest signal of what we should build next.