A command-line tool for interacting with finn.no, Norway's largest classifieds marketplace.
Licensed under the Apache License, Version 2.0.
- torget search — Search the general Torget marketplace
- realestate search — Search Bolig til salgs (homes for sale) with filters
- lettings search — Search Bolig til leie (homes for rent) with filters
More features are planned: managing your own active ads, viewing received messages, tracking saved searches, and support for additional marketplaces (bil, etc.).
Requires Python 3.11+ and uv.
git clone <repo>
cd finn-tools
uv syncThen run with:
uv run finnctl <command>Or install globally:
uv tool install .Search for items on Torget:
finnctl torget search skistaver
finnctl torget search "røde stoler" --limit 10
finnctl torget search sykkel --sort PRICE_ASC
finnctl torget search lego --page 2 --plainOptions:
| Option | Short | Default | Description |
|---|---|---|---|
--limit |
-n |
20 | Number of results to show |
--page |
-p |
1 | Page number |
--sort |
-s |
PUBLISHED_DESC |
Sort order |
--plain |
false | Plain text output (pipe-friendly) |
Sort values: PUBLISHED_DESC, PUBLISHED_ASC, PRICE_ASC, PRICE_DESC, RELEVANCE
The --plain flag outputs one result per line (price location title) suitable for piping to grep, awk, etc.
Search Bolig til salgs (homes for sale). Filter by keywords, price, property
type, number of bedrooms, ownership form, living area, and location. The
command is also available under its Norwegian alias eiendom.
finnctl realestate search --type leilighet --ownership selveier --bedrooms-min 2 --location Oslo --price-max 6000000
finnctl realestate search enebolig --bedrooms-min 3 --location 2.20007.20110.23007
finnctl realestate search --type leilighet --type rekkehus --location Oslo --json
finnctl eiendom search hytte --price-min 2000000 --plainOptions:
| Option | Short | Default | Description |
|---|---|---|---|
--price-min |
Minimum asking price (NOK) | ||
--price-max |
Maximum asking price (NOK) | ||
--type |
-t |
Property type (repeatable) | |
--bedrooms-min |
-b |
Minimum number of bedrooms | |
--ownership |
-o |
Ownership form (repeatable) | |
--area-min |
Minimum living area (m²) | ||
--location |
-l |
Location code or county name | |
--sort |
-s |
newest |
Sort order |
--limit |
-n |
20 | Number of results to show |
--page |
-p |
1 | Page number |
--json |
false | Output structured JSON | |
--plain |
false | Plain text output (pipe-friendly) |
Property types: leilighet, enebolig (alias hus), tomannsbolig, rekkehus, garasje
Ownership forms: selveier (alias eier), borettslag (alias andel), aksje, obligasjon
Sort values: newest, oldest, price-asc, price-desc, area-asc, area-desc
Location: pass a finn.no location code — the leading digit is the depth,
so 0. = county, 1. = municipality, 2. = district (e.g.
2.20007.20110.23007 = Buskerud › Drammen › Nedre Eiker). County names such as
Oslo or Buskerud are also recognised directly.
Structured output: --json emits { "total", "page", "ads": [...] } where
each ad includes id, title, url, price, total_price, location,
area_m2, bedrooms, property_type, and ownership — suitable for scripting
or piping to jq. The library API returns the same data as dataclasses:
from finnctl import FinnClient
from finnctl.marketplaces.realestate import RealestateClient
with FinnClient() as finn:
result = RealestateClient(finn).search(
"enebolig", property_types=["hus"], bedrooms_min=3, price_max=5_000_000
)
for ad in result.ads:
print(ad.price, ad.location, ad.title)Search Bolig til leie (homes for rent). Same filters as homes-for-sale minus
ownership form (rentals have none): keywords, monthly rent, property type,
number of bedrooms, living area, and location. Prices are the monthly rent.
Also available under its Norwegian alias leie.
finnctl lettings search --type leilighet --bedrooms-min 2 --location Oslo --price-max 25000
finnctl lettings search --type hybel --location Oslo --sort price-asc
finnctl leie search hage --type enebolig --location Bergen --jsonOptions:
| Option | Short | Default | Description |
|---|---|---|---|
--price-min |
Minimum monthly rent (NOK) | ||
--price-max |
Maximum monthly rent (NOK) | ||
--type |
-t |
Property type (repeatable) | |
--bedrooms-min |
-b |
Minimum number of bedrooms | |
--area-min |
Minimum living area (m²) | ||
--location |
-l |
Location code or county name | |
--sort |
-s |
newest |
Sort order |
--limit |
-n |
20 | Number of results to show |
--page |
-p |
1 | Page number |
--json |
false | Output structured JSON | |
--plain |
false | Plain text output (pipe-friendly) |
Property types: leilighet, enebolig (alias hus), tomannsbolig, rekkehus, hybel, bofellesskap (room in a shared flat), hytte, garasje, andre
Sort values: newest, price-asc, price-desc, area-asc, area-desc, relevance (price = monthly rent)
Location works exactly as for homes-for-sale (county name or hierarchical finn.no code).
Structured output: --json emits { "total", "page", "ads": [...] } where each ad
includes id, title, url, rent, location, area_m2, bedrooms, and
property_type. The library API returns the same via LettingsClient:
from finnctl import FinnClient
from finnctl.marketplaces.lettings import LettingsClient
with FinnClient() as finn:
result = LettingsClient(finn).search(
property_types=["leilighet"], bedrooms_min=2, price_max=25_000, location="Oslo"
)
for ad in result.ads:
print(ad.rent, ad.location, ad.title)