
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user
Scrape classified listings from OLX in seven countries: Poland (olx.pl), Ukraine (olx.ua), Romania (olx.ro), Bulgaria (olx.bg), Portugal (olx.pt), Kazakhstan (olx.kz) and Uzbekistan (olx.uz). Search by keyword and location, or paste any OLX search, category or offer URL, and get clean rows with price, every item parameter, description, photos, location, seller details and promotion flags. No login, no browser, hundreds of listings in seconds.
| Field | Description |
|---|---|
startUrls | OLX search, category or offer URLs from any supported site |
searchQueries | Keywords, one search each |
maxItems | Maximum listings per search (0 = no limit) |
domain | Site for keyword searches: olx.pl, olx.ua, olx.ro, olx.bg, olx.pt, olx.kz, olx.uz |
location | City or region for keyword searches, e.g. "Kraków", "Київ", "Lisboa" |
categoryId | Optional OLX category id for keyword searches |
priceMin, priceMax | Price range in the site's currency |
sellerType | all, private or business |
sortBy | relevance, newest, priceLowToHigh, priceHighToLow |
withPhotosOnly | Skip listings without photos |
{
"searchQueries": ["iphone 13"],
"domain": "olx.pl",
"location": "Warszawa",
"priceMax": 2000,
"sortBy": "newest",
"maxItems": 100
}
| Field | Description |
|---|---|
id, url, title | Offer id, link and title |
price, currency, priceLabel, priceType, negotiable, previousPrice | Price data (priceType is price, arranged, free or exchange) |
condition, params, paramsMap | Item condition and every parameter the seller filled in |
description | Full description as plain text |
categoryId, categoryType | OLX category |
city, district, region, latitude, longitude | Location (the map point is approximate, as on the site) |
sellerId, sellerName, sellerType, sellerCompanyName, sellerSince, sellerLastSeen, sellerLogo, shopUrl | Seller |
hasPhone, hasChat, deliveryAvailable | Contact options and OLX delivery |
isPromoted, isHighlighted, isUrgent, promotionOptions | Promotion flags |
mainImage, photos, photoCount | Photos (up to 1280 px) |
createdAt, refreshedAt, pushedUpAt, validTo, status | Dates and status |
domain, searchQuery, searchUrl | Where the row came from |
Example (trimmed; the seller is fictional):
{
"id": 1102592858,
"url": "https://www.olx.pl/d/oferta/iphone-13-midnight-128gb-stan-idealny-brak-rys-oryginal-bateria-100-CID99-ID1cCmLM.html",
"title": "iPhone 13 Midnight 128GB, stan idealny, brak rys, oryginał, bateria 100%",
"price": 850,
"currency": "PLN",
"priceLabel": "850 zł",
"priceType": "price",
"negotiable": false,
"previousPrice": null,
"convertedPrice": null,
"convertedCurrency": null,
"condition": "Używane",
"description": "iPhone 13 Midnight 128GB w stanie idealnym. \n\nWyglada jak właśnie wyjęty z pudełka - bez rys i otarć. \n\nNa ekranie folia ochronna od nowości. \n\nKondyc...",
"params": [
{
"key": "state",
"name": "Stan",
"value": "Używane",
"valueKey": "used"
},
{
"key": "phonemodel",
"name": "Model telefonu",
"value": "iPhone 13",
"valueKey": "iphone-13"
},
{
"key": "builtinmemory_phones",
"name": "Wbudowana pamięć",
"value": "128GB",
"valueKey": "128gb"
}
],
"paramsMap": {
"Stan": "Używane",
"Model telefonu": "iPhone 13",
"Wbudowana pamięć": "128GB",
"Kolor": "Czarny",
"Opcje SIM": "Dual SIM (SIM + eSIM)",
"Funkcje": "Rozpoznawanie twarzy, Szybkie ładowanie, Hot-Spot, Płatność NFC, Ładowanie indukcyjne"
},
"categoryId": 2298,
"categoryType": "electronics",
"city": "Warszawa",
"district": "Praga-Północ",
"region": "Mazowieckie",
"latitude": 52.25786,
"longitude": 21.03784,
"locationRadiusKm": 7,
"sellerId": 100000001,
"sellerName": "Marek",
"sellerType": "private",
"sellerCompanyName": null,
"sellerSince": "2019-11-29T19:46:44+01:00",
"sellerLastSeen": "2026-10-14T07:43:47+02:00",
"sellerIsOnline": false,
"sellerLogo": null,
"sellerPhoto": null,
"shopUrl": null,
"hasPhone": true,
"hasChat": true,
"deliveryAvailable": false,
"isPromoted": true,
"isHighlighted": false,
"isUrgent": false,
"promotionOptions": [
"promoted_ad_7"
],
"mainImage": "https://ireland.apollo.olxcdn.com:443/v1/files/oyx0zdtddsr11-PL/image;s=1000x750",
"photoCount": 8,
"photos": [
"https://ireland.apollo.olxcdn.com:443/v1/files/oyx0zdtddsr11-PL/image;s=1000x750",
"https://ireland.apollo.olxcdn.com:443/v1/files/wl60lfoe4her2-PL/image;s=1000x750"
],
"createdAt": "2026-10-04T11:57:11+02:00",
"refreshedAt": "2026-10-14T09:47:47+02:00",
"pushedUpAt": "2026-10-14T09:47:47+02:00",
"validTo": "2026-11-03T10:57:11+01:00",
"status": "active",
"offerType": "offer",
"domain": "olx.pl",
"searchQuery": "iphone 13",
"searchUrl": null,
"scrapedAt": "2026-10-15T23:05:53.507Z"
}
You pay $3.50 per 1,000 listings ($0.0035 per listing) plus a small amount of platform usage (compute and datacenter traffic): a 1,400-listing keyword run used $0.003 in our tests, and each pasted search URL adds about half a cent for loading the page once. So 1,000 listings ≈ $3.50–3.51. You only pay for listings saved to the dataset; "not found" rows are free.
Is it legal to scrape OLX? The actor reads only public listing data that anyone can see without an account. Make sure your use of the data, especially personal data such as seller names, complies with GDPR and local law.
Do I need an account or a proxy? No login is needed. The default datacenter proxy works well; residential proxies are pinned to the site's country if you choose them.
How many listings can I get? OLX returns at most 1,000 results per search. For bigger searches the actor splits the search into price bands and keeps going, so you can collect many thousands. Listings without a price (free, exchange) only appear in the first 1,000.
Why do I get results for a keyword that matches nothing? When nothing matches exactly, OLX itself shows loosely related listings instead of an empty page, and the API returns the same. Check title or add a category or price filter to narrow it.
Why is the phone number missing? OLX shows phone numbers only to logged-in users, and this actor never logs in. hasPhone tells you whether the seller added one.
Does it support OLX Brazil, India or Indonesia? No. Those sites run on different platforms. This actor covers the seven European and Central Asian OLX sites listed above.
Can I schedule it or use the API? Yes. Schedule runs in the console, or start runs and read datasets through the REST API.
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.
startUrlsarrayOptionalStart URLs
OLX search or category pages (any filters you set on the site are kept) or offer pages, from olx.pl, olx.ua, olx.ro, olx.bg, olx.pt, olx.kz or olx.uz. Filters below are added on top of a URL's own filters.
searchQueriesarrayOptionalSearch queries
Keywords to search on the site chosen in Country site, e.g. 'iphone 13', 'rower', 'mieszkanie'. Each keyword is one search.
maxItemsintegerOptionaldefault 20Max listings per search
Maximum listings to save for each start URL search and each keyword. Offer URLs are always saved. 0 means no limit. Searches with more than 1,000 results are split into price bands automatically.
domainenumOptionaldefault "olx.pl"Country site
Site used for Search queries. Start URLs always use their own site.
locationstringOptionalLocation
City or region for Search queries, e.g. 'Kraków', 'Київ', 'Lisboa', 'București'. Local spelling works best.
categoryIdintegerOptionalCategory ID
Optional OLX category id for Search queries (for example 99 = Electronics on olx.pl). Easier: open the category on the site and paste its URL into Start URLs.
priceMinintegerOptionalMin price
In the site's currency.
priceMaxintegerOptionalMax price
In the site's currency.
sellerTypeenumOptionaldefault "all"Seller type
Private persons or businesses only.
sortByenumOptionaldefault "relevance"Sort by
Order of search results.
withPhotosOnlybooleanOptionaldefault falseOnly listings with photos
Skip listings without photos.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter proxies work well for OLX. Residential proxies are pinned to the site's country unless you pick one.
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 |
|---|---|---|
| id | number | null | |
| price | number | null | |
| previousPrice | number | null | |
| convertedPrice | number | null | |
| categoryId | number | null | |
| latitude | number | null | |
| longitude | number | null | |
| locationRadiusKm | number | null | |
| sellerId | number | null | |
| photoCount | number | null | |
| negotiable | boolean | null | |
| sellerIsOnline | boolean | null | |
| hasPhone | boolean | null | |
| hasChat | boolean | null | |
| deliveryAvailable | boolean | null | |
| isPromoted | boolean | null | |
| isHighlighted | boolean | null | |
| isUrgent | boolean | null | |
| params | array | null | |
| promotionOptions | array | null | |
| photos | array | null | |
| paramsMap | object | null | |
| url | string | null | |
| title | string | null | |
| currency | string | null | |
| priceLabel | string | null | |
| priceType | string | null | |
| convertedCurrency | string | null | |
| condition | string | null | |
| description | string | null | |
| categoryType | string | null | |
| city | string | null | |
| district | string | null | |
| region | string | null | |
| sellerName | string | null | |
| sellerType | string | null | |
| sellerCompanyName | string | null | |
| sellerSince | string | null | |
| sellerLastSeen | string | null | |
| sellerLogo | string | null | |
| sellerPhoto | string | null | |
| shopUrl | string | null | |
| mainImage | string | null | |
| createdAt | string | null | |
| refreshedAt | string | null | |
| pushedUpAt | string | null | |
| validTo | string | null | |
| status | string | null | |
| offerType | string | null | |
| domain | string | null | |
| searchQuery | string | null | |
| searchUrl | string | null | |
| scrapedAt | string | null | |
| error | string | null |
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 OLX listing saved. Not-found or failed offers are free. | $0.0035 |
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/olx-scraper').call({
"startUrls": [
{
"url": "https://www.olx.pl/elektronika/telefony/q-iphone-13/"
}
],
"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/olx-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/olx-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.
200 to 2,000 PLN with photos, cheapest first.
Business seller ads from an OLX Ukraine search URL, newest first.
Ads from an OLX Romania search URL, highest price first.
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.