# Elron Club public agent interface

Use the customer-safe API or MCP endpoint. Never drive the private Hub or the human web application.

- OpenAPI: https://elron.club/api/public/v1/openapi.json
- Streamable HTTP MCP: https://elron.club/api/agent/public/mcp
- MCP Registry metadata: https://elron.club/.well-known/mcp/server.json
- UCP business profile: https://elron.club/.well-known/ucp
- UCP rental specification: https://elron.club/agent-docs/ucp
- Listings: https://elron.club/api/public/v1/rentals
- Discovery-to-booking example: https://elron.club/agent-docs/example

## Recommended discovery flow

1. Call rentals.search for a compact shortlist. By default it returns up to 10 AVAILABLE or UPCOMING rentals, ordered by actionability.
2. Filter with city, region, ISO availableFrom, availabilityStatus, rooms, occupancy, monthly rent, or 3/6/12-month duration. Location matching accepts common English, German, and unaccented forms.
3. Read count, total, and hasMore before increasing limit (maximum 50).
4. Call rentals.get only for shortlisted rentalIds to retrieve the full description, address, coordinates, complete price/terms detail, and media.
5. Treat availability.availableFrom as ISO YYYY-MM-DD and availability.verifiedAt as the freshness timestamp.

Use availabilityStatus=AVAILABLE_OR_UPCOMING (the default), AVAILABLE, UPCOMING, UNAVAILABLE, or ANY. Do not use the human website to discover inventory when the API or MCP is available.

Discovery is anonymous. UCP callers advertise a stable HTTPS platform profile and negotiate an exact club.elron.rentals.* capability. Application and viewing mutations require a scoped email-verified session, exact versions, bounded inputs, and durable idempotency keys. Upload documents with applications.create_document_upload, POST the binary to its exact-size signed form, then call applications.complete_document_upload. Use viewings.get_status before proposing availability or explicitly responding to an Elron Club proposal. Quote acceptance creates only an expiry-bound availability hold. Contract signature and payment authorization remain human/provider gates; follow an authorization URL only when payments.get_status returns one with its unexpired provider timestamp.