Asunnot Oikotie.fi Real Estate Scraper avatar

Asunnot Oikotie.fi Real Estate Scraper

Pricing

from $1.00 / 1,000 dataset items

Go to Apify Store
Asunnot Oikotie.fi Real Estate Scraper

Asunnot Oikotie.fi Real Estate Scraper

Scrape Finnish property listings from asunnot.oikotie.fi by location, filters, or search/listing URLs. Optionally enrich each result with full listing details.

Pricing

from $1.00 / 1,000 dataset items

Rating

0.0

(0)

Developer

Data Scrapers

Data Scrapers

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Asunnot Oikotie.fi Real Estate Scraper creates a structured dataset of Finnish property listings collected from asunnot.oikotie.fi. Each dataset item is one listing card and can include the listing URL, address, city, district, price in euros, living area, rooms, building type, construction year, and image. Query by location, listing type, or a search or listing URL, optionally enrich each card from the listing page, limit results with maxItems, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, XML, or another supported format.

Asunnot Oikotie.fi Real Estate Scraper — input to structured data

Dataset at a glance

PropertyValue
Sourceasunnot.oikotie.fi
Record unitOne listing card, optionally enriched from the listing page
Input methodsstartUrls, or searchQueries plus filters
Main identifierscardId and id
DeliveryApify Dataset and API
Export formatsJSON, CSV, Excel, XML, and other Apify dataset exports
Update modelFresh records per Actor run
Pricing$0.001 per listing card. $0.002 extra per listing when detail enrichment succeeds.

Coverage and available records

Start URLs take priority. A start URL may be a search results URL, such as https://asunnot.oikotie.fi/myytavat-asunnot?cardType=100&locations[]=helsinki, or a single listing URL. Query filters already on a search URL are kept. searchQueries is used when startUrls is empty. An empty location list with no start URL searches nationwide using the filters.

Supported listing types: homes for sale, homes for rent, holiday homes for sale or rent, plots, commercial for sale or rent, farms and forest estates, garages, and new developments.

Supported filters on searches that do not already set the same keys: building type, room count, minimum and maximum price in euros, living area in square meters, construction year, and sort order.

maxItems defaults to 100. 0 means no item cap. The saved sample used Helsinki, homes for sale, and maxItems 5, with detail extraction off.

Card records include address, district, city, postal code, price, price per square meter, living area, rooms, room layout, floor, building floor count, maintenance fee, construction year, coordinates, image, publication time, vendor ad id, and visit counts. officeName and officeId were null on the saved cards.

extractDetails fetches the listing page and sets detailsScraped to true. That path can add energy class, heating, sauna and kitchen text, contact name, phone, and email, office contact fields, an image list, viewings, and extra price fields. Those fields are absent on card-only records. Detail enrichment charges the separate listing-details event after a successful detail fetch.

Not currently collected:

  • A guaranteed office name on every card. The saved Helsinki cards left officeName null
  • Historical sold-price series
  • Media files. imageUrl is a link

Data dictionary

Types and examples are from a saved Helsinki for-sale card with detailsScraped false. The description in that file is longer than the text shown in the example below.

FieldTypeNullableDescriptionExample
idintegerNoNumeric listing id. Same value as cardId on this card.24609013
cardIdstringNoListing id as a string. Best join key when you mix card and detail records.24609013
urlstringNoPublic listing URL.https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/24609013
cardTypeintegerNoListing category code.100
cardTypeLabelstring or nullYesCategory label.For sale (homes)
buildingTypeinteger or nullYesBuilding type code.1
buildingTypeLabelstring or nullYesBuilding type label.Apartment building
statusinteger or nullYesSource status code.1
descriptionstring or nullYesCard description text.Finnish listing text
roomsnumber or nullYesRoom count.2
roomConfigurationstring or nullYesLayout label.2h + kk
pricenumber or nullYesPrice in euros.215000.0
priceTextstring or nullYesFormatted euro price.215 000 €
pricePerSqmnumber or nullYesEuros per square meter.5000
sizenumber or nullYesLiving area in square meters.43
sizeTextstring or nullYesFormatted area.43 m²
sizeLotnumber or nullYesLot size. Null on some cards.1118.9
buildYearinteger or nullYesConstruction year.1961
floorinteger or nullYesFloor number.4
buildingFloorCountinteger or nullYesFloors in the building.8
maintenanceFeenumber or nullYesMaintenance fee in euros.245.1
newDevelopmentboolean or nullYesNew-development flag.false
nextViewingobject or nullYesNext viewing. Null when none is listed.See below
visitsinteger or nullYesVisit count from the card.0
visitsWeeklyinteger or nullYesWeekly visit count.0
addressstring or nullYesStreet, postal code, and city.Suvilahdenkatu 1, 00500, Helsinki
streetAddressstring or nullYesStreet address.Suvilahdenkatu 1
districtstring or nullYesDistrict.Sörnäinen
citystring or nullYesCity.Helsinki
zipCodestring or nullYesPostal code.00500
countrystring or nullYesCountry label from the source.Suomi
latitudenumber or nullYesLatitude.60.1871
longitudenumber or nullYesLongitude.24.9669
publishedstring or nullYesPublished timestamp, YYYY-MM-DD HH:MM:SS.2026-07-25 11:15:17
publishedSortstring or nullYesSort timestamp from the source.2026-07-25 11:15:18
vendorAdIdstring or nullYesVendor advertisement id.UUID string
officeNamestring or nullYesOffice name. Null on the saved card.null
officeIdstring or nullYesOffice id. Null on the saved card.null
imageUrlstring or nullYesCard image URL.https://cdn.asunnot.oikotie.fi/...
detailsScrapedbooleanNoTrue only after a successful listing-page enrichment.false
sourceQuerystring or nullYesLocation or URL query that produced the card.Helsinki

