Skip to main content
Glama

Homejourney Singapore property listings

Search Homejourney listings

search_listings
Read-only

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, school, 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; the listings one agent has at one address or in one development on a page come back as one result whose listingCluster names the others. 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.

Input Schema

NameRequiredDescriptionDefault
pageNo
sortNonewest is the recommended order; listed_newest is strictly by listing date.newest
limitNo
queryNo
townsNoHDB 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.
schoolNoA school's full MOE name, such as "Tao Nan School". Matches homes that list it among their nearby schools; each result's searchedSchool gives its distance. Use for "near a school" or Primary 1 searches.
tenureNo
psf_maxNoPrice per square foot in SGD.
psf_minNoPrice per square foot in SGD.
bedroomsNo
districtNo
size_maxNoFloor area in square feet.
size_minNoFloor area in square feet.
districtsNoSingapore postal districts, such as "D09" or "15".
listed_byNoWho 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_linesNoMRT or LRT lines; a listing matches when its nearest station is on one. Combines with mrt_stations as 'near any'.
price_maxNo
price_minNo
furnishingNoThe furnishing the renter wants. Matches homes stated as this, and homes that state no furnishing.
bedrooms_minNo
listing_typeNo
mrt_stationsNoNearest MRT station names, such as "Orchard" or "Tanjong Pagar".
pets_allowedNotrue for a renter with a pet. Leaves out homes that say no pets; homes that state no pet policy still match, so confirm it with the lister.
project_nameNoExact condominium or development name.
bathrooms_minNo
property_typeNoOne of HDB, Condominium, Executive Condominium, Landed. Common words such as Condo, EC, Apartment, HDB flat or Bungalow are read as these.
available_fromNoThe renter's move-in date. Matches homes available on or before it, and homes that state no date.
bedroom_countsNoExact 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+.
foreign_tenantNotrue for a renter who is a foreigner, expat or PR. Searches rentals, rooms included, since no listing turns non-citizens away. An HDB whole flat comes back with checkHdbQuota true: it can go to a non-citizen other than a Malaysian only while HDB's quota for its block has room, which only HDB's quota checker can say, so tell the user to check it. The query words "expat" and "foreigner" set this too.
hdb_flat_typesNoHDB flat types, such as "4-room" or "executive".
reachable_onlyNoOnly 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_countsNoExact bathroom counts to match; combines with bathrooms_min.
subletting_typeNo
landed_house_typesNoLanded house types, such as "semi_detached" or "terrace"; detached is a bungalow, and strata_landed a landed house in a condominium development. Corner and intermediate houses both match their type. A landed listing that does not state its house type is left out, so pagination.total counts only listings that say.
listed_within_daysNo
utilities_includedNotrue for a renter who wants utilities in the rent. Leaves out homes that say utilities are extra; homes that do not say still match, so confirm it with the lister.
lease_duration_monthsNoThe renter's lease length in months. Matches homes whose minimum lease is at most this, and homes that state no minimum.
max_school_distance_kmNoKeeps homes within this many km of a school, such as 1 or 2 for the Primary 1 bands. With school, the limit applies to that school, and each result's searchedSchool.distanceKm gives its distance.
messages_on_homejourneyNoOnly homes whose host reads Homejourney messages: start_listing_conversation reaches the listing's Homejourney agent, else its owner, so the user's viewing can be arranged in a Homejourney thread. Leaves out homes reached only by a viewing request or WhatsApp. pagination.total counts only these homes.
min_remaining_lease_yearsNoFewest whole years of lease that must remain, as compare_listings reads it: an HDB flat's block lease, or a condo, EC or landed home's land lease. Freehold and 999-year homes always match, and so does an HDB flat whose block's year completed alone leaves enough (lease.minRemainingYears); homes whose lease left is not known are left out, and leaseFilter.leaseUnknown counts them. pagination.total counts only the matches.

Output Schema

