# Bazaraki Property Scraper — Cyprus Real Estate (`sian.agency/bazaraki-property-scraper`) Actor

Scrape Bazaraki.com for Cyprus property: asking price, €/m², covered and plot area, bedrooms, GPS, energy rating and seller. Sale and rent, JSON or CSV.

- **URL**: https://apify.com/sian.agency/bazaraki-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 1,000 property listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bazaraki Scraper: Cyprus Property Listings, Prices & Sellers 🏠

[![Store — SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store — Spitogatos](https://img.shields.io/badge/Store-Spitogatos-1AE392)](https://apify.com/sian.agency/spitogatos-property-scraper?fpr=sian) [![Store — xe.gr](https://img.shields.io/badge/Store-xe.gr-1AE392)](https://apify.com/sian.agency/xe-property-scraper?fpr=sian) [![Store — Hepsiemlak](https://img.shields.io/badge/Store-Hepsiemlak-1AE392)](https://apify.com/sian.agency/hepsiemlak-property-scraper?fpr=sian)

#### 🎉 The whole Cypriot property market as rows: 44,000 live adverts, 476 places, prices in euro

##### Built for analysts, agencies and relocation buyers who need Cyprus asking prices they can sort

***

### 🔎 What is the Bazaraki Cyprus Property Scraper — and when should you use it?

The **Bazaraki Cyprus Property Scraper** turns public Bazaraki property adverts from anywhere in Cyprus into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** Cypriot sale and rental adverts as rows. Each carries the asking price in euro, the portal's own price per square metre, covered floor area and plot area, bedroom and bathroom counts, parking and whether pets are allowed. The district and neighbourhood come with every row, along with every photo and a flag for paid placements. The seller block names who placed the advert and whether that account is a registered business. Open each advert as well and the row gains the seller's own description, map coordinates, the postal code and the energy efficiency rating. It also gains condition, construction year, floor, furnishing, air conditioning, the amenity list, the agency reference number and the view counter.

**Use something else when:** the property is not in Cyprus. Use [Spitogatos Scraper](https://apify.com/sian.agency/spitogatos-property-scraper?fpr=sian) for Greece's largest property portal, with energy class and agency phone numbers. Use [xe.gr Scraper](https://apify.com/sian.agency/xe-property-scraper?fpr=sian) for Greek listings that say whether a private owner or an agency placed the advert. Use [Hepsiemlak Scraper](https://apify.com/sian.agency/hepsiemlak-property-scraper?fpr=sian) for Turkish property across all 81 provinces, with the deposit on every rental. Coverage is the five districts of the Republic of Cyprus that Bazaraki indexes. Property in the north is sold on Turkish-language portals and is out of scope. Seller phone numbers sit behind a click the portal asks automated clients not to follow, so they are never collected; the row gives the seller's name, whether the account is a registered business, and the company website where one is published. The portal lists what is currently advertised, so there is no sold-price history to return.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/bazaraki-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Cyprus property listings and asking prices from Bazaraki using the Apify Actor `sian.agency/bazaraki-property-scraper`.

Use it when I need: Cypriot sale and rental adverts as rows. Each carries the asking price in euro, the portal's own price per square metre, covered floor area and plot area, bedroom and bathroom counts, parking and whether pets are allowed. The district and neighbourhood come with every row, along with every photo and a flag for paid placements. The seller block names who placed the advert and whether that account is a registered business. Open each advert as well and the row gains the seller's own description, map coordinates, the postal code and the energy efficiency rating. It also gains condition, construction year, floor, furnishing, air conditioning, the amenity list, the agency reference number and the view counter.

Don't use it when: the property is not in Cyprus — use spitogatos-property-scraper or xe-property-scraper or hepsiemlak-property-scraper instead.

How to call it: set `dealType` to `sale` or `rent` and `propertyCategory` to one of `apartments-flats`, `houses`, `commercial-property`, `plots-of-land`, `buildings`, `prefabricated-houses`, `rooms-flatmates`, `short-term` or `other`, or leave it on `all` for the whole section. For location, pick a `district` or name exact places in `areas`; both lists are built from the portal's own place index, so a name the site does not know is refused up front instead of quietly widening the search. Narrow further with `propertyType`, `bedrooms`, `bathrooms` and `minPrice`/`maxPrice` in euro — every one of those is a filter the portal applies before anything is sent, so a narrow buy-box costs a fraction of a sweep. `outputLanguage` switches the whole run between English and Greek. `includeDetails` opens each advert for its full record, for an extra charge per advert. To expand adverts you already have, set `operation` to `detail` and pass whole advert addresses in `listingUrls`; to reproduce a search you built on the site, paste it into `searchUrls`.

Start with this input:
{
  "operation": "search",
  "dealType": "sale",
  "propertyCategory": "apartments-flats",
  "district": "lemesos-district-limassol",
  "bedrooms": [
    "2"
  ],
  "minPrice": 200000,
  "maxPrice": 400000,
  "maxResults": 120
}

Ask me which district or towns to cover, whether they want adverts for sale or to rent, and whether the full advert record is worth the extra per-advert charge, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull two-bedroom apartments for sale in Limassol between 200,000 and 400,000 euro and rank the neighbourhoods by median price per square metre.*
- *Find rentals in Nicosia posted this week that allow pets, with the map coordinates and the monthly asking rent for each.*
- *List the agencies advertising villas in Paphos, with how many live adverts each one holds and the websites they publish.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/bazaraki-property-scraper.md](https://apify.com/sian.agency/bazaraki-property-scraper.md).

### 📋 Overview

**Cyprus has one property portal that everyone actually uses.** Bazaraki carries about 34,000 adverts for sale and 10,000 to rent at any moment, across all five districts. This Actor turns any slice of that into rows: prices, areas, bedrooms, coordinates, and the seller behind each advert.

**What you get:**

- ✅ **Every property section**: apartments, houses, commercial space, land, residential buildings, prefabricated homes, rooms, short-term lets. Sale and rent both.
- ⚡ **60 adverts per request**: a whole district comes back in a normal run.
- 🎯 **69 fields per row**: asking price, euro per square metre, covered and plot area, bedrooms, bathrooms, parking, pets, energy rating, condition, construction year, GPS.
- 💰 **Charged per advert returned**: a search that matches nothing costs nothing.
- 💎 **Locations from the portal's own index**: five districts and all 476 towns, villages and neighbourhoods, each shown with its district.
- 🗣️ **English or Greek**: the same adverts, the same identifiers, in either language the portal publishes.

***

### ✨ Features

- 🏘️ **Nine property sections**: pick one, or take the whole side of the market in one run.
- 📍 **476 places, chosen from a list**: no free-text location field to mistype, no geocoder to drift.
- 🛏️ **The portal's own filters**: property type, bedrooms, bathrooms and a price band are applied before anything is fetched.
- 📄 **Full advert records on demand**: the seller's description, coordinates, postal code, energy rating, amenities, the agency reference and the view counter.
- 🧭 **Coordinates on every opened advert**: map a shortlist, measure distance to a coast or a school.
- 🏢 **Seller intelligence**: business or private, how long the account has been posting, how many live adverts it holds, and the company website where one exists.
- ⭐ **Paid placements flagged**: know which adverts are VIP or Top before you average anything.
- 📸 **Every photo, full size**: the whole gallery, not only the card thumbnail.
- 🔗 **Paste your own search**: reproduce a search you built on the site, filters and all.
- 📊 **JSON, CSV or Excel**: straight out of the dataset.

***

### 🎬 Quick Start

Pick a side of the market, pick a district, press Start. The Actor reads Bazaraki's own pages 60 adverts at a time and stops at the number you asked for. There is nothing to configure and no key to obtain.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~bazaraki-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation":"search","dealType":"sale","propertyCategory":"apartments-flats","district":"lemesos-district-limassol","maxResults":120}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose the market

Set **For sale or to rent**, then pick a **Property category**. Leave the category on "Every category in the section" to sweep the whole side.

#### Step 2: Choose where

Pick a **District**, or name exact **Towns, villages and neighbourhoods**. Both lists come from Bazaraki's own index.

#### Step 3: Press Start

Add a price band or a bedroom count if you want a tighter set, then run it.

**That's it. In under a minute you'll have:**

- Asking prices in euro, with the portal's own price per square metre
- Covered area, plot area, bedrooms and bathrooms
- The district and neighbourhood of every advert, and the seller behind it

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `operation` | string | No | `search` to browse a section, `detail` to open adverts you already have |
| `dealType` | string | No | `sale` or `rent` |
| `propertyCategory` | string | No | `all`, `apartments-flats`, `houses`, `commercial-property`, `plots-of-land`, `buildings`, `prefabricated-houses`, `rooms-flatmates`, `short-term`, `other` |
| `propertyType` | array | No | Building types inside the category — apartment, penthouse, villa, offices and the rest |
| `district` | string | No | One of the five districts, or `any` for the whole island |
| `areas` | array | No | Exact towns, villages or neighbourhoods; overrides the district |
| `minPrice` / `maxPrice` | integer | No | Price band in euro; on rentals, the monthly rent |
| `bedrooms` / `bathrooms` | array | No | Counts to include, from Bazaraki's own filters |
| `sortBy` | string | No | `newest`, `cheapest` or `expensive` |
| `maxResults` | integer | No | Stop after this many adverts |
| `includeDetails` | boolean | No | Open each advert for its full record |
| `outputLanguage` | string | No | `en` or `el` |
| `searchUrls` | array | No | Bazaraki search addresses to reproduce exactly |
| `listingUrls` | array | No | Advert addresses to open, for `operation: "detail"` |

**Example — two-bedroom apartments in Limassol, 200k to 400k:**

```json
{
  "operation": "search",
  "dealType": "sale",
  "propertyCategory": "apartments-flats",
  "district": "lemesos-district-limassol",
  "bedrooms": ["2"],
  "minPrice": 200000,
  "maxPrice": 400000,
  "maxResults": 120
}
```

**Example — open adverts you already hold:**

```json
{
  "operation": "detail",
  "listingUrls": [
    "https://www.bazaraki.com/adv/6710880_2-bedroom-apartment-for-sale/"
  ]
}
```

***

### 📤 Output

Results land in the Apify dataset with **69 fields**. The most-used ones:

| Field | Type | Description |
|---|---|---|
| `listingId` | number | Bazaraki's advert number |
| `propertyTitle` | string | The advert headline |
| `url` | string | The advert's own address |
| `price` | number | Asking price in euro |
| `pricePerSqm` | number | The portal's own euro per square metre |
| `dealType` | string | `sale` or `rent` |
| `propertyType` | string | Apartment, villa, offices, and the rest |
| `district` / `area` | string | District and neighbourhood |
| `latitude` / `longitude` | number | Map coordinates, on opened adverts |
| `bedrooms` / `bathrooms` | number | Room counts; `isStudio` marks zero-bedroom units |
| `coveredAreaSqm` / `plotAreaSqm` | number | Floor area and plot area in square metres |
| `energyEfficiency` | string | The published energy rating |
| `condition` | string | Brand new, resale, under construction |
| `sellerName` / `sellerIsBusiness` | string / boolean | Who placed the advert, and whether it is a business account |
| `photos` | array | Every photo, full size |
| `publishedAt` | string | Publication date |

**Example row:**

```json
{
  "listingId": 6220683,
  "propertyTitle": "2-bedroom apartment for sale",
  "url": "https://www.bazaraki.com/adv/6220683_2-bedroom-apartment-for-sale/",
  "price": 300000,
  "priceLabel": "€300.000",
  "priceCurrency": "EUR",
  "pricePerSqm": 3297,
  "dealType": "sale",
  "propertyType": "Apartment",
  "district": "Limassol",
  "area": "Kato Polemidia",
  "latitude": 34.68915078267952,
  "longitude": 32.9943163700579,
  "postalCode": "4057",
  "bedrooms": 2,
  "bathrooms": 2,
  "coveredAreaSqm": 91,
  "floor": "1st",
  "condition": "Under construction",
  "constructionYear": "2026",
  "energyEfficiency": "A",
  "amenities": ["Elevator", "Balcony", "Storage room"],
  "adPlacement": "VIP",
  "sellerName": "Terresun",
  "sellerIsBusiness": true,
  "sellerActiveAdverts": "3 active ads",
  "viewCount": 1760,
  "publishedAt": "2026-09-11"
}
```

***

### 💼 Use Cases & Examples

#### 1. Cyprus Property Market Analysis

**An analyst measuring a district instead of guessing at it.**

**Input:** A district, or the whole island, with a category.
**Output:** Asking price against covered area, euro per square metre by neighbourhood, bedroom mix.
**Use:** Compare what a two-bedroom flat lists for in Limassol Marina against Larnaka Kamares, on the portal's own numbers.

#### 2. Estate Agency and Developer Lead Generation

**An agency mapping who is active in a town.**

**Input:** A district and a category, with the full advert record switched on.
**Output:** Every advert with the account that placed it, whether it is a registered business, how long it has been posting and how many live adverts it holds.
**Use:** Rank the active agencies and developers by inventory, with the company website where they publish one.

#### 3. Holiday-Let and Short-Term Rental Pricing

**A host pricing against the stock that actually competes.**

**Input:** `dealType: "rent"`, `propertyCategory: "short-term"`, a coastal town.
**Output:** Asking rent, bedrooms, covered area and the minimum stay each listing accepts.
**Use:** Build the asking curve for your own segment before you set a nightly rate.

#### 4. New-Build and Off-Plan Tracking

**A developer watching what comes to market.**

**Input:** A district, apartments, with the full advert record switched on.
**Output:** Condition, construction year and price per square metre on every advert.
**Use:** Run it weekly and you see which developments launch, at what price, and how long units sit.

#### 5. Relocation and Residency Research

**A buyer who needs a price floor and a map.**

**Input:** A price band across the whole island, cheapest first.
**Output:** Every advert clearing the threshold, with coordinates.
**Use:** Map the shortlist and filter on distance to a school, a marina or the airport.

#### 6. Rental Yield Screening

**An investor comparing like with like.**

**Input:** The same neighbourhood and bedroom count, run once for sale and once for rent.
**Output:** Two sets of rows with the same shape — area, bedrooms, bathrooms, condition, energy rating.
**Use:** Divide one by the other without pretending a city-centre rent applies to a suburban purchase.

#### 7. Bilingual Listing Feeds

**A portal or CRM serving both halves of the Cypriot market.**

**Input:** The same search twice, once with `outputLanguage: "en"` and once with `"el"`.
**Output:** Identical advert numbers, prices and coordinates, with English and Greek text.
**Use:** Join on the advert number and publish one feed in two languages.

***

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/bazaraki-property-scraper').call({
  operation: 'search',
  dealType: 'sale',
  propertyCategory: 'houses',
  district: 'pafos-district-paphos',
  maxResults: 300,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/bazaraki-property-scraper').call(run_input={
    'operation': 'search',
    'dealType': 'rent',
    'propertyCategory': 'apartments-flats',
    'district': 'lefkosia-district-nicosia',
    'maxPrice': 1500,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['price'], item['area'], item['bedrooms'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~bazaraki-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","dealType":"sale","propertyCategory":"plots-of-land","district":"larnaka-district-larnaca"}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a daily schedule, or a webhook from your CRM
2. **HTTP Request**: call the Actor with your saved search
3. **Process**: filter the JSON on price per square metre or bedrooms
4. **Action**: write new adverts to a sheet, a database, or a Slack alert

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 adverts** per run, with every field and every filter
- No credit card required
- Enough to check the data shape against your own model

#### PAID Tier (Production Ready)

- **Unlimited** adverts per run — a whole district in one go
- Pay per advert returned; a search that matched nothing is not charged
- Opening each advert for its full record is a separate, optional charge

🔗 [View current pricing](https://apify.com/sian.agency/bazaraki-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Do I need an API key, a login or a proxy?**
A: No. Pick a section and press Start.

**Q: How many adverts can one run return?**
A: As many as match, up to the number you set. FREE accounts are capped at 25 per run.

**Q: Are the prices in euro?**
A: Yes, every one. Cyprus is in the euro area and Bazaraki quotes in euro only.

**Q: Does it cover Northern Cyprus?**
A: No. Bazaraki indexes the five districts of the Republic of Cyprus. Property in the north is sold on Turkish-language portals.

**Q: Can I get the output in Greek?**
A: Yes. The output language field switches the whole run. Advert numbers, prices and coordinates are identical in both, so the two join cleanly.

**Q: What does opening each advert add?**
A: The seller's own description, map coordinates, postal code, energy rating, condition, construction year, floor, furnishing, air conditioning, the amenity list, the agency reference and the view counter.

**Q: Are phone numbers included?**
A: No. Bazaraki keeps seller phone numbers behind a click its own terms ask automated clients not to follow. You get the seller's name, whether the account is a business, and the company website where one is published.

**Q: How fresh is the data?**
A: Live. Every run reads the portal at the moment you press Start.

***

### 🐛 Troubleshooting

**A search returned nothing**

- Check the category belongs to the side of the market you picked. Residential buildings and prefabricated houses are sale-only; rooms, short-term lets and "other" are rent-only.
- Widen the location or clear the price ceiling. A single village with a narrow band can genuinely be empty.

**A bedroom or bathroom filter seems to have been ignored**

- Bazaraki only publishes those filters for apartments, houses and short-term rentals. On land, commercial space and buildings there is none, and the run log says so.

**An advert came back as withdrawn**

- Adverts are removed when they sell or let. Re-run the search to pick up what is live now.

**A pasted address was skipped**

- The address has to be a property search or an advert page. Car and electronics searches are not read, and neither are addresses the portal asks automated clients to leave alone.

**A detail run rejected an advert number**

- Paste the whole address from your browser. The number on its own does not open a page on Bazaraki.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Bazaraki is a trademark of its owner. This Actor is not affiliated with, endorsed by, or sponsored by Bazaraki.

***

### 🤝 Support

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Changelog

This Actor's version history is a separate document: https://apify.com/sian.agency/bazaraki-property-scraper/changelog.md

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. Property Search walks a Bazaraki property section and returns one row per advert. Property Detail takes Bazaraki advert addresses you already hold and opens each one for the full record: the seller's own description, map coordinates, postal code, energy rating, condition, amenity list and the view counter. A search row alone carries none of those.

## `dealType` (type: `string`):

Which side of the market to read. Bazaraki keeps sale and rental adverts in two separate sections with different category lists, so a run reads one or the other. For sale holds about 34,000 live adverts; to rent holds about 10,000.

## `propertyCategory` (type: `string`):

Which section to walk. Four categories exist on both sides of the market; the rest belong to one side only, and the label says which. Asking for a category the chosen deal type does not publish stops the run before anything is fetched or charged, because Bazaraki answers that address with its whole classifieds index — cars, phones and jobs included — rather than an error.

## `propertyType` (type: `array`):

Narrow the category to specific building types, using Bazaraki's own type list. Leave it empty to take every type. The values belong to the category above: apartments have apartment and penthouse, houses have detached, semi-detached, maisonette and villa, and commercial has its own eight. A type that does not belong to the chosen category is rejected before the run starts.

## `district` (type: `string`):

One of the five districts of the Republic of Cyprus, taken from Bazaraki's own location tree. Limassol is by far the deepest market on the site. Leave it on all of Cyprus to sweep the whole country. Ignored when you pick specific areas below.

## `areas` (type: `array`):

Pick specific places instead of a whole district. All 476 towns, villages and city neighbourhoods Bazaraki indexes for property are listed, each prefixed with its district, and the list comes from the portal's own sitemap rather than a translated map. Each place you pick is read separately, so five places cost five sweeps. Picking any place here overrides the district field.

## `minPrice` (type: `integer`):

Only return adverts asking at least this much, in euro. Every price on Bazaraki is in euro. Leave it at 0 for no floor. On rentals this is the monthly rent.

## `maxPrice` (type: `integer`):

Only return adverts asking at most this much, in euro. Leave it at 0 for no ceiling. The portal applies this filter itself, so a narrow band costs a fraction of a full sweep.

## `bedrooms` (type: `array`):

Bedroom counts to include, using Bazaraki's own bedroom filter. Studio is the zero entry. Pick several and each is read separately. This filter exists only for apartments, houses and short-term rentals — the portal has no bedroom filter on land, commercial space or buildings, so it is ignored there and the run says so in the log.

## `bathrooms` (type: `array`):

Bathroom counts to include. Like bedrooms this is a Bazaraki filter and exists only on apartments and houses. Pick several and each is read separately.

## `sortBy` (type: `string`):

The order Bazaraki returns adverts in. Newest first is what a market monitor wants; the price orders are for skimming the top or bottom of a segment without downloading the middle. Paid placements sit above the sort on the first page, exactly as they do for a visitor.

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

Stop after this many adverts. Bazaraki serves 60 per page, so the run reads in blocks of 60 and stops at the first block that reaches your number. Free Apify accounts are capped at 25 rows per run whatever this says.

## `includeDetails` (type: `boolean`):

Open every advert the search returns and merge its full record into the row. That adds the seller's own description, map coordinates, postal code, energy rating, condition, construction year, floor, furnishing, the amenity list, the agency reference number and the view counter. It is one extra request per advert and bills the Property Detail event once per advert, so a 100-row search costs 100 detail events on top. Leave it off when you only need prices and locations.

## `outputLanguage` (type: `string`):

Bazaraki publishes every advert in both English and Greek. English gives you Latin place names and English category and amenity labels; Greek gives you the Greek text the seller's Cypriot audience reads, with Greek place names. Prices, identifiers, coordinates and dates are identical either way, and the cost is the same.

## `searchUrls` (type: `array`):

Paste Bazaraki search addresses straight from your browser to reproduce a search exactly as you built it on the site, including filters this form does not expose. Everything above is ignored for these. Only property sections are accepted, and addresses the site asks crawlers to leave alone are rejected with the reason.

## `listingUrls` (type: `array`):

For Property Detail: the adverts to open, as whole Bazaraki addresses (https://www.bazaraki.com/adv/6710880\_2-bedroom-apartment-for-sale/). The advert number on its own is not enough — Bazaraki answers /adv/6710880/ with a 404 even while the advert is live — so paste the address from your browser. One row comes back per advert, carrying everything the advert page publishes.

## Actor input object example

```json
{
  "operation": "search",
  "dealType": "sale",
  "propertyCategory": "all",
  "propertyType": [],
  "district": "any",
  "areas": [],
  "minPrice": 0,
  "maxPrice": 0,
  "bedrooms": [],
  "bathrooms": [],
  "sortBy": "newest",
  "maxResults": 120,
  "includeDetails": false,
  "outputLanguage": "en",
  "searchUrls": [],
  "listingUrls": []
}
```

# Actor output Schema

## `bazarakiAdverts` (type: `string`):

Every advert this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "dealType": "sale",
    "propertyCategory": "all",
    "propertyType": [],
    "district": "any",
    "areas": [],
    "minPrice": 0,
    "maxPrice": 0,
    "bedrooms": [],
    "bathrooms": [],
    "sortBy": "newest",
    "maxResults": 120,
    "includeDetails": false,
    "outputLanguage": "en",
    "searchUrls": [],
    "listingUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/bazaraki-property-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 = {
    "operation": "search",
    "dealType": "sale",
    "propertyCategory": "all",
    "propertyType": [],
    "district": "any",
    "areas": [],
    "minPrice": 0,
    "maxPrice": 0,
    "bedrooms": [],
    "bathrooms": [],
    "sortBy": "newest",
    "maxResults": 120,
    "includeDetails": False,
    "outputLanguage": "en",
    "searchUrls": [],
    "listingUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/bazaraki-property-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 '{
  "operation": "search",
  "dealType": "sale",
  "propertyCategory": "all",
  "propertyType": [],
  "district": "any",
  "areas": [],
  "minPrice": 0,
  "maxPrice": 0,
  "bedrooms": [],
  "bathrooms": [],
  "sortBy": "newest",
  "maxResults": 120,
  "includeDetails": false,
  "outputLanguage": "en",
  "searchUrls": [],
  "listingUrls": []
}' |
apify call sian.agency/bazaraki-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/bazaraki-property-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/ivdu88k3OZK0ETqGd/builds/FGpTs98ZcGaiJNF7V/openapi.json
