# Editus.lu Business Directory Scraper (`dariomory/editus-lu-business-directory-scraper`) Actor

Scrape Luxembourg business listings from Editus.lu, including company names, addresses, phone numbers, websites, categories, opening hours, coordinates, and ratings.

- **URL**: https://apify.com/dariomory/editus-lu-business-directory-scraper.md
- **Developed by:** [Dario Mory](https://apify.com/dariomory) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 business results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Editus.lu Business Directory Scraper

Extract public Luxembourg business listings from Editus.lu. Start from a result, activity, location, or business-profile URL and receive structured company names, addresses, phone numbers, emails, websites, categories, opening hours, coordinates, images, and public ratings.

### Why use this Actor?

- Build targeted Luxembourg company and supplier lists
- Research local markets and competitors
- Enrich CRM records with public business contact details
- Schedule recurring directory monitoring
- Export data to JSON, CSV, Excel, XML, webhooks, or the Apify API

### Input

Paste one or more Editus.lu search, activity, location, or individual business-profile URLs.

```json
{
  "startUrls": [
    {
      "url": "https://www.editus.lu/en/luxembourg-1v/restaurant-800r"
    }
  ],
  "maxItems": 100,
  "maxPages": 20,
  "blockMedia": true
}
```

Editus uses DataDome anti-bot protection. The Actor includes an owner-funded premium residential proxy pool in Luxembourg, so Store users do not need to configure or purchase a separate proxy.

Keep `blockMedia` enabled (the default) to skip images, fonts, and video while preserving the business fields. This makes runs faster and reduces paid proxy bandwidth.

### Reliability and proxy costs

Premium Luxembourg proxy traffic is included in the result price. Sticky sessions keep cookies and an IP together, failed sessions rotate automatically, and Camoufox renders protected pages like a real browser. Proxy credentials stay in encrypted Actor secrets and never appear in inputs, logs, or datasets.

The Actor resolves redirected listing aliases to a canonical profile URL before saving a result. This prevents duplicate businesses from being returned or charged.

### Output

```json
{
  "companyName": "Example Business S.A.",
  "description": "Public company-profile description.",
  "profileUrl": "https://www.editus.lu/en/example-business-luxembourg-123",
  "website": "https://example.com/",
  "externalLinks": ["https://example.com/"],
  "phones": ["+352123456"],
  "emails": ["hello@example.com"],
  "streetAddress": "1 Example Street",
  "postalCode": "L-1000",
  "city": "Luxembourg",
  "country": "LU",
  "categories": ["Business services"],
  "openingHours": ["Mo-Fr 09:00-18:00"],
  "latitude": 49.61,
  "longitude": 6.13,
  "rating": 4.5,
  "reviewCount": 10,
  "imageUrl": "https://example.com/image.jpg",
  "source": "Editus.lu public business profile",
  "scrapedAt": "2026-08-02T12:00:00.000Z"
}
```

Some businesses do not publish every field. Missing arrays are empty, and missing scalar values are `null`.

### Data boundary

The Actor collects fields displayed on public Editus business listings. It does not attempt to access subscription-only administrative, financial, legal, or beneficial-owner data, and it excludes personal contact-person extraction.

### Pricing

| Event name | Title | Description | Price |
| --- | --- | --- | --- |
| `apify-actor-start` | Actor start | Starts one Actor run and initializes a protected browser session. | `$0.005` |
| `business-result` | Business result | One unique enriched public Editus.lu business profile saved to the dataset. | `$0.020` |

`apify-default-dataset-item` is not charged, so each saved business is billed exactly once. The result price includes the external premium proxy cost; normal Apify platform usage is shown separately by Apify.

### Failure handling

- Datacenter and local IP addresses are commonly blocked by Editus. The Actor handles the required residential proxy automatically.
- A proxy session can occasionally receive a DataDome challenge; failed sessions rotate and retry automatically.
- Editus can change its markup and anti-bot configuration. Failed pages are retried and reported in the run log.

### API

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('dariomory/editus-lu-business-directory-scraper').call({
    startUrls: [{
        url: 'https://www.editus.lu/en/luxembourg-1v/restaurant-800r',
    }],
    maxItems: 50,
});

console.log(run.defaultDatasetId);
```

This Actor is independent and is not affiliated with or endorsed by Editus.lu.

# Actor input Schema

## `startUrls` (type: `array`):

Search result, category, location, or direct business profile URLs. The default extracts restaurant listings.

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

Maximum number of unique business profiles to save. Each profile is loaded in a stealth browser, so large runs take hours.

## `maxPages` (type: `integer`):

Safety limit for result-page pagination.

## `blockMedia` (type: `boolean`):

Reduces proxy bandwidth and run cost without removing business data.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.editus.lu/en/luxembourg-1v/restaurant-800r"
    }
  ],
  "maxItems": 100,
  "maxPages": 20,
  "blockMedia": true
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.editus.lu/en/luxembourg-1v/restaurant-800r"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dariomory/editus-lu-business-directory-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 = { "startUrls": [{ "url": "https://www.editus.lu/en/luxembourg-1v/restaurant-800r" }] }

# Run the Actor and wait for it to finish
run = client.actor("dariomory/editus-lu-business-directory-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.editus.lu/en/luxembourg-1v/restaurant-800r"
    }
  ]
}' |
apify call dariomory/editus-lu-business-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dariomory/editus-lu-business-directory-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4o4tfgGn99pqTWvrN/builds/6HPlpl8XyDI5nPbye/openapi.json