nextViewing, when present:

FieldTypeDescriptionExample
datestringViewing date2026-07-26
startstringStart time13:00
endstringEnd time13:30
livebooleanLive-viewing flagfalse
firstbooleanFirst-viewing flagtrue

Detail-only fields, present when detailsScraped is true, and otherwise omitted:

descriptionSupplementary, priceSell, shareOfLiabilities, rentPerMonth, sizeTotal, energyClass, heating, sauna, saunaInfo, kitchenInfo, bathroomInfo, availability, servicesInfo, otherFeesInfo, estateTax, realEstateId, created, lastModified, expires, officeEmail, officePhone, officeUrl, officeStreetAddress, officeCity, officeZipCode, contactName, contactPhone, contactEmail, images, viewings, and sellStatus.

No detail-enriched sample was saved in this folder, so those fields are named from the parser and are not given example values here.

Example dataset record

This card is a Helsinki for-sale apartment from searchQueries: ["Helsinki"] with extractDetails false. The stored description is longer. The text below is the opening of that same description.

{
"id": 24609013,
"cardId": "24609013",
"url": "https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/24609013",
"cardType": 100,
"cardTypeLabel": "For sale (homes)",
"buildingType": 1,
"buildingTypeLabel": "Apartment building",
"status": 1,
"description": "Raikasta merituulta, urbaania asumista parhaimmillaan Vilhonvuoren rauhaisilla ja viihtyisillä kaduilla.",
"rooms": 2,
"roomConfiguration": "2h + kk",
"price": 215000.0,
"priceText": "215 000 €",
"pricePerSqm": 5000,
"size": 43,
"sizeText": "43 m²",
"sizeLot": 1118.9,
"buildYear": 1961,
"floor": 4,
"buildingFloorCount": 8,
"maintenanceFee": 245.1,
"newDevelopment": false,
"nextViewing": {
"date": "2026-07-26",
"start": "13:00",
"end": "13:30",
"live": false,
"first": true
},
"visits": 0,
"visitsWeekly": 0,
"address": "Suvilahdenkatu 1, 00500, Helsinki",
"streetAddress": "Suvilahdenkatu 1",
"district": "Sörnäinen",
"city": "Helsinki",
"zipCode": "00500",
"country": "Suomi",
"latitude": 60.1871,
"longitude": 24.9669,
"published": "2026-07-25 11:15:17",
"publishedSort": "2026-07-25 11:15:18",
"vendorAdId": "75485a34-132f-43b2-a38e-c37b1e1e7f9c",
"officeName": null,
"officeId": null,
"imageUrl": "https://cdn.asunnot.oikotie.fi/C763kBNcZy05qAuNvn9lfE21dH4=/full-fit-in/708x444/filters:background_color(white):format(jpeg):quality(60)/ot-real-estate-mediabank-prod/281/886/source/231688182",
"detailsScraped": false,
"sourceQuery": "Helsinki"
}

Query and input reference

InputTypeRequiredDefaultAccepted valuesDescription
startUrlsURL arrayNoNoneSearch or listing URLsPriority source. Prefill is a Helsinki for-sale search.
searchQueriesstring arrayNoNoneCity, district, or postal codeIgnored when startUrls is set. Prefill: Helsinki.
listingTypestringNoFOR_SALEFOR_SALE, FOR_RENT, HOLIDAY_FOR_SALE, HOLIDAY_FOR_RENT, PLOTS, COMMERCIAL_FOR_SALE, COMMERCIAL_FOR_RENT, FARMS, GARAGES, NEW_DEVELOPMENTListing category.
buildingTypesstring arrayNoEmptyAPARTMENT, ROW_HOUSE, DETACHED_HOUSE, HOLIDAY_HOME, SEMI_DETACHED_SEPARATE, SEMI_DETACHED, OTHER, WALK_UP, WOODEN_APARTMENTEmpty means all types.
roomCountsstring arrayNoEmpty1, 2, 3, 4, 55 means five or more rooms.
priceMinintegerNoNoneEuros, minimum 0Minimum sale price or rent.
priceMaxintegerNoNoneEuros, minimum 0Maximum price.
sizeMinintegerNoNoneSquare meters, minimum 0Minimum living area.
sizeMaxintegerNoNoneSquare meters, minimum 0Maximum living area.
yearMinintegerNoNoneYear, minimum 1800Minimum construction year.
yearMaxintegerNoNoneYear, minimum 1800Maximum construction year.
sortBystringNopublishedDescpublishedDesc, publishedAsc, priceAsc, priceDesc, sizeAsc, sizeDescSearch sort.
extractDetailsbooleanNofalsetrue or falseFetch each listing page and charge listing-details.
detailConcurrencyintegerNo51–50Parallel detail requests.
maxItemsintegerNo1000 or a positive integerMaximum listings. 0 means no cap. Prefill 20.
proxyConfigurationobjectNoApify residential proxyApify proxy editorProxy for search and detail requests.

