# Daft.ie Commercial Property Scraper (`studio-amba/daft-commercial-scraper`) Actor

Scrape commercial property listings from Daft.ie: offices, retail units, industrial space, agricultural land, development land and investment properties across Ireland. Prices with the site's own wording (POA preserved), floor areas, BER, coordinates and agent contacts.

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

## Pricing

from $1.20 / 1,000 result scrapeds

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

## Daft.ie Commercial Property Scraper

Extract commercial property listings from Daft.ie, Ireland's largest property portal. Covers offices, retail units, industrial space, restaurants, bars and hotels, investment properties, and the full land market: agricultural land, development land, commercial and industrial sites.

### What does this actor do?

You give it an Irish location (county, city or town), pick sale or rent, and optionally narrow to a segment such as offices or agricultural land. It returns structured JSON for every listing: address, price with the site's own wording, floor area or site size with its unit, BER rating, coordinates, photos, and the marketing agent with phone number.

### Why use it?

- **Market research.** Track asking prices and rents for offices, retail and industrial space across Irish counties.
- **Land sourcing.** Agricultural land and development sites are a large part of the Irish commercial market. Filter them directly and feed the results into your own pipeline.
- **Investment screening.** Investment properties and full pricing context in one dataset.
- **Agent prospecting.** Every record includes the marketing agency and phone number where published.

Commercial listings in Ireland are often priced on application. This actor never fakes a number: POA and "Rent Negotiable" listings get a null `price`, and the exact display string is preserved in `priceText`. When a price is quoted per month, per week, per annum or per sq ft, the quote unit is captured in `priceUnit`.

### How to scrape Daft.ie commercial property data

1. Set `searchQuery` to an Irish location, for example `Dublin`, `Cork City`, `Galway`, `Limerick` or `Athlone`. Leave it empty to search all of Ireland.
2. Pick `listingType`: `sale` or `rent`.
3. Pick a `segment`, or keep `all`.
4. Set `maxResults` and run. Results land in the default dataset as JSON, downloadable as CSV, Excel or via the API.

The location is resolved through Daft.ie's own location lookup, so anything you could type into the search box on the site works here too: counties ("Mayo"), cities ("Cork City"), towns ("Mullingar") or Dublin postal districts.

