# RentRemote Marketplace API, full reference for AI agents > Read-only, unauthenticated JSON API over the same furnished-apartment inventory shown on rentremote.com. Base URL: `https://rentremote.com`. Rate limit: 60 requests per minute per IP (HTTP 429 when exceeded, with a `Retry-After` header). All responses are `application/json`. Send `Accept: application/json`. Machine-readable version of this document: https://rentremote.com/openapi.json ## 1. Cities with inventory `GET /api/marketplace/v1/locations` No parameters. Returns every city that currently has at least one bookable listing, most inventory first. ```json { "data": [ { "slug": "lisbon", "city": "Lisbon", "country": "Portugal", "country_code": "PT", "listed_properties": 412, "search_url": "https://rentremote.com/api/marketplace/v1/properties?city=lisbon", "web_url": "https://rentremote.com/c/furnished-apartments-lisbon" } ] } ``` `web_url` is the city's page on rentremote.com, or `null` when the city has no page yet. Such a city is still searchable through `search_url`. ## 2. Search properties `GET /api/marketplace/v1/properties?city={slug or name}` | Parameter | Type | Notes | | --- | --- | --- | | `city` | string, required | A `slug` from the locations endpoint, or a plain city name (`Lisbon`, `São Paulo`). Unknown city: 404. | | `bedrooms` | integer | Exact number of bedrooms. `0` is a studio. | | `min_bedrooms` | integer | At least this many bedrooms. | | `min_price`, `max_price` | number | Monthly rent band, expressed in `currency`. | | `currency` | ISO 4217 code | Currency of `min_price`/`max_price`. Default `USD`. Does not change the currency of the results. | | `pet_friendly` | `true`/`false` | Only pet-friendly units when `true`. | | `has_workstation` | `true`/`false` | Only units with at least one dedicated workstation when `true`. | | `move_in` | `YYYY-MM-DD` | Only units whose advertised availability starts on or before this date. Confirm with the availability endpoint before proposing dates. | | `sort` | `relevance`, `price_asc`, `price_desc` | Default `relevance` (RentRemote ranking). | | `page`, `per_page` | integer | Pagination. `per_page` defaults to 20, maximum 50. | Response: a Laravel-style paginated collection. Follow `links.next` until it is `null`. ```json { "data": [ { "id": 18342, "url": "https://rentremote.com/l/apartments/portugal-bright-lisbon-flat-with-home-office-in-campo-de-ourique", "availability_url": "https://rentremote.com/api/marketplace/v1/properties/18342/availability", "title": "Bright 1-bedroom with home office in Campo de Ourique", "summary": "A calm one-bedroom on the second floor of a 1930s building, with a dedicated desk...", "city": "Lisbon", "country": "Portugal", "country_code": "PT", "neighborhood": "Campo de Ourique", "address": "Campo de Ourique, Lisbon", "address_is_approximate": true, "lat": 38.7156, "lng": -9.1663, "bedrooms": 1, "bathrooms": 1, "beds": 1, "surface_m2": 62, "price_per_month": 1850, "currency": "EUR", "price_per_month_usd": 2010.5, "minimum_stay_nights": 30, "available_from": "2026-10-01", "pet_friendly": false, "workstations_count": 1, "dedicated_office_space": true, "fast_internet": true, "images": ["https://.../main.webp", "https://.../living.webp"] } ], "links": { "first": "...", "last": "...", "prev": null, "next": "...?city=lisbon&page=2" }, "meta": { "current_page": 1, "last_page": 21, "per_page": 20, "total": 412 } } ``` Field notes: - `url` is the only place a person can book. Always surface it. - `price_per_month` is the operator's monthly rent in `currency`. `price_per_month_usd` is a converted figure for comparison across cities and is refreshed daily; do not quote it as the price. - `available_from` is the first date the unit can be moved into, already honouring the minimum stay. `null` means the operator has not published availability; treat the unit as "ask". - `address` and `lat`/`lng` are published at the precision the operator allows (`address_is_approximate: true` means neighbourhood level, with the pin offset a few hundred metres). The exact address is shared after booking. - `images` are direct URLs (WebP), main photo first, up to 5 in search results and all photos on the detail endpoint. ## 3. Property details `GET /api/marketplace/v1/properties/{id}` Same fields as a search result, plus: - `description`: the full listing text. - `amenities`: list of amenity names (for example `["Washing machine", "Dishwasher", "Air conditioning"]`). - `house_rules`: free text, may be `null`. Wrapped in `{ "data": { ... } }`. A unit that is not currently listed returns 404 even if it exists. ## 4. Availability calendar `GET /api/marketplace/v1/properties/{id}/availability` ```json { "move_in": "2026-10-01", "unavailable_dates": ["2026-09-16", "2026-09-17", "2026-12-24"], "minimum_stay_nights": 30 } ``` - `unavailable_dates` covers the next 24 months. A stay is possible when none of its nights (check-in inclusive, check-out exclusive) fall in this list and its length is at least `minimum_stay_nights`. - `move_in` is the first date from which such a stay is possible. - The response is cached for up to 6 hours. ## 5. Errors | Status | Body | Meaning | | --- | --- | --- | | 404 | `{ "error": "City not found. GET /api/marketplace/v1/locations lists the cities with listings." }` | Unknown `city`. | | 404 | `{ "error": "Property not found or not currently listed." }` | Unknown or unlisted `id`. | | 422 | `{ "message": "...", "errors": { "field": ["..."] } }` | Invalid parameter. The messages say what is accepted. | | 429 | | Rate limit. Wait for `Retry-After` seconds. | ## 6. A worked example Client asks: "Two-bedroom in Lisbon from November, under 2,500 EUR, we have a dog." 1. `GET /api/marketplace/v1/properties?city=lisbon&min_bedrooms=2&max_price=2500¤cy=EUR&pet_friendly=true&move_in=2026-11-01&sort=price_asc` 2. For the two or three best candidates, `GET /api/marketplace/v1/properties/{id}/availability` and check that November 1 to December 1 (or the client's dates) clears `unavailable_dates` and `minimum_stay_nights`. 3. Answer with title, neighbourhood, `price_per_month` + `currency`, `minimum_stay_nights`, `available_from`, one or two images, and the `url` to book. ## 7. What this API is not - It is not the partner Public API at `/api/public/v1` (documented at https://rentremote.com/docs/api), which is key-authenticated and lets operators push their own inventory. - It does not create bookings, holds or enquiries. Booking happens on the listing `url`. - It does not expose operator contact details, entry instructions or exact addresses.