POST /api/propertyguru/properties/search
Price: 20 credits
Search PropertyGuru property listings for sale or rent with a full filter set: location (free text or district), property type, price range, bedrooms, bathrooms, floor and land size, price per sqft, distance to MRT, tenure, build year, floor level, unit features, facilities, furnishing, keyword, lease term, availability and recency, plus room-rental filters (entire unit or room, room type, cooking allowance, tenant gender, maximum tenants, tenancy conditions), with ordering. Returns listing cards with id, title, price and price per sqft, bedrooms, bathrooms, floor area, property type, tenure, district, nearest MRT, photo count and the listing agent.
Search PropertyGuru listings for sale or rent. Set region ('sg'/'my') and listing_type ('sale'/'rent') and count. Filter by freetext location or district (D01-D28, Singapore), property_type_group (N/L/H) and/or property_types (specific subtypes), min_price/max_price, bedrooms/bathrooms (lists), min_floor_size/max_floor_size, min_land_size/max_land_size, min_psf/max_psf, distance_to_mrt, tenure, min_build_year/max_build_year, floor_level, unit_features, facilities, furnishing, keyword, listed_since, availability and lease_term (for-rent), entire_unit_or_room/room_types/cooking_type/tenant_gender/max_tenants/tenancy_conditions (room rentals, for-rent), verified_only, with_floorplans, with_media, and sort. Each result has id, url, title, listing_type, property_type/property_type_group, is_new_project, price/price_text/price_per_sqft/currency, bedrooms/bathrooms, floor_area_sqft, tenure, district_code/district_text, nearest_mrt, photo_count, posted_at, is_verified, agent (id/name/license) and agency_name, plus image. Use propertyguru/properties with an id for full listing details.
access-token string requiredtimeout integer — Max scrapping execution timeout (in seconds) (default: 300; min: 20; max: 1500)region string — PropertyGuru regional marketplace (sg = Singapore, my = Malaysia). (default: "sg"; one of: "sg", "my")listing_type string — Listing intent. (default: "sale"; one of: "sale", "rent")count integer required — Max number of results to return (min: 1; max: 20)freetext string nullable — Free-text location (e.g. 'Singapore', 'Holland Village', a street name).district string nullable — Singapore postal district to filter by (D01-D28). (one of: "D01", "D02", "D03", "D04", "D05", "D06", "D07", "D08", "D09", "D10", "D11", "D12", "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28")property_type_group string nullable — Top-level property category (N = non-landed/condo, L = landed, H = HDB). (one of: "N", "L", "H")property_types array nullable — One or more specific property type subtypes to filter by. (one of: "CONDO", "APT", "WALK", "CLUS", "EXCON", "1R", "2A", "2I", "2S", "2RF", "3A", "3NG", "3Am", "3NGm", "3I", "3Im", "3S", "3STD", "3PA", "4A", "4NG", "4PA", "4I", "4S", "4STD", "5A", "5I", "5PA", "5S", "6J", "EA", "EM", "MG", "TE", "TERRA", "DETAC", "SEMI", "CORN", "LBUNG", "BUNG", "SHOPH", "RLAND", "TOWN", "CON", "LCLUS")min_price integer nullable — Minimum price. (min: 0)max_price integer nullable — Maximum price. (min: 0)bedrooms array nullable — Bedroom counts to filter by (0 = studio, 1-4, 5 = 5 or more).bathrooms array nullable — Bathroom counts to filter by (1-4, 5 = 5 or more).min_floor_size integer nullable — Minimum floor size in sqft. (min: 0)max_floor_size integer nullable — Maximum floor size in sqft. (min: 0)min_land_size integer nullable — Minimum land size in sqft (landed properties). (min: 0)max_land_size integer nullable — Maximum land size in sqft (landed properties). (min: 0)min_psf integer nullable — Minimum price per sqft. (min: 0)max_psf integer nullable — Maximum price per sqft. (min: 0)distance_to_mrt string nullable — Maximum walking distance to an MRT station. (one of: "0.25", "0.5", "0.75", "1", "1.5")tenure array nullable — Tenure types to filter by (for-sale). (one of: "F", "L99", "L103", "L110", "L999", "L9999", "NA")min_build_year integer nullable — Minimum build year / TOP year. (min: 1900)max_build_year integer nullable — Maximum build year / TOP year. (min: 1900)floor_level string nullable — Floor level band. (one of: "GND", "LOW", "MID", "HIGH", "PENT")unit_features array nullable — Unit features to filter by. (one of: "AIRC", "BAL", "BATH", "CORN", "MAID", "PPOOL", "RENO", "TERR")facilities array nullable — Project facilities to filter by. (one of: "GYM", "PARK", "SWIM", "TEN")furnishing string nullable — Furnishing state. (one of: "UNFUR", "PART", "FULL")keyword string nullable — Free-text keyword to match in the listing (e.g. 'garage', 'renovated').listed_since string nullable — Only include listings posted within this window. (one of: "3", "7", "14", "31")availability string nullable — Move-in availability window (for-rent). (one of: "0", "1", "2", "3", "4")lease_term array nullable — Lease term to filter by (for-rent). (one of: "1YR", "2YR", "3YR", "ST", "FL")verified_only boolean nullable — Only include verified listings.with_floorplans boolean nullable — Only include listings that have a floor plan.with_media boolean nullable — Only include listings that have a video or virtual tour.entire_unit_or_room string nullable — Rent the entire unit or a single room (room rentals, for-rent). (one of: "ent", "room")room_types array nullable — Room types for room rentals (master/common/shared, for-rent). (one of: "master", "common", "shared")cooking_type string nullable — Cooking allowance for room rentals (for-rent). (one of: "none", "light", "any")tenant_gender string nullable — Tenant gender preference for room rentals (for-rent). (one of: "male", "female", "any")max_tenants integer nullable — Maximum number of tenants for room rentals (for-rent). (min: 1; max: 4)tenancy_conditions array nullable — Tenancy amenities/conditions for room rentals (for-rent). (one of: "hasAircon", "ownerStays", "allowPets", "hasUtilities", "allowVisitors", "hasWifi")sort string — Result ordering. (default: "recommended"; one of: "recommended", "lowest_price", "highest_price", "psf_low_high", "psf_high_low", "size_high_low", "size_low_high")@type string (default: "PropertyGuruSearchResult")id string requiredurl string requiredlisting_type string nullableproperty_type string nullableproperty_type_group string nullableis_new_project boolean nullableprice number nullableprice_text string nullableprice_per_sqft number nullablecurrency string nullablebedrooms integer nullablebathrooms integer nullablefloor_area_sqft number nullabletenure string nullabledistrict_code string nullabledistrict_text string nullablenearest_mrt string nullablephoto_count integer nullableposted_at string nullableis_verified boolean nullableagent_id string nullableagent_name string nullableagent_license string nullableagency_name string nullableimage string nullable422 — The request body did not validate Check the fields against this schema. A URN with the wrong prefix is the most common cause.408 — The request ran past its time limit Raise `timeout` in the request body, up to the maximum this endpoint documents. Lowering `count` or turning off the `with_*` flags also helps, because less work finishes sooner.412 — The entity was not found, or a precondition failed Retrying will not help: either the entity does not exist, or the input points at a different one.429 — Too many requests: a rate limit or a usage window is exhausted When the response carries an X-Retry-After header, wait that many seconds and retry: the same number is in the body as `detail.retry_after`, and the limit clears once that window passes. The message in the body names the limit that was hit.500 — Something broke on our side Retrying will not help. If it keeps happening, send us the X-Request-ID from the response headers.529 — Rate limit reached, or the endpoint is overloaded Wait at least 30 seconds, then retry.X-Error — Error message text (present only on error)X-Request-ID — Unique request identifierX-Execution-Time — Execution time in secondsX-Result-Count — How many records the body carries. 0 means an empty result, which is a normal answer and not by itself an error. A non-zero count can come back together with X-Error when the failure happened partway through — read this header and X-Error independently.X-Total-Available-Results — How many records exist for this query, when the endpoint can say. On a `dry_run` request this is the answer and the body is empty. It saturates: the endpoint's documented maximum means 'at least that many', any smaller number is exact.X-Warning — Present when the request body carried keys this endpoint does not document. They were ignored, so any filter you meant to apply through them did not apply. Check the spelling against this schema and retry.X-Retry-After — Seconds to wait before retrying. Present only on 429.