# Bazaraki.com Scraper - Cyprus Classifieds Data Extractor (`studio-amba/bazaraki-scraper`) Actor

Scrape classified ads from Bazaraki.com, Cyprus's largest general classifieds portal. Extract titles, prices, categories, locations, images, and descriptions across real estate, cars, electronics, jobs, and more. No login needed.

- **URL**: https://apify.com/studio-amba/bazaraki-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bazaraki Scraper

Extract classified ads from [Bazaraki.com](https://www.bazaraki.com), Cyprus's largest general classifieds portal. This actor pulls titles, prices, categories, locations, seller details, photos, and full descriptions across real estate, cars, electronics, jobs, and every other category on the site.

### Why use this actor?

Bazaraki is Cyprus's dominant classifieds marketplace — the equivalent of OLX or Craigslist for the Cypriot market, covering everything from apartment rentals to used cars to job listings. That makes it useful for rental/sale price benchmarking, market research on any Cyprus vertical, lead generation, and academic or journalistic research on the Cypriot economy.

Use cases include real estate market analysis (Cyprus has no single dominant property portal the way other EU countries do — Bazaraki is where the volume is), used-car pricing research, competitor price tracking for Cyprus-based sellers, and feeding a search/alert tool with fresh Cyprus classifieds.

### How to scrape Bazaraki.com data

1. Go to the actor's page on the Apify Store
2. Pick a category (defaults to apartment rentals) — Bazaraki's own category URL path, e.g. `real-estate-to-rent/apartments-flats`, `real-estate-for-sale`, `motors-transport/cars`
3. Or use a keyword search across the whole site, or paste direct category/listing URLs into Start URLs
4. Set Max Results — the actor paginates automatically until it's reached
5. Click "Start" to run the scraper
6. Download results as JSON, CSV, or Excel when complete

The actor fetches pages through Bright Data's Web Unlocker to get past Bazaraki's Cloudflare block, then extracts data from the site's own embedded Next.js React Server Component payload — the same structured object the site's frontend renders from, not a fragile CSS scrape. Full descriptions are pulled from each listing's schema.org Product/Offer JSON-LD on the detail page.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `category` | String | No | Category URL path, e.g. `real-estate-to-rent/apartments-flats` (default), `real-estate-for-sale`, `motors-transport/cars` |
| `searchQuery` | String | No | Keyword to search across the whole site, e.g. `iphone`, `toyota corolla`. Only used when Category is empty |
| `startUrls` | Array | No | Bazaraki.com search, category, or listing detail URLs. Overrides Category/Search Keyword |
| `maxResults` | Integer | No | Maximum ads to return. Category/search pages return 60 ads each; the actor paginates automatically |
| `fetchDescriptions` | Boolean | No | Fetch each ad's detail page for the full description text (default: on, adds one request per ad) |
| `brightDataApiKey` | String | No | Your own Bright Data API key for the Web Unlocker zone. Leave empty to use the built-in unlocking service |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `adId` | String | `"6599819"` |
| `adTitle` | String | `"3-bedroom apartment to rent"` |
| `price` | Number | `1950` |
| `currency` | String | `"EUR"` |
| `category` | String | `"Real Estate to rent / Apartments Flats"` |
| `location` | String | `"Limassol — Limassol - Agios Georgios"` |
| `imageUrl` | String | Primary listing photo URL |
| `imageUrls` | Array | All listing photo URLs |
| `adDescription` | String | Full listing description text |
| `sellerName` | String | `"Moving Doors"` |
| `isBusinessSeller` | Boolean | `true` |
| `published` | String | `"5 days ago"` (relative, as shown on the site) |
| `url` | String | Full Bazaraki.com listing URL |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "adId": "6599819",
    "adTitle": "3-bedroom apartment to rent",
    "price": 1950,
    "currency": "EUR",
    "category": "Real Estate to rent / Apartments Flats",
    "location": "Limassol — Limassol - Agios Georgios",
    "imageUrl": "https://cdn1.bazaraki.com/media/cache1/fd/47/fd472d4d0068ac5f0ee6706c4cfccc99.webp",
    "adDescription": "Room for the whole group, right in the heart of Limassol...",
    "sellerName": "Moving Doors",
    "isBusinessSeller": true,
    "published": "5 days ago",
    "url": "https://www.bazaraki.com/adv/6599819_3-bedroom-apartment-to-rent/",
    "scrapedAt": "2026-08-30T09:26:13.818Z"
}
```

### Cost estimate

This actor fetches one Bright Data Web Unlocker request per category/search page, plus (with `fetchDescriptions` on, the default) one extra request per ad for the full description. Approximate costs:

- **~60 results, descriptions off (1 category page)**: $0.02-0.05 in platform credits
- **~60 results, descriptions on (default)**: $0.06-0.12 in platform credits
- **~600 results, descriptions on (10 pages)**: $0.60-1.20 in platform credits

Actual usage cost only settles once the run reports SUCCEEDED — reading the dataset from a still-running run will undercount what you'll actually be charged.

### Tips for best results

- **Start small** — test with `maxResults: 20` before running large scrapes.
- **Turn off `fetchDescriptions` for speed and cost** — search-page data already includes title, price, location, category, seller, and a full image gallery; only the description text requires a detail-page fetch.
- **Category browsing is more reliable than keyword search** — category pages are Bazaraki's own primary navigation; site-wide keyword search can return broader/noisier matches across unrelated categories.
- **Direct listing URLs get you a single known ad** — paste a `/adv/{id}_{slug}/` URL into Start URLs.

### Limitations

- Bazaraki.com fronts every page with a genuine Cloudflare block, confirmed even on plain curl requests to `/robots.txt`. This actor routes requests through Bright Data's Web Unlocker to get past it.
- Prices are shown as posted by sellers and are not verified or negotiated — Cyprus classifieds commonly include "negotiable" or bundled-utility pricing in the description text.
- The actor scrapes the public website. No login or authentication is used.

### Related scrapers

- [Skelbiu.lt Scraper](https://apify.com/itsnotyouitsme/skelbiu-scraper) — Lithuania's largest general classifieds portal
- [OkiDoki.ee Scraper](https://apify.com/itsnotyouitsme/okidoki-ee-scraper) — Estonian classifieds marketplace
- [DBA General Scraper](https://apify.com/itsnotyouitsme/dba-general-scraper) — Danish general classifieds marketplace
- [Vatera Scraper](https://apify.com/itsnotyouitsme/vatera-scraper) — Hungarian classifieds/auctions marketplace
- [Catawiki Scraper](https://apify.com/itsnotyouitsme/catawiki-scraper) — European curated auctions marketplace

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
deduplication, delta detection, and delivery to your inbox, Google Sheets,
or API — maintenance included. We can also build a custom version with your
exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.
We maintain 700+ European web scrapers and answer within one business day.

# Actor input Schema

## `category` (type: `string`):

Bazaraki.com category URL path, e.g. 'real-estate-to-rent/apartments-flats', 'real-estate-for-sale', 'motors-transport/cars'. This is the reliable way to get results — category pages are server-rendered. Defaults to apartment rentals if empty and no keyword/start URL is set.

## `searchQuery` (type: `string`):

Keyword to search across the whole site, e.g. 'iphone', 'toyota corolla'. Only used when Category is empty.

## `startUrls` (type: `array`):

Bazaraki.com search, category, or listing detail URLs (/adv/{id}\_{slug}/). Overrides Category/Search Keyword when provided.

## `maxResults` (type: `integer`):

Maximum number of ads to scrape. Category/search pages return 60 ads each; the actor paginates automatically until this limit is reached.

## `fetchDescriptions` (type: `boolean`):

Fetch each ad's detail page to get the full description text (adds one extra request per ad). Turn off for a faster, cheaper run when you only need list-level fields (title, price, location, images).

## `brightDataApiKey` (type: `string`):

Optional: your own Bright Data API key for the Web Unlocker zone. Leave empty to use the built-in unlocking service.

## `proxyConfiguration` (type: `object`):

Legacy field, kept for backwards compatibility. Fetching now goes through the built-in Bright Data Web Unlocker, so this is ignored.

## Actor input object example

```json
{
  "category": "real-estate-to-rent/apartments-flats",
  "startUrls": [
    {
      "url": "https://www.bazaraki.com/real-estate-to-rent/apartments-flats/"
    }
  ],
  "maxResults": 5,
  "fetchDescriptions": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "category": "real-estate-to-rent/apartments-flats",
    "startUrls": [
        {
            "url": "https://www.bazaraki.com/real-estate-to-rent/apartments-flats/"
        }
    ],
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/bazaraki-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "category": "real-estate-to-rent/apartments-flats",
    "startUrls": [{ "url": "https://www.bazaraki.com/real-estate-to-rent/apartments-flats/" }],
    "maxResults": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/bazaraki-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "category": "real-estate-to-rent/apartments-flats",
  "startUrls": [
    {
      "url": "https://www.bazaraki.com/real-estate-to-rent/apartments-flats/"
    }
  ],
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/bazaraki-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/bazaraki-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/rdTp5v1kzQi3JtuZd/builds/Oa0BomZQeZiRBpJw6/openapi.json
