GET/api/property-stats
Property market statistics
Aggregate market data across every active listing on MLS.PH — totals by transaction type and category, average prices, the top 20 cities by inventory, and price distribution. Recomputed on request and cached at the edge for one hour.
Takes no parameters.
Example response
{
"generatedAt": "2026-09-18T04:21:07.518Z",
"source": "MLS.ph - Philippine Real Estate Marketplace",
"url": "https://www.mls.ph",
"overview": {
"totalActiveListings": 1284,
"forSale": 1109,
"forRent": 175
},
"byPropertyCategory": {
"counts": { "RESIDENTIAL": 812, "LAND_LOT": 301, "COMMERCIAL": 128 },
"averagePrices": { "RESIDENTIAL": 8420000, "LAND_LOT": 3150000 }
},
"topCitiesByListings": [
{ "city": "Quezon City", "activeListings": 146 }
],
"averagePriceByCity": [
{ "city": "Makati", "averagePrice": 24800000 }
],
"averagePricePerSqmByCity": [
{ "city": "Taguig", "avgPricePerSqm": 215000, "listingsCount": 12 }
],
"priceDistribution": {
"under1M": 63, "1M-5M": 402, "5M-10M": 311,
"10M-50M": 288, "over50M": 45
},
"recentActivity": { "newListingsLast7Days": 37 },
"propertyTypes": ["Residential", "Land/Lot", "Commercial", "Industrial", "Others"],
"transactionTypes": ["For Sale", "For Rent"],
"coverage": { "regions": 16, "provinces": 82, "majorCities": ["Manila", "..."] }
}
Cache-Control: public, s-maxage=3600, stale-while-revalidate=86400
This is the only endpoint that returns its payload at the top level — there is no success wrapper. Every figure is computed live from active listings, except coverage, which is a fixed editorial summary — treat the location endpoints as authoritative for region, province and city counts.
GET/api/locations/regions
List all regions
Returns all 17 Philippine regions, NCR first and the remainder alphabetical. Takes no parameters.
Takes no parameters.
Example response
{
"success": true,
"regions": [
{
"code": "130000000",
"name": "NCR",
"regionName": "National Capital Region",
"islandGroup": "luzon"
},
{
"code": "050000000",
"name": "Bicol Region",
"regionName": "Region V",
"islandGroup": "luzon"
}
]
}
name is the short display form and regionName is the long form. Which one reads as the “full” name flips between regions — NCR is name “NCR” / regionName “National Capital Region”, while Bicol is name “Bicol Region” / regionName “Region V”. Match on code, not on either name.
GET/api/locations/provinces
List provinces
Returns all 81 provinces, sorted alphabetically. Pass regionCode to narrow the list to a single region.
Parameters
| Name | Type | Required | Description |
|---|
| regionCode | string | No | PSGC region code, e.g. 050000000. Omit to return every province. |
Example response
{
"success": true,
"provinces": [
{
"code": "012800000",
"name": "Ilocos Norte",
"regionCode": "010000000",
"islandGroup": "luzon"
}
]
}
Cache-Control: public, s-maxage=86400, stale-while-revalidate=604800
GET/api/locations/cities
List cities and municipalities
Returns all 1,634 cities and municipalities. Sorted capitals first, then cities, then municipalities, each group alphabetical. provinceCode takes precedence over regionCode when both are supplied.
Parameters
| Name | Type | Required | Description |
|---|
| provinceCode | string | No | PSGC province code, e.g. 012800000. More specific than regionCode. |
| regionCode | string | No | PSGC region code. Ignored when provinceCode is also present. |
Example response
{
"success": true,
"cities": [
{
"code": "012812000",
"name": "City of Laoag",
"provinceCode": "012800000",
"regionCode": "010000000",
"isCity": true,
"isCapital": true,
"displayName": "Laoag"
}
]
}
Cache-Control: public, s-maxage=86400, stale-while-revalidate=604800
displayName is a convenience field with the “City of ” prefix removed — use name when you need the official PSGC spelling.
GET/api/locations/barangays
List barangays
Returns barangays for one city or one region. Either cityCode or regionCode is required — a request with neither returns 400. Barangay data is loaded per region, so regionCode queries can return tens of thousands of rows; use limit.
Parameters
| Name | Type | Required | Description |
|---|
| cityCode | string | No | PSGC city code, e.g. 012801000. Takes precedence over regionCode. |
| regionCode | string | No | PSGC region code. Used only when cityCode is absent. |
| search | string | No | Case-insensitive substring match on the barangay name. |
| limit | integer | No | Maximum rows to return. Defaults to 100. |
Example response
{
"success": true,
"barangays": [
{
"code": "012801001",
"name": "Adams (Pob.)",
"regionCode": "010000000",
"cityCode": "012801000"
}
],
"total": 1,
"hasMore": false
}
Cache-Control: public, s-maxage=86400, stale-while-revalidate=604800
total is the count before limit is applied, and hasMore tells you whether rows were truncated.
GET/api/listings/mls/{mlsNumber}
Look up a listing by MLS number
Returns a single listing by its public MLS number, along with the featured photo and the seller's display name and verification badges. Only listings that are currently active and available are returned.
Parameters
| Name | Type | Required | Description |
|---|
| mlsNumber | string (path) | Yes | 14-character MLS number, e.g. MLSPH91A1B2C3D. Case-insensitive — lowercase input is upper-cased before lookup. |
Example response
{
"success": true,
"listing": {
"id": "clx8f2k9p0001abcd1234efgh",
"mlsNumber": "MLSPH91A1B2C3D",
"title": "3-Bedroom House and Lot",
"price": "8500000",
"priceType": "TOTAL",
"transactionType": "FOR_SALE",
"propertyCategory": "RESIDENTIAL",
"propertySubtype": "HOUSE_SINGLE_DETACHED",
"cityMunicipality": "Quezon City",
"barangayArea": "Batasan Hills",
"region": "National Capital Region",
"province": null,
"propertyDetails": { "bedrooms": 3, "bathrooms": 2, "floorArea": 120 },
"photos": [{ "id": "...", "photoUrl": "https://...", "isFeatured": true }],
"user": {
"id": "clx8f2k9p0000abcd1234efgh",
"profile": { "firstName": "Juan", "lastName": "Dela Cruz", "photoUrl": null },
"badges": ["VERIFIED", "VERIFIED_BROKER"],
"isVerified": true
}
}
}
Returns 404 for listings that are sold, reserved, inactive or in draft — not just for numbers that do not exist.