# Ohne-Makler Scraper - German Property, No Agents · $1.5/1K (`listingworks/ohne-makler-scraper`) Actor

Extract property listings from ohne-makler.net (Germany) by location and property type: price, rooms, living area, plot area, postcode, town, URL, newest first.

- **URL**: https://apify.com/listingworks/ohne-makler-scraper.md
- **Developed by:** [Yusuke Suda](https://apify.com/listingworks) (community)
- **Categories:** Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 result items

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

## Ohne-Makler Scraper — German property from private sellers, no agency

Extract property listings from ohne-makler.net (Germany) by location and property type: price, rooms, living area, plot area, postcode, town, URL, newest first.

ohne-makler.net is Germany's portal for property sold or let without an estate agent, so there is
no commission to pay. Around 10,000 offers are live, most of them put up by the owners themselves.
This Actor turns the site's lists into a clean table. Each row gives:

- the listing title
- the price, or the monthly rent
- the number of rooms, the living area and, for houses and land, the plot
- the postcode, town and district
- a photo and the link to the listing

Press Start. The prefilled input returns flats for sale in Hamburg, so the first run needs no
configuration.

### What a row looks like

```json
{
  "title": "Helle 3-Zimmer-Wohnung mit viel Potential",
  "property_type": "apartment",
  "listing_type": "sale",
  "price": 349990,
  "currency": "EUR",
  "rooms": 3,
  "living_area_sqm": 60.4,
  "address": "22303 Hamburg (Winterhude)",
  "postal_code": "22303",
  "city": "Hamburg",
  "source_url": "https://www.ohne-makler.net/immobilie/491805/",
  "image_urls": ["https://media.ohne-makler.net/…"],
  "external_id": "491805"
}
```

#### The seller

The sellers on ohne-makler.net are mostly private people, so this Actor publishes no seller at all.
There is no agency column, and names, phone numbers and email addresses are never collected.

- This Actor reads the lists only and never opens the listing page, which is where the seller's
  contact details are.
- The site's map has a point for every listing. For a private seller that point is their home, so
  it is not published. The postcode, town and district are.
- Title and place are typed by the seller. An email address or phone number in them is removed.

#### The place

`address` is the place as the listing gives it, e.g. `22303 Hamburg (Winterhude)`. The district is
in brackets. `postal_code` and `city` are split out of it.

A town's list on ohne-makler.net also includes offers nearby, and the Actor keeps them. A search for
Hamburg returns listings in Hamburg itself and a few in towns around it, such as Schenefeld or Stade.
Each row keeps its own town, so you can filter them out if you want the city only.

#### Prices and areas

`price` is the asking price for a sale and the monthly rent for a let, in euros. A listing marked
"Preis auf Anfrage" (price on request) has no price, and the column is empty rather than zero.
`rooms` counts half rooms, as German listings do (`3.5`). `living_area_sqm` and `plot_area_sqm` are
in square metres. Offices and land carry no room count on the list, and none is made up.

`image_urls` holds the list photo. The link is signed by the site and stops working after about
12 hours, so download the photo in the same job if you need to keep it.

### What people use it for

Price monitoring for German property that is sold without commission, where owners set the price
themselves. Comparing rents and asking prices by postcode. And market research on what is offered
without an agent, by Bundesland, town and property type.

### Input

| Field | What it does |
|---|---|
| `location` | A Bundesland (`bayern`), a Bundesland and town as in the site's own URL (`bayern/munchen`, `hessen/frankfurt-main`, `schleswig-holstein/reinbek`), or a big town by name (`Hamburg`, `Berlin`, `München`, `Köln`, `Frankfurt`). Umlauts are fine. |
| `listingType` | `sale` (the default) or `rent`. |
| `propertyType` | `apartment`, `house`, `land` (for sale only) or `office`. Leave it empty for apartments and houses. |
| `maxItems` | Hard stop, so your bill is predictable. |
| `proxyConfiguration` | Off by default. Most runs do not need one. |

If the site does not know the town you give, the run fails and tells you. It does not return
unfiltered results.

There is no `postedAfter` input for this site. The lists show no listing date, so the Actor refuses
the input rather than guessing. It asks for the site's "newest first" order. To get what is new on
a daily run, compare `external_id` with the previous run.

### Pricing

$1.50 per 1,000 listings, dropping to $0.75 per 1,000 on higher Apify plans, plus $0.005 each time a
run starts. Platform usage is not passed on to you.

You are charged for rows you actually receive. If you set a maximum charge for the run, it stops
cleanly at that limit instead of overshooting it.

### Scope and limits

Public listings only, from the site's lists by type and place. The free-text search is closed to
crawlers by the site's robots.txt, so this Actor does not use it. Year built, floor, the full
description and the seller are not in the lists and are not collected. Prices are in euros.

If ohne-makler.net changes its page structure, the run goes red. It does not return zero rows and
report success. A silent scraper is worse than a broken one, because you find out weeks later. The
Actor also checks that every page answers the question it asked (type, sale or rent, place, order
and page number) and fails rather than delivering a page for something else.

A run that is blocked or cut short partway also goes red, even though the rows it did collect are in
the dataset and yours to keep. Red here means "this is not the complete answer", not "you lost the
data". On a schedule, a run that quietly came back short is the thing you most need to hear about.

Every run also publishes the site's own result count next to the rows it delivered, so you can see
"100 rows of 164 the site reports" without going back to the site to check. That number is what the
site says, not a promise about what one run returns.

### Same data, other countries

This Actor shares its output shape with the Bezrealitky Scraper (Czech Republic), the Immowelt
Scraper (Germany) and the Willhaben Immobilien Scraper (Austria). A parser you write for one keeps
working on the others.

### Support

Open an issue on this Actor with the run ID and your input. Answered within one business day.

# Actor input Schema

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

A Bundesland (bayern), a Bundesland and town as the site writes them in its URL (bayern/munchen, hessen/frankfurt-main, schleswig-holstein/reinbek), or a big town by name (Hamburg, Berlin, München, Köln). Town pages include offers nearby. A place the site does not know fails the run rather than returning unfiltered results.

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

Property for sale (Kauf) or for rent (Miete).

## `propertyType` (type: `array`):

Which lists to walk: apartment, house, land (for sale only), office. Leave empty for apartments and houses.

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

Stop after this many listings. ohne-makler.net serves 24 per page.

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

Off by default. Turn on (residential, in Germany) only if runs start getting blocked with 403/429.

## Actor input object example

```json
{
  "location": "Hamburg",
  "listingType": "sale",
  "propertyType": [
    "apartment"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

All commission-free German listings from this run: what each property is, what it costs, and its postcode and town.

## `pricing` (type: `string`):

The same listings reduced to the fields used for price analysis.

## `runReport` (type: `string`):

Pages read, records delivered, errors, and the verdict (ok, degraded or broken).

# 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 = {
    "location": "Hamburg",
    "propertyType": [
        "apartment"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("listingworks/ohne-makler-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 = {
    "location": "Hamburg",
    "propertyType": ["apartment"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("listingworks/ohne-makler-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 '{
  "location": "Hamburg",
  "propertyType": [
    "apartment"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call listingworks/ohne-makler-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,listingworks/ohne-makler-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/RyErAz0fmYB62vCD3/builds/XeJV4NyWRmNvvC6K7/openapi.json
