# Morizon Property Search API Documentation

Scrappa's `GET /api/morizon/search` returns Morizon property listings in Poland as structured JSON, for sale (`transaction=sale`, the default) or for rent (`rent`).

## What you get

One request returns one page of 35 listings and Morizon's own match count in `total`. Each listing has `id`, `url`, `title`, `price` and `price_per_m2` (amount, currency, formatted), omnibus prices, `area_m2`, `rooms`, `floor`, `address` with coordinates, dates, promotion flags, up to 10 `photos`, `plans` and the `contact` block with the agency and agent. Call the listing endpoint for the full description, fees, features and environment data.

## Filters are honoured

Morizon applies every filter itself, so `total` and the paging always describe the real result set. Unknown parameters are rejected with `422` instead of being ignored. `applied_filters` echoes what was sent. When you filter by price, area or rooms, an item that cannot confirm the filter (for example a developer offer without a price) is left out and counted in `meta.omitted_unverifiable`, so a page can hold fewer than 35 listings. Without a price filter, such offers are returned with `price` set to `null`.

## Locations

`location` takes an id from `/api/morizon/locations`. An id that does not exist returns `422` (`unknown_location`), because Morizon would otherwise ignore it and return listings from all of Poland.

## Sort

`sort` is one of `default`, `price_asc`, `price_desc`, `newest`, `oldest`, `price_m2_asc`, `price_m2_desc`, `area_asc`, `area_desc`, `rooms_asc` or `rooms_desc`.

## Pagination

`page` is 1-based with 35 listings per page. A page past the last page returns an empty list with the real `total`. It never returns another page's listings.

## Bathrooms

Morizon has no bathroom filter. The number of bathrooms is a field of the listing detail.

