Motoinzerce Scraper
Pricing
from $5.00 / 1,000 results
Motoinzerce Scraper
Under maintenanceScrape 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
Actor stats
0
Bookmarked
2
Total users
0
Monthly active users
11 days ago
Last modified
Categories
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:
- 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.
- Fetch full detail pages only for listings it hasn't seen before. Known listings are skipped entirely (no detail fetch, no OCR).
- 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-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.
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) arenull. Emitted for every listing on the search pages.detail— full record with every field populated. Emitted only for listings not inseen-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.
| Setting | What it does | Example |
|---|---|---|
customUrl | Paste 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/" |
keywords | Search by keyword in listing titles | "honda cbr" |
minYear / maxYear | Year range | 2018 / 2023 |
minPrice / maxPrice | Price range in CZK | 50000 / 200000 |
minMileage / maxMileage | Mileage range in km | 0 / 30000 |
minEngineCcm / maxEngineCcm | Engine displacement in cc | 600 / 1200 |
sorting | Sort order | "cenaa" (cheapest first), "cenad" (most expensive first), "datud" (newest first) |
listingsPerPage | How many listings per page | 10, 20, 30, 50, or 100 |
skipTipmoto | Skip promoted ads from tipmoto.com that appear in the results | true |
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:
- Go to motoinzerce.cz/hledat.php
- Select your manufacturer, model, and any other filters from the dropdowns
- Click Hledat (Search)
- Copy the full URL from your browser's address bar
- Paste it into the
customUrlfield
{"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
| Field | What it is |
|---|---|
source | Always "motoinzerce" |
scrapeStage | "summary" (search-listing data only) or "detail" (full record) |
date | When this record was produced |
id | The listing's unique ID on motoinzerce.cz |
url | Link to the listing |
sourceUrl | The search results page it came from |
title | Listing title (brand + model) |
price | Price as shown on the site (e.g. "85 000 Kč") |
priceNumeric | Price as a plain number (85000) |
year | Year of manufacture |
mileage | How far the bike has been driven (e.g. "15 000 km") |
mileageNumeric | Mileage as a plain number (15000) |
engineCcm | Engine size in cc |
powerKw | Engine power in kW |
type | Motorcycle type (e.g. "Enduro", "Nakedbike") |
model | Model name from the category tree |
condition | New or used |
region | Czech region (kraj) |
city | City |
stkValidity | Technical inspection (STK) validity |
serviceBook | Whether a service book is present |
origin | Country of origin |
photos | List of all full-size photo URLs |
photoCount | How many photos there are |
description | Full listing description text |
phone | Seller'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. |
phoneImage | Direct link to the phone image on Apify storage (when scrapePhone: true) |
email | Seller's email as plain text — populated only if ocrContacts: true. null otherwise. |
emailImage | Direct link to the email image on Apify storage (when scrapeEmail: true) |
postedDate | Date 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/scrapeEmailgive you the PNG image URL.ocrContactsadditionally runs on-device OCR and fills in the plain-textphone/
Optional extras
These are turned off by default to keep things fast. Turn on what you need:
| Setting | Default | What it does |
|---|---|---|
scrapePhotos | true | Collect all full-size photo URLs |
scrapeDescription | true | Collect the full listing description |
scrapePhone | false | Collect the seller's phone number (as an image) |
scrapeEmail | false | Collect the seller's email address (as an image) |
ocrContacts | false | Run 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
| Option | Extra work per listing | Practical impact |
|---|---|---|
scrapePhone / scrapeEmail | +1 HTTP request each, tiny image stored in the Key-Value store | Modest — 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
| Setting | Default | What it does |
|---|---|---|
maxPagesPerCrawl | 10 | Stop 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:
| Setting | Default | What it does |
|---|---|---|
maxConcurrency | 10 | How many listings to fetch at the same time |
timeoutSecs | 120 | How long to wait for a page before giving up |
maxRequestRetries | 3 | How many times to retry a failed page |
proxyConfiguration | (none) | Use a proxy (useful if you're getting blocked) |
debugLog | false | Show 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.