### Input options

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchQuery` | string | (empty) | Irish county, city or town. Empty = all of Ireland. |
| `listingType` | string | `sale` | `sale` or `rent`. |
| `segment` | string | `all` | `office`, `retail`, `industrial`, `land`, `agricultural-land`, `development-land`, `commercial-site`, `investment`, `hospitality` or `all`. |
| `minPrice` | integer | (none) | Minimum price in EUR. Filters rental price on rent searches. |
| `maxPrice` | integer | (none) | Maximum price in EUR. |
| `maxResults` | integer | `100` | Hard cap on returned listings (1 to 10,000). |
| `proxyConfiguration` | object | Residential, IE | Irish residential proxy recommended. |

The `land` segment bundles agricultural land, development land, commercial sites and industrial sites in one search. The specific land types are also available individually.

#### Example: offices to rent in Dublin

```json
{
    "searchQuery": "Dublin",
    "listingType": "rent",
    "segment": "office",
    "maxResults": 100
}
```

#### Example: sites and land for sale in Cork

```json
{
    "searchQuery": "Cork",
    "listingType": "sale",
    "segment": "land",
    "maxResults": 100
}
```

#### Example: farms for sale nationwide

```json
{
    "listingType": "sale",
    "segment": "agricultural-land",
    "maxResults": 500
}
```

### Output fields

| Field | Type | Example |
|-------|------|---------|
| `title` | string | `"The Exchange Building, Mayor Street Lower, IFSC, Co. Dublin"` |
| `url` | string | Daft.ie listing URL |
| `listingType` | string | `"sale"` or `"rent"` |
| `segment` | string | `"office"`, `"retail"`, `"industrial"`, `"agricultural-land"`, `"development-land"`, `"commercial-site"`, `"investment"`, `"hospitality"` |
| `propertyType` | string | `"Office Space"`, `"Retail Unit"`, `"Agricultural Land"` |
| `price` | number or null | `975000`, `1200` (null when price on application) |
| `priceText` | string | `"€1,200 per month"`, `"Price on Application"`, `"AMV: Price on Application"` |
| `priceUnit` | string or null | `"per month"`, `"per annum"`, `"per sq ft"` (null for plain sale prices) |
| `currency` | string | `"EUR"` (always, quoted alongside every price) |
| `surface` | number or null | `1784`, `0.5` |
| `surfaceUnit` | string or null | `"m2"` for buildings, `"acres"` or `"hectares"` for land |
| `address` | string | Address as listed |
| `county` | string or null | `"Dublin"`, `"Cork"` |
| `eircode` | string or null | `"T12NP27"` |
| `latitude`, `longitude` | number or null | WGS84 coordinates |
| `berRating` | string or null | `"E"`, `"SI_666"` (BER exempt) |
| `imageUrl` | string or null | Primary photo |
| `imageUrls` | array | All photos |
| `agencyName` | string or null | `"Fox & Gallagher"` |
| `agencyPhone` | string or null | `"096 70900"` |
| `agencyUrl` | string or null | Daft.ie agent page |
| `publishedDate` | string or null | ISO 8601 publish date |
| `source` | string | `"daft.ie"` |
| `scrapedAt` | string | ISO 8601 scrape timestamp |

### Pricing and cost

You pay per result: one listing = one dataset item. There are no detail-page fetches, so a run of 100 results makes about three requests and finishes in well under a minute. A run's usage cost only settles after the run reports SUCCEEDED; a failed run does not charge for results, and a mid-run dataset read undercounts the final cost.

### Notes and limits

- POA is common in Irish commercial property, and especially on office and investment listings. Expect a meaningful share of null prices; the site's exact wording is always in `priceText`.
- Land sizes are quoted in acres or hectares, building sizes in square metres. Check `surfaceUnit` before comparing `surface` values.
- The same physical property can be listed under two property types (for example Commercial Site and Investment Property). Those are separate ads on Daft.ie and appear as separate records.
- Price filters (`minPrice`/`maxPrice`) exclude POA listings, because Daft.ie cannot compare an unquoted price against a range.
- A single search is paginated 50 listings at a time from Daft.ie's own listings API, so results match what the website shows for the same search.
- Residential listings are a separate section of Daft.ie and a separate scraper (Daft.ie Scraper for houses and apartments).

### Legal

This actor scrapes publicly available listing data. You are responsible for how you use the data; respect Daft.ie's terms of service and applicable law, including GDPR for any personal data such as agent contact details.

# Actor input Schema

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

Irish county, city or town (e.g. 'Dublin', 'Cork City', 'Galway'). Resolved through Daft.ie's own location lookup. Leave empty to search all of Ireland.

## `listingType` (type: `string`):

Commercial property for sale or to rent.

## `segment` (type: `string`):

Commercial segment. 'land' bundles agricultural land, development land, commercial sites and industrial sites; the specific land types are also available individually.

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

Minimum price filter in EUR. For rentals this filters the rental price. Listings priced 'on application' are excluded by Daft when a price filter is set.

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

Maximum price filter in EUR. For rentals this filters the rental price.

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

Hard cap on the number of listings returned (1 to 10,000). One result = one listing.

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

Irish residential proxies recommended for reliable cloud runs.

## Actor input object example

```json
{
  "searchQuery": "Dublin",
  "listingType": "sale",
  "segment": "all",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IE"
  }
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "searchQuery": "Dublin",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/daft-commercial-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 = {
    "searchQuery": "Dublin",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/daft-commercial-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 '{
  "searchQuery": "Dublin",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IE"
  }
}' |
apify call studio-amba/daft-commercial-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/daft-commercial-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/zN5vKquVpcbjbmnru/builds/a5570ffwIktvFy7TO/openapi.json
