Motoinzerce Scraper avatar

Motoinzerce Scraper

Under maintenance

Pricing

from $5.00 / 1,000 results

Go to Apify Store
Motoinzerce Scraper

Motoinzerce Scraper

Under maintenance

Scrape motorcycle listings from MotoInzerce.cz with engine size filtering. Extract full details: price, specs, photos, seller descriptions, phone/email. Ideal for market analysis, lead generation, and price monitoring of Czech motorcycle inventory.

Pricing

from $5.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

MotoInzerce.cz Scraper

Pulls motorcycle listings from motoinzerce.cz and saves them as structured data you can open in Excel, Google Sheets, or feed into any other tool.

No coding knowledge needed to use it — just set your filters and hit run.


What you get

Each result is one motorcycle listing with:

  • Price (text and number separately)
  • Year, mileage, engine size, power
  • Condition, type, model, region, city
  • Technical inspection and service book info
  • Photos (full gallery)
  • Full description
  • Phone and email (optional — off by default, served as images)

Quick start

Scrape all listings — no config needed, starts from /vypisy/ automatically:

{
"maxPagesPerCrawl": 2
}

Search by manufacturer or model — use the keywords field to filter by title:

{
"keywords": "yamaha mt-07",
"maxPagesPerCrawl": 5
}

Precise filtering (manufacturer dropdown, category, region, etc.) — set up your search on motoinzerce.cz, copy the URL from your browser, and paste it in:

{
"customUrl": "https://www.motoinzerce.cz/hledat.php?moto=1&prodej=prodej&razeni=cenaa&vyrobce=5&model=42"
}

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 (plus, if enabled, contact OCR) for every listing. Use this when you need a one-off complete dataset — exports, brand analysis, market snapshots.

{ "ingestMode": "full", "keywords": "yamaha" }

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:

  1. Push a summary record for every listing found in the search results — title, year, region, price, url. 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 entirely (no detail fetch, no OCR).
  3. Stop paginating when two consecutive search pages contain only known listings. Avoids re-crawling the entire archive on scheduled runs.
{ "ingestMode": "incremental", "maxPagesPerCrawl": 0, "scrapePhotos": false, "scrapeDescription": false }

Because the per-detail cost here is higher (OCR, tesseract workers, rate-limit-sensitive AJAX contact endpoint), incremental mode is a big win on daily schedules — after day one you only fetch a handful of detail pages per run.

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.

Dataset records in incremental mode

Every record carries a scrapeStage field:

  • summary — lightweight record from the search-listing row (title, year, region, price, url, id). Detail-only fields (description, photos, specs, contacts) are null. Emitted for every listing on the search pages.
  • detail — full record with every field populated. Emitted only for listings not in seen-ids.

Consumers should treat null on summary records as "not available this run, don't overwrite". Price, title, year, region are present on both.

Running incremental on a schedule

Set up an Apify Schedule targeting this actor with:

{ "ingestMode": "incremental", "maxPagesPerCrawl": 0, "maxItems": 0, "scrapePhotos": true, "scrapeDescription": true }

Day-one run is the heaviest (full bootstrap). Subsequent runs scan the top few pages, detail-fetch ~2-5% of listings, and stop once they hit known territory.


Filters

Use these to narrow down what gets scraped. All filters are optional — leave out anything you don't need.

SettingWhat it doesExample
customUrlPaste a URL directly from motoinzerce.cz (skips all other filters). Use /vypisy/ for all listings or a hledat.php URL for pre-filtered results."https://www.motoinzerce.cz/vypisy/"
keywordsSearch by keyword in listing titles"honda cbr"
minYear / maxYearYear range2018 / 2023
minPrice / maxPricePrice range in CZK50000 / 200000
minMileage / maxMileageMileage range in km0 / 30000
minEngineCcm / maxEngineCcmEngine displacement in cc600 / 1200
sortingSort order"cenaa" (cheapest first), "cenad" (most expensive first), "datud" (newest first)
listingsPerPageHow many listings per page10, 20, 30, 50, or 100
skipTipmotoSkip promoted ads from tipmoto.com that appear in the resultstrue

Searching by manufacturer, model, or category

The Actor's filter fields cover the most common numeric ranges (price, year, mileage, engine). For everything else — manufacturer, model, category (enduro, naked, sport…), condition, or region — the website uses internal dropdown IDs that can't be typed in directly. There are two ways to handle this:

