
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape kleinanzeigen.de listings by URL or keyword: price, description, specifications, location with coordinates, images, seller type, views and dates. Filters for location, radius, category and price.
Scrape listings from kleinanzeigen.de, Germany's largest classifieds site, by search URL or by keyword. Every listing comes back with the full description, price, item specifications, zip code, city and coordinates, all image URLs, dates, seller type and view count. No login, no browser, and up to 100 listings per request, so runs finish in seconds.
| Field | What it does |
|---|---|
startUrls | Kleinanzeigen search, category, seller (Bestandsliste) or listing URLs. Filters inside the URL are kept. |
searchQueries | Keywords, one per line. |
maxItems | Maximum listings per run (default 20). |
category, location, radiusKm | Where to search (keyword searches). Location accepts a city, district or zip code. |
minPrice, maxPrice, sortBy | Price range in euros and sort order. |
sellerType, offerType, shipping, buyNowOnly, photosOnly | Private or commercial sellers, offered or wanted ads, shipping or pickup, buy-now, photos. |
includeListingDetails | Adds view count and seller details (on by default). |
monitoringMode | Only listings not returned by earlier runs with the same input. |
downloadImages | Also saves all photos to a key-value store. |
{
"searchQueries": ["iphone 15"],
"location": "Berlin",
"radiusKm": "20",
"maxPrice": 600,
"sellerType": "private",
"maxItems": 100
}
| Field | Description |
|---|---|
itemId, title, itemUrl | Listing ID, title and link |
price, priceAmount, priceType, originalPrice | Price as shown ("450 € VB"), number, fixed / negotiable / free, price before a reduction |
description, specifications | Full text and item attributes |
location, zipCode, city, district, state, latitude, longitude | Where the item is |
datePosted, postedAt, lastEditedAt | Dates |
categoryId, categoryName, adType, status | Category, offered / wanted, active |
seller_type, sellerId, sellerName, memberSince, sellerRating, storeName, sellerPhone | Seller (phone and imprint only for commercial sellers) |
viewCount | How often the listing was viewed |
hasShipping, shipping, shippingOptions, buyNow | Delivery options |
imageUrl, images, imageCount | Photos |
Example (sample data):
{
"itemId": 3500000001,
"title": "Apple iPhone 15 128GB Schwarz – Akku 92%",
"price": "450 € VB",
"priceAmount": 450,
"priceType": "negotiable",
"currency": "EUR",
"description": "Verkaufe mein iPhone 15 in sehr gutem Zustand. Immer mit Hülle benutzt, keine Kratzer. Originalverpackung und Ladekabel dabei.",
"location": "10587 Charlottenburg",
"zipCode": "10587",
"city": "Berlin",
"district": "Charlottenburg",
"state": "Berlin",
"latitude": 52.5163,
"longitude": 13.3141,
"datePosted": "14.10.2026",
"postedAt": "2026-10-14T18:12:40+02:00",
"itemUrl": "https://www.kleinanzeigen.de/s-anzeige/apple-iphone-15-128gb-schwarz/3500000001-173-3382",
"categoryId": "173",
"categoryName": "Smartphones",
"adType": "offered",
"status": "active",
"seller_type": "private",
"sellerName": "Max",
"memberSince": "02.03.2019",
"viewCount": 87,
"hasShipping": true,
"shipping": "Versand möglich",
"shippingOptions": ["DHL_001", "HERMES_001"],
"buyNow": false,
"imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/00/00000000-0000-0000-0000-000000000001?rule=$_59.AUTO",
"imageCount": 6,
"specifications": {
"Marke": "Apple",
"Modell": "iPhone 15",
"Speicher (GB)": "128 GB",
"Zustand": "Sehr Gut"
}
}
You pay $1.00 per 1,000 listings ($0.001 per listing) plus a small amount of platform usage (compute and proxy traffic, typically well under $0.05 per 1,000 listings with datacenter proxies). Seller details and view counts are included in the listing price.
Example: 1,000 listings with details ≈ $1.03 in total.
Is it legal to scrape Kleinanzeigen? The scraper only reads publicly visible listings. You are responsible for how you use the data, especially personal data such as seller names, under GDPR and Kleinanzeigen's terms.
Do I need a Kleinanzeigen account or my own proxies? No. No login is needed, and the built-in datacenter proxy works for most runs. If Kleinanzeigen blocks a datacenter range, the scraper switches to German residential proxies by itself.
How many listings can I get? Kleinanzeigen returns at most 10,000 listings per search. For more, split the search by category, location or price range; the scraper tells you in the status message when a search hits that ceiling.
Why is a field empty?
Sellers fill in different fields. Phone and imprint are only shown for commercial sellers, originalPrice only exists after a price reduction, and specifications depend on the category.
Can I schedule it or use it from code? Yes. Schedule it with monitoring mode on to get only new listings each time, and use the API or integrations to send results to your own systems.
Do website filter URLs work?
Yes. Price, radius, seller type, offer type, shipping, sorting and category attribute filters inside the URL (for example /s-autos/preis:1000:5000/c216+autos.marke_s:bmw) are kept.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalKleinanzeigen URLs
Search result, category, seller (Bestandsliste) or single listing URLs from kleinanzeigen.de. Filters already in the URL (price, radius, seller type, attributes) are kept. Pages are followed automatically.
searchQueriesarrayOptionalSearch keywords
One keyword per line, e.g. 'iphone 15', 'ebike', '3 zimmer wohnung'. The filters below apply to these keyword searches.
maxItemsintegerOptionaldefault 20Max listings
Maximum number of listings saved in this run, across all URLs and keywords. Kleinanzeigen returns up to 10,000 listings per search.
Applied to the search keywords above. URLs keep the filters they already contain.
categoryenumOptionaldefault ""Category
Limit keyword searches to one category or subcategory.
locationstringOptionalLocation
City, district or 5-digit zip code, e.g. 'Berlin', 'München', 'Hamburg-Altona', '10115'. Leave empty for all of Germany.
radiusKmenumOptionaldefault ""Radius (km)
Distance around the location. Ignored without a location.
minPriceintegerOptionalMin price (EUR)
Lowest price in euros.
maxPriceintegerOptionalMax price (EUR)
Highest price in euros.
sortByenumOptionaldefault "newest"Sort by
Order in which listings are collected.
sellerTypeenumOptionaldefault "all"Seller type
Private or commercial sellers.
offerTypeenumOptionaldefault "all"Offer type
Items for sale or wanted ads.
shippingenumOptionaldefault "all"Shipping
Whether the seller ships the item.
buyNowOnlybooleanOptionaldefault falseBuy-now listings only
Only listings with the 'Direkt kaufen' option.
photosOnlybooleanOptionaldefault falseListings with photos only
Skip listings without a picture. Applies to keywords and URLs.
includeListingDetailsbooleanOptionaldefault trueInclude seller details and view count
Adds the view count and seller details (seller name, member since, rating; phone and imprint for commercial sellers). Costs one or two extra requests per listing. Description, specifications, images, coordinates and dates are always included.
monitoringModebooleanOptionaldefault falseOnly new listings (monitoring)
Skip listings that earlier runs with the same URLs, keywords and filters already returned. Useful for scheduled runs.
downloadImagesbooleanOptionaldefault falseDownload images
Also save every listing photo as a JPEG in a key-value store (named below). Image URLs are always in the results.
storeNamestringOptionaldefault "kleinanzeigen-images"Image store name
Key-value store for downloaded images. Only used when 'Download images' is on.
maxConcurrencyintegerOptionaldefault 24Max concurrency
Requests in flight at once. Lower it if you see many retries.
maxRequestRetriesintegerOptionaldefault 4Max retries per request
Retries per request, each on a fresh proxy session.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for most runs. The scraper switches to German residential proxies on its own if Kleinanzeigen blocks the datacenter range.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| itemId | integer | null | Listing ID |
| title | string | null | Listing title |
| price | string | null | Price as shown on the site |
| priceAmount | number | null | Price in euros |
| priceType | string | null | fixed, negotiable or free |
| currency | string | null | Currency |
| originalPrice | number | null | Price before a reduction, if any |
| description | string | null | Full listing description |
| metaDescription | string | null | Short description (160 chars) |
| location | string | null | Location as shown on the site |
| zipCode | string | null | Zip code |
| city | string | null | City |
| district | string | null | District |
| state | string | null | Federal state |
| latitude | number | null | Latitude |
| longitude | number | null | Longitude |
| datePosted | string | null | Date posted (DD.MM.YYYY) |
| postedAt | string | null | Posted at (ISO 8601) |
| lastEditedAt | string | null | Last edited at (ISO 8601) |
| itemUrl | string | null | Listing URL |
| categoryId | string | null | Category ID |
| categoryName | string | null | Category name |
| adType | string | null | offered or wanted |
| status | string | null | Listing status |
| seller_type | string | null | private or commercial |
| sellerId | string | null | Seller user ID |
| sellerName | string | null | Seller display name (details) |
| memberSince | string | null | Seller member since (details) |
| sellerRating | number | null | Seller rating (details) |
| sellerPhone | string | null | Phone of commercial sellers (details) |
| storeName | string | null | Shop name of commercial sellers |
| viewCount | integer | null | Listing views (details) |
| hasShipping | boolean | null | Shipping available |
| shipping | string | null | Shipping label |
| shippingOptions | array | Shipping options |
| buyNow | boolean | null | Buy-now available |
| imageUrl | string | null | Main image URL |
| metaImageUrl | string | null | Preview image URL |
| imageCount | integer | null | Number of images |
| images | array | All image URLs |
| specifications | object | Item attributes (brand, model, mileage, rooms...) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Listing | One Kleinanzeigen listing saved to the dataset. | $0.001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/kleinanzeigen-scraper').call({
"startUrls": [
{
"url": "https://www.kleinanzeigen.de/s-aachen/iphone/k0l1921"
}
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/kleinanzeigen-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/kleinanzeigen-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Ads from a Kleinanzeigen category URL with listing details.
Keyword search within 20 km of Berlin with listing details.
Keyword search within 10 km of Munich sorted by price.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.