# OhneMakler Listing API Documentation

Scrappa's `GET /api/ohne-makler/listing` endpoint returns the complete exposé for one ohne-makler.net listing by id (numeric, or `OM-` prefixed).

## What the listing response returns

The price block ships `price`, `price_label`, the `price_on_request` flag, and `price_breakdown` rows (Kaufpreis plus Nebenkosten for sale listings, Kaltmiete/Warmmiete plus NK for rentals). Facts include `rooms`, `living_area_m2`, `plot_area_m2`, `condition`, `construction_year`, `object_art`, `object_type`, and the seller-published `summary` table. The energy block is published exactly as the seller filled it in — when the source carries no `Energieeffizienklasse`/`Verbrauch` data the response returns `energy: null`; absence is recorded, never guessed.

Also included: the full `sections` tables (Einzelheiten, Ausstattung, Lage, Energie, Sonstiges), seller `description` and `location_text`, `seller_type` (`"Privatangebot"` badge when published), `latitude`/`longitude` from the inline map center, the complete `gallery` of signed `media.ohne-makler.net` URLs (signature TTL is about 12 hours — URLs are re-extracted from a fresh read on every request and are never cached or proxied by Scrappa), `object_number`, and the page's JSON-LD `aggregate_rating`.

`attachments_available` is always `false`: PDF exposés are contact-gated on the source and out of scope.

## Liveness

A listing that no longer exists returns a non-billable 404 — the source either serves a literal 404 or a "Fehler 404" page, both treated as gone.

- **Documentation:** [https://scrappa.co/docs/ohne-makler-api/ohne_makler_listing](https://scrappa.co/docs/ohne-makler-api/ohne_makler_listing)
- **API group:** OhneMakler API
- **Endpoint:** `GET https://scrappa.co/api/ohne-makler/listing`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | Yes | Listing id: numeric (498791) or object number (OM-498791). |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/ohne-makler/listing?id=498791"
```

## Example response

```json
{
    "success": true,
    "listing": {
        "id": 498791,
        "object_number": "OM-498791",
        "title": "Helle Altbauwohnung mit Wintergarten",
        "url": "https://www.ohne-makler.net/immobilie/498791/",
        "available": true,
        "price": 2390,
        "price_label": "Kaltmiete",
        "price_on_request": false,
        "price_breakdown": [
            {
                "label": "Kaltmiete",
                "value": "2.390 \u20ac (zzgl. NK)"
            }
        ],
        "rooms": 3.5,
        "living_area_m2": 80,
        "plot_area_m2": null,
        "condition": "Erstbezug nach Sanierung",
        "construction_year": null,
        "object_art": "Wohnung",
        "object_type": "Erdgeschosswohnung",
        "energy": null,
        "seller_type": "Privatangebot",
        "latitude": 53.57727,
        "longitude": 9.95344,
        "gallery": [
            "https://media.ohne-makler.net/..."
        ],
        "attachments_available": false
    }
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 404 | Listing Gone | The listing id does not exist or the exposé expired (`listing_gone`). Non-billable. |
| 422 | Validation Error | A query parameter failed validation (for example a missing `id`). Non-billable. |
| 503 | Upstream Unavailable | The upstream exposé could not be fetched or parsed after retries. `error.code` is one of `upstream_unavailable`, `parser_drift`, `upstream_blocked`, or `transport_error`. Retryable and never billed. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
