# Search private-seller listings by place and date

> **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/private-sellers/search`

[Private Seller Leads](/docs/private-sellers) · [REST API](/docs/rest/private-sellers). Send `Authorization: Bearer $CASAFARI_API_KEY`: a platform API key (`cf_sk_...`) from [the console](https://platform.casafari.com/console), or an OAuth access token; `X-API-Key` carries the key too. See [platform API keys](/docs/rest#platform-api-keys). Costs 10 tokens a call (1 token = EUR 0.04).

Over MCP: [`private-sellers_search`](/docs/private-sellers/search) (equivalent). See [MCP and REST compared](/docs/parity#private-seller-leads).

The platform's OpenAPI file leaves the shape open; what is shown comes from the same definitions the platform publishes elsewhere: request: the MCP tool private-sellers_search's input.

## Description

Costs 10 tokens a call. Each page is a call. Page size: `page_size` in the body, at most 50 (a Free plan account is capped lower).

## Request body

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

- `location_id` (integer, required): Location id of a country, city, district or neighbourhood, from locations_search (Location Lookup). ≥ 1.
- `since` (string, required): Only listings first seen on or after this date, YYYY-MM-DD, at most 90 days back. pattern `^\d{4}-\d{2}-\d{2}$`.
- `until` (string, optional): Only listings first seen on or before this date, YYYY-MM-DD. Optional. pattern `^\d{4}-\d{2}-\d{2}$`.
- `operation` (string, optional): Homes for sale or for rent. Optional: both. Values: `sale`, `rent`.
- `property_type` (string, optional): Property type group, lower case, e.g. "apartment" or "house". Optional. pattern `^[a-z_]{1,32}$`.
- `confirmed_only` (boolean, optional): true: only listings whose private seller is confirmed. Default false.
- `page_size` (integer, optional): Listings per page, 1 to 50 (default 20). Every page costs the same. 1–50.
- `cursor` (string, optional): The next value of the previous page, as it came. Valid for an hour. Leave out for the first page. 1–4096 characters.

## Example request

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

```bash
curl -X POST "https://platform.casafari.com/v1/private-sellers/search" \
  -H "Authorization: Bearer $CASAFARI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "location_id": 1,
  "since": "<since>"
}'
```

## Responses

### 200 Success.

Type: `object`.

### Errors

Every error is an `application/problem+json` body (RFC 9457) with `type` (a page that explains it), `title`, `status`, `detail` (what to do), `instance`, `code` and `request_id` (what to quote to support). A `402` carries an `upgrade_url`, a `429` a `Retry-After` header. The codes each status can carry:

- `400`: `invalid_request`, `key_in_query`, `page_depth_exceeded` (https://platform.casafari.com/errors/invalid-request, https://platform.casafari.com/errors/key-in-query, https://platform.casafari.com/errors/page-depth-exceeded)
- `401`: `unauthorized`, `invalid_credential`, `credential_revoked`, `token_expired` (https://platform.casafari.com/errors/unauthorized, https://platform.casafari.com/errors/invalid-credential, https://platform.casafari.com/errors/credential-revoked, https://platform.casafari.com/errors/token-expired)
- `402`: `payment_required` (https://platform.casafari.com/errors/payment-required)
- `403`: `insufficient_scope`, `not_entitled`, `account_suspended` (https://platform.casafari.com/errors/insufficient-scope, https://platform.casafari.com/errors/not-entitled, https://platform.casafari.com/errors/account-suspended)
- `404`: `not_found` (https://platform.casafari.com/errors/not-found)
- `405`: `method_not_allowed` (https://platform.casafari.com/errors/method-not-allowed)
- `409`: `conflict` (https://platform.casafari.com/errors/conflict)
- `413`: `payload_too_large` (https://platform.casafari.com/errors/payload-too-large)
- `415`: `unsupported_media_type` (https://platform.casafari.com/errors/unsupported-media-type)
- `422`: `validation_failed` (https://platform.casafari.com/errors/validation-failed)
- `429`: `rate_limited`, `daily_limit_reached`, `request_limit_reached`, `usage_limit_reached` (https://platform.casafari.com/errors/rate-limited, https://platform.casafari.com/errors/daily-limit-reached, https://platform.casafari.com/errors/request-limit-reached, https://platform.casafari.com/errors/usage-limit-reached)
- `500`: `internal_error` (https://platform.casafari.com/errors/internal-error)
- `502`: `upstream_error` (https://platform.casafari.com/errors/upstream-error)
- `503`: `capacity_exhausted`, `unavailable` (https://platform.casafari.com/errors/capacity-exhausted, https://platform.casafari.com/errors/unavailable)
- `504`: `upstream_timeout` (https://platform.casafari.com/errors/upstream-timeout)

## Related pages

- [One private-seller listing (GET /v1/private-sellers/listings/{id})](/docs/rest/private-sellers/one-private-seller-listing)
- [Countries with private-seller listings and their counts (GET /v1/private-sellers/coverage)](/docs/rest/private-sellers/countries-with-private-seller-listings-and-their-counts)
- [Private Seller Leads REST API: all operations](/docs/rest/private-sellers)
- [How to get a bearer token for the Casafari REST API](/docs/rest)
- [MCP vs REST API compared](/docs/parity)