Filters are ignored for keys already present on a start URL.

Minimal request:

{
"searchQueries": ["Helsinki"],
"listingType": "FOR_SALE",
"maxItems": 5,
"extractDetails": false
}

Detail request:

{
"startUrls": [
{ "url": "https://asunnot.oikotie.fi/myytavat-asunnot?cardType=100&locations[]=helsinki" }
],
"maxItems": 5,
"extractDetails": true,
"detailConcurrency": 3
}

Retrieve the data through the API

  1. Start datascrapers/asunnot-oikotie-fi with the JSON input.
  2. Wait until the run finishes, or call the synchronous dataset endpoint.
  3. Read items from the run's default dataset.
  4. Paginate with dataset offset and limit, or export from the Apify console.
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("datascrapers/asunnot-oikotie-fi").call(
run_input={
"searchQueries": ["Helsinki"],
"listingType": "FOR_SALE",
"maxItems": 5,
"extractDetails": False,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["cardId"], item["city"], item["price"])

Other languages are listed on the Actor's API tab. This is the Apify Actor API, not an Oikotie API.

Data quality and record handling

  • Card records always include detailsScraped. It is false until a listing page is merged in.
  • Deduplicate on cardId. id is the same listing number when it is numeric.
  • vendorAdId is a second identifier from the source. It was present on the saved Helsinki cards.
  • Price is euros. pricePerSqm is euros per square meter. size is square meters. maintenanceFee is euros.
  • published is a source timestamp string, not a timezone-aware ISO value.
  • Overlapping locations can return the same cardId. Compare that field before merging runs.
  • A failed detail request leaves the card record and does not set detailsScraped to true.
  • The listing-details charge runs only after a successful enrichment. A card-only run charges dataset-item only.
  • Contact email and phone exist only on enriched records and only when the listing page includes them.

Pricing and cost examples

The price file in the Actor folder sets $1 per 1,000 listings and $2 per 1,000 listing details. Registered event prices, the same on every plan:

EventWhen it is chargedPrice
dataset-itemEach listing pushed to the dataset$0.001
listing-detailsEach successful detail enrichment$0.002

Platform usage, including compute and residential proxy, is billed separately by Apify. Estimates below assume every selected listing is pushed, and, in the enriched column, every one of those listings is enriched.

ListingsCards onlyCards plus details
1,000$1.00$3.00
10,000$10.00$30.00

Limitations and responsible data use

  • Results follow the public search you request. An empty location list is a nationwide search and can be large.
  • Filters do not override query keys already present on a start URL.
  • Office and contact fields are often missing on card-only records.
  • Detail fields depend on the listing page. A missing energy class or email stays absent.
  • Viewings and prices change on the source. This dataset is not a historical archive.
  • Contact details are personal data when they identify a person. Use them in line with the privacy rules that apply to your project.
  • You are responsible for complying with the site's terms and applicable law.

Dataset questions

What does one dataset item represent?

One Oikotie Asunnot listing. With extractDetails enabled and a successful fetch, the same record also contains listing-page fields and detailsScraped true.

Which field should I use as a unique identifier?

Use cardId. id repeats that number as an integer on saved cards.

Are fields nullable or conditional?

Yes. Lot size, office name, and the next viewing are null on some cards. Energy class, heating, and contact fields are only added when detailsScraped is true.

Can I retrieve the records as CSV or JSON?

Yes. Export the default dataset as JSON, CSV, Excel, XML, or another Apify format.

How do I paginate large datasets?

Set maxItems on the run. Read items with dataset limit and offset. 0 removes the Actor's item cap.

Does the Actor return historical data?

No. published is the listing's published time, not a history of price changes.

What counts as a billable result?

Each pushed listing charges dataset-item at $0.001. Each successful detail enrichment also charges listing-details at $0.002.

  • Apartments Scraper collects apartment listings with price, size, and location fields.
  • Aqar.fm Scraper collects Saudi listing cards you can compare on price, area, and city.
  • Aengevelt Scraper collects property records from a commercial brokerage site.
  • 99acres Scraper is a listings dataset with price and area fields.
  • 99.co Scraper collects portal listings for the same kind of market comparison.

Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.