Search, read and compare Singapore property listings and book home services, with no account.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this after search_listings or list_saved_properties when the user wants two to six Homejourney listings compared side by side. Pass their listing_ids (a saved home's property_id), and optionally the user criteria: budget, bedrooms, bathrooms, preferred districts or MRT stations, the longest acceptable walk to the MRT, the fewest years of lease that must remain, and must-have features. Returns the listings ranked against those criteria, each with its score out of 100 and the points it earns on each criterion, the reasons it fits, its tradeoffs and any missing data, plus price, size, nearest MRT, nearby schools and, for an HDB flat, the lease left on its block. Never returns owner or agent contact details. To show the result as a card, pass it to render_shortlist.
The AI app making this call, such as chatgpt or claude. It records where the request came from; it is not the listing owner or agent.
Tool list last changed Oct 25, 2026.
Use this after search_listings or list_saved_properties when the user wants two to six Homejourney listings compared side by side. Pass their listing_ids (a saved home's property_id), and optionally the user criteria: budget, bedrooms, bathrooms, preferred districts or MRT stations, the longest acceptable walk to the MRT, the fewest years of lease that must remain, and must-have features. Returns the listings ranked against those criteria, each with its score out of 100 and the points it earns on each criterion, the reasons it fits, its tradeoffs and any missing data, plus price, size, nearest MRT, nearby schools and, for an HDB flat, the lease left on its block. Never returns owner or agent contact details. To show the result as a card, pass it to render_shortlist.
| Argument | Type | Description |
|---|---|---|
| host | string | The AI app making this call, such as chatgpt or claude. It records where the request came from; it is not the listing owner or agent. |
| criteria | object | |
| listing_ids* | array | |
| host_reference_id | string |
{
"type": "object",
"required": [
"listing_ids"
],
"properties": {
"host": {
"type": "string",
"maxLength": 50,
"minLength": 1,
"description": "The AI app making this call, such as chatgpt or claude. It records where the request came from; it is not the listing owner or agent."
},
"criteria": {
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"bedrooms": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"price_max": {
"type": "number",
"minimum": 1
},
"price_min": {
"type": "number",
"minimum": 1
},
"commute_note": {
"type": "string",
"maxLength": 160,
"minLength": 1
},
"listing_type": {
"enum": [
"For Sale",
"For Rent"
],
"type": "string"
},
"mrt_stations": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"maxItems": 6,
"minItems": 1,
"description": "Preferred MRT or LRT stations, matched against each listing's nearest station."
},
"bathrooms_min": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"property_type": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"must_have_tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"maxItems": 8,
"minItems": 1
},
"subletting_types": {
"type": "array",
"items": {
"enum": [
"whole_unit",
"master_room",
"common_room",
"studio",
"bed"
],
"type": "string"
},
"maxItems": 5,
"minItems": 1
},
"preferred_districts": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"maxItems": 6,
"minItems": 1
},
"max_mrt_walk_minutes": {
"type": "integer",
"maximum": 60,
"minimum": 1,
"description": "Longest acceptable walk to the nearest MRT or LRT station, in minutes."
},
"min_remaining_lease_years": {
"type": "integer",
"maximum": 99,
"minimum": 1,
"description": "Fewest whole years of lease that must remain, read from each home's lease: an HDB flat's block lease, or a condo, EC or landed home's land lease. Freehold and 999-year tenures always meet it."
}
},
"additionalProperties": false
},
"listing_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 6,
"minItems": 2
},
"host_reference_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
},
"additionalProperties": false
}Fetch one Homejourney listing by the ID that search returned, for deep-research and citation hosts. Returns the listing text, without owner or agent contact details, and its Homejourney URL for citations. After search_listings, use get_listing_details instead.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": false
}Use the opaque status token returned by prepare_guest_service_checkout to check card approval, provider, completion, and payment state. Returns no contact or address details.
| Argument | Type | Description |
|---|---|---|
| status_token* | string |
{
"type": "object",
"required": [
"status_token"
],
"properties": {
"status_token": {
"type": "string",
"maxLength": 200,
"minLength": 32
}
},
"additionalProperties": false
}Use this after search_listings when the user wants the full details of one Homejourney listing, such as its description, size, tenure, furnishing, availability, nearest MRT, nearby schools, the MRT stations open or under construction, primary schools by 1 km and 2 km band, secondary schools, supermarkets, hawker centres, CHAS clinics and parks near it, and Homejourney link. For an owner listing it adds reportUrl, where the user reports a wrong, misleading or scam listing to Homejourney. Never returns owner or agent contact details.
| Argument | Type | Description |
|---|---|---|
| listing_id* | string |
{
"type": "object",
"required": [
"listing_id"
],
"properties": {
"listing_id": {
"type": "string",
"format": "uuid"
}
},
"additionalProperties": false
}Use this first when an owner wants to sell or rent out their own home on Homejourney, before asking them anything. Returns every field to collect (required or optional, allowed values, examples, which apply only to HDB, condo, landed or rentals), the photo rules, where to order a floor plan, and the steps in order: the agent saves the details with create_listing_draft, then the owner adds photos or confirms the ones you add, verifies with Singpass, joins Homejourney Pro and publishes. Ask the owner for all required fields in one message. Needs no sign-in.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Use this for new customer bookings from an external agent, whether the customer already has a Homejourney account or not. After the customer confirms the selected provider package, the exact price, schedule, address, customer-provided email and mobile number, and contact consent, it returns one branded Homejourney review-and-authorization link. No OTP is required. The customer approves their card for the exact booking without a charge; Homejourney charges it only after verified completion, and PayNow can instead be requested after completion. The booking appears in the Homejourney account of the customer once they sign in with the same verified email or WhatsApp number.
| Argument | Type | Description |
|---|---|---|
| host* | string | The AI app making this call, such as chatgpt or claude. It records where the request came from; it is not the listing owner or agent. |
| confirmed* | boolean | |
| base_price | number | |
| provider_id | string | |
| total_price | number | |
| consent_text | string | |
| price_source* | string | |
| service_type |
Use this after search_services with the selected provider and package identifiers. Returns the exact server-revalidated price before confirmation and does not create a booking row. A quote needs no name, email, or phone. A provider package also returns the assignment deadline, after which an unaccepted booking is cancelled at no charge; it needs an exact start at least 2 hours away. An operator price quoted with the service address also returns slots, the open arrival times there on scheduled_date with the total for each; book one of those times. When none is open, slotsUnavailableReason says whether the address has no postal code, the postal code matches no address, or the provider does not serve it; otherwise quote another date. A package named for a unit count ("3 wall units") is refused for another number_of_units with reason package_unit_count; quote the package for the asked count instead. Other refusals say what to change: start_too_soon names the earliest start, price_changed the new price, invalid_catalog_version the current catalog_version_id, and quote_required means the package cannot be booked on Homejourney.
| Argument | Type | Description |
|---|---|---|
| base_price | number | |
| provider_id | string | |
| total_price | number | |
| price_source* | string | |
| service_type* | string | |
Show one Homejourney listing as a visual card with its photos, key details and a button to open it on Homejourney. Use this when the user wants to look at one listing. Never shows owner or agent contact details.
| Argument | Type | Description |
|---|---|---|
| listing_id* | string |
{
"type": "object",
"required": [
"listing_id"
],
"properties": {
"listing_id": {
"type": "string",
"format": "uuid"
}
},
"additionalProperties": false
}Show a comparison that compare_listings returned as a visual shortlist card. Use this after compare_listings when the host can display app cards; pass the comparison unchanged.
| Argument | Type | Description |
|---|---|---|
| ranking | array | |
| listings* | array | |
| comparedAt | string | |
| canonicalUrls | array | |
| criteriaSummary | string | |
| missingDataNotes | array | |
| sameHomeListingIds | array | |
| unavailableListingIds | array |
{
"type": "object",
"required": [
"listings"
],
"properties": {
"ranking": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"rank"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"rank": {
"type": "integer",
"maximum": 6,
"minimum": 1
},
"score": {
"type": "number",
"maximum": 100,
"minimum": -100
},
"reasonCodes": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"maxItems": 12
}
},
"additionalProperties": false
},
"maxItems": 6
},
"listings": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"rank": {
"type": "integer",
"maximum": 6,
"minimum": 1
},
"price": {
"type": "number",
"minimum": 1
},
"score": {
"type": "number",
"maximum": 100,
"minimum": -100
},
"title": {
"type": "string",
"maxLength": 160
},
"images": {
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 500
},
"maxItems": 8
},
"source": {
"type": "string",
"maxLength": 80
},
"tenure": {
"type": [
"string",
"null"
],
"maxLength": 100
},
"address": {
"type": "string",
"maxLength": 240
},
"bedrooms": {
"type": "integer",
"maximum": 20,
"minimum": 0
},
"district": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"bathrooms": {
"type": "number",
"maximum": 20,
"minimum": 0
},
"tradeoffs": {
"type": "array",
"items": {
"type": "string",
"maxLength": 180,
"minLength": 1
},
"maxItems": 8
},
"bookingUrl": {
"type": "string",
"format": "uri",
"maxLength": 300
},
"imageCount": {
"type": "integer",
"maximum": 50,
"minimum": 0
},
"squareFeet": {
"type": [
"number",
"null"
],
"minimum": 1
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 5000
},
"listingType": {
"type": "string",
"maxLength": 80
},
"missingData": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"maxItems": 8
},
"reasonCodes": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"maxItems": 12
},
"canonicalUrl": {
"type": "string",
"format": "uri",
"maxLength": 300
},
"propertyType": {
"type": "string",
"maxLength": 80
},
"canonical_url": {
"type": "string",
"format": "uri",
"maxLength": 300
},
"lastVerifiedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"sublettingType": {
"type": [
"string",
"null"
],
"maxLength": 80
},
"visibilityBand": {
"enum": [
"fresh",
"aging",
null
],
"type": [
"string",
"null"
]
},
"continueInAppUrl": {
"type": "string",
"maxLength": 240
},
"continueInWebUrl": {
"type": "string",
"format": "uri",
"maxLength": 300
},
"continue_in_app_url": {
"type": "string",
"maxLength": 240
},
"continue_in_web_url": {
"type": "string",
"format": "uri",
"maxLength": 300
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1
},
"comparedAt": {
"type": "string",
"maxLength": 40
},
"canonicalUrls": {
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 300
},
"maxItems": 6
},
"criteriaSummary": {
"type": "string",
"maxLength": 300
},
"missingDataNotes": {
"type": "array",
"items": {
"type": "string",
"maxLength": 160,
"minLength": 1
},
"maxItems": 12
},
"sameHomeListingIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"maxItems": 6
},
"unavailableListingIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"maxItems": 6
}
},
"additionalProperties": false
}Search active Homejourney Singapore property listings for deep-research and citation hosts. Broad availability questions are supported; use location, project, or feature keywords only when the user supplied them. Returns canonical listing URLs for citations. To filter by price, bedrooms, area or rent terms, use search_listings instead.
| Argument | Type | Description |
|---|---|---|
| query* | string |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string"
}
},
"additionalProperties": false
}Use this when someone asks how buying, selling, renting or letting a home in Singapore works: grants and eligibility, BTO and resale, stamp duty, loans and down payments, the MOP, tenancy agreements, or renting out a flat or room. Returns Homejourney's reviewed guides that match, each with its URL, a short answer, who it is for, whether it has a calculator, and the date it was last checked. Cite the guide URL and its date. Filter with persona (buyer, seller, renter or landlord); leave query empty to list every guide for that persona. Needs no sign-in.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query | string | |
| persona | string |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 5,
"maximum": 25,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"persona": {
"enum": [
"buyer",
"seller",
"renter",
"landlord"
],
"type": "string"
}
},
"additionalProperties": false
}Primary listing-discovery tool for homes in Singapore. Use this when the user asks what properties are available, or describes a home to buy or rent by area, MRT station, budget, bedrooms, flat type or other criteria. Omit query for a broad availability request; query is full-text search over project, title, address and description. pagination.total is the exact number of matching listings. Returns summaries of active, published Homejourney listings that may be shown in AI assistants: price, size, address, nearest MRT, nearby schools, a Homejourney link and a link to book a viewing, but never the owner or agent contact details.
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| sort | string | newest is the recommended order; listed_newest is strictly by listing date. |
| limit | integer | |
| query | string | |
| towns | array | HDB towns, URA planning areas or URA regions the listing lies in, such as "Tampines", "Bukit Timah" or "East". A region (Central, East, North, North-East, West) covers all its planning areas. |
| tenure | string | |
| psf_max | number | Price per square foot in SGD. |
Use this to find active Homejourney services. Each result carries the provider, package, catalogue version, and price required for quoting and checkout. Every result sells under its provider's own name and logo (soldUnder "provider"): a large operator's at its own published price, a small shop's at Homejourney's standard price; priceSetBy says which. A service can list both. Booking saves a card and charges nothing until the provider accepts.
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| limit | integer | |
| query | string | |
| provider_id | string | |
| service_type | string |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 20,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"provider_id": {
"type": "string",
"format": "uuid"
},
"service_type": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
},
"additionalProperties": false
}| string |
| customer_info* | object |
| property_size | string | Home size, for an offering priced by home size. A quote without it names the sizes the provider prices. |
| scheduled_date* | string |
| singapore_time* | string | Exact customer-selected Singapore start time in 24-hour HH:mm format. Do not send a time range. |
| discount_amount | number |
| idempotency_key* | string |
| number_of_hours | number | Hours booked, for an offering priced per hour. The provider may charge a minimum number of hours. |
| number_of_units | integer |
| service_details* | string |
| host_reference_id | string |
| issue_description | string |
| service_frequency | string |
| catalog_version_id* | string |
| consent_to_contact* | boolean |
| platform_unit_count | integer | Retired: Homejourney no longer offers its own catalog prices, so a launch_guide selection is refused. Leave it out. |
| provider_package_id | string |
| special_instructions | string |
{
"type": "object",
"required": [
"host",
"idempotency_key",
"confirmed",
"service_type",
"service_details",
"catalog_version_id",
"price_source",
"scheduled_date",
"singapore_time",
"customer_info",
"consent_to_contact"
],
"properties": {
"host": {
"type": "string",
"maxLength": 50,
"minLength": 1,
"description": "The AI app making this call, such as chatgpt or claude. It records where the request came from; it is not the listing owner or agent."
},
"confirmed": {
"type": "boolean",
"const": true
},
"base_price": {
"type": "number",
"minimum": 0
},
"provider_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"total_price": {
"type": "number",
"minimum": 0
},
"consent_text": {
"type": "string",
"maxLength": 300
},
"price_source": {
"enum": [
"provider_catalog",
"launch_guide"
],
"type": "string"
},
"service_type": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"customer_info": {
"type": "object",
"required": [
"name",
"email",
"phone"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"email": {
"type": "string",
"format": "email",
"maxLength": 254
},
"phone": {
"type": "string",
"maxLength": 40,
"minLength": 8
},
"address": {
"type": "string",
"maxLength": 300,
"minLength": 5
},
"unit_number": {
"type": "string",
"maxLength": 40
},
"pickup_address": {
"type": "string",
"maxLength": 300,
"minLength": 5
},
"delivery_address": {
"type": "string",
"maxLength": 300,
"minLength": 5
},
"pickup_unit_number": {
"type": "string",
"maxLength": 40
},
"delivery_unit_number": {
"type": "string",
"maxLength": 40
}
},
"additionalProperties": false
},
"property_size": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "Home size, for an offering priced by home size. A quote without it names the sizes the provider prices."
},
"scheduled_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"singapore_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "Exact customer-selected Singapore start time in 24-hour HH:mm format. Do not send a time range."
},
"discount_amount": {
"type": "number",
"minimum": 0
},
"idempotency_key": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"number_of_hours": {
"type": "number",
"maximum": 24,
"minimum": 1,
"description": "Hours booked, for an offering priced per hour. The provider may charge a minimum number of hours."
},
"number_of_units": {
"type": "integer",
"default": 1,
"maximum": 50,
"minimum": 1
},
"service_details": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"host_reference_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"issue_description": {
"type": "string",
"maxLength": 1000
},
"service_frequency": {
"type": "string",
"default": "one-time",
"maxLength": 60,
"minLength": 1
},
"catalog_version_id": {
"type": "string",
"maxLength": 160,
"minLength": 1
},
"consent_to_contact": {
"type": "boolean",
"const": true
},
"platform_unit_count": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Retired: Homejourney no longer offers its own catalog prices, so a launch_guide selection is refused. Leave it out."
},
"provider_package_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"special_instructions": {
"type": "string",
"maxLength": 1000
}
},
"additionalProperties": false
}| customer_info |
| object |
| Optional. The service address (pickup_address for moving), only to list the open arrival times of an operator price. |
| property_size | string | Home size, for an offering priced by home size. A quote without it names the sizes the provider prices. |
| scheduled_date* | string |
| singapore_time* | string | Exact customer-selected Singapore start time in 24-hour HH:mm format. Do not send a time range. |
| discount_amount | number |
| number_of_hours | number | Hours booked, for an offering priced per hour. The provider may charge a minimum number of hours. |
| number_of_units | integer |
| service_details* | string |
| issue_description | string |
| service_frequency | string |
| catalog_version_id* | string |
| platform_unit_count | integer | Retired: Homejourney no longer offers its own catalog prices, so a launch_guide selection is refused. Leave it out. |
| provider_package_id | string |
| special_instructions | string |
{
"type": "object",
"required": [
"service_type",
"service_details",
"catalog_version_id",
"price_source",
"scheduled_date",
"singapore_time"
],
"properties": {
"base_price": {
"type": "number",
"minimum": 0
},
"provider_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"total_price": {
"type": "number",
"minimum": 0
},
"price_source": {
"enum": [
"provider_catalog",
"launch_guide"
],
"type": "string"
},
"service_type": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"customer_info": {
"type": "object",
"properties": {
"address": {
"type": "string",
"maxLength": 300,
"minLength": 5
},
"pickup_address": {
"type": "string",
"maxLength": 300,
"minLength": 5
}
},
"description": "Optional. The service address (pickup_address for moving), only to list the open arrival times of an operator price.",
"additionalProperties": false
},
"property_size": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "Home size, for an offering priced by home size. A quote without it names the sizes the provider prices."
},
"scheduled_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"singapore_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "Exact customer-selected Singapore start time in 24-hour HH:mm format. Do not send a time range."
},
"discount_amount": {
"type": "number",
"minimum": 0
},
"number_of_hours": {
"type": "number",
"maximum": 24,
"minimum": 1,
"description": "Hours booked, for an offering priced per hour. The provider may charge a minimum number of hours."
},
"number_of_units": {
"type": "integer",
"default": 1,
"maximum": 50,
"minimum": 1
},
"service_details": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"issue_description": {
"type": "string",
"maxLength": 1000
},
"service_frequency": {
"type": "string",
"default": "one-time",
"maxLength": 60,
"minLength": 1
},
"catalog_version_id": {
"type": "string",
"maxLength": 160,
"minLength": 1
},
"platform_unit_count": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Retired: Homejourney no longer offers its own catalog prices, so a launch_guide selection is refused. Leave it out."
},
"provider_package_id": {
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"special_instructions": {
"type": "string",
"maxLength": 1000
}
},
"additionalProperties": false
}| psf_min |
| number |
| Price per square foot in SGD. |
| bedrooms | integer |
| district | string |
| size_max | number | Floor area in square feet. |
| size_min | number | Floor area in square feet. |
| districts | array | Singapore postal districts, such as "D09" or "15". |
| listed_by | string | Who lists the home. owner keeps homes their owners list: on Homejourney, or on HDB Flat Portal without an agent. agent keeps every other home. pagination.total counts only these homes. |
| mrt_lines | array | MRT or LRT lines; a listing matches when its nearest station is on one. Combines with mrt_stations as 'near any'. |
| price_max | number |
| price_min | number |
| furnishing | string | The furnishing the renter wants. Matches homes stated as this, and homes that state no furnishing. |
| bedrooms_min | integer |
| listing_type | string |
| mrt_stations | array | Nearest MRT station names, such as "Orchard" or "Tanjong Pagar". |
| project_name | string | Exact condominium or development name. |
| bathrooms_min | integer |
| property_type | string |
| available_from | string | The renter's move-in date. Matches homes available on or before it, and homes that state no date. |
| bedroom_counts | array | Exact bedroom counts to match, such as [2, 3]; 0 is a studio. Combines with bedrooms_min, so [0] plus bedrooms_min 5 means studio or 5+. |
| hdb_flat_types | array | HDB flat types, such as "4-room" or "executive". |
| reachable_only | boolean | Only homes whose owner or agent can be reached now: a viewing request reaches the owner or a Homejourney agent, or the lister takes WhatsApp. Leaves out homes whose agent is not on Homejourney yet and has no verified WhatsApp number. pagination.total counts only these homes. |
| bathroom_counts | array | Exact bathroom counts to match; combines with bathrooms_min. |
| subletting_type | string |
| listed_within_days | integer |
| lease_duration_months | integer | The renter's lease length in months. Matches homes whose minimum lease is at most this, and homes that state no minimum. |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"default": 1,
"minimum": 1
},
"sort": {
"enum": [
"newest",
"listed_newest",
"price_asc",
"price_desc",
"psf_asc",
"psf_desc",
"size_asc",
"size_desc",
"nearest_mrt"
],
"type": "string",
"default": "newest",
"description": "newest is the recommended order; listed_newest is strictly by listing date."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 120
},
"towns": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 5,
"minItems": 1,
"description": "HDB towns, URA planning areas or URA regions the listing lies in, such as \"Tampines\", \"Bukit Timah\" or \"East\". A region (Central, East, North, North-East, West) covers all its planning areas."
},
"tenure": {
"enum": [
"Freehold",
"99 Year Leasehold",
"103 Year Leasehold",
"110 Year Leasehold",
"999 Year Leasehold",
"9999 Year Leasehold",
"Leasehold",
"Unknown"
],
"type": "string"
},
"psf_max": {
"type": "number",
"minimum": 1,
"description": "Price per square foot in SGD."
},
"psf_min": {
"type": "number",
"minimum": 1,
"description": "Price per square foot in SGD."
},
"bedrooms": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"district": {
"type": "string",
"maxLength": 20
},
"size_max": {
"type": "number",
"minimum": 1,
"description": "Floor area in square feet."
},
"size_min": {
"type": "number",
"minimum": 1,
"description": "Floor area in square feet."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"maxLength": 20
},
"maxItems": 28,
"minItems": 1,
"description": "Singapore postal districts, such as \"D09\" or \"15\"."
},
"listed_by": {
"enum": [
"owner",
"agent"
],
"type": "string",
"description": "Who lists the home. owner keeps homes their owners list: on Homejourney, or on HDB Flat Portal without an agent. agent keeps every other home. pagination.total counts only these homes."
},
"mrt_lines": {
"type": "array",
"items": {
"enum": [
"North South Line",
"East West Line",
"Northeast Line",
"Circle Line",
"Downtown Line",
"Thomson-East Coast Line",
"Bukit Panjang LRT",
"Sengkang LRT",
"Punggol LRT"
],
"type": "string"
},
"maxItems": 9,
"minItems": 1,
"description": "MRT or LRT lines; a listing matches when its nearest station is on one. Combines with mrt_stations as 'near any'."
},
"price_max": {
"type": "number",
"minimum": 1
},
"price_min": {
"type": "number",
"minimum": 1
},
"furnishing": {
"enum": [
"unfurnished",
"partial",
"fully_furnished"
],
"type": "string",
"description": "The furnishing the renter wants. Matches homes stated as this, and homes that state no furnishing."
},
"bedrooms_min": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"listing_type": {
"enum": [
"For Sale",
"For Rent"
],
"type": "string"
},
"mrt_stations": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 10,
"minItems": 1,
"description": "Nearest MRT station names, such as \"Orchard\" or \"Tanjong Pagar\"."
},
"project_name": {
"type": "string",
"maxLength": 120,
"description": "Exact condominium or development name."
},
"bathrooms_min": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"property_type": {
"type": "string",
"maxLength": 80
},
"available_from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The renter's move-in date. Matches homes available on or before it, and homes that state no date."
},
"bedroom_counts": {
"type": "array",
"items": {
"type": "integer",
"maximum": 10,
"minimum": 0
},
"maxItems": 11,
"minItems": 1,
"description": "Exact bedroom counts to match, such as [2, 3]; 0 is a studio. Combines with bedrooms_min, so [0] plus bedrooms_min 5 means studio or 5+."
},
"hdb_flat_types": {
"type": "array",
"items": {
"enum": [
"2-room",
"3-room",
"4-room",
"5-room",
"executive"
],
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"description": "HDB flat types, such as \"4-room\" or \"executive\"."
},
"reachable_only": {
"type": "boolean",
"description": "Only homes whose owner or agent can be reached now: a viewing request reaches the owner or a Homejourney agent, or the lister takes WhatsApp. Leaves out homes whose agent is not on Homejourney yet and has no verified WhatsApp number. pagination.total counts only these homes."
},
"bathroom_counts": {
"type": "array",
"items": {
"type": "integer",
"maximum": 10,
"minimum": 1
},
"maxItems": 11,
"minItems": 1,
"description": "Exact bathroom counts to match; combines with bathrooms_min."
},
"subletting_type": {
"enum": [
"whole_unit",
"master_room",
"common_room",
"studio",
"bed"
],
"type": "string"
},
"listed_within_days": {
"type": "integer",
"maximum": 365,
"minimum": 1
},
"lease_duration_months": {
"type": "integer",
"maximum": 60,
"minimum": 1,
"description": "The renter's lease length in months. Matches homes whose minimum lease is at most this, and homes that state no minimum."
}
},
"additionalProperties": false
}