Motorkari Scraper
Pricing
from $8.00 / 1,000 results
Motorkari Scraper
Fast motorcycle listing scraper for Motorkari.cz. Extract price, specs, seller info, and optional descriptions/photos/phone. Supports filtering by brand, model, year, mileage, price. Perfect for dealers, researchers, price comparison tools.
Pricing
from $8.00 / 1,000 results
Rating
0.0
(0)
Developer
gearshift-data
Actor stats
0
Bookmarked
2
Total users
0
Monthly active users
11 days ago
Last modified
Categories
Share
Motorkari.cz Scraper
Pulls motorcycle listings from motorkari.cz and saves them as structured data you can open in Excel, Google Sheets, or feed into any other tool.
No coding needed — just set your filters and run.
What you get
Each result is one motorcycle listing with price, brand, model, year, mileage, region, seller info, view count, and a main photo. Optionally you can also pull the full description, gallery photos, and the seller's phone number.
Quick start
Just want to try it? This scrapes the first page of all listings with no filters:
{"maxPagesPerCrawl": 1}
Ingest mode — full vs incremental
The actor has two modes, set by the ingestMode input. Default is full.
full (default)
Scrape the search results and fetch detail pages for every listing. Use this when you need a one-off complete dataset — exports, brand analysis, market snapshots.
{ "ingestMode": "full", "manufacturer": "honda" }
incremental
Designed for repeated runs. The actor remembers which listing IDs it saw in previous runs (stored in its default key-value store as seen-ids) and uses that to do two things:
- Push a summary record for every listing found in the search results — title, year, price, url. This lets you detect price changes across runs without refetching the detail page.
- Fetch full detail pages only for listings it hasn't seen before. Known listings are skipped.
- Stop paginating when two consecutive search pages contain only known listings. Avoids re-crawling the entire archive on daily runs.
{ "ingestMode": "incremental", "maxPagesPerCrawl": 0 }
Do I need to run full first?
No. The first incremental run is its own bootstrap:
seen-idsis empty → every listing is "new" → detail page is fetched for every listing, exactly likefullmode.- At the end, the actor saves all IDs it processed as
seen-ids. - The next incremental run only fetches details for listings that appeared since.
So: pick a mode and stick with it. Don't mix. If you run full once then incremental, the incremental bootstrap won't know about anything full scraped (different code path, doesn't write seen-ids). Just run incremental from day one.
What each run produces in incremental mode
Every dataset item carries a scrapeStage field:
summary— lightweight record from the search listing row (title, year, price, url, id). Detail-only fields likedescription,photos,phonearenull. Emitted for every listing the actor sees on the search pages.detail— full record with every field populated. Emitted only for listings not inseen-ids.
On a typical daily run: ~500 summary records (whole first page or two), ~5-50 detail records (actually-new listings).
Output types example (incremental)
Same listing, two records across two runs:
// Run 1 — id is new → detail scrape{ "scrapeStage": "detail", "id": "2048429", "title": "Husqvarna FE 450","price": "25 000 Kč", "priceNumeric": 25000, "description": "...", "photos": [...] }// Run 2 (one week later, seller dropped price) — id is known → summary only{ "scrapeStage": "summary", "id": "2048429", "title": "Husqvarna FE 450","price": "22 000 Kč", "priceNumeric": 22000, "description": null, "photos": [] }
Consumers of the dataset should treat null on summary records as "not available this run, don't overwrite". Price, title, year are present on both.
Running incremental on a schedule
Set up an Apify Schedule targeting this actor with input:
{ "ingestMode": "incremental", "maxPagesPerCrawl": 0, "maxItems": 0, "scrapeDescription": true, "scrapePhotos": true }
Daily at the same time. Day-one run is the heaviest (full bootstrap). Subsequent runs scan the top few pages, fetch details for ~2-5% of listings, and stop once they hit known territory.
Filters
All filters are optional. Mix and match what you need.
| Setting | What it does | Example |
|---|---|---|
customUrl | Paste a search URL directly from motorkari.cz — skips all other filters | "https://www.motorkari.cz/motobazar/motorky/honda/?..." |
manufacturer | Filter by brand (slug) | "honda", "yamaha", "ktm" |
model | Filter by model (slug from the motorkari.cz URL, e.g. "honda-cbr-600rr") | "honda-cbr-600rr" |
keywords | Search for keywords in listings | "ABS nové pneu" |
minYear / maxYear | Year range | 2018 / 2023 |
minPrice / maxPrice | Price range in CZK | 50000 / 200000 |
minMileage / maxMileage | Mileage range in km | 0 / 30000 |
Optional extras
Off by default to keep things fast. Turn on what you need:
| Setting | What it does |
|---|---|
scrapeDescription | Pull the full listing description |
scrapePhotos | Pull all gallery photo URLs |
scrapePhone | Pull the seller's phone number |
Enabling
scrapeDescriptionandscrapePhotostogether is no slower than enabling one alone — they come from the same detail page.
Other settings
| Setting | Default | What it does |
|---|---|---|
ingestMode | full | full or incremental — see section above |
maxPagesPerCrawl | 1 | Stop after this many search pages. 0 = unlimited |
maxListingsPerPage | 100 | Listings per page (40–100, step 10) |
maxItems | 0 | Cap total items. 0 = unlimited |
datasetName | (auto) | Named dataset instead of the run's default |
maxConcurrency | 10 | Pages fetched in parallel |
timeoutSecs | 600 | Max total run time in seconds |
proxyConfiguration | Apify Proxy | Proxy settings |
Examples
KTMs from 2020 and up, full mode, with descriptions:
{"ingestMode": "full","manufacturer": "ktm","minYear": 2020,"scrapeDescription": true,"maxPagesPerCrawl": 3}
Daily incremental (set up as Apify Schedule):
{"ingestMode": "incremental","maxPagesPerCrawl": 0,"scrapeDescription": true,"scrapePhotos": true}
Using a custom search URL from your browser:
{"customUrl": "https://www.motorkari.cz/motobazar/motorky/honda/?s[rok][0]=2019&s[cena][1]=200000"}
Sample output (detail stage)
{"source": "motorkari","date": "2026-02-27T10:15:44.123Z","scrapeStage": "detail","id": "2048429","url": "https://www.motorkari.cz/motobazar/motorky/husqvarna/husqvarna-fe-450/husqvarna-fe-450-2048429.html","sourceUrl": "https://www.motorkari.cz/motobazar/motorky/?pgr=1","title": "Husqvarna FE 450","brand": "husqvarna","model": "husqvarna-fe-450","year": 2020,"price": "25 000 Kč","priceNumeric": 25000,"currency": "Kč","orientacnePrice": null,"mileage": "5 000 km","mileageNumeric": 5000,"region": "Praha","seller": "Jan Novák","sellerUrl": "https://www.motorkari.cz/bazar/user/12345/","isCompany": false,"views": "123","isTop": false,"isNew": false,"thumbnail": "https://www.motorkari.cz/images/bazar/husqvarna-fe-450-2048429.jpg","photos": ["https://img.motorkari.cz/upload/images/.../1.jpg"],"photoCount": 1,"description": "Prodám motocykl v perfektním stavu...","phone": null}
Output fields reference
| Field | Description |
|---|---|
source | Always "motorkari" |
date | When this record was produced (ISO 8601) |
scrapeStage | "summary" (search-listing data only) or "detail" (full record) |
id | Listing ID on Motorkari.cz |
url | Full URL to the listing |
sourceUrl | Search results page the listing came from |
title | Listing title |
brand | Brand slug (e.g. "honda") |
model | Model slug |
year | Year of manufacture (integer) |
price | Price as displayed ("25 000 Kč") |
priceNumeric | Price as a plain number (25000) |
currency | Currency symbol ("Kč") |
orientacnePrice | Approximate price if exact not given |
mileage | Mileage as displayed ("5 000 km") |
mileageNumeric | Mileage as a plain number |
region | Czech/Slovak region |
seller | Seller's name |
sellerUrl | Link to seller's profile |
isCompany | true if seller is a business |
views | Listing view count |
isTop | Featured/TOP listing |
isNew | New-badge on the listing |
thumbnail | Main photo URL |
photos | Full gallery URLs (when scrapePhotos: true) |
photoCount | Number of photos |
description | Full listing description (when scrapeDescription: true) |
phone | Seller's phone number (when scrapePhone: true) |
💰 Pricing
This actor uses Apify's Pay-Per-Result model:
- $8 per 1,000 results scraped
- First 500 results free to try each month
- No charge if the actor fails or finds no results
- Cancel anytime — no long-term contracts
Incremental mode is much cheaper to run on a schedule — after the first day, daily runs typically return a few hundred summary records and fewer than 50 detail records.