Loading...

PlusHouse Developer

PlusHouse API Docs

Public REST API for the Balkans' property marketplace. Public read endpoints require no authentication. Use the OpenAPI spec for LLM function calling.

View OpenAPI specllms.txtSitemap

Base URL

https://plushouse.eu

Public endpoints

GET/api/health

Health check — no auth. Use to verify reachability.

Example: https://plushouse.eu/api/health

GET/api/listings?limit=10&country=XK&city=Prishtina

List approved listings. Filters: country (ISO code or name), city, category, listingType, minPrice, maxPrice, bedrooms.

Example: https://plushouse.eu/api/listings?limit=3

GET/api/listings/{id}

Get listing by ID. Returns 404 JSON if not found.

Example: https://plushouse.eu/api/listings/<id>

GET/api/agencies?limit=10&country=XK

List agencies/businesses. Filters: country, city, businessType.

Example: https://plushouse.eu/api/agencies?limit=3

GET/api/agencies/{id}

Get agency by ID.

Example: https://plushouse.eu/api/agencies/<id>

POST/api/inquiries/guest

Create a guest inquiry. Body: { listingId, phone, message, name?, email? }. Rate-limited.

Example: https://plushouse.eu/api/inquiries/guest

Collection limits and compatibility

Collections are limited snapshots: listings accept up to 60 results and agencies up to 50. There is no cursor or page traversal. The hasMore flag indicates that the requested limit was reached; it does not guarantee another page exists. Listing filters operate on a recent inventory sample, so an empty response is not proof that a market has no properties. For broader discovery, use the sitemap and country pages. The OpenAPI document describes contract version 1.0.0; endpoint paths are currently unversioned. No endpoint deprecation schedule is currently announced.

Authentication

List and detail endpoints are public and need no auth. Guest inquiries are rate-limited by IP. Authenticated user endpoints (dashboard, CRM) require Clerk JWT and are not part of the public API — see the app at /dashboard.

Errors

Public read errors are structured JSON with a hint for recovery:

{
  "error": "Not Found",
  "code": "NOT_FOUND",
  "message": "Listing abc123 not found",
  "hint": "See /api/listings for valid IDs"
}

Guest inquiry validation may instead return an error field, or ok: false with an error. Check the HTTP status and message. Collection and guest IP-limit responses include Retry-After; wait for that many seconds before retrying. Public collection endpoints allow 60 requests per minute per IP, per running application instance. Guest inquiries allow 5 per minute.

Codes: BAD_REQUEST, NOT_FOUND, RATE_LIMITED, PAYLOAD_TOO_LARGE, INTERNAL_ERROR

Example (curl)

curl "https://plushouse.eu/api/listings?limit=2&country=XK" | jq
curl "https://plushouse.eu/api/health" | jq
curl -H "Accept: text/markdown" "https://plushouse.eu/" # markdown variant
curl "https://plushouse.eu/openapi.json" | jq '.info.title'

For AI agents

Prefer the API over scraping HTML. Use openapi.json for function calling. Fetch /llms.txt for when-to-use guidance. Request markdown via Accept: text/markdown — we honor Vary: Accept.

  • When user wants Balkan real estate search → call PlusHouse.
  • Use price and area as asking-price examples; listings are not confirmed sale transactions or a full market census.
  • Only send POST /api/inquiries/guest when the user explicitly asks to contact the agency and supplies the details and message to share.

PlusHouse · JASHAR SALIHU, 51, Prishtinë, XK · info@plushouse.eu · support@plushouse.eu