Option 1 — Keywords (quickest)

The keywords field searches listing titles. Since most titles include the manufacturer and model name, this works well for targeted searches:

{ "keywords": "honda cb 500", "maxPagesPerCrawl": 5 }
{ "keywords": "kawasaki z900", "minYear": 2020, "maxPrice": 200000 }

Tip: shorter terms match more listings ("yamaha" catches all Yamaha models, "yamaha mt" narrows it down).

Option 2 — Custom URL (most precise)

For exact manufacturer/model/category filtering, use the website itself to build the search:

  1. Go to motoinzerce.cz/hledat.php
  2. Select your manufacturer, model, and any other filters from the dropdowns
  3. Click Hledat (Search)
  4. Copy the full URL from your browser's address bar
  5. Paste it into the customUrl field
{
"customUrl": "https://www.motoinzerce.cz/hledat.php?moto=1&prodej=prodej&razeni=cenaa&vyrobce=5&model=42",
"maxPagesPerCrawl": 10,
"listingsPerPage": 50
}

All other filter fields are ignored when customUrl is set — the URL already contains everything.


What each result looks like

FieldWhat it is
sourceAlways "motoinzerce"
scrapeStage"summary" (search-listing data only) or "detail" (full record)
dateWhen this record was produced
idThe listing's unique ID on motoinzerce.cz
urlLink to the listing
sourceUrlThe search results page it came from
titleListing title (brand + model)
pricePrice as shown on the site (e.g. "85 000 Kč")
priceNumericPrice as a plain number (85000)
yearYear of manufacture
mileageHow far the bike has been driven (e.g. "15 000 km")
mileageNumericMileage as a plain number (15000)
engineCcmEngine size in cc
powerKwEngine power in kW
typeMotorcycle type (e.g. "Enduro", "Nakedbike")
modelModel name from the category tree
conditionNew or used
regionCzech region (kraj)
cityCity
stkValidityTechnical inspection (STK) validity
serviceBookWhether a service book is present
originCountry of origin
photosList of all full-size photo URLs
photoCountHow many photos there are
descriptionFull listing description text
phoneSeller's phone as plain text — populated only if ocrContacts: true (or when the listing exposes the phone in plain HTML, e.g. some tipmoto.com dealers). null otherwise.
phoneImageDirect link to the phone image on Apify storage (when scrapePhone: true)
emailSeller's email as plain text — populated only if ocrContacts: true. null otherwise.
emailImageDirect link to the email image on Apify storage (when scrapeEmail: true)
postedDateDate the listing was posted (private listings only)

Note on phone & email: motoinzerce.cz protects contact details by showing them as images instead of plain text. scrapePhone / scrapeEmail give you the PNG image URL. ocrContacts additionally runs on-device OCR and fills in the plain-text phone / email fields. See the ⚠️ section above for privacy, cost, and proxy considerations before enabling these.


Optional extras

These are turned off by default to keep things fast. Turn on what you need:

SettingDefaultWhat it does
scrapePhotostrueCollect all full-size photo URLs
scrapeDescriptiontrueCollect the full listing description
scrapePhonefalseCollect the seller's phone number (as an image)
scrapeEmailfalseCollect the seller's email address (as an image)
ocrContactsfalseRun on-device OCR on the phone/email images and also populate the plain-text phone and email fields

⚠️ Phone, email, and OCR — responsibilities, costs, and proxy

scrapePhone, scrapeEmail, and ocrContacts are all off by default on purpose. Before turning them on, please read this section.

Privacy / GDPR — your responsibility, not ours

Phone numbers and email addresses are personal data. The moment you extract them you become the data controller under the EU GDPR (and equivalent laws in the UK, Switzerland, Czechia, etc.). That means:

  • You must have a lawful basis to process the data (legitimate interest, consent, …).
  • You must honor data-subject rights (access, deletion, objection).
  • You must not use the data for spam, cold-outreach at scale, profiling, or resale without a basis.
  • Sellers published their contact on motoinzerce.cz to be contacted about a specific bike they listed. Repurposing that for anything else is almost always a GDPR problem.

The operator of this Actor is not your data controller and does not assume any of these obligations. If you run the Actor with contact extraction enabled, the responsibility is entirely yours.

Cost impact — expect noticeably slower runs

