# AngoCasa Property Scraper — Angola Real Estate (`sian.agency/angocasa-property-scraper`) Actor

Angolan property adverts from AngoCasa: asking price in kwanzas or dollars, typology, floor and plot area, province and Luanda zone, photos, and the advertiser's phone and WhatsApp number on every row. Search 18 provinces and 39 Luanda zones, or open single adverts for the full amenity block and dat

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

## AngoCasa Scraper - Angola Real Estate Listings & Prices 🏠

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Idealista Scraper](https://img.shields.io/badge/Store-Idealista%20Scraper-E60023)](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) [![Imovirtual Scraper](https://img.shields.io/badge/Store-Imovirtual%20Scraper-1AE392)](https://apify.com/sian.agency/imovirtual-property-scraper?fpr=sian) [![Property24 Scraper](https://img.shields.io/badge/Store-Property24%20Scraper-1AE392)](https://apify.com/sian.agency/property24-property-scraper?fpr=sian)

#### 🎉 The whole Angolan property market in about 210 requests, at $1.50 per thousand adverts, with the advertiser's phone and WhatsApp number already on the search row

##### Built for property analysts, brokers, lead-generation teams and proptech developers who need Luanda listing data in a spreadsheet rather than in a browser tab.

### 🔎 What is the AngoCasa Scraper — and when should you use it?

The **AngoCasa Scraper** turns AngoCasa search results and advert pages 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:** Angolan asking prices in kwanzas or dollars, typology and bedroom count, floor and plot area, province and Luanda zone, photos, the seller's own description, and a direct phone and WhatsApp number for whoever published the advert.

**Use something else when:** you need a country this portal does not cover. Use [Imovirtual Scraper](https://apify.com/sian.agency/imovirtual-property-scraper?fpr=sian) for the Portuguese market itself, rather than the handful of Portuguese adverts AngoCasa carries for the diaspora. Use [Property24 Scraper](https://apify.com/sian.agency/property24-property-scraper?fpr=sian) for South Africa, Namibia, Botswana, Zambia, Zimbabwe, Mozambique and Kenya. Use [Idealista Scraper](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) for Spain, Portugal and Italy.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/angocasa-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 to compare apartment rents across Luanda's zones using the Apify Actor `sian.agency/angocasa-property-scraper`.

Use it when I need: Angolan property adverts with asking price in kwanzas or dollars, typology, bedroom count, area, province and Luanda zone, photos, and the advertiser's phone and WhatsApp number.

Don't use it when: I need a country AngoCasa does not publish — use imovirtual-property-scraper or property24-property-scraper instead.

How to call it: set `operation` to "search" to walk the portal's results grid for a deal type, a property type and a place (50 adverts per request), or to "detail" to open specific adverts I already have the full web address for.

Start with this input:
{
  "operation": "search",
  "dealType": "arrenda",
  "propertyType": "apartamento",
  "location": "angola-luanda-talatona",
  "maxItems": 200
}

Ask me which zone and whether I mean sale or rent, then run the Actor and summarise the results as a table.
```

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

- *"Pull every apartment for rent in Talatona and Ingombota and give me the median asking rent by bedroom count."*
- *"Collect all the land plots for sale in Luanda province and list the advertisers with more than five plots, with their WhatsApp numbers."*
- *"Open these four advert links and tell me which has the largest plot and what amenities each one claims."*

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

### 📋 Overview

**Angola's property market is small enough to take whole.** AngoCasa publishes roughly 10,500 live adverts, and this Actor reads them 50 per request, so a complete national sweep is about 210 requests. Every row comes back as flat JSON with 49 fields, ready for CSV, Excel or the API.

**What you get:**

- 📞 **A contact on every search row**: the advertiser's name, a phone number and a WhatsApp number, printed in the results grid rather than hidden behind a click. You do not need the detail operation to build a callable list.
- 🇦🇴 **The whole country, by name**: Angola as a whole, any of its 18 provinces, or any of the 39 named Luanda zones. Talatona carries about 2,650 adverts, Benfica 1,400, Ingombota 1,050, Camama 650, Alvalade and Maianga 500 each, Morro Bento 400.
- 💱 **Kwanzas and dollars, both labelled**: the asking price arrives with the currency the seller quoted. A dollar-priced advert also carries the portal's kwanza conversion in its own field, so an AOA column stays an AOA column.
- 💰 **$1.50 per thousand adverts** on Property Search, charged per advert returned and never for adverts that fail.
- 🌍 **Portuguese in, English out**: deal type, property type and condition are translated, with the Portuguese original kept beside each one. The seller's own words are returned untouched.
- 🔓 **Nothing to configure**: no API key, no login, no proxy setup, no browser engine.

***

### ✨ Features

- 🔍 **Property Search**: walk the portal's results grid by deal type, property type and place, 50 adverts per request.
- 📄 **Property Detail**: open specific adverts for the amenity checklists, every photo at full size, the publication and update dates and the advertiser's profile.
- 📍 **39 named Luanda zones**: Talatona, Ingombota, Benfica, Camama, Kilamba, Maianga, Alvalade, Morro Bento, Viana and the rest, plus all 18 provinces.
- 🏘️ **14 property types**: apartments, villas, land plots, offices, shops, warehouses, new-build developments, guest houses, hotels, builders' yards, restaurants, farms, rooms and suites.
- 🤝 **Sale and rent in one schema**: every row is labelled either way and carries the same fields, so rents and asking prices sit in one table.
- 🧹 **De-duplicated by advert ID**: a 15-page drain returned 701 adverts with no repeats, and repeated links in your own input are dropped before anything is charged.
- 🖼️ **Photos and thumbnails**: the cover image on search rows, the complete image array and a photo count on detail rows.
- ✅ **Verified-agency flag**: detail rows mark the advertisers the portal itself has certified, alongside their account type and registration date.
- 🌐 **Also Portugal and Namibia**: the portal's diaspora stock is selectable from the same place list.
- 🧾 **Run report**: what was collected, what failed and what it cost is saved to the key-value store.

***

### 🎬 Quick Start

Pick sale or rent, pick a property type, pick a place, press Start. The run pages through the results grid until it reaches your maximum or the adverts run out. Nothing else on the form narrows the set, because nothing else is a filter the portal honours.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~angocasa-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation":"search","dealType":"venda","propertyType":"apartamento","location":"angola-luanda-talatona","maxItems":200}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose the operation

Leave **What to do** on Property Search to sweep a slice of the portal. Switch it to Property Detail when you already hold advert links and want the amenity block, the full photo set and the dates.

#### Step 2: Pick the slice

Set **For sale or for rent**, **Property type** and **Where**. Luanda is the default because that is where roughly 10,250 of the portal's 10,500 adverts sit.

#### Step 3: Set a maximum and run

**How many adverts** defaults to 100, which is two requests. Raise it past the slice's own size to drain it: Talatona is about 2,650 adverts, Luanda province about 10,250, all of Angola about 10,350.

**That's it! Within a minute or two, you'll have:**

- A dataset of adverts with asking prices, typology, area and location
- A phone number and a WhatsApp number on every search row
- A CSV, Excel or JSON export, or an API endpoint your own code can read

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `search` (Property Search) or `detail` (Property Detail). Default `search`. |
| `dealType` | string | No | `listar-todos` for both, `venda` for sale, `arrenda` for rent. Default `listar-todos`. |
| `propertyType` | string | No | `all`, or one of 14 types: `apartamento`, `vivenda`, `terreno`, `escritorio`, `loja`, `armazem`, `empreendimento`, `guest-house`, `hotel`, `estaleiro`, `restaurante`, `quinta`, `quarto-suite`, `outro`. |
| `location` | string | No | `angola` for the whole country, a province such as `angola-benguela`, a Luanda zone such as `angola-luanda-talatona`, or `portugal` / `namibia`. Default `angola-luanda`. |
| `maxItems` | integer | No | Stop once this many adverts have been returned. Default 100, maximum 20,000. |
| `propertyUrl` | string | No | Property Detail: the full web address of one advert, copied from your browser. |
| `propertyUrls` | array | No | Property Detail: several full advert addresses, one per line. Duplicates are removed before anything is charged. |

**Example - apartments for rent in Talatona:**

```json
{
  "operation": "search",
  "dealType": "arrenda",
  "propertyType": "apartamento",
  "location": "angola-luanda-talatona",
  "maxItems": 500
}
```

**Example - every land plot for sale in the country:**

```json
{
  "operation": "search",
  "dealType": "venda",
  "propertyType": "terreno",
  "location": "angola",
  "maxItems": 2000
}
```

**Example - open specific adverts:**

```json
{
  "operation": "detail",
  "propertyUrls": [
    "https://www.angocasa.com/apartamento/t3/luanda/kilamba/vender-apartamento-t3-na-urbanizacao-kk5000/0203827/"
  ]
}
```

***

### 📤 Output

Every advert is one flat row with **49 fields**. The most-used ones:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | AngoCasa advert ID, zero-padded exactly as the site prints it |
| `propertyUrl` | string | Link to the advert |
| `propertyTitle` | string | Advert headline |
| `dealType` / `dealTypeOriginal` | string | Sale or rent, in English and in the portal's Portuguese |
| `price` / `currency` | number / string | Asking price as advertised, and whether it was quoted in AOA or USD |
| `priceAoa` | number | The kwanza figure, including the conversion the portal prints beside a dollar price |
| `propertyType` / `propertyTypeOriginal` | string | Category in English and in Portuguese |
| `typology` / `bedrooms` | string / integer | T3, V4 and the like, plus the bedroom count read from it |
| `bathrooms` | integer | Bathroom count (Property Detail) |
| `usableAreaSqm` / `landAreaSqm` | number | Floor area and plot area in m² |
| `condition` / `isFurnished` / `yearBuilt` | string / boolean / integer | State of repair, furnishing and construction year (Property Detail) |
| `interiorFeatures` / `exteriorFeatures` / `otherFeatures` | array | The advert's amenity checklists (Property Detail) |
| `country` / `province` / `locality` / `landmark` | string | Written location as the portal files it |
| `provinceSlug` / `localitySlug` | string | Machine-readable location keys, on every row |
| `descriptionText` / `isDescriptionTruncated` | string / boolean | The seller's text, and whether it is the grid teaser or the full version |
| `advertiserName` / `advertiserType` / `isVerifiedAgency` | string / string / boolean | Who published it, their account type and whether the portal has certified them |
| `advertiserProfileUrl` / `advertiserSince` / `advertiserLocation` | string | Their profile page, registration date and base (Property Detail) |
| `phone` / `whatsapp` | string | Contact numbers, on search rows as well as detail rows |
| `thumbnail` / `photos` / `photoCount` | string / array / integer | Cover image on every row, the full image array on detail rows |
| `isFeatured` | boolean | Whether the portal is promoting the advert |
| `listedAt` / `updatedAt` | string | Publication and update dates (Property Detail) |
| `searchedLocation` / `resultPage` | string / integer | Which slice and which page the row came from |
| `status` / `errorMessage` | string | `success` on a data row, or the reason an item could not be read |

**Example row** (values illustrative):

```json
{
  "listingId": "0203827",
  "propertyUrl": "https://www.angocasa.com/apartamento/t3/luanda/kilamba/vender-apartamento-t3-na-urbanizacao-kk5000/0203827/",
  "propertyTitle": "Vender Apartamento T3 na Urbanização KK5000",
  "dealType": "For sale",
  "dealTypeOriginal": "Vender",
  "price": 53000000,
  "currency": "AOA",
  "priceAoa": 53000000,
  "propertyType": "Apartment",
  "propertyTypeOriginal": "apartamento",
  "typology": "T3",
  "bedrooms": 3,
  "bathrooms": 2,
  "usableAreaSqm": 120,
  "condition": "Used",
  "isFurnished": false,
  "interiorFeatures": ["Cozinha equipada", "Ar condicionado"],
  "country": "Angola",
  "province": "Luanda",
  "locality": "Kilamba",
  "provinceSlug": "luanda",
  "localitySlug": "kilamba",
  "descriptionText": "Apartamento T3 na centralidade do Kilamba...",
  "advertiserName": "Imobiliária Exemplo",
  "advertiserType": "Agência",
  "isVerifiedAgency": true,
  "phone": "244923000000",
  "whatsapp": "244923000000",
  "photoCount": 14,
  "photos": ["https://www.angocasa.com/.../1.jpg", "https://www.angocasa.com/.../2.jpg"],
  "listedAt": "2026-08-30",
  "updatedAt": "2026-09-05",
  "status": "success",
  "_fetchedAt": "2026-09-13T10:22:41.000Z"
}
```

***

### 💼 Use Cases & Examples

#### 1. Price the Luanda market by zone

**Property analysts measuring a city where no public sold-price register exists.**

**Input:** a Luanda zone, a deal type and a property type
**Output:** asking price, typology, bedroom count and area, row by row
**Use:** compare a two-bedroom rent in Ingombota against the same thing in Camama without hand-sorting. Sale and rent adverts share one schema, so a yield calculation needs no mapping step.

#### 2. Build a contactable agency list

**Lead-generation teams and brokers who need to reach whoever is actually transacting.**

**Input:** a zone, with the property type left on All types
**Output:** advertiser name, phone number and WhatsApp number on every search row
**Use:** sweep a zone, group by advertiser, and you have the market's active sellers and a way to call them. You never open an advert page, so you never pay the detail charge.

#### 3. Watch new stock arrive

**Portals and market researchers tracking how long inventory sits.**

**Input:** the same slice on a daily or weekly schedule
**Output:** advert IDs to diff, plus publication and update dates from the detail operation
**Use:** separate genuinely new adverts from re-listings, and measure absorption in a market with no transaction record to lean on.

#### 4. Size the new-build pipeline

**Developers and land buyers watching where new supply lands.**

**Input:** the new-build development type paired with All of Angola
**Output:** every project the portal lists, with the ones it has certified flagged
**Use:** open the interesting ones for the amenity block and the full photo set, then rank developers by how much stock they are advertising.

#### 5. Research a diaspora purchase

**Angolan buyers abroad, and the agents who serve them.**

**Input:** the same run shape against Angola, Portugal or Namibia
**Output:** prices in whichever currency the seller quoted, with a kwanza conversion where the advert is priced in dollars
**Use:** put Luanda and Lisbon stock side by side in one table, in one currency.

#### 6. Feed a property portal or CRM

**Proptech teams loading a listings table on a schedule.**

**Input:** a nightly run over the slices you care about
**Output:** numeric prices and areas, arrays for the amenity checklists, ISO dates and absolute photo URLs
**Use:** load it straight in. A complete refresh of the portal is about 210 requests, so the nightly job can take everything instead of a sample.

#### 7. Comparables for valuation and lending

**Appraisers and mortgage teams assembling an evidence pack.**

**Input:** a zone and a property type, then the detail operation on the closest matches
**Output:** price, floor and plot area, condition, furnishing, amenities and photos
**Use:** an appraisal file backed by live asking prices rather than by anecdote.

***

### 🔗 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/angocasa-property-scraper').call({
  operation: 'search',
  dealType: 'arrenda',
  propertyType: 'apartamento',
  location: 'angola-luanda-talatona',
  maxItems: 200
});

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/angocasa-property-scraper').call(
    run_input={
        'operation': 'search',
        'dealType': 'venda',
        'propertyType': 'terreno',
        'location': 'angola',
        'maxItems': 1000,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['listingId'], item['price'], item['currency'], item['localitySlug'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~angocasa-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","dealType":"venda","propertyType":"vivenda","location":"angola-luanda-benfica_inclui_lar_do_patriota_","maxItems":300}'
```

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

1. **Trigger**: a daily schedule, or a webhook from your own app
2. **HTTP Request**: start the Actor with your input and wait for the run to finish
3. **Process**: read the dataset and filter on `price`, `bedrooms`, `usableAreaSqm` or `localitySlug`
4. **Action**: append to Google Sheets, write to Postgres or Airtable, or push new advertisers into your CRM

***

### 📊 Performance & Pricing

#### Free plan

- **25 adverts per run**, with every field, every place and both operations
- No credit card, no API key, no setup
- Enough to check the fields and the coverage before you commit

#### Paid plans

- **No per-run cap**, up to 20,000 adverts in a single run
- 50 adverts per request, so a 1,000-advert sweep is 20 requests
- Charged per advert returned, never for adverts that fail

| Event | Price | What it covers |
|---|---:|---|
| Property Search | $0.0015 per advert | Each advert returned by a results page, with its contact numbers |
| Property Detail | $0.0045 per advert | Each advert opened on its own page for amenities, photos and dates |
| Actor start | $0.005 per run | One charge when the run begins |

$1.50 per thousand adverts on Property Search, contact numbers included. The other AngoCasa Actor on the Store lists at $0.01667 per result, about eleven times that.

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

***

### ❓ Frequently Asked Questions

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

**Q: How many adverts are there in total?**
A: About 10,500 across the whole portal, of which roughly 10,250 sit in Luanda province. That is the real size of the Angolan online property market. At 50 adverts a request, taking all of it is about 210 requests.

**Q: Why is there no price, bedroom or sort filter?**
A: Because the portal's own search does not have one. Its result pages narrow by deal type, property type and place, and nothing else. A price or typology token in the address is ignored and the unfiltered list comes back, so shipping such a filter would quietly bill you for a full sweep. Price, typology and bedroom count arrive on every row instead, with area wherever the advert publishes it, so you can filter in your own tool afterwards.

**Q: Are prices in kwanzas or dollars?**
A: Whichever the seller quoted. Most adverts are in kwanzas; higher-end ones are often quoted in US dollars, and the portal prints a kwanza conversion beside them that arrives in its own `priceAoa` field.

**Q: Do I get the seller's phone number?**
A: Yes, on every row, from the search operation alone. A landline or mobile number and a WhatsApp number both come back. The detail operation is not needed for contacts.

**Q: Can I pass just the advert number instead of the full link?**
A: No, and that is the site rather than the Actor. AngoCasa has no page that an advert ID alone opens: an address only resolves when it carries the property type, typology, province and locality too. Copy the address from your browser and it works.

**Q: What does Property Detail add that Property Search does not have?**
A: The seller's complete text instead of the grid teaser, the interior, exterior and extras checklists, and every photo at full size. It also adds floor and plot area, condition, furnishing, bathroom count, the publication and update dates, and the advertiser's profile link, account type and registration date.

**Q: Can I search by neighbourhood?**
A: Yes, for Luanda: 39 named zones, among them Talatona, Ingombota, Benfica, Camama, Kilamba, Maianga, Alvalade, Morro Bento and Viana. The other 17 provinces are selectable at province level, which is how the portal itself indexes them.

**Q: Why are some provinces empty?**
A: Because they have no adverts today. Bié, Cuando Cubango, Cunene, Lunda Sul and Moxico each return zero, and several others hold only a handful. They stay in the list because they are real places that can fill up, and a run against an empty one finishes cleanly rather than erroring.

**Q: Does a long sweep return duplicates?**
A: No. A full 15-page drain returned 701 adverts with no repeats. Advert IDs are also de-duplicated within a run before anything is charged.

**Q: Is the data in Portuguese?**
A: The site is Portuguese and the seller's own words come back unchanged. The structured fields are translated: deal type, property type and condition each arrive in English with the Portuguese original kept alongside.

**Q: What output formats are available?**
A: JSON, CSV, Excel and XML, exported from the dataset or read through the API.

**Q: How many runs can I start?**
A: Paid Apify plans have no limit. Free plans get a daily allowance of 10 unbilled runs and 30 runs in total, which resets at 00:00 UTC.

***

### 🐛 Troubleshooting

**The run returned far more adverts than the zone should hold**

- **How many adverts** was probably set high while the place was left on All of Angola. Pick the province or zone you mean, and set a maximum you are happy to pay for.

**The search matched nothing**

- The run finishes with a message saying so and charges for no adverts. It never widens the search to fill the gap. Set **Property type** to All types, or move up from a Luanda zone to the whole province.

**A detail address was skipped**

- Property Detail needs the advert's full web address as your browser shows it, ending in the advert number. An advert number on its own, or a link to a results page, cannot be opened.

**The same query returned the adverts in a different order**

- The portal's result order is not stable between requests, and it offers no sort. Pagination is sound and IDs are de-duplicated, so a full sweep is complete either way. Sort in your own tool once the data has landed.

**The Actor stopped at 25 adverts**

- That is the free-plan cap for a single run. Adding credits or a payment method in Apify Console lifts it.

**A page came back empty or slow**

- The site is occasionally unavailable for a few minutes. Re-run, and the request will go through.

***

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

AngoCasa is a trademark of its owner. This Actor is not affiliated with, endorsed by or sponsored by AngoCasa, and reads only pages the site publishes publicly.

***

### 🤝 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/angocasa-property-scraper/changelog.md

# Actor input Schema

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

Property Search walks the portal's result grid and returns 50 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 amenity block, every photo and the publication date. One operation per run.

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

Sale adverts carry an asking price, rent adverts a monthly rent, and every row is labelled either way. Roughly three adverts in five are for sale. These are the only two deal types the portal's search actually honours — its short-stay section is not reachable from the search grid, so it is not offered here.

## `propertyType` (type: `string`):

Apartments and villas are the two deep sections and together are about four adverts in five. Land plots are sale-only. The long tail — hotels, rooms, restaurants, farms, builders' yards — holds a few dozen adverts each nationally, so pair those with All of Angola rather than a single Luanda zone.

## `location` (type: `string`):

Angola as a whole, one of its 18 provinces, or one of the 39 named Luanda zones. Luanda holds about 10,250 of the roughly 10,500 adverts on the portal, and inside it Talatona, Benfica and Ingombota are the deep ones. Portugal and Namibia carry the portal's small diaspora stock. Every value in this list was checked against the live site and narrows the result set; the portal's own country menu also shows South Africa, Mozambique, Guinea-Bissau, São Tomé and the UAE, but its search returns the…

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

Stops the sweep once this many adverts have been returned. The portal serves 50 per request, so 100 is two requests. Set it above the slice's own size to drain it completely — All of Angola is about 10,350 adverts, Luanda about 10,250, Talatona about 2,650.

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

Used by Property Detail. Paste the full address of an AngoCasa advert, exactly as it appears in your browser. An advert number on its own will not work: AngoCasa has no page that an ID alone opens, so the address is the only way in. Ignored by Property Search.

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

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

## Actor input object example

```json
{
  "operation": "search",
  "dealType": "listar-todos",
  "propertyType": "all",
  "location": "angola-luanda",
  "maxItems": 100,
  "propertyUrl": "https://www.angocasa.com/apartamento/t3/luanda/kilamba/vender-apartamento-t3-na-urbanizacao-kk5000/0203827/",
  "propertyUrls": []
}
```

# Actor output Schema

## `angocasaAdverts` (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": "listar-todos",
    "propertyType": "all",
    "location": "angola-luanda",
    "maxItems": 100,
    "propertyUrl": "https://www.angocasa.com/apartamento/t3/luanda/kilamba/vender-apartamento-t3-na-urbanizacao-kk5000/0203827/",
    "propertyUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/angocasa-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": "listar-todos",
    "propertyType": "all",
    "location": "angola-luanda",
    "maxItems": 100,
    "propertyUrl": "https://www.angocasa.com/apartamento/t3/luanda/kilamba/vender-apartamento-t3-na-urbanizacao-kk5000/0203827/",
    "propertyUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/angocasa-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": "listar-todos",
  "propertyType": "all",
  "location": "angola-luanda",
  "maxItems": 100,
  "propertyUrl": "https://www.angocasa.com/apartamento/t3/luanda/kilamba/vender-apartamento-t3-na-urbanizacao-kk5000/0203827/",
  "propertyUrls": []
}' |
apify call sian.agency/angocasa-property-scraper --silent --output-dataset

```

## MCP server setup

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