# Tori Scraper - Finnish Car Listings & Classifieds (`studio-amba/tori-scraper`) Actor

Scrape car listings from Tori.fi, Finland's largest classifieds site. Extract prices, specs, mileage, fuel type, location. No login required.

- **URL**: https://apify.com/studio-amba/tori-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Tori Scraper - Finnish Marketplace Listings

Scrape listings from [Tori.fi](https://www.tori.fi), Finland's largest online marketplace. Extract structured listing data including prices, locations, publish dates, images, and listing URLs. No login or cookies required.

Tori.fi (part of the Vend / Schibsted marketplace group, same platform family as FINN.no and Blocket) is visited by millions of Finns every month and is the go-to platform for second-hand goods in Finland: furniture, electronics, bikes, sports gear, tools, vehicle parts, and much more.

### Why use this scraper?

- **Structured listing data** -- Get titles, prices, locations, publish dates, image URLs, and listing links in clean JSON or CSV format.
- **No login required** -- Works without authentication, cookies, or account creation.
- **Finnish market coverage** -- Access Finland's largest second-hand marketplace with hundreds of thousands of active listings.
- **Flexible filtering** -- Search by keyword, category, price range, and sort order.
- **Automatic pagination** -- Crawls through search result pages up to your specified limit.
- **Fast and lightweight** -- Parses server-rendered HTML directly, no headless browser overhead.
- **Export to any format** -- Download results as JSON, CSV, XML, or Excel. Push to Google Sheets, webhooks, or other integrations via the Apify platform.

### How to scrape Tori.fi data

1. **Create an Apify account** -- Sign up at [Apify](https://apify.com) if you do not already have an account. New accounts get free monthly credits.

2. **Open the Tori Scraper** -- Navigate to the actor page and click "Start" or "Try for free."

3. **Configure your search** -- Enter a search query (e.g., "sohva", "polkupyörä", "iphone"). Optionally narrow results with a category ID, price range, and sort order.

4. **Set the result limit** -- Adjust "Max Results" to control how many listings you want. The default is 100. Lower values reduce runtime and cost.

5. **Run the scraper** -- Click "Start" and wait for the run to complete. Progress is shown in the log output.

6. **Download your data** -- Once finished, go to the "Dataset" tab to preview results. Export as JSON, CSV, XML, or Excel. You can also connect the output to Google Sheets, webhooks, Slack, or any Apify integration.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQuery` | string | `sohva` | Free-text search term in Finnish or English. |
| `category` | string | | Optional Tori.fi category ID (e.g., `0.78` for Koti ja sisustus, `0.93` for Elektroniikka ja kodinkoneet). |
| `priceFrom` | integer | | Minimum listing price in EUR. |
| `priceTo` | integer | | Maximum listing price in EUR. |
| `sort` | string | `RELEVANCE` | Sort order: `RELEVANCE`, `PUBLISHED_DESC`, `PUBLISHED_ASC`, `PRICE_ASC`, `PRICE_DESC`. |
| `maxResults` | integer | `100` | Maximum number of listings to scrape. |
| `proxyConfiguration` | object | Finnish residential | Proxy settings. Finnish residential IPs are recommended. |

#### Example input

```json
{
    "searchQuery": "polkupyörä",
    "priceFrom": 100,
    "priceTo": 800,
    "sort": "PUBLISHED_DESC",
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FI"
    }
}
```

### Output

Each listing is one dataset item:

```json
{
    "itemId": "26594762",
    "listingTitle": "Tampuriini valkoinen 3-istuttava sohva",
    "price": 350,
    "currency": "EUR",
    "location": "Tampere, Pirkanmaa",
    "publishedDate": "21.6.",
    "highlight": "",
    "imageUrl": "https://img.tori.net/dynamic/default/67/67ec3ea5-0e60-4d83-9b8f-daa0b31449da",
    "url": "https://www.tori.fi/recommerce/forsale/item/26594762",
    "scrapedAt": "2026-07-05T12:34:56.789Z"
}
```

| Field | Description |
|-------|-------------|
| `itemId` | Tori.fi listing ID |
| `listingTitle` | Full listing title |
| `price` | Price in EUR (null when the seller did not set one) |
| `currency` | Always `EUR` |
| `location` | Seller location (city, area, region) |
| `publishedDate` | Publish date as shown on the listing card |
| `highlight` | Promotion badge, if any (e.g. `Paalupaikka`) |
| `imageUrl` | Main listing image |
| `url` | Direct link to the listing |
| `scrapedAt` | ISO 8601 scrape timestamp |

### Use cases

- **Price monitoring** -- Track second-hand prices for furniture, electronics, bikes, or any product category in Finland.
- **Deal hunting** -- Poll new listings for a keyword sorted by `PUBLISHED_DESC` and get notified via Apify integrations when something matches.
- **Market research** -- Analyze supply, pricing, and regional distribution of second-hand goods in the Finnish market.
- **Resale arbitrage** -- Compare Tori.fi prices against other European marketplaces.
- **Inventory sourcing** -- Find stock for resale businesses across Finnish regions.

### Tips

- Use Finnish keywords for best results ("sohva" instead of "sofa", "polkupyörä" instead of "bicycle").
- Sort by `PUBLISHED_DESC` and run on a schedule to build a fresh-listings feed.
- The scraper stops automatically when it reaches `maxResults` or runs out of result pages.
- Finnish residential proxies (the default) give the most reliable results.

### Legal note

This scraper only collects publicly available listing data that any visitor can see on Tori.fi. Always review and comply with Tori.fi's terms of service and applicable data protection regulations (GDPR) for your use case. Do not scrape or store personal data beyond what your legal basis covers.

### Support

If the scraper stops returning data (for example after a site redesign), open an issue on the actor page and it will be fixed promptly.

# Actor input Schema

## `searchQuery` (type: `string`):

Free-text search term in Finnish or English (e.g. 'sohva', 'polkupyörä', 'iphone').

## `category` (type: `string`):

Optional Tori.fi category ID to narrow results (e.g. '0.78' for Koti ja sisustus, '0.90' for Auto-, vene- ja moottoripyörätarvikkeet, '0.93' for Elektroniikka ja kodinkoneet). Find IDs in the category filter links on tori.fi search pages.

## `priceFrom` (type: `integer`):

Minimum listing price in euros.

## `priceTo` (type: `integer`):

Maximum listing price in euros.

## `sort` (type: `string`):

How to sort search results.

## `maxResults` (type: `integer`):

Maximum number of listings to scrape.

## `proxyConfiguration` (type: `object`):

Proxy settings. Residential proxies with Finnish IP are recommended for reliable results.

## Actor input object example

```json
{
  "searchQuery": "sohva",
  "sort": "RELEVANCE",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FI"
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "sohva",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FI"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/tori-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "sohva",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FI",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/tori-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "sohva",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FI"
  }
}' |
apify call studio-amba/tori-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/tori-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/FF7KyX3td9Lx7kNLR/builds/HnQ6g2FnHoJx2mefk/openapi.json