NameRequiredDescriptionDefault
dataYes
featuredNoLabelled Pro listings matching the search, on page 1 only.
nextStepsNoSuggestions for what the user usually does next, best first. Each names the tool to call or the page to open; none is taken without the user asking, and a tool that writes still needs their confirmation.
paginationYes
leaseFilterNoHow min_remaining_lease_years narrowed the search.
matchedTermNo
roomMatchesNoRooms that match when no whole unit does.
featuredNoteNo
resultReasonNoWhy the search found no listing, or that it searched a corrected term.
unappliedIntentNoWords in query that an explicit filter replaced; those words were not searched.
continuedClustersNoThis page's listings in a listingCluster that the previous page already shows, which data leaves out: listingId is one of its listings on that page, listingIds are this page's listings in it.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / typicalRent
      Added value: +{
      +  "description": "Details only, for a sale listing: the typical rent and gross yield its web page shows. monthlyRent is the median monthly rent in S$ of the last 12 months' recorded whole-home rentals like it: the same bedroom count in its development, or for an HDB flat the same flat type on its street, in any block. rentals is how many, fromMonth and toMonth (YYYY-MM) the months they span, and basis names them. grossYieldPct is monthlyRent × 12 ÷ the asking price, leaving out costs, vacancy and ABSD. Null for a rental, or below five matching rentals.",
      +  "properties": {
      +    "basis": {
      +      "type": "string"
      +    },
      +    "fromMonth": {
      +      "type": "string"
      +    },
      +    "grossYieldPct": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "monthlyRent": {
      +      "type": "number"
      +    },
      +    "rentals": {
      +      "minimum": 5,
      +      "type": "integer"
      +    },
      +    "toMonth": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "monthlyRent",
      +    "rentals",
      +    "fromMonth",
      +    "toMonth",
      +    "basis"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / typicalRent
      Added value: +{
      +  "description": "Details only, for a sale listing: the typical rent and gross yield its web page shows. monthlyRent is the median monthly rent in S$ of the last 12 months' recorded whole-home rentals like it: the same bedroom count in its development, or for an HDB flat the same flat type on its street, in any block. rentals is how many, fromMonth and toMonth (YYYY-MM) the months they span, and basis names them. grossYieldPct is monthlyRent × 12 ÷ the asking price, leaving out costs, vacancy and ABSD. Null for a rental, or below five matching rentals.",
      +  "properties": {
      +    "basis": {
      +      "type": "string"
      +    },
      +    "fromMonth": {
      +      "type": "string"
      +    },
      +    "grossYieldPct": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "monthlyRent": {
      +      "type": "number"
      +    },
      +    "rentals": {
      +      "minimum": 5,
      +      "type": "integer"
      +    },
      +    "toMonth": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "monthlyRent",
      +    "rentals",
      +    "fromMonth",
      +    "toMonth",
      +    "basis"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / landed_house_types
      Added value: +{
      +  "description": "Landed house types, such as \"semi_detached\" or \"terrace\"; detached is a bungalow, and strata_landed a landed house in a condominium development. Corner and intermediate houses both match their type. A landed listing that does not state its house type is left out, so pagination.total counts only listings that say.",
      +  "items": {
      +    "enum": [
      +      "terrace",
      +      "semi_detached",
      +      "detached",
      +      "cluster",
      +      "strata_landed"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 5,
      +  "minItems": 1,
      +  "type": "array"
      +}
  3. Changed5 schema fields changed
    • changedInput schema / properties / min_remaining_lease_years / description
      Previous value: -"Fewest whole years of lease that must remain, as compare_listings reads it: an HDB flat's block lease, or a condo, EC or landed home's land lease. Freehold and 999-year homes always match; homes whose lease left is not known are left out, and leaseFilter.leaseUnknown counts them. pagination.total counts only the matches."New value: +"Fewest whole years of lease that must remain, as compare_listings reads it: an HDB flat's block lease, or a condo, EC or landed home's land lease. Freehold and 999-year homes always match, and so does an HDB flat whose block's year completed alone leaves enough (lease.minRemainingYears); homes whose lease left is not known are left out, and leaseFilter.leaseUnknown counts them. pagination.total counts only the matches."
    • changedOutput schema / properties / data / items / properties / lease / description
      Previous value: -"Search, compare and details, for every home: its tenure, the lease left this month and its age from TOP, as the listing page shows them. An HDB flat's lease comes from its block's resale records; a condo, EC or landed home's from URA's records of its land lease, not its TOP. remainingLabel is 'Lease start not confirmed' for a leasehold whose start is not found, and null for freehold and 999-year homes. Null when nothing is known."New value: +"Search, compare and details, for every home: its tenure, the lease left this month and its age from TOP, as the listing page shows them. An HDB flat's lease comes from its block's resale records, and its age from HDB's year completed when the block has no resale yet; a condo, EC or landed home's from URA's records of its land lease, not its TOP. remainingLabel is 'Lease start not confirmed' for a leasehold whose start is not found, and null for freehold and 999-year homes. Null when nothing is known."
    • addedOutput schema / properties / data / items / properties / lease / properties / minRemainingYears
      Added value: +{
      +  "description": "Only for an HDB flat whose lease start is not confirmed: the fewest whole years that can be left, from its block's year completed. min_remaining_lease_years uses it; it is not the lease left.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / featured / items / properties / lease / description
      Previous value: -"Search, compare and details, for every home: its tenure, the lease left this month and its age from TOP, as the listing page shows them. An HDB flat's lease comes from its block's resale records; a condo, EC or landed home's from URA's records of its land lease, not its TOP. remainingLabel is 'Lease start not confirmed' for a leasehold whose start is not found, and null for freehold and 999-year homes. Null when nothing is known."New value: +"Search, compare and details, for every home: its tenure, the lease left this month and its age from TOP, as the listing page shows them. An HDB flat's lease comes from its block's resale records, and its age from HDB's year completed when the block has no resale yet; a condo, EC or landed home's from URA's records of its land lease, not its TOP. remainingLabel is 'Lease start not confirmed' for a leasehold whose start is not found, and null for freehold and 999-year homes. Null when nothing is known."
    • addedOutput schema / properties / featured / items / properties / lease / properties / minRemainingYears
      Added value: +{
      +  "description": "Only for an HDB flat whose lease start is not confirmed: the fewest whole years that can be left, from its block's year completed. min_remaining_lease_years uses it; it is not the lease left.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
  4. Changed6 schema fields changed
    • changedOutput schema / properties / data / items / properties / financing / description
      Previous value: -"Details only, for a sale listing: the financing figures its web page shows at the asking price and lease, for a Singapore citizen's first home with no other loans. primary is the bank loan; options adds the HDB loan for an HDB flat when its lease allows one. grossIncomeNeeded is the monthly income a loan needs under incomeLimitLabel (MSR for an HDB flat, else TDSR) at stressRatePct. buyerStampDuty, legalFees and totalUpfront (down payment, BSD and legal fees, no ABSD) are in S$. buyerAge is the youngest buyer's age assumed; estimate_mortgage_options takes another age or residency. Null for a rental."New value: +"Details only, for a sale listing: the financing figures its web page shows at the asking price and lease, for a Singapore citizen's first home with no other loans. primary is the bank loan; options adds the HDB loan for an HDB flat when its lease allows one; when a 75% HDB loan would need more than HDB's S$16,000 family income ceiling, that option is the largest loan a household at the ceiling repays, with incomeCap set. grossIncomeNeeded is the monthly income a loan needs under incomeLimitLabel (MSR for an HDB flat, else TDSR) at stressRatePct. buyerStampDuty, legalFees and totalUpfront (down payment, BSD and legal fees, no ABSD) are in S$. buyerAge is the youngest buyer's age assumed; estimate_mortgage_options takes another age or residency. Null for a rental."
    • changedOutput schema / properties / data / items / properties / hdbFlatTypeUnknownReason / description
      Previous value: -"For an HDB flat without hdbFlatType: why its type is unverified. no_block and no_block_records: its block has no HDB resale records yet; no_size_match: its size matches no flat type in its block's records; ambiguous: its size fits more than one flat type in its block; no_size: the listing gives no floor area."New value: +"For an HDB flat without hdbFlatType: why its type is unverified. no_block and no_block_records: its block has no HDB resale records yet; no_size_match: its size matches no flat type in its block's records; ambiguous: its size fits more than one flat type in its block; no_size: the listing gives no floor area; room_size_only: a let room's listing gives only the room's size, not the flat's."
    • changedOutput schema / properties / data / items / properties / squareFeet / description
      Previous value: -"Floor area. An owner's let room gives the flat's here; read room.squareFeet for the room's own size."New value: +"Floor area. A let room may give the flat's here, as every owner's does; read room.squareFeet for the room's own size, null when the listing gives only the flat's."
    • changedOutput schema / properties / featured / items / properties / financing / description
      Previous value: -"Details only, for a sale listing: the financing figures its web page shows at the asking price and lease, for a Singapore citizen's first home with no other loans. primary is the bank loan; options adds the HDB loan for an HDB flat when its lease allows one. grossIncomeNeeded is the monthly income a loan needs under incomeLimitLabel (MSR for an HDB flat, else TDSR) at stressRatePct. buyerStampDuty, legalFees and totalUpfront (down payment, BSD and legal fees, no ABSD) are in S$. buyerAge is the youngest buyer's age assumed; estimate_mortgage_options takes another age or residency. Null for a rental."New value: +"Details only, for a sale listing: the financing figures its web page shows at the asking price and lease, for a Singapore citizen's first home with no other loans. primary is the bank loan; options adds the HDB loan for an HDB flat when its lease allows one; when a 75% HDB loan would need more than HDB's S$16,000 family income ceiling, that option is the largest loan a household at the ceiling repays, with incomeCap set. grossIncomeNeeded is the monthly income a loan needs under incomeLimitLabel (MSR for an HDB flat, else TDSR) at stressRatePct. buyerStampDuty, legalFees and totalUpfront (down payment, BSD and legal fees, no ABSD) are in S$. buyerAge is the youngest buyer's age assumed; estimate_mortgage_options takes another age or residency. Null for a rental."
    • changedOutput schema / properties / featured / items / properties / hdbFlatTypeUnknownReason / description
      Previous value: -"For an HDB flat without hdbFlatType: why its type is unverified. no_block and no_block_records: its block has no HDB resale records yet; no_size_match: its size matches no flat type in its block's records; ambiguous: its size fits more than one flat type in its block; no_size: the listing gives no floor area."New value: +"For an HDB flat without hdbFlatType: why its type is unverified. no_block and no_block_records: its block has no HDB resale records yet; no_size_match: its size matches no flat type in its block's records; ambiguous: its size fits more than one flat type in its block; no_size: the listing gives no floor area; room_size_only: a let room's listing gives only the room's size, not the flat's."
    • changedOutput schema / properties / featured / items / properties / squareFeet / description
      Previous value: -"Floor area. An owner's let room gives the flat's here; read room.squareFeet for the room's own size."New value: +"Floor area. A let room may give the flat's here, as every owner's does; read room.squareFeet for the room's own size, null when the listing gives only the flat's."
  5. Changed1 schema field changed
    • addedInput schema / properties / foreign_tenant
      Added value: +{
      +  "description": "true for a renter who is a foreigner, expat or PR. Searches rentals, rooms included, since no listing turns non-citizens away. An HDB whole flat comes back with checkHdbQuota true: it can go to a non-citizen other than a Malaysian only while HDB's quota for its block has room, which only HDB's quota checker can say, so tell the user to check it. The query words \"expat\" and \"foreigner\" set this too.",
      +  "type": "boolean"
      +}
  6. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / gcbArea
      Added value: +{
      +  "description": "Details only: the URA Good Class Bungalow area a landed home stands in, from its location, such as Kilburn Estate; null outside every area. The Ministry of Law has approved no foreign buyer, PRs included, for one since 2021.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / gcbArea
      Added value: +{
      +  "description": "Details only: the URA Good Class Bungalow area a landed home stands in, from its location, such as Kilburn Estate; null outside every area. The Ministry of Law has approved no foreign buyer, PRs included, for one since 2021.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  7. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / financing
      Added value: +{
      +  "description": "Details only, for a sale listing: the financing figures its web page shows at the asking price and lease, for a Singapore citizen's first home with no other loans. primary is the bank loan; options adds the HDB loan for an HDB flat when its lease allows one. grossIncomeNeeded is the monthly income a loan needs under incomeLimitLabel (MSR for an HDB flat, else TDSR) at stressRatePct. buyerStampDuty, legalFees and totalUpfront (down payment, BSD and legal fees, no ABSD) are in S$. buyerAge is the youngest buyer's age assumed; estimate_mortgage_options takes another age or residency. Null for a rental.",
      +  "properties": {
      +    "buyerAge": {
      +      "type": "integer"
      +    },
      +    "buyerStampDuty": {
      +      "type": "number"
      +    },
      +    "cpfUsagePct": {
      +      "type": "number"
      +    },
      +    "legalFees": {
      +      "type": "number"
      +    },
      +    "options": {
      +      "items": {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "primary": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "remainingLeaseYears": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "totalUpfront": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "primary",
      +    "totalUpfront"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / financing
      Added value: +{
      +  "description": "Details only, for a sale listing: the financing figures its web page shows at the asking price and lease, for a Singapore citizen's first home with no other loans. primary is the bank loan; options adds the HDB loan for an HDB flat when its lease allows one. grossIncomeNeeded is the monthly income a loan needs under incomeLimitLabel (MSR for an HDB flat, else TDSR) at stressRatePct. buyerStampDuty, legalFees and totalUpfront (down payment, BSD and legal fees, no ABSD) are in S$. buyerAge is the youngest buyer's age assumed; estimate_mortgage_options takes another age or residency. Null for a rental.",
      +  "properties": {
      +    "buyerAge": {
      +      "type": "integer"
      +    },
      +    "buyerStampDuty": {
      +      "type": "number"
      +    },
      +    "cpfUsagePct": {
      +      "type": "number"
      +    },
      +    "legalFees": {
      +      "type": "number"
      +    },
      +    "options": {
      +      "items": {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "primary": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "remainingLeaseYears": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "totalUpfront": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "primary",
      +    "totalUpfront"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  8. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / requestedListing
      Added value: +{
      +  "description": "Details and compare: the id asked for when it is one portal's listing of this home, such as an agent's own listing from search_agents, which Homejourney shows as this listing (id). platform and price are that portal's; sourceAgents names each portal's agent. Use id for viewings and saves.",
      +  "properties": {
      +    "id": {
      +      "format": "uuid",
      +      "type": "string"
      +    },
      +    "platform": {
      +      "type": "string"
      +    },
      +    "price": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / featured / items / properties / requestedListing
      Added value: +{
      +  "description": "Details and compare: the id asked for when it is one portal's listing of this home, such as an agent's own listing from search_agents, which Homejourney shows as this listing (id). platform and price are that portal's; sourceAgents names each portal's agent. Use id for viewings and saves.",
      +  "properties": {
      +    "id": {
      +      "format": "uuid",
      +      "type": "string"
      +    },
      +    "platform": {
      +      "type": "string"
      +    },
      +    "price": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  9. Changed5 schema fields changed
    • addedOutput schema / properties / continuedClusters
      Added value: +{
      +  "description": "This page's listings in a listingCluster that the previous page already shows, which data leaves out: listingId is one of its listings on that page, listingIds are this page's listings in it.",
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "address": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "listingId": {
      +        "type": "string"
      +      },
      +      "listingIds": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "page": {
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "scope": {
      +        "enum": [
      +          "address",
      +          "development"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "listingId",
      +      "page",
      +      "listingIds"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / data / items / properties / listingCluster / description
      Previous value: -"Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on the page joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart."New value: +"Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on this page or the next joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart."
    • addedOutput schema / properties / data / items / properties / listingCluster / properties / listingsOnThisPage
      Added value: +{
      +  "description": "Present when some of them are on the next page: how many are on this one. The next page leaves those out and names this result in continuedClusters.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / featured / items / properties / listingCluster / description
      Previous value: -"Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on the page joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart."New value: +"Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on this page or the next joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart."
    • addedOutput schema / properties / featured / items / properties / listingCluster / properties / listingsOnThisPage
      Added value: +{
      +  "description": "Present when some of them are on the next page: how many are on this one. The next page leaves those out and names this result in continuedClusters.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
  10. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / listingCluster
      Added value: +{
      +  "description": "Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on the page joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart.",
      +  "properties": {
      +    "listingCount": {
      +      "minimum": 2,
      +      "type": "integer"
      +    },
      +    "maxPrice": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "minPrice": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "otherListingIds": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "scope": {
      +      "enum": [
      +        "address",
      +        "development"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "listingCount",
      +    "otherListingIds",
      +    "scope"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / featured / items / properties / listingCluster
      Added value: +{
      +  "description": "Search only: this result stands for listingCount listings one agent lists at one address (scope address) or in one development (scope development), itself and otherListingIds, priced minPrice to maxPrice. Absent for a listing no other on the page joins. The listings may be different homes, since an agent can list two flats in one block; pass an id to get_listing_details to tell them apart.",
      +  "properties": {
      +    "listingCount": {
      +      "minimum": 2,
      +      "type": "integer"
      +    },
      +    "maxPrice": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "minPrice": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "otherListingIds": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "scope": {
      +      "enum": [
      +        "address",
      +        "development"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "listingCount",
      +    "otherListingIds",
      +    "scope"
      +  ],
      +  "type": "object"
      +}
  11. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / hdbFlatTypeUnknownReason
      Added value: +{
      +  "description": "For an HDB flat without hdbFlatType: why its type is unverified. no_block and no_block_records: its block has no HDB resale records yet; no_size_match: its size matches no flat type in its block's records; ambiguous: its size fits more than one flat type in its block; no_size: the listing gives no floor area.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / featured / items / properties / hdbFlatTypeUnknownReason
      Added value: +{
      +  "description": "For an HDB flat without hdbFlatType: why its type is unverified. no_block and no_block_records: its block has no HDB resale records yet; no_size_match: its size matches no flat type in its block's records; ambiguous: its size fits more than one flat type in its block; no_size: the listing gives no floor area.",
      +  "type": "string"
      +}
  12. Changed1 schema field changed
    • addedInput schema / properties / messages_on_homejourney
      Added value: +{
      +  "description": "Only homes whose host reads Homejourney messages: start_listing_conversation reaches the listing's Homejourney agent, else its owner, so the user's viewing can be arranged in a Homejourney thread. Leaves out homes reached only by a viewing request or WhatsApp. pagination.total counts only these homes.",
      +  "type": "boolean"
      +}
  13. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them) and busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them) and preschools (ECDA-licensed childcare centres, kindergartens and early years centres within 1 km: name, place, walkMinutes; credit \"Contains information from ECDA\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
    • changedOutput schema / properties / featured / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them) and busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them) and preschools (ECDA-licensed childcare centres, kindergartens and early years centres within 1 km: name, place, walkMinutes; credit \"Contains information from ECDA\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  14. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / reportUrl / description
      Previous value: -"Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. The user sends the report themselves; null for other listings."New value: +"Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. For a flat its owner lists on HDB Flat Portal, the same form takes only that it's gone or its details are wrong. The user sends the report themselves; null for other listings."
    • changedOutput schema / properties / featured / items / properties / reportUrl / description
      Previous value: -"Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. The user sends the report themselves; null for other listings."New value: +"Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. For a flat its owner lists on HDB Flat Portal, the same form takes only that it's gone or its details are wrong. The user sends the report themselves; null for other listings."
  15. Changed2 schema fields changed
    • addedInput schema / properties / min_remaining_lease_years
      Added value: +{
      +  "description": "Fewest whole years of lease that must remain, as compare_listings reads it: an HDB flat's block lease, or a condo, EC or landed home's land lease. Freehold and 999-year homes always match; homes whose lease left is not known are left out, and leaseFilter.leaseUnknown counts them. pagination.total counts only the matches.",
      +  "maximum": 99,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / leaseFilter
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "How min_remaining_lease_years narrowed the search.",
      +  "properties": {
      +    "candidates": {
      +      "description": "Homes matching every other filter.",
      +      "type": "integer"
      +    },
      +    "leaseChecked": {
      +      "description": "Homes whose lease was checked; fewer than candidates when the search was too broad.",
      +      "type": "integer"
      +    },
      +    "leaseUnknown": {
      +      "description": "Homes matching every other filter whose lease left is not known; left out.",
      +      "type": "integer"
      +    },
      +    "minRemainingLeaseYears": {
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
  16. Changed1 schema field changed
    • addedOutput schema / properties / roomMatches
      Added value: +{
      +  "description": "Rooms that match when no whole unit does.",
      +  "type": "integer"
      +}
  17. Changed1 schema field changed
    • changedInput schema / properties / max_school_distance_km / description
      Previous value: -"Keeps homes with a school within this many km, such as 1 or 2 for the Primary 1 bands. With school, check searchedSchool.distanceKm: this limit is met by any nearby school, as on the website."New value: +"Keeps homes within this many km of a school, such as 1 or 2 for the Primary 1 bands. With school, the limit applies to that school, and each result's searchedSchool.distanceKm gives its distance."
  18. Changed4 schema fields changed
    • addedInput schema / properties / max_school_distance_km
      Added value: +{
      +  "description": "Keeps homes with a school within this many km, such as 1 or 2 for the Primary 1 bands. With school, check searchedSchool.distanceKm: this limit is met by any nearby school, as on the website.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 5,
      +  "type": "number"
      +}
    • addedInput schema / properties / school
      Added value: +{
      +  "description": "A school's full MOE name, such as \"Tao Nan School\". Matches homes that list it among their nearby schools; each result's searchedSchool gives its distance. Use for \"near a school\" or Primary 1 searches.",
      +  "maxLength": 120,
      +  "type": "string"
      +}
    • addedOutput schema / properties / data / items / properties / searchedSchool
      Added value: +{
      +  "description": "Search with school only: {name, distanceKm}, that school and its straight-line distance from the block, or null when the home does not list it nearby. For Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / searchedSchool
      Added value: +{
      +  "description": "Search with school only: {name, distanceKm}, that school and its straight-line distance from the block, or null when the home does not list it nearby. For Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  19. Changed1 schema field changed
    • addedInput schema / properties / property_type / description
      Added value: +"One of HDB, Condominium, Executive Condominium, Landed. Common words such as Condo, EC, Apartment, HDB flat or Bungalow are read as these."
  20. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes) and malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them) and busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
    • changedOutput schema / properties / featured / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes) and malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them) and busStops (LTA bus stops within 400 m: code, name, place as the road, services as the bus numbers that call there, walkMinutes; credit \"Contains information from LTA DataMall\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  21. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / bookingUrl / description
      Previous value: -"Where the user asks for a viewing."New value: +"Where the user asks for a viewing. Absent when that page takes no request: the owner books on a portal (reach.bookOn says where) or no request reaches anyone."
    • changedOutput schema / properties / featured / items / properties / bookingUrl / description
      Previous value: -"Where the user asks for a viewing."New value: +"Where the user asks for a viewing. Absent when that page takes no request: the owner books on a portal (reach.bookOn says where) or no request reaches anyone."
  22. Changed2 schema fields changed
    • addedInput schema / properties / pets_allowed
      Added value: +{
      +  "description": "true for a renter with a pet. Leaves out homes that say no pets; homes that state no pet policy still match, so confirm it with the lister.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / utilities_included
      Added value: +{
      +  "description": "true for a renter who wants utilities in the rent. Leaves out homes that say utilities are extra; homes that do not say still match, so confirm it with the lister.",
      +  "type": "boolean"
      +}
  23. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / houseRules / description
      Previous value: -"Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. Empty or null when it states none."New value: +"Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. An owner rental may add \"tenants\", who the owner says the home suits (families, couples, working_professionals, students); none is no preference. Empty or null when it states none."
    • changedOutput schema / properties / featured / items / properties / houseRules / description
      Previous value: -"Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. Empty or null when it states none."New value: +"Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. An owner rental may add \"tenants\", who the owner says the home suits (families, couples, working_professionals, students); none is no preference. Empty or null when it states none."
  24. Changed6 schema fields changed
    • addedOutput schema / properties / data / items / properties / bathrooms / description
      Added value: +"The whole home's bathrooms; for a let room, read room.ownBathroom."
    • addedOutput schema / properties / data / items / properties / room
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "For a rental that lets a master room, common room or bed space: the room itself, which its card shows in place of the flat's bathrooms and floor area. Null for a whole home, a studio or a sale.",
      +  "properties": {
      +    "label": {
      +      "description": "Master room, Common room or Bed space.",
      +      "type": "string"
      +    },
      +    "ownBathroom": {
      +      "description": "True for an attached bathroom, false for a shared one, null when not stated.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "squareFeet": {
      +      "description": "The room's own size; null when not stated, never the flat's.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "label"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / items / properties / squareFeet / description
      Added value: +"Floor area. An owner's let room gives the flat's here; read room.squareFeet for the room's own size."
    • addedOutput schema / properties / featured / items / properties / bathrooms / description
      Added value: +"The whole home's bathrooms; for a let room, read room.ownBathroom."
    • addedOutput schema / properties / featured / items / properties / room
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "For a rental that lets a master room, common room or bed space: the room itself, which its card shows in place of the flat's bathrooms and floor area. Null for a whole home, a studio or a sale.",
      +  "properties": {
      +    "label": {
      +      "description": "Master room, Common room or Bed space.",
      +      "type": "string"
      +    },
      +    "ownBathroom": {
      +      "description": "True for an attached bathroom, false for a shared one, null when not stated.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "squareFeet": {
      +      "description": "The room's own size; null when not stated, never the flat's.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "label"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / squareFeet / description
      Added value: +"Floor area. An owner's let room gives the flat's here; read room.squareFeet for the room's own size."
  25. Changed1 schema field changed
    • addedOutput schema / properties / unappliedIntent
      Added value: +{
      +  "description": "Words in query that an explicit filter replaced; those words were not searched.",
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "kind": {
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": [
      +          "string",
      +          "number"
      +        ]
      +      },
      +      "words": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "value",
      +      "words"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  26. Changed1 schema field changed
    • addedOutput schema / properties / nextSteps
      Added value: +{
      +  "description": "Suggestions for what the user usually does next, best first. Each names the tool to call or the page to open; none is taken without the user asking, and a tool that writes still needs their confirmation.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "type": "string"
      +      },
      +      "tool": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "format": "uri",
      +        "type": "string"
      +      },
      +      "why": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "why"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 3,
      +  "type": "array"
      +}
  27. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, and parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes) and malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
    • changedOutput schema / properties / featured / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, and parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes) and malls (shopping malls within 2 km from OpenStreetMap: name, walkMinutes; credit \"© OpenStreetMap contributors\" when you show them), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  28. Changed4 schema fields changed
    • addedOutput schema / properties / data / items / properties / description
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / items / properties / descriptionSource
      Added value: +{
      +  "description": "Who wrote description: generated means Homejourney wrote it from the listing's photos and data, so say so when quoting it and never present it as the lister's words; listing means the lister wrote it; null with no description.",
      +  "enum": [
      +    "generated",
      +    "listing",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / description
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / descriptionSource
      Added value: +{
      +  "description": "Who wrote description: generated means Homejourney wrote it from the listing's photos and data, so say so when quoting it and never present it as the lister's words; listing means the lister wrote it; null with no description.",
      +  "enum": [
      +    "generated",
      +    "listing",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  29. Changed4 schema fields changed
    • addedOutput schema / properties / data / items / properties / maxOccupants
      Added value: +{
      +  "description": "Details only, for a rental: the most people who may live in the home or room, 1 to 20. Null when not stated.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / items / properties / utilitiesIncluded
      Added value: +{
      +  "description": "Details only, for a rental: whether the rent includes utilities (true) or not (false). Null when the listing does not say.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / maxOccupants
      Added value: +{
      +  "description": "Details only, for a rental: the most people who may live in the home or room, 1 to 20. Null when not stated.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / utilitiesIncluded
      Added value: +{
      +  "description": "Details only, for a rental: whether the rent includes utilities (true) or not (false). Null when the listing does not say.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
  30. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / reportUrl
      Added value: +{
      +  "description": "Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. The user sends the report themselves; null for other listings.",
      +  "format": "uri",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / reportUrl
      Added value: +{
      +  "description": "Details only: for an owner listing, the listing page with its Report this listing form open, where the user tells Homejourney the details or photos are wrong, it isn't the owner's, it's gone or it looks like a scam. The user sends the report themselves; null for other listings.",
      +  "format": "uri",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  31. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, and parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
    • changedOutput schema / properties / featured / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, and parks (NParks parks within 1 km of their nearest edge: name, areaHectares, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  32. Changed3 schema fields changed
    • changedInput schema / properties / mrt_lines / description
      Previous value: -"MRT lines; a listing matches when its nearest station is on one. Combines with mrt_stations as 'near any'."New value: +"MRT or LRT lines; a listing matches when its nearest station is on one. Combines with mrt_stations as 'near any'."
    • changedInput schema / properties / mrt_lines / items / enum
      Previous value: -[
      -  "North South Line",
      -  "East West Line",
      -  "Northeast Line",
      -  "Circle Line",
      -  "Downtown Line",
      -  "Thomson-East Coast Line"
      -]New value: +[
      +  "North South Line",
      +  "East West Line",
      +  "Northeast Line",
      +  "Circle Line",
      +  "Downtown Line",
      +  "Thomson-East Coast Line",
      +  "Bukit Panjang LRT",
      +  "Sengkang LRT",
      +  "Punggol LRT"
      +]
    • changedInput schema / properties / mrt_lines / maxItems
      Previous value: -6New value: +9
  33. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
    • changedOutput schema / properties / featured / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), futureStations (stations under construction within 1.5 km: name, lines, openingYear as LTA expects it or null when not dated, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  34. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / hdbFlatType / description
      Previous value: -"Search results only, for an HDB flat: its flat type, such as 4-room or executive, inferred from its block's resale records and its size."New value: +"For an HDB flat in search, details and compare: its flat type, such as 4-room or executive, inferred from its block's resale records and its size. Absent when no single type matches, so treat that flat's type as unverified and never infer it from bedrooms."
    • changedOutput schema / properties / featured / items / properties / hdbFlatType / description
      Previous value: -"Search results only, for an HDB flat: its flat type, such as 4-room or executive, inferred from its block's resale records and its size."New value: +"For an HDB flat in search, details and compare: its flat type, such as 4-room or executive, inferred from its block's resale records and its size. Absent when no single type matches, so treat that flat's type as unverified and never infer it from bedrooms."
  35. Changed1 schema field changed
    • addedInput schema / properties / listed_by
      Added value: +{
      +  "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.",
      +  "enum": [
      +    "owner",
      +    "agent"
      +  ],
      +  "type": "string"
      +}
  36. Changed1 schema field changed
    • addedInput schema / properties / reachable_only
      Added value: +{
      +  "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.",
      +  "type": "boolean"
      +}
  37. Changed1 schema field changed
    • changedInput schema / properties / towns / description
      Previous value: -"HDB towns or URA planning areas the listing lies in, such as \"Tampines\" or \"Bukit Timah\"."New value: +"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."
  38. Changed1 schema field changed
    • removedInput schema / properties / reachable_only
      Removed value: -{
      -  "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.",
      -  "type": "boolean"
      -}
  39. Changed1 schema field changed
    • addedInput schema / properties / reachable_only
      Added value: +{
      +  "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.",
      +  "type": "boolean"
      +}
  40. Changed4 schema fields changed
    • changedOutput schema / properties / data / items / properties / depositMonths / description
      Previous value: -"Details only, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none."New value: +"Details and compare, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none."
    • addedOutput schema / properties / data / items / properties / houseRules
      Added value: +{
      +  "description": "Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. Empty or null when it states none.",
      +  "type": [
      +    "object",
      +    "array",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / featured / items / properties / depositMonths / description
      Previous value: -"Details only, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none."New value: +"Details and compare, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none."
    • addedOutput schema / properties / featured / items / properties / houseRules
      Added value: +{
      +  "description": "Details and compare: the house rules the listing states, such as {\"pets\": false, \"cooking\": true} (true allowed, false not allowed) or rules in words such as [\"no_smoking\"]. Empty or null when it states none.",
      +  "type": [
      +    "object",
      +    "array",
      +    "null"
      +  ]
      +}
  41. Changed1 schema field changed
    • addedInput schema / properties / furnishing
      Added value: +{
      +  "description": "The furnishing the renter wants. Matches homes stated as this, and homes that state no furnishing.",
      +  "enum": [
      +    "unfurnished",
      +    "partial",
      +    "fully_furnished"
      +  ],
      +  "type": "string"
      +}
  42. Changed4 schema fields changed
    • changedOutput schema / properties / data / items / properties / hdbLease / description
      Previous value: -"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."New value: +"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, as in lease; kept for earlier clients. Null when unknown."
    • addedOutput schema / properties / data / items / properties / lease
      Added value: +{
      +  "description": "Search, compare and details, for every home: its tenure, the lease left this month and its age from TOP, as the listing page shows them. An HDB flat's lease comes from its block's resale records; a condo, EC or landed home's from URA's records of its land lease, not its TOP. remainingLabel is 'Lease start not confirmed' for a leasehold whose start is not found, and null for freehold and 999-year homes. Null when nothing is known.",
      +  "properties": {
      +    "ageLabel": {
      +      "description": "Such as 26 years.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "ageYears": {
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "completionYear": {
      +      "description": "TOP or the year completed.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "freehold": {
      +      "type": "boolean"
      +    },
      +    "leaseYears": {
      +      "description": "99, 103 or 999; null for freehold.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "remainingLabel": {
      +      "description": "Such as 72 years 10 months.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "remainingMonths": {
      +      "maximum": 11,
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "remainingYears": {
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "startYear": {
      +      "description": "The year the lease began; null when not confirmed.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "tenureLabel": {
      +      "description": "Such as 99-year lease from 2000, or Freehold; null when the tenure is not known.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "freehold"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / featured / items / properties / hdbLease / description
      Previous value: -"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."New value: +"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, as in lease; kept for earlier clients. Null when unknown."
    • addedOutput schema / properties / featured / items / properties / lease
      Added value: +{
      +  "description": "Search, compare and details, for every home: its tenure, the lease left this month and its age from TOP, as the listing page shows them. An HDB flat's lease comes from its block's resale records; a condo, EC or landed home's from URA's records of its land lease, not its TOP. remainingLabel is 'Lease start not confirmed' for a leasehold whose start is not found, and null for freehold and 999-year homes. Null when nothing is known.",
      +  "properties": {
      +    "ageLabel": {
      +      "description": "Such as 26 years.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "ageYears": {
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "completionYear": {
      +      "description": "TOP or the year completed.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "freehold": {
      +      "type": "boolean"
      +    },
      +    "leaseYears": {
      +      "description": "99, 103 or 999; null for freehold.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "remainingLabel": {
      +      "description": "Such as 72 years 10 months.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "remainingMonths": {
      +      "maximum": 11,
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "remainingYears": {
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "startYear": {
      +      "description": "The year the lease began; null when not confirmed.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "tenureLabel": {
      +      "description": "Such as 99-year lease from 2000, or Freehold; null when the tenure is not known.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "freehold"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  43. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / hdbFlatType
      Added value: +{
      +  "description": "Search results only, for an HDB flat: its flat type, such as 4-room or executive, inferred from its block's resale records and its size.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / featured / items / properties / hdbFlatType
      Added value: +{
      +  "description": "Search results only, for an HDB flat: its flat type, such as 4-room or executive, inferred from its block's resale records and its size.",
      +  "type": "string"
      +}
  44. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / hdbLease / description
      Previous value: -"Details only, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."New value: +"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."
    • changedOutput schema / properties / featured / items / properties / hdbLease / description
      Previous value: -"Details only, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."New value: +"Details and compare, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown."
  45. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / depositMonths
      Added value: +{
      +  "description": "Details only, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / depositMonths
      Added value: +{
      +  "description": "Details only, for an owner rental: the security deposit in months of rent, as the owner stated it. Null when not stated; partner listings carry none.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
  46. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / priceReason
      Added value: +{
      +  "description": "Details only: the owner's own words on why the home is priced as it is.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / priceReason
      Added value: +{
      +  "description": "Details only: the owner's own words on why the home is priced as it is.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  47. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / hdbLease
      Added value: +{
      +  "description": "Details only, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown.",
      +  "properties": {
      +    "ageYears": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "remainingMonths": {
      +      "maximum": 11,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "remainingYears": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "startYear": {
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "startYear",
      +    "remainingYears",
      +    "remainingMonths",
      +    "ageYears"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / hdbLease
      Added value: +{
      +  "description": "Details only, for an HDB flat: its block's lease start year, the lease left this month and the block's age in years, from HDB resale records. Null when unknown.",
      +  "properties": {
      +    "ageYears": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "remainingMonths": {
      +      "maximum": 11,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "remainingYears": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "startYear": {
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "startYear",
      +    "remainingYears",
      +    "remainingMonths",
      +    "ageYears"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  48. Changed4 schema fields changed
    • changedOutput schema / properties / data / items / properties / seller / description
      Previous value: -"Details only, for an owner listing: whether the owner verified with Singpass, and their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open)."New value: +"Details only, for an owner listing: whether the owner verified with Singpass, their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open), and how many minutes they usually take to first answer a viewing request (null until they have answered at least 3)."
    • addedOutput schema / properties / data / items / properties / seller / properties / typicalReplyMinutes
      Added value: +{
      +  "minimum": 1,
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / featured / items / properties / seller / description
      Previous value: -"Details only, for an owner listing: whether the owner verified with Singpass, and their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open)."New value: +"Details only, for an owner listing: whether the owner verified with Singpass, their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open), and how many minutes they usually take to first answer a viewing request (null until they have answered at least 3)."
    • addedOutput schema / properties / featured / items / properties / seller / properties / typicalReplyMinutes
      Added value: +{
      +  "minimum": 1,
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
  49. Changed2 schema fields changed
    • changedOutput schema / properties / data / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, and supermarkets (name, place, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
    • changedOutput schema / properties / featured / items / properties / nearbyPlaces / description
      Previous value: -"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, and supermarkets (name, place, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."New value: +"Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, supermarkets, hawkerCentres (within 2 km) and clinics (CHAS clinics within 1 km, type gp or dental), the last three with name, place and walkMinutes, each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery."
  50. Changed8 schema fields changed
    • addedOutput schema / properties / data / items / properties / facing
      Added value: +{
      +  "description": "Details only: which way the main windows face, as the owner states it (N, NE, E, SE, S, SW, W or NW).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / items / properties / flatModel
      Added value: +{
      +  "description": "Details only: HDB flat model.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / items / properties / renovationYear
      Added value: +{
      +  "description": "Details only: the year the owner last renovated.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / items / properties / storeyRange
      Added value: +{
      +  "description": "Details only: HDB's three-storey band, such as 13 to 15, never the exact storey.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / facing
      Added value: +{
      +  "description": "Details only: which way the main windows face, as the owner states it (N, NE, E, SE, S, SW, W or NW).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / flatModel
      Added value: +{
      +  "description": "Details only: HDB flat model.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / renovationYear
      Added value: +{
      +  "description": "Details only: the year the owner last renovated.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / storeyRange
      Added value: +{
      +  "description": "Details only: HDB's three-storey band, such as 13 to 15, never the exact storey.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  51. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / seller
      Added value: +{
      +  "description": "Details only, for an owner listing: whether the owner verified with Singpass, and their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open).",
      +  "properties": {
      +    "role": {
      +      "enum": [
      +        "owner"
      +      ],
      +      "type": "string"
      +    },
      +    "singpassVerified": {
      +      "type": "boolean"
      +    },
      +    "viewingHours": {
      +      "items": {
      +        "properties": {
      +          "endsAt": {
      +            "description": "HH:MM",
      +            "type": "string"
      +          },
      +          "startsAt": {
      +            "description": "HH:MM",
      +            "type": "string"
      +          },
      +          "weekday": {
      +            "maximum": 6,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / seller
      Added value: +{
      +  "description": "Details only, for an owner listing: whether the owner verified with Singpass, and their weekly viewing hours (Singapore time, weekday 0 is Sunday; empty when none are open).",
      +  "properties": {
      +    "role": {
      +      "enum": [
      +        "owner"
      +      ],
      +      "type": "string"
      +    },
      +    "singpassVerified": {
      +      "type": "boolean"
      +    },
      +    "viewingHours": {
      +      "items": {
      +        "properties": {
      +          "endsAt": {
      +            "description": "HH:MM",
      +            "type": "string"
      +          },
      +          "startsAt": {
      +            "description": "HH:MM",
      +            "type": "string"
      +          },
      +          "weekday": {
      +            "maximum": 6,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  52. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / nearbyPlaces
      Added value: +{
      +  "description": "Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, and supermarkets (name, place, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / nearbyPlaces
      Added value: +{
      +  "description": "Details only: the places the listing page shows near the block. mrtStations (code, name, walkMinutes), primarySchoolsWithin1Km and primarySchools1To2Km (the Primary 1 registration bands), secondarySchools, and supermarkets (name, place, walkMinutes), each with distanceKm. Distances are straight-line from the block and walks are estimates; for Primary 1 registration, the user checks the exact distance on OneMap SchoolQuery.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  53. Changed6 schema fields changed
    • addedOutput schema / properties / data / items / properties / builtYear
      Added value: +{
      +  "description": "Details only.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / items / properties / floorplans
      Added value: +{
      +  "description": "Details only: published floor plan image URLs.",
      +  "items": {
      +    "format": "uri",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / data / items / properties / listedAt
      Added value: +{
      +  "description": "When the listing was first shown publicly.",
      +  "format": "date-time",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / builtYear
      Added value: +{
      +  "description": "Details only.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / featured / items / properties / floorplans
      Added value: +{
      +  "description": "Details only: published floor plan image URLs.",
      +  "items": {
      +    "format": "uri",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / featured / items / properties / listedAt
      Added value: +{
      +  "description": "When the listing was first shown publicly.",
      +  "format": "date-time",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  54. Changed2 schema fields changed
    • addedOutput schema / properties / data / items / properties / imageLabels
      Added value: +{
      +  "description": "One per image, in order: the tag to show with an owner's edited photo, or null for an unedited one.",
      +  "items": {
      +    "enum": [
      +      "Virtually staged",
      +      "Decluttered",
      +      null
      +    ],
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / featured / items / properties / imageLabels
      Added value: +{
      +  "description": "One per image, in order: the tag to show with an owner's edited photo, or null for an unedited one.",
      +  "items": {
      +    "enum": [
      +      "Virtually staged",
      +      "Decluttered",
      +      null
      +    ],
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "type": "array"
      +}
  55. Changed2 schema fields changed
    • addedInput schema / properties / available_from / description
      Added value: +"The renter's move-in date. Matches homes available on or before it, and homes that state no date."
    • addedInput schema / properties / lease_duration_months / description
      Added value: +"The renter's lease length in months. Matches homes whose minimum lease is at most this, and homes that state no minimum."
  56. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "data": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "address": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "bathrooms": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "bedrooms": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "bookingUrl": {
      +            "description": "Where the user asks for a viewing.",
      +            "format": "uri",
      +            "type": "string"
      +          },
      +          "canonicalUrl": {
      +            "format": "uri",
      +            "type": "string"
      +          },
      +          "district": {
      +            "description": "Singapore postal district number.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "id": {
      +            "format": "uuid",
      +            "type": "string"
      +          },
      +          "listingType": {
      +            "description": "For Sale or For Rent.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "price": {
      +            "description": "SGD; monthly rent for a rental.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "propertyType": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "squareFeet": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "title": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "id"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "featured": {
      +      "description": "Labelled Pro listings matching the search, on page 1 only.",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "address": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "bathrooms": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "bedrooms": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "bookingUrl": {
      +            "description": "Where the user asks for a viewing.",
      +            "format": "uri",
      +            "type": "string"
      +          },
      +          "canonicalUrl": {
      +            "format": "uri",
      +            "type": "string"
      +          },
      +          "district": {
      +            "description": "Singapore postal district number.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "id": {
      +            "format": "uuid",
      +            "type": "string"
      +          },
      +          "listingType": {
      +            "description": "For Sale or For Rent.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "price": {
      +            "description": "SGD; monthly rent for a rental.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "propertyType": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "squareFeet": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "title": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "id"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "featuredNote": {
      +      "type": "string"
      +    },
      +    "matchedTerm": {
      +      "type": "string"
      +    },
      +    "pagination": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "limit": {
      +          "type": "integer"
      +        },
      +        "page": {
      +          "type": "integer"
      +        },
      +        "total": {
      +          "type": "integer"
      +        },
      +        "totalPages": {
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "resultReason": {
      +      "description": "Why the search found no listing, or that it searched a corrected term.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "data",
      +    "pagination"
      +  ],
      +  "type": "object"
      +}
  57. First observed

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false). Beyond that the description adds genuinely useful context: results are limited to 'active, published' listings, pagination.total is the exact match count, same-development/multi-unit listings are collapsed into one result with a listingCluster, and owner/agent contact details are never returned. That last point in particular is a disclosure an agent cannot infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The identity and trigger conditions are front-loaded, then the query semantics, then output shape and the PII caveat. Sentences are dense but each carries distinct information, with no restatement of the title. Slightly crowded for a single paragraph, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 40-parameter search tool with a full output schema and read-only annotations, the description supplies what structured fields cannot: when to invoke it, the meaning of the free-text query, result clustering, and the fact that contact details are withheld. Gaps are minor — pagination/limit behavior and sort selection are left entirely to the schema, which is acceptable given the annotations and output schema already present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 40 parameters and 68% schema description coverage, the schema is doing most of the work and already documents the subtle filters (furnishing, foreign_tenant, reachable_only, min_remaining_lease_years). The description adds meaning for only one parameter, explaining that query is full-text over project, title, address and description, and that it should be omitted for broad requests. That is real value but thin against the breadth of the remaining undocumented surface.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Primary listing-discovery tool for homes in Singapore') and immediately scopes it to the Singapore property domain, which cleanly separates it from siblings like search_agents, search_guides and search_services. An agent can tell what this tool retrieves without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggering conditions ('when the user asks what properties are available, or describes a home to buy or rent by area, MRT station, school, budget...') and a concrete default behavior with 'Omit query for a broad availability request'. It does not explicitly name an alternative such as compare_listings or get_listing_details for follow-up actions, so it stops short of full when-not/alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources