Properati Scraper | Colombia Property Listings
Pricing
from $2.20 / 1,000 listings
Properati Scraper | Colombia Property Listings
Extract Properati sale and rental listings from Colombian city searches and listing links in Colombia, Argentina, Peru and Ecuador. Get prices, property features and available contact details. Pay per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 listings
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Features
Share
Extract Properati property listings from Colombian city searches and listing links in Colombia, Argentina, Peru and Ecuador as exportable rows.
- Sale and rental prices, bedrooms, bathrooms and property size.
- Listing IDs, source links, location labels and market currencies.
- Optional listing details with available phone numbers, addresses, agency names and photos.
- JSON, CSV and Excel exports for property comparisons and reporting.
- Pay for delivered rows: $3 per 1,000 rows on the Free plan, plus a start fee.
What does Properati Scraper do?
Properati Scraper collects publicly available property listings. Use a Colombian city search to discover properties, or supply specific listing links from properati.com.co, properati.com.ar, properati.com.pe or properati.com.ec. Each row represents one property listing, not one agency or search page.
- City search: fill
geoand choose sale or rent, property type and optional bedroom count. - Listing details: fill
detailUrlswith existing listing links. Several links can share a run. - Detail enrichment: set
enrichDetailstotrueto add available contact and property details to search rows. It is off by default and updates the same row, with no separately billed row.
The input form offers Colombian cities. Use direct listing links for the other three markets; their fields can differ.
What data can you extract from Properati?
Search and detail results share one listing format. Optional fields depend on what each listing shows. Examples are illustrative, not a live property or contact.
| Field | Description | Example |
|---|---|---|
listingId | Listing identifier from its link | REPLACE_WITH_LISTING_ID |
url | Link to the individual listing | https://www.properati.com.co/detalle/REPLACE_WITH_LISTING_ID |
title | Listing title | Apartment for sale in Bogotá |
name | Display name; may fall back to the listing ID | Apartment for sale in Bogotá |
type | Property type used in the dataset preview | apartamento |
status | Listing record status, not a transaction confirmation | listed |
country | Country code for the listing's market | CO |
authority | Source domain without the subdomain prefix | properati.com.co |
priceText | Price as displayed | $ 450.000.000 |
priceAmount | Numeric asking price when readable | 450000000 |
currency | Currency of the displayed price | COP |
localityLabel | Location label on a search result | Bogotá |
bedrooms | Bedroom count | 2 |
bathrooms | Bathroom count | 2 |
areaText | Property size with source units | 70 m² |
operation | Sale or rent label; wording can vary by market | venta |
propertyType | Source property category | apartamento |
phones | Available detail-page contacts with type labels | [{"value":"+1 555 0100","type":"mobile"}] |
address | Available address components | {"street":"Example Street 123","country":"CO"} |
geo | City slug in search rows; coordinates in detail rows when available | {"lat":4.6,"lng":-74.1} |
org | Agency information, not the name of an individual | {"name":"Example Agency"} |
web.socials | Available social contact entries, including WhatsApp | [{"type":"whatsapp","value":"+1 555 0100"}] |
images | Listing photo URLs | ["https://example.com/property.jpg"] |
stratum | Property stratum when present on a detail page | 4 |
constructionYear | Construction year when shown | 2018 |
floor | Floor number when shown | 3 |
leadAbsences | Reasons when phones, emails, web.socials or the street address is empty | {"emails": "not_verified (…)"} |
scrapedAt | Collection timestamp | 2026-10-24T00:00:00Z |
Search-only rows do not supply phone numbers. Detail contacts may include phones entries with type set to whatsapp. Agency names belong in org, while person remains empty. The Actor does not provide email addresses. An empty field does not show the property lacks that feature.
How to scrape Properati
- Open Properati Scraper in Apify Console.
- Fill
geofor a city search, or paste existing listing links intodetailUrls. - Set
maxResultsto3for a first sample. LeavesearchTypeonauto. - Click Start and wait for the run to finish.
- Open the dataset and download the rows, or retrieve them through the API.
Empty input {} starts an example search for Bogotá apartments for sale, capped at 3 rows using the form's sample values. It is a normal billed run, not a free preview. Filling one target field selects its mode. With auto, listing links take priority over geo when both are supplied.
City search
Choose a geo slug from the form, such as bogota-d-c-colombia. Use operation values venta for sale or arriendo for rent. bedrooms adds a bedroom filter. page and maxPages request a starting page and page count; inventory or the row limit can end collection earlier. Bogotá apartment sale and rental searches are starting examples.
Listing details
Copy current /detalle/ links from Properati search results into detailUrls. Replace the example placeholder first. Links from the four supported country domains are accepted; subdomains are normalized and query strings are removed. Duplicate links create no extra rows. Set enrichDetails for search enrichment, not to activate direct detail mode.
What to fill in
| Field | What to enter | Default |
|---|---|---|
searchType | auto, search or detail | auto |
geo | One Colombian city slug from the form | Sample: bogota-d-c-colombia |
detailUrls | List of existing Properati /detalle/ URLs | Empty |
maxResults | Maximum rows per city search or detail URL, from 1 to 200 | 70; form sample 3 |
propertyType | Property category, such as apartamento or casa | apartamento |
operation | venta or arriendo | venta |
bedrooms | Bedroom filter from 1 to 20; omit for no filter | Not set |
maxPages | Requested number of search pages, from 1 to 20 | 1 |
page | Starting search page, from 1 to 20 | 1 |
enrichDetails | Add available details to search rows | false |
City search with optional enrichment:
{"geo": "bogota-d-c-colombia","operation": "venta","propertyType": "apartamento","bedrooms": 2,"enrichDetails": true,"maxResults": 3}
Direct details; replace the placeholder with a current listing link:
{"detailUrls": ["https://www.properati.com.co/detalle/REPLACE_WITH_LISTING_ID"],"maxResults": 1}
maxItems and limit are aliases of maxResults. Other accepted aliases include city for geo, urls for detailUrls, and pdp for detail mode. sale and rent become venta and arriendo.
Unknown fields do not fail the run: close misspellings can be corrected and other unknown fields are ignored with a note. Numeric values may be normalized or clamped, so inspect the INPUT_REPORT record in the default key-value store to see what was filled, corrected or ignored. The Actor writes this report before input validation completes.
Invalid listing links and unsupported modes stop before collection with a message such as INVALID_INPUT: detailUrls — use full Properati listing links. No listing rows are charged for that failure; the start fee can still apply.
Output example
This illustrative search row uses a placeholder listing ID; it is not a live listing, and fields may be absent.
{"name": "Apartment for sale in Bogotá","type": "apartamento","status": "listed","country": "CO","authority": "properati.com.co","listingId": "REPLACE_WITH_LISTING_ID","url": "https://www.properati.com.co/detalle/REPLACE_WITH_LISTING_ID","title": "Apartment for sale in Bogotá","priceText": "$ 450.000.000","priceAmount": 450000000,"currency": "COP","localityLabel": "Bogotá","bedrooms": 2,"bathrooms": 2,"areaText": "70 m²","operation": "venta","propertyType": "apartamento","geo": "bogota-d-c-colombia","phones": [],"leadAbsences": {"phones": "not_verified (phone is not read from the search card)","emails": "not_verified (agent and agency email is not read from Properati pages)","web.socials": "not_on_list_page (search card has no WhatsApp link; it is read on the detail page)"},"images": [],"scrapedAt": "2026-10-24T00:00:00Z"}
You can export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. JSON preserves nested fields such as phones and address; pick needed columns for spreadsheets.
Why use this Properati scraper?
- Row-based billing. Listing charges apply to rows written to the dataset, not unsuccessful page attempts. The separate start fee still applies.
- Partial delivery. Returned partial results are delivered and marked in
RUN_SUMMARY. Rows already written remain in the dataset; an interrupted run does not save undelivered rows. - Readable input errors. Validation errors name the affected field and suggest a correction.
- Source-based values. Missing contact details stay empty; a missing title falls back to the listing ID.
- Several listing inputs. Supply multiple detail links in one run.
- No proxy configuration. You do not need to set up proxies.
How much does it cost to scrape Properati?
The Actor uses pay-per-event pricing. One start event costs $0.005 per GB of run memory, with at least one event. The default 512 MB configuration therefore costs $0.005 to start. Platform usage is included in these prices.
| Apify plan | Start fee at 512 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.0022 | $2.20 |
| Diamond | $0.005 | $0.0022 | $2.20 |
maxResultsapplies to each input: a city search or detail URL. Its default is 70 and its maximum is 200; larger-than-default requests are collected in parts of up to 70 rows.- A detail URL identifies one listing, so a higher row limit does not multiply it.
- Free Apify plan runs are capped at 200 rows, and this Actor allows 10 runs for free-plan users.
- Set Maximum cost per run in the run options (
maxTotalChargeUsdin the API) to cap the whole run's charge. It is not a field in the Actor's input JSON. - The Apify Free plan includes $5.00 in monthly usage credit (about 1,666 rows at
$0.003per row across Free-plan runs capped at 200 rows per run).
Example: a default-memory run delivering 3 rows on the Free plan costs 3 × $0.003 + $0.005 = $0.014. A successful run with no matching listings has no row charge, but the start fee still applies.
Use with AI agents and the API
Apify MCP server
Claude, ChatGPT, Cursor and VS Code clients with remote MCP support can use:
https://mcp.apify.com?tools=lentic_clockss/properati-scraper
Sign in with Apify when prompted through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The Actor tool starts a run and returns run and dataset IDs. Use get-dataset-items to read the rows; add that tool to the client's configuration if needed.
For clients without remote support, run npx @apify/actors-mcp-server --tools lentic_clockss/properati-scraper with your APIFY_TOKEN configured privately.
Example prompt: “Find 3 Bogotá apartments for sale using geo=bogota-d-c-colombia, operation=venta and maxResults=3. Return the price, bedroom count and listing link.”
- Agent execution note: Set
maxResultsbetween5and20on exploratory tool calls to keep responses compact, and readRUN_SUMMARYandINPUT_REPORTfrom the default key-value store to inspect normalized inputs and delivered row counts.
Apify API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/properati-scraper").call(run_input={"geo": "bogota-d-c-colombia", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/properati-scraper').call({geo: 'bogota-d-c-colombia', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Or send the input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~properati-scraper/runs with an Authorization: Bearer header. After the run finishes, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Standby HTTP endpoint
The endpoint https://lentic-clockss--properati-scraper.apify.actor offers read-only information:
| Route | Returns |
|---|---|
GET / | Service information |
GET /health | Service health response |
GET /input-example | A small example input |
GET /openapi.json | The endpoint specification |
These routes do not collect listings. There is no POST /v1/collect route for this Actor; start a normal Actor run through Console, MCP or the Apify API to obtain rows.
Integrations
Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable or your own webhook. Apify Schedules can start repeat runs for periodic property comparisons.
En español
Obtén anuncios de Properati para comparar precios, superficies y características de inmuebles. Para buscar en Colombia, elige la ciudad en geo, indica venta o arriendo en operation y empieza con maxResults en 3. Si ya tienes enlaces de anuncios, pégalos en detailUrls; también se aceptan enlaces de Argentina, Perú y Ecuador. Activa enrichDetails para añadir a los resultados de búsqueda los datos de contacto y las fotos que estén disponibles. No todos los anuncios incluyen teléfono o dirección. El cobro se realiza por fila entregada, además del cargo de inicio. Puedes descargar los resultados en CSV, Excel o JSON.
FAQ
Is it legal to scrape Properati?
This Actor collects public data. You are responsible for checking the site's terms and applicable data protection law. Public availability does not remove privacy obligations; processing personal contact data requires a lawful basis.
Why did my run end as ABORTED?
A run can be aborted manually or by an API request. Check its status message and log for the actual reason. This Actor does not automatically resume an aborted run. Inspect the dataset before deciding whether to start another run.
How many results can I get?
Set maxResults between 1 and 200 per input. Free-plan runs have a 200-row total cap and a 10-run allowance. Fewer rows can be returned when inventory is exhausted, links are unavailable or the cost limit is reached.
Why are some fields empty?
A listing may omit the price, size, address or contact information. Search-only rows have no phone numbers; use detail links or enrichment when those fields matter. Emails are not provided. Missing values are not estimates or zero values. leadAbsences gives the reason when phones, emails, web.socials or the street address is empty: not_verified (<note>) when the Actor did not read or find it, not_on_list_page (<note>) when it is read only on the detail page, and gated (<note>) when the WhatsApp button asks for an email or phone first.
Why do leadAbsences reasons differ from earlier runs?
Rows written before 2026-11-13 08:49 UTC used Chinese labels, shown JSON-escaped, and a quality block that marked emails and web.socials as not_present; the Actor no longer writes quality.
| Before | Since |
|---|---|
"\u672a\u9a8c\u8bc1" (phones, address) | not_verified (<note>) |
"\u672c\u7ad9\u65e0\uff1a<evidence>" (emails, web.socials) | not_verified (<note>), or not_on_list_page (<note>) for web.socials on search rows |
"\u95f8\u95e8\u9501" (web.socials on detail rows) | gated (<note>) |
Why did my run stop with a proxy message?
"No proxy is available for this run." and "New runs are paused until the live proxy configuration is confirmed." mean the Actor could not start collecting, so no rows are delivered. Start the run again later. Before 2026-11-13 08:49 UTC the first message ended with is required for curl provider. and the second was in Chinese, beginning "\u5b9e\u65f6\u4ee3\u7406\u914d\u7f6e" (JSON-escaped).
Can I scrape markets outside Colombia?
Use detailUrls from Properati Argentina, Peru or Ecuador. The city dropdown is Colombian. Do not use searchType=other-tld: it is rejected, as are map and projects.
Does enrichment cost an extra row?
No. enrichDetails adds available fields to the existing row. It can take longer and does not guarantee a phone number, address or photo.
What if no properties match my search?
A confirmed no-match search can succeed with zero rows. Check RUN_SUMMARY for the explanation. An unavailable page or collection error is not automatically treated as an empty market; failures may also write ERROR_SUMMARY.
Can I supply several cities in one run?
geo accepts one city slug, not an array. Start separate city searches. detailUrls accepts multiple listing links in one run, with duplicate listings removed.
Limitations
- No independent map results, development-project mode or contact-form submission.
- Only the four named Properati country domains are accepted for detail links; other property portals are outside scope.
- City and property-type options do not guarantee current inventory; start with a small sample.
- Search rows and detail rows can use different shapes for
geo; handle a city string, a coordinate object or an empty value. - Addresses, phone numbers and agency details are conditional. Image lists are limited to 40 URLs per listing.
- Listing prices are asking prices, not completed-sale values. A removed or changed listing can reduce rows delivered.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- Craigslist Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Apartments.com Scraper
- Email Validator
- Phone Number Validator
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Found a problem or need another field? Open an issue in the Issues tab of this Actor's page and include the run ID and the input you used.