# Nettikone Scraper — Used Machinery Finland (`crawloop/nettikone-scraper`) Actor

Scrape Nettikone used machinery listings in Finland: excavators, tractors, forestry, trucks, and dealer stock. Extract EUR prices, hours, VAT, specs, and images — a Nettikone scraper / API alternative.

- **URL**: https://apify.com/crawloop/nettikone-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 1,000 scraped nettikone listings

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

## Nettikone Scraper — Used Machinery Finland

> **Crawloop Used Machinery Marketplace Suite** — Structured extraction for heavy machinery, farm equipment, and commercial vehicles. Built for market research, inventory monitoring, and pricing workflows.

| Machineryline | Agriaffaires | Truck1 | Exapro | Machineseeker | Nettikone |
| :--- | :--- | :--- | :--- | :--- | :--- |
| [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) | [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) | [Truck1 Scraper](https://apify.com/crawloop/truck1-scraper) | [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) | [Machineseeker Scraper](https://apify.com/crawloop/machineseeker-scraper) | Nettikone Scraper ◄── you are here |

> **Disclaimer:** This is an unofficial integration developed independently of Alma Media / Nettix. It is not affiliated with, sponsored by, or endorsed by Nettikone, Nettiauto, or any of their subsidiaries.
>
> **Nettikone** and related names are trademarks of their respective owners. Listing data is read from publicly accessible web sources only; no proprietary databases are redistributed.
>
> This Actor is provided **for informational and research purposes only** (e.g. market research, dealer outreach, inventory monitoring). You are solely responsible for ensuring your use complies with applicable laws (including GDPR), platform terms of use, and your organization's policies. Phone numbers are **off by default** and must only be processed with a lawful basis.
>
> No warranty is given as to accuracy, completeness, or continued availability of third-party data. Use at your own risk.

Scrape **used machinery in Finland** from Nettikone — excavators, tractors, forestry machines, trucks, loaders, forklifts, and more — into clean JSON on Apify. A practical **Nettikone API alternative** for Python, Node.js, and MCP workflows.

Supports category URLs, keyword search (`/haku`), dealer profiles (`/yritys/{id}`), and direct listing pages. Use `listings` for fast catalog scans, `details` for VAT, hours, specs, and images, or `dealers` for company rows. Enable `monitorMode` with an Apify Schedule to track **new listings** and **price changes**, optionally via Telegram.

### When to use this Actor

Use this Actor when you need Finnish used-machinery prices, hours, VAT deductibility, and dealer context for excavators, farm machines, or commercial vehicles.

For pan-European heavy equipment, use the [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper). For farm machinery across Europe, use the [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper). For trucks, use the [Truck1 Scraper](https://apify.com/crawloop/truck1-scraper). For industrial auctions, see [Troostwijk](https://apify.com/crawloop/troostwijk-scraper) and [Surplex](https://apify.com/crawloop/surplex-scraper).

**Not in scope:** spare-parts categories that redirect to other Nettix sites, article/news pages, posting flows, or Alma Media login.

### Used Machinery Marketplace Workflow

```
Multi-platform intelligence          Per-platform enrichment
──────────────────────────          ─────────────────────────

  Nettikone Scraper     ◄── you are here ──► Finland used machinery & dealers
  Agriaffaires Scraper  ──────────────────► European farm equipment
  Truck1 Scraper        ──────────────────► commercial trucks
  Machineryline Scraper ──────────────────► pan-EU heavy equipment & contacts
  Troostwijk / Surplex  ──────────────────► auction lots & bids

  Join datasets by make + model ──► Nordic vs EU price comparison
```

### Key Features

- **Three extraction modes** — `listings` for card-level make/model/price/hours; `details` for PDP specs, VAT net/gross, gallery, seller; `dealers` for `/yritys/{id}` profiles.
- **Category shortcuts** — `machineTypes` covers construction, agriculture, forestry, trucks, excavators, tractors, forklifts, and more (Finnish path slugs on both `/en/` and Finnish UI).
- **Search and filters** — `searchQuery`, `make`, and `adType` (`for_sale` / `for_rent` / `sold`) build `/haku` URLs without hand-editing query strings.
- **VAT and hours** — Gross/net price, 25.5% VAT when published, VAT-deductible badge, operating hours (or km when the card shows tkm).
- **Dealer inventory** — Pass `/yritys/{id}` or `/haku?id_user=` to crawl that seller’s stock. The public dealer directory page is JavaScript-loaded by region and is not crawled as a list.
- **Optional phones (details)** — `includePhones` default `false` (GDPR). Numbers are decoded from listing HTML only; the Actor does not fire the site’s phone-click counter.
- **Monitor mode** — Schedule the Actor on a category, search, or dealer URL; only **new** listings and **price changes** go to the dataset, with optional Telegram alerts.
- **Finnish residential proxy** — HTTP extraction with `curl_cffi`; Apify RESIDENTIAL + country `FI` is the default.

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | excavators category | Category, search, dealer, or listing URLs. |
| `searchQuery` | String | — | Optional keyword search (`/haku?q=`). |
| `make` | String | — | Optional brand merged into the search query. |
| `machineTypes` | Array | `[]` | Built-in category shortcuts (excavators, tractors, trucks, …). |
| `language` | String | `"en"` | `"en"` (`/en/` prefix) or `"fi"`. |
| `adType` | String | `"all"` | `"all"`, `"for_sale"`, `"for_rent"`, or `"sold"`. |
| `runMode` | String | `"listings"` | `"listings"`, `"details"`, or `"dealers"`. |
| `includePhones` | Boolean | `false` | Decode seller phones in details mode (GDPR opt-in). |
| `includeDealerProfiles` | Boolean | `true` | Push a dealer row when a `/yritys/{id}` URL is provided. |
| `maxItems` | Integer | `10` | Maximum records (0 = unlimited). Keep small for Store QA. |
| `maxPagesPerUrl` | Integer | `1` | Pagination depth per start URL (`?page=N`). |
| `concurrencyLimit` | Integer | `3` | Parallel PDP workers in details mode. |
| `monitorMode` | Boolean | `false` | Delta tracking: first run seeds state; later runs emit new / price-changed rows. |
| `monitorStoreName` | String | `nettikone-monitor-state` | Named KV store so fingerprints survive Apify Schedules. |
| `telegramToken` | String | — | Telegram bot token for monitor alerts. |
| `telegramChatId` | String | — | Telegram chat ID for monitor alerts. |
| `resetMonitorState` | Boolean | `false` | Clear stored fingerprints and force a fresh seed run. |
| `proxyConfiguration` | Object | RESIDENTIAL / FI | Apify Proxy (Finnish residential recommended). |

If `startUrls`, `searchQuery`, and `machineTypes` are all empty, the Actor defaults to the English excavators category.

#### Input Example

```json
{
  "startUrls": [
    { "url": "https://www.nettikone.com/en/maarakennus/kaivinkone" }
  ],
  "runMode": "listings",
  "maxItems": 10,
  "maxPagesPerUrl": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "FI"
  }
}
```

#### Details + search example

```json
{
  "searchQuery": "Volvo EC",
  "machineTypes": ["excavators"],
  "language": "en",
  "adType": "for_sale",
  "runMode": "details",
  "maxItems": 25,
  "maxPagesPerUrl": 2,
  "includePhones": false,
  "concurrencyLimit": 3
}
```

#### Dealer inventory example

```json
{
  "startUrls": [
    { "url": "https://www.nettikone.com/en/yritys/3021897" }
  ],
  "runMode": "details",
  "maxItems": 50,
  "maxPagesPerUrl": 5
}
```

#### Monitor mode example (Schedule + Telegram)

```json
{
  "startUrls": [
    { "url": "https://www.nettikone.com/en/maarakennus/kaivinkone" }
  ],
  "runMode": "listings",
  "monitorMode": true,
  "monitorStoreName": "nettikone-monitor-excavators",
  "maxItems": 200,
  "maxPagesPerUrl": 10,
  "telegramToken": "123456:ABC...",
  "telegramChatId": "123456789",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "FI"
  }
}
```

With `monitorMode: true`, listing fingerprints are stored in a **named** Key-Value store (`monitorStoreName`, key `MONITOR_STATE`) so Apify Schedules keep state across runs. The first run seeds the cache and writes no dataset rows. Later scheduled runs emit only `changeType: "new"` or `"price_change"` (and send Telegram when token + chat ID are set). Use a distinct `monitorStoreName` per category or dealer watch. Use `resetMonitorState: true` to wipe the cache.

### Output Format

Each row is pushed to the default dataset. Schema depends on `runMode`.

| Field | Description |
| :--- | :--- |
| `recordType` | `listing` or `dealer` |
| `id`, `url`, `title` | Listing or dealer identifiers |
| `make`, `model`, `category`, `year` | Machine identity |
| `hours`, `mileageKm` | Operating hours, or km when the card shows tkm |
| `price`, `priceGross`, `priceNet`, `vatAmount`, `vatRate` | EUR asking price and VAT breakdown (details) |
| `vatDeductible`, `currency`, `adType`, `status` | VAT badge, EUR, for\_sale / for\_rent / sold |
| `fuel`, `driveType`, `powerKw`, `powerHp`, `grossWeightKg` | Specs from the PDP |
| `city`, `region`, `country`, `location` | Geography (Finland) |
| `sellerName`, `sellerId`, `sellerUrl`, `sellerAddress` | Dealer / private seller |
| `sellerPhone`, `sellerPhones`, `sellerEmail` | Only when `includePhones=true` (details) |
| `images`, `description`, `accessories` | Gallery, notes, equipment list |
| `isFastLane`, `isDealer`, `changeType` | Promo flag, dealer listing, monitor delta |

- **`listings`** — card fields: `id`, `title`, `make`, `model`, `year`, `hours`, `price` / `priceGross`, `vatDeductible`, `city`, `sellerName`, Fast lane flag. No phones (not published on cards).
- **`details`** — merges the card with the PDP: net/gross VAT, drive type, fuel, weight, power, images, notes, seller address/email, optional phones.
- **`dealers`** — `recordType: "dealer"` with company name, address, member since, inventory count.
- **`monitorMode`** — same fields plus `changeType` (`new` | `price_change`), `previousPrice` / `previousCurrency`, `monitoredAt`.

```json
{
  "recordType": "listing",
  "id": "2683697",
  "url": "https://www.nettikone.com/en/hitachi/zx70/2683697",
  "title": "Hitachi ZX70",
  "make": "Hitachi",
  "model": "ZX70",
  "category": "Excavators",
  "hours": 561,
  "price": 29995,
  "priceGross": 29995,
  "priceNet": 23900,
  "vatAmount": 6095,
  "vatRate": 25.5,
  "vatDeductible": true,
  "currency": "EUR",
  "adType": "for_sale",
  "fuel": "Diesel",
  "driveType": "Track",
  "grossWeightKg": 7000,
  "city": "Akaa",
  "region": "Pirkanmaa",
  "country": "FI",
  "sellerName": "ConMag Oy",
  "sellerId": "3021897",
  "sellerUrl": "https://www.nettikone.com/yritys/3021897",
  "images": [
    "https://images.nettikone.com/live/2026/07/24/e2f6a3577e6911a7-large.jpg"
  ],
  "scrapedAt": "2026-08-14T12:00:00Z"
}
```

### Typical Workflow

1. Open a Nettikone category or search in the browser (or set `machineTypes` / `searchQuery`).
2. Put category, `/haku`, `/yritys/{id}`, or listing URLs into `startUrls`.
3. Set `runMode` to `listings` (bulk index), `details` (specs + seller), or `dealers`.
4. Keep `includePhones` false unless you have a lawful basis.
5. Export the Apify dataset as JSON, CSV, or Excel.

#### Inventory / price monitoring

1. Set `startUrls` to a category, search, or dealer inventory page.
2. Enable `monitorMode` (prefer `runMode: "listings"` for cheaper scans).
3. Set a distinct `monitorStoreName` per watch target.
4. Add Telegram bot token + chat ID if you want alerts.
5. Create an Apify Schedule (e.g. every 1–6 hours). The named KV store keeps fingerprints across runs; the first run is a silent seed.

### Use cases

| Use case | What you get |
| :--- | :--- |
| **Finnish price benchmarking** | EUR asking prices, VAT net/gross, hours for excavators and tractors |
| **Dealer outreach** | Company name, city, profile URL; phones only with `includePhones` |
| **Inventory monitoring** | New listing / price-change deltas with optional Telegram |
| **Nordic vs EU comps** | Join `make` / `model` with Machineryline or Agriaffaires datasets |
| **AI / MCP workflows** | Run via Apify API, clients, or MCP and summarize dealer stock |

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/nettikone-scraper').call({
  startUrls: [{ url: 'https://www.nettikone.com/en/maarakennus/kaivinkone' }],
  runMode: 'listings',
  maxItems: 25,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'FI',
  },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/nettikone-scraper").call(
    run_input={
        "startUrls": [{"url": "https://www.nettikone.com/en/maarakennus/kaivinkone"}],
        "runMode": "listings",
        "maxItems": 25,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "FI",
        },
    }
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(len(items), items[:3])
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~nettikone-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://www.nettikone.com/en/maarakennus/kaivinkone"}],
    "runMode": "listings",
    "maxItems": 10,
    "proxyConfiguration": {
      "useApifyProxy": true,
      "apifyProxyGroups": ["RESIDENTIAL"],
      "apifyProxyCountry": "FI"
    }
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/nettikone-scraper`.

Example prompts:

- "Run Nettikone Scraper for English excavators in listings mode, max 20, and return title, price, hours, city, and url"
- "Scrape Nettikone Volvo listings in details mode and summarize median asking price and hours by model"
- "Chain Nettikone Scraper then Agriaffaires Scraper for similar tractors and compare Finnish vs European asking prices"

### Suite next step

For European farm equipment, run [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper). For commercial trucks, run [Truck1 Scraper](https://apify.com/crawloop/truck1-scraper). For pan-EU heavy machinery and dealer contacts, run [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper).

### FAQ

**Is this an official Nettikone API?** No. It reads publicly available listing pages. There is no official public API for this use.

**Why Finnish residential proxies?** The site is Finland-focused. Apify RESIDENTIAL with country `FI` is the stable default; datacenter IPs are more likely to fail.

**Can I scrape the dealer directory?** The `/listDealer.php` page loads companies by region in JavaScript. Pass concrete `/yritys/{id}` or `/haku?id_user=` URLs instead.

**Are phone numbers included?** Only in `details` mode when `includePhones` is true. Default is off.

**Finnish or English URLs?** Both work. Category slugs stay Finnish even under `/en/`.

### Related Actors

| Actor | Apify Store |
| :--- | :--- |
| **Nettikone Scraper** ◄── you are here | Finland used machinery & dealers |
| [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) | pan-EU heavy equipment & dealer contacts |
| [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) | used farm machinery Europe |
| [Truck1 Scraper](https://apify.com/crawloop/truck1-scraper) | commercial trucks |
| [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) | European CNC & metalworking |
| [Resale.info Scraper](https://apify.com/crawloop/resale-scraper) | European listings & categories |
| [Machineseeker Scraper](https://apify.com/crawloop/machineseeker-scraper) | regional CNC & metalworking |
| [Troostwijk Scraper](https://apify.com/crawloop/troostwijk-scraper) | multi-country industrial auctions |
| [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) | plant closures & Surplex lots |

# Actor input Schema

## `startUrls` (type: `array`):

Nettikone category, search (/haku), listing detail (/{make}/{model}/{id}), or dealer profile (/yritys/{id}) URLs. Finnish slugs stay in the path even on /en/. Example: /en/maarakennus/kaivinkone or /en/haku?q=volvo. Do not use listDealer.php — it is loaded by region in JavaScript; pass /yritys/{id} or /haku?id\_user= instead.

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

Optional keyword search. Builds /haku?q=… and appends it to start URLs (e.g. Volvo EC).

## `make` (type: `string`):

Optional brand keyword merged into the search query (e.g. Hitachi, Volvo, John Deere).

## `machineTypes` (type: `array`):

Built-in category roots when you do not want to paste URLs. Finnish path slugs are used on both FI and EN.

## `language` (type: `string`):

UI language for built URLs. en uses /en/ prefix; fi uses the Finnish root. Category slugs stay Finnish in both cases.

## `adType` (type: `string`):

Filter for-sale, for-rent, or sold ads when building /haku or category URLs. all = no filter.

## `runMode` (type: `string`):

listings = fast card-level data from category/search pages. details = visit each listing for specs, VAT, images, seller. dealers = dealer profile rows from /yritys/{id} URLs. Default listings so Store QA finishes quickly.

## `includePhones` (type: `boolean`):

When true and runMode is details, decode seller phones from listing HTML (data-mobile / data-phone, often base64). Off by default (GDPR). You are responsible for lawful processing. The Actor does not fire the site's phone-click counter.

## `includeDealerProfiles` (type: `boolean`):

When a /yritys/{id} start URL is provided, also push a dealer profile row (name, address, inventory count).

## `maxItems` (type: `integer`):

Maximum records to return (listings + dealers). 0 = unlimited. Keep small for Store auto-tests (under 5 minutes).

## `maxPagesPerUrl` (type: `integer`):

Pagination depth per category/search/dealer URL (?page=N). 0 = until exhausted.

## `concurrencyLimit` (type: `integer`):

Parallel detail-page workers (1–12). Keep low (2–4) with Finnish residential proxies.

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

Apify Proxy. RESIDENTIAL in Finland (FI) is required for stable runs.

## `monitorMode` (type: `boolean`):

Delta tracking for category, search, or dealer inventory URLs. First run seeds a named Key-Value store (no dataset rows / alerts). Later runs output only new listings and price changes. Pair with an Apify Schedule.

## `monitorStoreName` (type: `string`):

Named Key-Value store for fingerprints across scheduled runs. Use a distinct name per watch target (e.g. excavators vs a dealer).

## `telegramToken` (type: `string`):

Bot token for real-time alerts on new listings and price changes (monitorMode only). Create a bot via @BotFather.

## `telegramChatId` (type: `string`):

Telegram user or group chat ID that receives monitor alerts.

## `resetMonitorState` (type: `boolean`):

Clear stored listing fingerprints before this run (forces a fresh seed run).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.nettikone.com/en/maarakennus/kaivinkone"
    }
  ],
  "machineTypes": [],
  "language": "en",
  "adType": "all",
  "runMode": "listings",
  "includePhones": false,
  "includeDealerProfiles": true,
  "maxItems": 10,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FI"
  },
  "monitorMode": false,
  "monitorStoreName": "nettikone-monitor-state",
  "resetMonitorState": false
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.nettikone.com/en/maarakennus/kaivinkone"
        }
    ],
    "language": "en",
    "adType": "all",
    "runMode": "listings",
    "maxItems": 10,
    "maxPagesPerUrl": 1,
    "concurrencyLimit": 3,
    "monitorStoreName": "nettikone-monitor-state"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/nettikone-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 = {
    "startUrls": [{ "url": "https://www.nettikone.com/en/maarakennus/kaivinkone" }],
    "language": "en",
    "adType": "all",
    "runMode": "listings",
    "maxItems": 10,
    "maxPagesPerUrl": 1,
    "concurrencyLimit": 3,
    "monitorStoreName": "nettikone-monitor-state",
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/nettikone-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 '{
  "startUrls": [
    {
      "url": "https://www.nettikone.com/en/maarakennus/kaivinkone"
    }
  ],
  "language": "en",
  "adType": "all",
  "runMode": "listings",
  "maxItems": 10,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 3,
  "monitorStoreName": "nettikone-monitor-state"
}' |
apify call crawloop/nettikone-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/nettikone-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/VPdec16tjTVXhg42T/builds/pZOIIjeItjkULiefq/openapi.json
