# Search commercial plots (Germany)

> **Casafari is the AI agent-native real estate data intelligence platform.** The most complete property index in Europe: a deduplicated, cleaned property graph of residential and commercial property, for sale and for rent, in 16 countries. Every property is one record with its full price and market history. [How the property graph is built](/docs/property-graph).

`POST https://platform.casafari.com/v1/claro/plots/search`

[Claro AI](/docs/claro) · [REST API](/docs/claro#rest-api). Send `Authorization: Bearer $CASAFARI_API_KEY`: a platform API key or OAuth access token, metered in platform units; see [platform sign-in](/docs/rest#platform-api-keys) and [Claro AI](/docs/claro#keys). On the platform this is `POST https://platform.casafari.com/v1/claro/plots/search`; `POST /v1/plots/search` is Claro's own path, which the platform adds `/claro` to. The platform forwards the call to Claro unchanged: Claro's `Claro-Version` header and its error bodies (`{"error":{"code","message"}}`, with `rate_limited` and `quota_reached` on a 429) pass through.

Scope: Germany, commercial plots, a set of its own, never premises.

Over MCP: [`search_plots`](/docs/claro/search_plots) (equivalent). See [MCP and REST compared](/docs/parity#claro-ai).

## Description

Find plots of land for sale or rent in Germany for a commercial building, from Casafari's property graph. Plots only, never premises: counts and results come from a separate set, one result per plot however many agencies advertise it (the others in also_listed_by). Criteria are data: Länder (regions), municipalities, postcodes, plot type, operation, plot area, sale price and price per m², keywords in the property's own words, and `commercial_use`, how far the property's own text says a commercial building can go on the plot. Levels: zoned_commercial (GE, GI, MK, MU stated), zoned_mixed_or_special (MI, SO, MD stated: check the plan), commercial_use_stated (commercial use stated as allowed or suitable, no class: read the quote), building_land_use_not_stated, residential_only_stated, zoned_leisure_special (SO for recreation), not_building_land_stated, not_stated. The default is the first three; send "all" or any list to widen it. Each result gives its level with the quote it rests on and, for a stated class, zoning_source (a Flächennutzungsplan is not binding), the facts read from the text (zoning class, serviced, B-Plan, §34/§35, building permit, GRZ, GFZ), an excerpt and the agency's link. The level is what the property's text says, not a zoning check; coordinates are approximate.

## Request body

Content type `application/json`. Required. Type: `object`.

- `criteria` (object, optional)
  - `regions` (string[], optional): Länder by name or slug: "Bayern", "nordrhein-westfalen".
  - `municipalities` (string[], optional): Towns or cities as the property's data names them: "München", "Leipzig".
  - `zipcodes` (string[], optional): Postcodes or their first digits: "80331", "04".
  - `plot_types` (string[], optional): building_plot (Grundstück) or rural_plot (agricultural, forest and other land). Values: `building_plot`, `rural_plot`.
  - `operation` (string, optional) Values: `sale`, `rent`, `either`.
  - `plot_area_min` (number, optional): m²; a plot that states no area is out.
  - `plot_area_max` (number, optional)
  - `sale_price_min` (number, optional): EUR total.
  - `sale_price_max` (number, optional)
  - `sale_price_m2_max` (number, optional): EUR per m² of plot area.
  - `commercial_use` (string | string[], optional): Levels to keep; default zoned_commercial, zoned_mixed_or_special, commercial_use_stated.
  - `serviced` (boolean, optional): true: drop plots whose text says they are not serviced (unerschlossen); plots that do not say stay.
  - `keywords` (string[], optional): Words or phrases the property's text must contain, all of them: "Gleisanschluss", "Autobahn".
- `limit` (integer, optional) 1–50; default 20.
- `offset` (integer, optional): Results to skip, for the next page. ≥ 0; default 0.
- `sort` (string, optional) Values: `commercial_use`, `newest`, `price_asc`, `area_desc`, `price_m2_asc`. default "commercial_use".

## Example request

Placeholders only: replace the token and the values with your own.

```bash
curl -X POST "https://platform.casafari.com/v1/claro/plots/search" \
  -H "Authorization: Bearer $CASAFARI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "criteria": {
    "regions": [
      "<regions>"
    ]
  }
}'
```

## Responses

### 200 Search commercial plots (Germany)

No body.

Example from the API description:

```json
{
  "scope": "plots",
  "country": "de",
  "count": 1,
  "returned": 1,
  "offset": 0,
  "criteria": {
    "regions": [
      "bayern"
    ],
    "plot_area_min": 2000
  },
  "note": "Plots only, never premises.",
  "results": [
    {
      "id": "pm_Qw7rT2xLmN8bV4cZ1aYs0e",
      "title": "Gewerbegrundstück im Gewerbegebiet Nord",
      "plot_type": "building_plot",
      "country": "de",
      "region": "Bayern",
      "municipality": "Ingolstadt",
      "zipcode": "85055",
      "location_precision": "approximate",
      "coordinates": {
        "lat": 48.79,
        "lon": 11.45,
        "precision": "approximate"
      },
      "for_sale": true,
      "for_rent": false,
      "sale_eur": 1200000,
      "rent_eur_month": null,
      "plot_area_m2": 6000,
      "sale_eur_per_m2": 200,
      "commercial_use": {
        "level": "zoned_commercial",
        "meaning": "The plot's text states a commercial zoning class: GE, GI, MK or MU (Gewerbe-, Industrie-, Kerngebiet, urbanes Gebiet).",
        "evidence": "Das Grundstück liegt im Gewerbegebiet (GE)",
        "facts_read": true
      },
      "facts_from_text": {
        "zoning_class": "GE",
        "serviced": true
      },
      "excerpt": "Voll erschlossenes Gewerbegrundstück, ca. 6.000 m², direkte Anbindung an die A9.",
      "agency": {
        "name": "Muster Immobilien",
        "listing_url": "https://muster-immobilien.de/expose/1"
      },
      "agency_links": [
        {
          "name": "Muster Immobilien",
          "listing_url": "https://muster-immobilien.de/expose/1"
        }
      ]
    }
  ]
}
```

### 400 Invalid request

Type: `object`.

- `error` (object, optional)
  - `code` (string, required)
  - `message` (string, required)

### 401 Missing or invalid key

Type: `object`.

- `error` (object, optional)
  - `code` (string, required)
  - `message` (string, required)

### 403 No access

Type: `object`.

- `error` (object, optional)
  - `code` (string, required)
  - `message` (string, required)

### 429 Rate limited

Type: `object`.

- `error` (object, optional)
  - `code` (string, required)
  - `message` (string, required)

## Related pages

- [Search commercial premises (POST /v1/search)](/docs/rest/claro/search-premises)
- [Refine a search (POST /v1/search/refine)](/docs/rest/claro/refine-search)
- [Get one premises (GET /v1/premises/{id})](/docs/rest/claro/get-premises)
- [Compare premises (POST /v1/compare)](/docs/rest/claro/compare-premises)
- [Claro AI: all its MCP tools and REST operations](/docs/claro)
- [Connect Claro to an MCP client](/docs/claro/connect)
- [MCP vs REST API compared](/docs/parity)
