# Expat-Dakar Scraper - Senegal Property Listings & Prices (`sian.agency/expat-dakar-property-scraper`) Actor

Senegalese property adverts from Expat-Dakar: asking price in CFA francs, bedrooms, floor area, neighbourhood and region, photos, and the advertiser's phone and WhatsApp number on every row. Search nine categories across seven regions, or open single adverts for the full seller text, bathroom count

- **URL**: https://apify.com/sian.agency/expat-dakar-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.76 / 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

## Expat-Dakar Scraper — Senegal Property Listings, Prices & Contacts 🚀

[![Store-SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-AngoCasa Scraper](https://img.shields.io/badge/Store-AngoCasa%20Scraper-1AE392)](https://apify.com/sian.agency/angocasa-property-scraper?fpr=sian) [![Store-Mubawab Scraper](https://img.shields.io/badge/Store-Mubawab%20Scraper-C1272D)](https://apify.com/sian.agency/mubawab-property-scraper?fpr=sian) [![Store-Property24 Scraper](https://img.shields.io/badge/Store-Property24%20Scraper-007A4D)](https://apify.com/sian.agency/property24-property-scraper?fpr=sian)

#### 🎉 Senegal's whole online property market — 3,762 live adverts, each with a phone number

##### Built for agencies, investors and diaspora buyers who need Dakar prices as data, not browser tabs

### 🔎 What is the Expat-Dakar Property Scraper — and when should you use it?

The **Expat-Dakar Property Scraper** turns public Expat-Dakar property adverts from anywhere in Senegal 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:** Senegalese sale and rental adverts as rows: asking price or monthly rent in CFA francs, bedrooms, floor or plot area, neighbourhood and region, the date the advert was posted, the advertiser's name and their direct phone number and WhatsApp link. Every row also names the property type and whether it is for sale or to rent, so an export splits by either after the fact. Open an advert in full and you also get the complete seller text, the bathroom count, every photo at original resolution, the advertiser's join date and the exact update timestamp.

**Use something else when:** the property is not in Senegal. Use [AngoCasa Scraper](https://apify.com/sian.agency/angocasa-property-scraper?fpr=sian) for Angola, with the same sale-and-rent row shape across 18 provinces and 39 Luanda zones. Use [Mubawab Scraper](https://apify.com/sian.agency/mubawab-property-scraper?fpr=sian) for Morocco and Tunisia, including GPS coordinates and the full advert text. Use [Property24 Scraper](https://apify.com/sian.agency/property24-property-scraper?fpr=sian) for Southern and East Africa: South Africa, Namibia, Botswana, Zambia, Zimbabwe, Mozambique and Kenya. This actor covers the nine property categories Expat-Dakar files under Immobilier: apartments, furnished apartments, houses, land, rooms and commercial premises, each already split into sale or rent by the portal. Hotels and estate-agency service adverts sit outside that tree and are not in scope, and Senegal publishes no sold-price register, so asking prices are the only prices there are.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/expat-dakar-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 property adverts, asking prices and seller phone numbers from Expat-Dakar using the Apify Actor `sian.agency/expat-dakar-property-scraper`.

Use it when I need: Senegalese sale and rental adverts as rows: asking price or monthly rent in CFA francs, bedrooms, floor or plot area, neighbourhood and region, the date the advert was posted, the advertiser's name and their direct phone number and WhatsApp link. Every row also names the property type and whether it is for sale or to rent, so an export splits by either after the fact. Open an advert in full and you also get the complete seller text, the bathroom count, every photo at original resolution, the advertiser's join date and the exact update timestamp.

Don't use it when: the property is not in Senegal — use angocasa-property-scraper or mubawab-property-scraper or property24-property-scraper instead.

How to call it: set `category` to one of the nine property categories (`appartements-a-louer`, `terrains-a-vendre`, `maisons-a-vendre` …) or leave it at `immobilier` for all of them at once. The category already says whether the adverts are for sale or to rent, so there is no separate deal-type field. Set `region` to `dakar`, `thies` or any of the other eight places that hold stock, or `all` for the whole country. Narrow with `minPrice` and `maxPrice` in CFA francs; the bounds go to the portal's own filter, so anything they exclude is never saved and never billed. Use `keyword` to reach a neighbourhood such as almadies or mermoz, which the portal has no address for. Set `sortBy` to `latest` when you want the newest adverts first for monitoring. To expand adverts you already have, set `operation` to `detail` and pass `propertyUrls`.

Start with this input:
{
  "operation": "search",
  "category": "appartements-a-louer",
  "region": "dakar",
  "sortBy": "latest",
  "maxItems": 200
}

Ask me which property category they want and whether Dakar alone is enough or they need the whole country, then run the Actor and summarise the results as a table.
```

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

- *Pull apartments to rent in Dakar under 800,000 F CFA a month and rank neighbourhoods by median rent per square metre.*
- *Find every land plot for sale in Thiès over 1,000 m² and give me a phone number for each.*
- *Give me this week's new furnished apartments in Dakar with the advertiser's name and WhatsApp link.*

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

### 📋 Overview

**Senegal has one deep property board, and until now nobody had put it on the Apify Store.** This actor reads Expat-Dakar's own result pages and hands you every advert as a row: asking price in CFA francs, bedrooms, floor area, neighbourhood, region, the date it was posted, and the advertiser's phone number and WhatsApp link.

**What you get:**

- ✅ **The whole vertical**: nine property categories, 3,762 live adverts when this actor was built, and no page ceiling to stop a full sweep
- ⚡ **Ten adverts per request**: a complete national index is 377 requests, so a whole-country run finishes in minutes
- 🎯 **Contact data on the cheap row**: phone and WhatsApp arrive with the search result, not behind a second paid call
- 💰 **Pay per advert returned**: nothing is charged for a category that matched nothing or an address we could not read
- 💎 **Two operations, one dataset**: the search rows and the detail rows share a field layout, so they merge without a mapping step
- ✨ **French content, typed columns**: prices, areas and room counts come out as numbers, not strings you have to clean

### ✨ Features

- 🏠 **Nine property categories**: apartments, furnished apartments, houses, land, rooms and commercial premises, each split into sale and rent by the portal itself
- 📍 **Region picker from the portal's own index**: Dakar, Thiès, Saint-Louis, Diourbel, Kaolack, Sine-Saloum, Ziguinchor, Fatick, Kaffrine, plus a catch-all
- 🔎 **Keyword narrowing**: reach a neighbourhood — Almadies, Mermoz, Ngor, Point E — that the portal has no URL for
- 💰 **Price bounds in CFA francs**: floor, ceiling or both, applied by the portal before anything is returned or billed
- 🆕 **Newest-first ordering**: run it on a schedule and diff the advert IDs to see what arrived
- 📞 **Phone and WhatsApp on every row**: the portal prints both in the result page, so a lead list needs one call per ten adverts
- 📷 **Full photo sets on detail rows**: every image at its original resolution, not the 224px grid thumbnail
- 🏢 **Advertiser record**: name, business profile, join date and which contact details the portal has verified
- 📊 **Typed output**: 39 fields, nullable where a real advert can leave them empty, exportable as JSON, CSV or Excel

### 🎬 Quick Start

Pick a category, pick a region, press Start. The default input sweeps the whole Immobilier section across all of Senegal and returns the first 100 adverts. No key, no login, no proxy to configure.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~expat-dakar-property-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"operation":"search","category":"appartements-a-louer","region":"dakar","maxItems":100}'
```

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to search

Set **Category** to the kind of property you want. The category is the deal type as well, so "Apartments to rent" and "Apartments for sale" are separate values and no impossible combination exists.

#### Step 2: Choose where

Set **Region**. Dakar holds roughly nine adverts in ten, so "All of Senegal" and "Dakar" return nearly the same thing; the smaller regions are there for when you specifically want them.

#### Step 3: Run it and export

Press Start. Rows land in the dataset as they arrive. Download JSON, CSV or Excel from the Storage tab, or read them straight from the API.

**That's it! In about a minute, you'll have:**

- Every matching advert with its asking price in CFA francs
- Bedrooms, floor area, neighbourhood and region as separate columns
- A phone number and a WhatsApp link for each one

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `search` walks the result pages; `detail` opens adverts you already have |
| `category` | string | No | One of nine property categories, or `immobilier` for all of them |
| `region` | string | No | `all`, or one of the ten regions that hold property stock |
| `keyword` | string | No | Narrows the category to adverts whose text matches — the way to reach a neighbourhood |
| `minPrice` | integer | No | Floor in CFA francs; 0 means no floor |
| `maxPrice` | integer | No | Ceiling in CFA francs; 0 means no ceiling |
| `sortBy` | string | No | `priority`, `latest`, `lowest-price` or `highest-price` |
| `maxItems` | integer | No | Stops the sweep once this many adverts have been returned |
| `propertyUrl` | string | No | One advert address, for the `detail` operation |
| `propertyUrls` | array | No | Several advert addresses, one per line |

**Example — apartments to rent in Dakar, newest first:**

```json
{
  "operation": "search",
  "category": "appartements-a-louer",
  "region": "dakar",
  "sortBy": "latest",
  "maxItems": 200
}
```

**Example — open specific adverts in full:**

```json
{
  "operation": "detail",
  "propertyUrls": [
    "https://www.expat-dakar.com/annonce/4-chambres-f5-standing-neuf-jamais-habite-6754772",
    "https://www.expat-dakar.com/annonce/chambre-meublee-aux-maristes-2725287"
  ]
}
```

### 📤 Output

Results are saved to the Apify dataset with **39 fields**, including:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | The advert's own number, shared by search and detail rows |
| `propertyUrl` | string | The advert's address on the portal |
| `propertyTitle` | string | The headline the advertiser wrote |
| `categoryLabel` | string | The portal's own category name, in French |
| `propertyType` | string | Apartment, Furnished apartment, House, Land, Room or Commercial |
| `dealType` | string | Sale or Rent |
| `price` | number | The figure on the advert, as a number |
| `currency` | string | Read from the advert rather than assumed; XOF in practice |
| `bedrooms` | integer | Room count, where the category carries one |
| `bathrooms` | integer | Detail rows only |
| `areaSqm` | number | Floor area for buildings, plot area for land |
| `locality` | string | Neighbourhood, as the advert was filed |
| `region` | string | Senegalese region |
| `phone` | string | The advertiser's number, in international format |
| `whatsapp` | string | The same number as a WhatsApp contact |
| `advertiserName` | string | Agency or private seller |
| `photos` | array | Every image at full resolution, on detail rows |
| `updatedAt` | string | When the advertiser last touched the advert |

**Example row:**

```json
{
  "listingId": "6754772",
  "propertyUrl": "https://www.expat-dakar.com/annonce/4-chambres-f5-standing-neuf-jamais-habite-6754772",
  "propertyTitle": "4 CHAMBRES (F5) - STANDING - NEUF & JAMAIS HABITÉ",
  "categoryLabel": "Appartements à louer",
  "propertyType": "Apartment",
  "dealType": "Rent",
  "price": 900000,
  "currency": "XOF",
  "priceText": "900 000 F Cfa",
  "bedrooms": 4,
  "areaSqm": 200,
  "locality": "Almadies",
  "region": "Dakar",
  "advertiserName": "Nova Immobilier",
  "advertiserId": "6649503",
  "isBusinessAdvertiser": true,
  "phone": "+221764146666",
  "whatsapp": "+221764146666",
  "listedAtText": "10. juin, 16:40",
  "isFeatured": true,
  "promotionTier": "gold",
  "status": "success"
}
```

### 💼 Use Cases & Examples

#### 1. Price the Dakar rental market by neighbourhood

**A property analyst benchmarking asking rents across the city's districts.**

**Input:** Category "Apartments to rent", region Dakar, `maxItems` above 1,400.
**Output:** Every live rental advert with rent, bedrooms, floor area and neighbourhood as separate columns.
**Use:** Median rent per square metre for Almadies against Mermoz, Ngor or Point E, from the same dataset and the same field layout.

#### 2. Build a contactable agency list

**An agency or CRM operator who needs to know who is actually transacting in Dakar.**

**Input:** Any category, region Dakar. No detail calls needed.
**Output:** Advertiser name, business profile link, phone number and WhatsApp link on every search row.
**Use:** Group by advertiser to rank agencies by live stock, then reach each one directly.

#### 3. Watch new stock arrive

**An investor or relocation consultant tracking supply in a market with no sold-price register.**

**Input:** Order set to "Newest first", run on a schedule.
**Output:** Advert IDs you can diff between runs; detail rows carry the exact update timestamp.
**Use:** Separate genuinely new listings from re-posted ones, and measure how long stock sits.

#### 4. Track the Dakar and Petite Côte land market

**A developer sourcing plots outside the built-up city.**

**Input:** Category "Land for sale", region Dakar or Thiès.
**Output:** 441 adverts with plot area parsed as a number, from a few hundred square metres to 30,000.
**Use:** Derive price per square metre yourself, which the portal never publishes.

#### 5. Research a diaspora purchase or return

**A Senegalese buyer in France, Italy or the United States, or an agent serving them.**

**Input:** Category "Furnished apartments", keyword for a neighbourhood.
**Output:** 685 furnished lets with prices, photos and a number that reaches the landlord directly.
**Use:** Shortlist and call from abroad without a portal lead form in between.

#### 6. Feed a West African property index

**A data team maintaining a multi-country series.**

**Input:** Category "All property", region "All of Senegal".
**Output:** The whole vertical in one dataset, in the same row shape as our Angola, Morocco and Southern Africa actors.
**Use:** Append Dakar to an existing series without writing a translation layer.

### 🔗 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/expat-dakar-property-scraper').call({
  operation: 'search',
  category: 'appartements-a-louer',
  region: 'dakar',
  maxItems: 100,
});

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/expat-dakar-property-scraper').call(
    run_input={
        'operation': 'search',
        'category': 'terrains-a-vendre',
        'region': 'thies',
        'maxItems': 100,
    }
)

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

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~expat-dakar-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","category":"maisons-a-vendre","region":"dakar","maxItems":100}'
```

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

1. **Trigger**: a daily schedule, or a webhook from your own system
2. **HTTP Request**: call the actor's run endpoint with your category and region
3. **Process**: filter the rows on price, area or advertiser
4. **Action**: append to a sheet, upsert into a CRM, or send new stock to Slack

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 adverts** per run, with the same fields and the same quality as a paid run
- No credit card required
- Enough to check the columns before you commit to a sweep

#### PAID Tier (Production Ready)

- **Unlimited** adverts per run. A full national sweep is about 3,760
- Pay per advert returned; a category that matched nothing costs nothing
- Property Detail is priced separately, because it is a second request per advert

💰 **Mid-band for African property data** — and the phone number arrives on the cheap row, which most of the field charges a second event for.

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

### ❓ Frequently Asked Questions

**Q: How many adverts can I get?**
A: FREE tier: 25 per run. PAID tier: unlimited. The whole Immobilier section held 3,762 adverts when this actor was built.

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

**Q: What currency are the prices in?**
A: The CFA franc (XOF), which is what every advert quotes. The currency is read from each advert rather than assumed, so it travels on the row.

**Q: Is the price a monthly rent or a sale price?**
A: Whichever the advert is. The category says which, and every row carries a plain Deal column so you never have to infer it.

**Q: Can I filter by neighbourhood?**
A: Use the Keyword field. The portal files adverts by region, not by neighbourhood, so there is no Almadies or Mermoz address to point at. The neighbourhood is on every advert and comes back as a column either way.

**Q: What does Property Detail add?**
A: The complete seller text instead of the grid teaser, the bathroom count, every photo at full resolution, the advertiser's join date and verification badges, and the exact update timestamp. Price, bedrooms, area, neighbourhood, phone and WhatsApp are already on the search row.

**Q: What output formats are available?**
A: JSON, CSV and Excel, exported straight from the Apify dataset.

**Q: Is this legal?**
A: We read only what the portal publishes to any visitor. See the legal section below.

### 🐛 Troubleshooting

**A run returned one row that says no adverts are published**

- That category and region genuinely hold nothing right now. Outside Dakar and Thiès most categories are empty.
- Set Region to "All of Senegal", or Category to "All property", and run it again. You were not charged for the empty result.

**A keyword returned far fewer adverts than expected**

- The keyword is matched against the advert's own French wording, so a misspelling returns nothing rather than everything.
- Try a shorter keyword — "almadies" rather than "almadies 2 villa" — or clear it and filter the rows yourself.

**Fewer adverts came back than the category count suggested**

- A price floor or ceiling excludes adverts that carry no price at all: on the full vertical that is about 77 of 3,762.
- Raise `maxItems` if you set it low; it stops the sweep, and the default is 100.

**A detail run says the advert was sold, rented or withdrawn**

- The advert is off the board. Re-run a Property Search for the same category to pick up what replaced it.

**A run says the site asked the request to verify itself**

- Occasional and transient; the run already retried five times. Wait a few minutes and start it again. Nothing was charged.

### ⚖️ 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/).

Expat-Dakar is a trademark of its owner. This actor is not affiliated with, endorsed by, or sponsored by Expat-Dakar.

### 🤝 Support

**Join our active support community**

- For issues or questions, open an issue on the actor's page
- 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/expat-dakar-property-scraper/changelog.md

# Actor input Schema

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

Property Search walks the portal's result pages and returns ten adverts per request, each already carrying a phone and WhatsApp number. Property Detail takes advert addresses you already have and opens each one for the full seller text, the bathroom count and every photo. One operation per run.

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

One category per run. Expat-Dakar files property by what it is AND whether it is for sale or to rent, so the category is the deal type as well — there is no separate sale/rent switch and no combination that does not exist. Measured depth on 2026-09-13: apartments to rent 1,351, furnished apartments 685, land for sale 441, houses to rent 373, apartments for sale 323, houses for sale 289, commercial to rent 178, rooms to rent 93, commercial for sale 29. All property is all nine at once, 3,762…

## `region` (type: `string`):

Every value here is a place the portal's own index recognises, and that held property adverts when this actor was built. Six Senegalese regions hold none — Louga, Matam, Kolda, Tambacounda, Kédougou and Sédhiou — so they are left out rather than offered as a filter that returns nothing. The market is concentrated: Dakar held 3,401 of 3,762 adverts and Thiès 313, so anything outside those two is a handful. Pick All of Senegal to sweep the lot.

## `keyword` (type: `string`):

Optional. Narrows the chosen category to adverts whose text matches, which is how you reach a neighbourhood: Expat-Dakar has no URL for one, so "almadies", "mermoz", "ngor" or "point e" is the way to get a neighbourhood slice. Matching is on the advert's own wording, so a misspelling returns nothing rather than everything. Leave empty for the whole category.

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

Optional floor, in CFA francs, on the figure printed on the advert — a monthly rent for rentals and an asking price for sales. Leave at 0 for no floor. Setting any price bound drops the adverts that carry no price at all: on the full vertical that is about 77 of 3,762.

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

Optional ceiling, in CFA francs, on the same figure. Leave at 0 for no ceiling. Rents in Dakar cluster between 200,000 and 1,500,000 F CFA a month; sale prices run from about 20,000,000 upwards.

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

Newest first is the one to use for monitoring — run it on a schedule and diff the advert IDs. The portal's own order is the default because it is the order the board itself paginates most stably. The board's fifth ordering, Special offers, is deliberately not offered: it quietly returns fewer adverts than the others, so it is a filter wearing a sort's clothes.

## `maxItems` (type: `integer`):

Stops the sweep once this many adverts have been returned. The portal serves ten per request, so 100 is ten requests. Set it above the slice's own size to drain it completely — All property across all of Senegal is about 3,760 adverts, apartments to rent about 1,350, and Dakar alone about 3,400.

## `propertyUrl` (type: `string`):

Used by Property Detail. Paste the full address of an Expat-Dakar advert, exactly as it appears in your browser. An advert number on its own also works — the number is the trailing digits of the address — but the address is what the search rows give you. Ignored by Property Search.

## `propertyUrls` (type: `array`):

Used by Property Detail for more than one advert at a time. One full Expat-Dakar advert address per line. Duplicates are removed before anything is charged.

## Actor input object example

```json
{
  "operation": "search",
  "category": "immobilier",
  "region": "all",
  "keyword": "",
  "minPrice": 0,
  "maxPrice": 0,
  "sortBy": "priority",
  "maxItems": 100,
  "propertyUrl": "https://www.expat-dakar.com/annonce/4-chambres-f5-standing-neuf-jamais-habite-6754772",
  "propertyUrls": []
}
```

# Actor output Schema

## `expatDakarAdverts` (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",
    "category": "immobilier",
    "region": "all",
    "keyword": "",
    "minPrice": 0,
    "maxPrice": 0,
    "sortBy": "priority",
    "maxItems": 100,
    "propertyUrl": "https://www.expat-dakar.com/annonce/4-chambres-f5-standing-neuf-jamais-habite-6754772",
    "propertyUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/expat-dakar-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",
    "category": "immobilier",
    "region": "all",
    "keyword": "",
    "minPrice": 0,
    "maxPrice": 0,
    "sortBy": "priority",
    "maxItems": 100,
    "propertyUrl": "https://www.expat-dakar.com/annonce/4-chambres-f5-standing-neuf-jamais-habite-6754772",
    "propertyUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/expat-dakar-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",
  "category": "immobilier",
  "region": "all",
  "keyword": "",
  "minPrice": 0,
  "maxPrice": 0,
  "sortBy": "priority",
  "maxItems": 100,
  "propertyUrl": "https://www.expat-dakar.com/annonce/4-chambres-f5-standing-neuf-jamais-habite-6754772",
  "propertyUrls": []
}' |
apify call sian.agency/expat-dakar-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/expat-dakar-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/5wPDvukiGoU6Ya41a/builds/qpzSTk8URI5iYucJy/openapi.json
