Motorkari Scraper avatar

Motorkari Scraper

Pricing

from $8.00 / 1,000 results

Go to Apify Store
Motorkari Scraper

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

gearshift-data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

11 days ago

Last modified

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:

  1. 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.
  2. Fetch full detail pages only for listings it hasn't seen before. Known listings are skipped.
  3. 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-ids is empty → every listing is "new" → detail page is fetched for every listing, exactly like full mode.
  • 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 like description, photos, phone are null. Emitted for every listing the actor sees on the search pages.
  • detail — full record with every field populated. Emitted only for listings not in seen-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.

SettingWhat it doesExample
customUrlPaste a search URL directly from motorkari.cz — skips all other filters"https://www.motorkari.cz/motobazar/motorky/honda/?..."
manufacturerFilter by brand (slug)"honda", "yamaha", "ktm"
modelFilter by model (slug from the motorkari.cz URL, e.g. "honda-cbr-600rr")"honda-cbr-600rr"
keywordsSearch for keywords in listings"ABS nové pneu"
minYear / maxYearYear range2018 / 2023
minPrice / maxPricePrice range in CZK50000 / 200000
minMileage / maxMileageMileage range in km0 / 30000

Optional extras

Off by default to keep things fast. Turn on what you need:

SettingWhat it does
scrapeDescriptionPull the full listing description
scrapePhotosPull all gallery photo URLs
scrapePhonePull the seller's phone number

Enabling scrapeDescription and scrapePhotos together is no slower than enabling one alone — they come from the same detail page.


Other settings

SettingDefaultWhat it does
ingestModefullfull or incremental — see section above
maxPagesPerCrawl1Stop after this many search pages. 0 = unlimited
maxListingsPerPage100Listings per page (40–100, step 10)
maxItems0Cap total items. 0 = unlimited
datasetName(auto)Named dataset instead of the run's default
maxConcurrency10Pages fetched in parallel
timeoutSecs600Max total run time in seconds
proxyConfigurationApify ProxyProxy 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

FieldDescription
sourceAlways "motorkari"
dateWhen this record was produced (ISO 8601)
scrapeStage"summary" (search-listing data only) or "detail" (full record)
idListing ID on Motorkari.cz
urlFull URL to the listing
sourceUrlSearch results page the listing came from
titleListing title
brandBrand slug (e.g. "honda")
modelModel slug
yearYear of manufacture (integer)
pricePrice as displayed ("25 000 Kč")
priceNumericPrice as a plain number (25000)
currencyCurrency symbol ("Kč")
orientacnePriceApproximate price if exact not given
mileageMileage as displayed ("5 000 km")
mileageNumericMileage as a plain number
regionCzech/Slovak region
sellerSeller's name
sellerUrlLink to seller's profile
isCompanytrue if seller is a business
viewsListing view count
isTopFeatured/TOP listing
isNewNew-badge on the listing
thumbnailMain photo URL
photosFull gallery URLs (when scrapePhotos: true)
photoCountNumber of photos
descriptionFull listing description (when scrapeDescription: true)
phoneSeller'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.