OptionExtra work per listingPractical impact
scrapePhone / scrapeEmail+1 HTTP request each, tiny image stored in the Key-Value storeModest — a bit slower, a little extra storage
ocrContacts+200–600 ms of CPU per image (tesseract.js on-device OCR)Significant — a run with both contacts OCR'd can take ~1 s extra per listing, plus a ~1–2 s one-time worker warm-up and ~10 MB language-data download at the start of the run. Recommended Actor memory: ≥ 1024 MB.

Only enable ocrContacts when you actually need the plain-text value. If you just want to display the contact to a human, the image URL is cheaper and avoids most of the privacy risk.

Proxy — effectively required for contact extraction

motoinzerce.cz's contact endpoint (/inzerat_zobrazeni.php) is aggressively rate-limited by IP. Without a residential proxy you will hit a block image ("Nedovolené volání — příliš mnoho, blokace…") after only a handful of requests, and every further listing will come back empty. The Actor detects this and logs a warning, but it can't work around a blocked IP on its own.

Recommended for any run with scrapePhone / scrapeEmail / ocrContacts:

{
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Limiting how much to scrape

SettingDefaultWhat it does
maxPagesPerCrawl10Stop after this many search result pages. Set to 0 for unlimited.
datasetName(auto)Save results to a named dataset (useful if running multiple times)

Advanced settings

You generally don't need to touch these, but they're there if you do:

SettingDefaultWhat it does
maxConcurrency10How many listings to fetch at the same time
timeoutSecs120How long to wait for a page before giving up
maxRequestRetries3How many times to retry a failed page
proxyConfiguration(none)Use a proxy (useful if you're getting blocked)
debugLogfalseShow detailed logs for troubleshooting

Example: Find Honda bikes under 150 000 Kč from 2018+

Uses keywords to search by manufacturer name in listing titles:

{
"keywords": "honda",
"minYear": 2018,
"maxPrice": 150000,
"sorting": "cenad",
"maxPagesPerCrawl": 5
}

Example: Scrape all listings (default)

No configuration needed — the scraper starts from /vypisy/ automatically:

{
"maxPagesPerCrawl": 5,
"listingsPerPage": 50
}

Example: Scrape using a custom search URL

Set up your search on motoinzerce.cz (use the manufacturer/model/category dropdowns), then copy the URL from your browser and paste it here:

{
"customUrl": "https://www.motoinzerce.cz/hledat.php?moto=1&prodej=prodej&razeni=cenaa&vyrobce=5&model=42",
"listingsPerPage": 50,
"maxPagesPerCrawl": 10
}

Example: Skip promoted tipmoto.com ads

motoinzerce.cz shows some promoted ads from tipmoto.com mixed in with the results. You can filter those out:

{
"skipTipmoto": true,
"maxPagesPerCrawl": 3
}

Sample output

{
"source": "motoinzerce",
"scrapeStage": "detail",
"date": "2026-02-27T10:15:00.000Z",
"id": "654321",
"url": "https://www.motoinzerce.cz/motorky/yamaha/654321-yamaha-mt-07.html",
"sourceUrl": "https://www.motoinzerce.cz/hledat.php?...",
"title": "Yamaha MT-07",
"price": "119 000 Kč",
"priceNumeric": 119000,
"year": 2021,
"mileage": "8 500 km",
"mileageNumeric": 8500,
"engineCcm": 689,
"powerKw": 54,
"type": "Nakedbike",
"model": "MT-07",
"condition": "UsedCondition",
"region": "Středočeský",
"city": "Praha",
"stkValidity": "Ano / Ano do 03/2027",
"serviceBook": "Ano",
"origin": "Japonsko",
"photos": [
"https://www.motoinzerce.cz/foto/654321-yamaha-mt-07-1.jpg",
"https://www.motoinzerce.cz/foto/654321-yamaha-mt-07-2.jpg"
],
"photoCount": 2,
"description": "Motocykl v perfektním stavu, servisní kniha, garážován...",
"phone": null,
"phoneImage": null,
"email": null,
"emailImage": null,
"postedDate": null
}

💰 Pricing

This actor uses Apify's Pay-Per-Result model:

  • $5 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

This pricing reflects the cost to run the actor on Apify's cloud platform. The more results you scrape, the more you pay — but there are no hidden fees or setup costs.