- **Documentation:** [https://scrappa.co/docs/morizon-api/morizon_search](https://scrappa.co/docs/morizon-api/morizon_search)
- **API group:** Morizon API
- **Endpoint:** `GET https://scrappa.co/api/morizon/search`

## 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 |
| --- | --- | --- | --- |
| `transaction` | string | No | sale (default) or rent. |
| `type` | string | No | flat (default), house, plot, commercial, garage or room. |
| `location` | string | No | Location id from /api/morizon/locations, for example 311510 for Kraków. |
| `price_min` | integer | No | Minimum price in PLN. |
| `price_max` | integer | No | Maximum price in PLN. |
| `area_min` | number | No | Minimum area in square metres. |
| `area_max` | number | No | Maximum area in square metres. |
| `rooms_min` | integer | No | Minimum number of rooms, a whole number. |
| `rooms_max` | integer | No | Maximum number of rooms, a whole number. |
| `market` | string | No | primary (new build) or secondary. |
| `owner_type` | string | No | private, agency or developer. |
| `floor_min` | integer | No | Lowest floor, 0 is the ground floor. |
| `floor_max` | integer | No | Highest floor. |
| `build_year_min` | integer | No | Earliest year of construction. |
| `build_year_max` | integer | No | Latest year of construction. |
| `price_m2_min` | integer | No | Minimum price per square metre in PLN. |
| `price_m2_max` | integer | No | Maximum price per square metre in PLN. |
| `plot_area_min` | number | No | Minimum plot area in square metres. |
| `plot_area_max` | number | No | Maximum plot area in square metres. |
| `balcony` | boolean | No | true to require a balcony. |
| `garden` | boolean | No | true to require a garden. |
| `terrace` | boolean | No | true to require a terrace. |
| `elevator` | boolean | No | true to require an elevator. |
| `basement` | boolean | No | true to require a basement. |
| `parking` | boolean | No | true to require a parking place or garage. |
| `last_floor` | boolean | No | true for top-floor homes only. |
| `with_photo` | boolean | No | true for listings with photos only. |
| `with_3d_view` | boolean | No | true for listings with a 3D view only. |
| `added_since` | string | No | Earliest date a listing was added, as YYYY-MM-DD. |
| `agency_id` | integer | No | Only listings of this company id (from the contact block of a listing). |
| `sort` | string | No | default, price_asc, price_desc, newest, oldest, price_m2_asc, price_m2_desc, area_asc, area_desc, rooms_asc or rooms_desc. |
| `page` | integer | No | Result page, 1-based. 35 listings per page. |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/morizon/search?transaction=sale&type=flat&location=311510&price_min=500000&price_max=700000&rooms_min=2&sort=price_asc"
```

## Example response

```json
{
    "success": true,
    "total": 4002,
    "returned": 1,
    "pagination": {
        "page": 1,
        "limit": 35,
        "pages_count": 115,
        "has_next_page": true,
        "has_previous_page": false
    },
    "applied_filters": {
        "transaction": "sale",
        "type": "flat",
        "price_min": 500000,
        "price_max": 700000,
        "rooms_min": 2,
        "location": "311510",
        "sort": "price_asc"
    },
    "listings": [
        {
            "id": "mzn2045462366",
            "numeric_id": 1540411861,
            "url": "/oferta/sprzedaz-mieszkanie-krakow-podgorze-duchackie-bialoruska-69-46m2-mzn2045462366",
            "full_url": "https://www.morizon.pl/oferta/sprzedaz-mieszkanie-krakow-podgorze-duchackie-bialoruska-69-46m2-mzn2045462366",
            "title": "mieszkanie na sprzeda\u017c",
            "description": "Najwa\u017cniejsze atuty: szybki dojazd do centrum i autostrady A4 ...",
            "price": {
                "amount": 764796,
                "currency": "PLN",
                "formatted": "764 796 z\u0142"
            },
            "price_per_m2": {
                "amount": 16300,
                "currency": "PLN",
                "formatted": "16 300 z\u0142/m\u00b2"
            },
            "omnibus": {
                "previous_sale_price": null,
                "previous_lowest_price": null
            },
            "area_m2": 46.92,
            "rooms": {
                "count": 2,
                "text": "2 pokoje"
            },
            "floor": {
                "number": 3,
                "text": "pi\u0119tro 3"
            },
            "address": {
                "country_code": null,
                "parts": [
                    "Krak\u00f3w",
                    "Podg\u00f3rze Duchackie"
                ],
                "street": "Bia\u0142oruska 69",
                "number": null,
                "county": null,
                "commune": null
            },
            "latitude": 50.0207,
            "longitude": 19.963,
            "added_at": "2025-04-10",
            "refreshed_at": null,
            "development": "Osiedle przy Malborskiej",
            "flags": {
                "top_promoted": false,
                "highlighted": false,
                "recommended": false,
                "has_3d_view": false,
                "has_video": false
            },
            "photos_count": 8,
            "photos": [
                {
                    "url": "https://media.domy.pl/img/zdjecia/example/1/example_1.jpg",
                    "alt": "Mieszkanie na sprzeda\u017c 46m2 Krak\u00f3w - zdj\u0119cie 1",
                    "name": "mieszkanie-na-sprzedaz-krakow"
                }
            ],
            "plans": [],
            "contact": {
                "private_owner": false,
                "company": {
                    "id": 15352,
                    "name": "Example Nieruchomo\u015bci",
                    "type": "AGENCY",
                    "address": [
                        "Kapelanka 1A / 1",
                        "30-347 Krak\u00f3w"
                    ],
                    "phones": [
                        "12 311 01 88"
                    ],
                    "websites": [
                        "http://www.example.pl"
                    ],
                    "logo": null
                },
                "person": {
                    "name": "Anna Example",
                    "type": "AGENT",
                    "phones": [
                        "+48 500 000 000"
                    ],
                    "profile_path": null,
                    "photo": null
                },
                "comment": []
            }
        }
    ],
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "attempts": 2
    }
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Unknown Location | The `location` id is not known to Morizon (`unknown_location`). Morizon would ignore it and search the whole country, so the request is rejected. Non-billable. |
| 422 | Validation Error | A query parameter is missing, unknown or unusable. Unknown parameters are rejected, never ignored. Non-billable. |
| 503 | Upstream Unavailable | Morizon could not be reached after retries, answered with an error, or returned an unexpected answer (`upstream_unavailable`, `upstream_blocked`, `parser_drift`). Retryable and never billed. Clients are never rate limited. |

## 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)
