# UI Mapping Quick Guide โ€” GoodGo API Fields A fast reference for wiring UI mockups to real API data. All fields with their actual types and endpoints. --- ## ๐Ÿ  Property/Listing Display ### Card View (Search Results) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ [Featured Badge] 2 hrs ago โ”‚ โ† listing.featuredUntil | createdAt โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ $2.5B [SALE] [ACTIVE] โ”‚ โ† priceVND | transactionType | status โ”‚ 75 mยฒ โ€ข 2BR โ€ข 1BA โ€ข Q1, HCMC โ”‚ โ† areaM2 | bedrooms | bathrooms | district โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ๐Ÿ‘๏ธ 342 โค๏ธ 28 ๐Ÿ’ฌ 12 โ”‚ โ† viewCount | saveCount | inquiryCount โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Agent: John | โญ 4.8 โ”‚ โ† agent.user.fullName | agent.qualityScore โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` **API Fields**: - Price: `listing.priceVND` โ†’ format as VND - Type/Status: `listing.transactionType`, `listing.status` - Area: `property.areaM2` - Bedrooms: `property.bedrooms` (null = studio) - Bathrooms: `property.bathrooms` - District: `property.district` - Metrics: `listing.viewCount`, `listing.saveCount`, `listing.inquiryCount` - Agent: `listing.agent.user.fullName`, `listing.agent.qualityScore` **Endpoint**: `GET /search` or search index --- ### Detail Page (Hero Section) ``` Main Image Carousel โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Apartment in District 1 for $2.5B โ”‚ โ”‚ 75 mยฒ | 2BR 1BA | ACTIVE โ”‚ โ”‚ โ”‚ โ”‚ โญ 4.8 (234 views) | 28 saves | 12 inquiries โ”‚ โ”‚ โ”‚ โ”‚ [Agent: John] [Verified] [License: xxx] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` **API Fields** (from Listing + Property): - Title: `property.title` - Price: `listing.priceVND` - Area: `property.areaM2` - Beds/Baths: `property.bedrooms`, `property.bathrooms` - Status: `listing.status` - Views: `listing.viewCount` - Saves: `listing.saveCount` - Inquiries: `listing.inquiryCount` - Agent Name: `listing.agent.user.fullName` - Agent Verified: `listing.agent.isVerified` - License: `listing.agent.licenseNumber` **Endpoint**: Individual listing API or detail endpoint --- ### Property Details Panel ``` LOCATION โ”œโ”€ Address: 123 Nguyen Hue, District 1, HCMC โ”œโ”€ Lat/Lng: 10.7769, 106.7009 โ”œโ”€ Metro Distance: 450m โ””โ”€ Project: [Project Name if applicable] PHYSICAL โ”œโ”€ Type: APARTMENT โ”œโ”€ Area: 75 mยฒ โ”œโ”€ Usable Area: 70 mยฒ โ”œโ”€ Bedrooms: 2 (or Studio if -1) โ”œโ”€ Bathrooms: 1 โ”œโ”€ Floors: 25 total, Unit on Floor 12 โ”œโ”€ Direction: NORTHEAST โ”œโ”€ Year Built: 2020 โ””โ”€ Legal: SแปŸ hแปฏu lรขu dร i AMENITIES โ”œโ”€ Furnishing: FULLY_FURNISHED โ”œโ”€ Condition: LIKE_NEW โ”œโ”€ Parking: 1 slot โ”œโ”€ Maintenance Fee: 2.5M/month โ”œโ”€ Pet Friendly: Yes โ”œโ”€ Views: Street, Park โ””โ”€ Suitable For: Young couples, Families ``` **API Fields** (all from `property`): - Address: `address`, `ward`, `district`, `city` - Coordinates: `location.lat`, `location.lng` - Metro: `metroDistanceM` - Project: `projectName`, `projectDevelopmentId` - Type: `propertyType` - Sizes: `areaM2`, `usableAreaM2` - Rooms: `bedrooms`, `bathrooms` - Levels: `floor`, `totalFloors` - Direction: `direction` - Year: `yearBuilt` - Legal: `legalStatus` - Furnishing: `furnishing` - Condition: `propertyCondition` - Parking: `parkingSlots` - Fee: `maintenanceFeeVND` - Pet: `petFriendly` - Views: `viewType[]` - Suitable: `suitableFor[]` --- ## ๐Ÿ“Š Analytics & Market Data ### Market Snapshot Widget ``` HCMC Market Overview (Last Updated: 2 hours ago) โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Active Listings 2,345 โ”‚ โ† activeCount โ”‚ Avg Price $2.8B โ”‚ โ† avgPrice (format) โ”‚ Median Price $2.5B โ”‚ โ† medianPrice (format) โ”‚ Price/mยฒ $35M โ”‚ โ† avgPricePerM2 โ”‚ Avg Days on Mkt 45d โ”‚ โ† daysOnMarket โ”‚ New (24h) 12 โ”‚ โ† newListings24h โ”‚ โ”‚ โ”‚ Price Change (24h) +2% โ”‚ โ† priceChangePct.d1 โ”‚ Price Change (7d) +5% โ”‚ โ† priceChangePct.d7 โ”‚ Price Change (30d) +12% โ”‚ โ† priceChangePct.d30 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ Cache: Next update in 25 min โ† nextRefreshAt ``` **Endpoint**: `GET /analytics/market-snapshot?city=HCMC` **Response Fields** (`MarketSnapshotDto`): - `activeCount` - `avgPrice` โ†’ convert string to number for display - `medianPrice` - `avgPricePerM2` - `daysOnMarket` - `newListings24h` - `priceChangePct.d1/d7/d30` โ†’ percentage values - `nextRefreshAt` โ†’ show "Updates in X mins" --- ### Price Trend Chart (Line) ``` Price Over Time (Q1 2026 - Q2 2026) $4B โ”Œโ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ โ”‚ $3B โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ $2B โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Q1 Q2 Q3 ``` **Endpoint**: `GET /analytics/price-trend?district=Quแบญn%201&city=HCMC&propertyType=APARTMENT` **Response Fields** (`PriceTrendDto`): - `trend[]`: - `period` โ†’ x-axis label (e.g., "Q1 2026") - `medianPrice` โ†’ y-axis value (parse from string) - `avgPriceM2` โ†’ optional secondary axis - `totalListings` โ†’ tooltip data --- ### Heatmap (District Color Intensity) ``` [District] [Price/mยฒ] [Listings] [Median Price] โ”œโ”€ D1 $45M 234 $2.8B โ”œโ”€ D2 $38M 412 $2.2B โ””โ”€ D3 $28M 567 $1.8B โ†’ Use avgPriceM2 for color intensity ``` **Endpoint**: `GET /analytics/heatmap?city=HCMC&period=2026-04` **Response Fields** (`HeatmapDto`): - `dataPoints[]`: - `district` โ†’ overlay label - `avgPriceM2` โ†’ color intensity (higher = redder) - `totalListings` โ†’ hover tooltip - `medianPrice` โ†’ detail view --- ### District Stats Table ``` District Median Price Price/mยฒ Listings Days Market YoY Change โ”œโ”€ D1 $2.8B $45M 234 42d +12% โ”œโ”€ D2 $2.2B $38M 412 48d +8% โ””โ”€ D3 $1.8B $28M 567 52d +5% ``` **Endpoint**: `GET /analytics/district-stats?city=HCMC&period=2026-04` **Response Fields** (`DistrictStatsDto`): - `districts[]`: - `district` โ†’ row label - `medianPrice` โ†’ format as VND - `avgPriceM2` - `totalListings` - `daysOnMarket` - `yoyChange` โ†’ percentage --- ### Trending Areas Widget ``` ๐Ÿ”ฅ Trending (Last 30 Days) โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ 1. District 1 โ”‚ โ† scoreRank โ”‚ ๐Ÿ“Š 12 new | 45 inquiries โ”‚ โ† listings | inquiries โ”‚ ๐Ÿ‘๏ธ 234 views | โ†‘5% price โ”‚ โ† views | priceChangePct โ”‚ โ”‚ โ”‚ 2. District 5 โ”‚ โ”‚ ๐Ÿ“Š 8 new | 32 inquiries โ”‚ โ”‚ ๐Ÿ‘๏ธ 156 views | โ†‘2% price โ”‚ โ”‚ โ”‚ โ”‚ 3. District 9 โ”‚ โ”‚ ๐Ÿ“Š 15 new | 28 inquiries โ”‚ โ”‚ ๐Ÿ‘๏ธ 189 views | โ†“1% price โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ Score = inquiriesร—0.6 + viewsร—0.3 + listingsร—0.1 ``` **Endpoint**: `GET /analytics/trending-areas?period=30&limit=10&level=district` **Response Fields** (`TrendingAreasDto`): - `areas[]`: - `scoreRank` โ†’ ranking number - `name` โ†’ district name (e.g., "Quแบญn 1") - `listings` โ†’ new listings count - `inquiries` - `views` - `priceChangePct` โ†’ YoY change or null --- ## ๐Ÿ’ฐ Valuations (AVM) ### Quick Estimate Card ``` PROPERTY VALUATION (by Coordinates) Estimated Value: $2.5B Confidence: 82% (Good) Price/mยฒ: $33.3M Model: AVM v2 Ensemble Comparable Sales (5 nearby): โ”œโ”€ 234B (apt, 75mยฒ) - 450m away โ”œโ”€ 231B (apt, 78mยฒ) - 520m away โ””โ”€ 238B (apt, 72mยฒ) - 380m away ``` **Endpoint**: `GET /analytics/valuation?propertyId=prop-123` OR `POST /analytics/valuation` **GET Response** (`ValuationDto`): - `estimatedPrice` โ†’ format as VND - `confidence` โ†’ 0.0-1.0, convert to percentage - `pricePerM2` - `modelVersion` - `comparables[]`: - `priceVND` - `areaM2` - `distanceMeters` โ†’ convert to distance label **POST Request**: ```json { "propertyType": "APARTMENT", "area": 75, "district": "Quแบญn 1", "city": "Hแป“ Chรญ Minh", "bedrooms": 2, "bathrooms": 1, "yearBuilt": 2020, "useV2": true, "distanceToHospitalKm": 0.5, "distanceToParkKm": 1.2, "hasElevator": true, "hasParking": true } ``` --- ### Valuation History Chart ``` Estimated Value Over 12 Months $2.8B โ”Œโ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ โ”‚ $2.5B โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ $2.2B โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Apr Aug Dec ``` **Endpoint**: `GET /analytics/valuation/history/prop-123?limit=50` **Response Fields**: - `history[]`: - `valuedAt` โ†’ x-axis timestamp - `estimatedPrice` โ†’ y-axis value (parse) - `confidence` โ†’ tooltip - `pricePerM2` โ†’ tooltip - `modelVersion` โ†’ metadata --- ### Property Comparison Table ``` Property A Property B Property C Value $2.5B $2.2B $2.8B Conf 85% 78% 92% /mยฒ $33.3M $31.4M $35M Model v2 Ensemble v2 Ensemble v1 Standard [Comparables shown for each] ``` **Endpoint**: `POST /analytics/valuation/compare` **Request**: ```json { "propertyIds": ["prop-a", "prop-b", "prop-c"] } ``` **Response Fields**: - `comparisons[]`: - `propertyId` - `address`, `district`, `areaM2` - `valuation` (same as ValuationDto above) --- ## ๐ŸŒŸ Neighborhood & POIs ### Neighborhood Score Card ``` NEIGHBORHOOD SCORE Overall: 78/100 โญโญโญโญ โ”œโ”€ Education 85/100 โ”œโ”€ Healthcare 92/100 โ”œโ”€ Transport 78/100 โ”œโ”€ Shopping 85/100 โ”œโ”€ Greenery 65/100 โ””โ”€ Safety 72/100 POI Summary: โ”œโ”€ 3 Schools โ”œโ”€ 5 Hospitals โ”œโ”€ 2 Transit Stations โ”œโ”€ 8 Shopping Centers โ”œโ”€ 2 Parks โ””โ”€ 12 Restaurants ``` **Endpoint**: `GET /analytics/neighborhoods/Quแบญn%201/score?city=HCMC` (PUBLIC) **Response Fields** (`NeighborhoodScoreResult`): - `totalScore` โ†’ 0-100 - `educationScore`, `healthcareScore`, `transportScore`, etc. โ†’ each 0-100 - `poiCounts` โ†’ map of categoryโ†’count - `calculatedAt` โ†’ timestamp --- ### Nearby POIs Map ``` Center: (10.7769, 106.7009) POI Markers (within 2km): ๐Ÿซ School (450m) Name: Saigon Star International School Address: 123 Nguyen Hue, D1 ๐Ÿฅ Hospital (890m) Name: Vinmec Hospital Address: 458 Ly Thuong Kiet, D1 ๐Ÿ›๏ธ Mall (1.2km) Name: The Landmark 81 ๐Ÿš‡ Metro (680m) Name: Ben Thanh Station ``` **Endpoint**: `GET /analytics/pois/nearby?lat=10.7769&lng=106.7009&radius=2000&limit=30` (PUBLIC) **Response Fields** (`NearbyPOIsResultDto`): - `center`: `{lat, lng}` - `pois[]`: - `name` - `type` โ†’ SCHOOL, HOSPITAL, METRO_STATION, MALL, PARK, RESTAURANT, etc. - `category` โ†’ school | hospital | transit | shopping | restaurant | park - `lat`, `lng` โ†’ for map markers - `distance` โ†’ meters from center - `address` --- ## ๐Ÿ‘จโ€๐Ÿ’ผ Agent Profile ### Agent Card ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ [Avatar] John Doe โ”‚ โ”‚ โญ 4.8/5 โ”‚ โ† qualityScore โ”‚ [Verified] [Licensed] โ”‚ โ† isVerified | licenseNumber exists โ”‚ โ”‚ โ”‚ License: RE-12345 โ”‚ โ† licenseNumber โ”‚ Agency: Saigon Realty โ”‚ โ† agency โ”‚ Response Time: 2.5 hours โ”‚ โ† responseTimeAvg (secondsโ†’hours) โ”‚ Deals: 42 completed โ”‚ โ† totalDeals โ”‚ โ”‚ โ”‚ Service Areas: โ”‚ โ”‚ District 1, 3, 7, Binh Thanhโ”‚ โ† serviceAreas[] โ”‚ โ”‚ โ”‚ Bio: "10+ years experience" โ”‚ โ† bio โ”‚ โ”‚ โ”‚ [Message] [View Listings] โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` **API Fields** (Agent + User): - Avatar: `user.avatarUrl` - Name: `user.fullName` - Rating: `qualityScore` โ†’ convert 0-100 to 0-5 stars - Verified Badge: `isVerified` - License: `licenseNumber` (display if exists) - Agency: `agency` - Response Time: `responseTimeAvg` (seconds) โ†’ format as "X.X hours" - Deals: `totalDeals` - Service Areas: `serviceAreas[]` โ†’ join with comma --- ## ๐Ÿ“‹ Listing Management ### Listing Status Flow ``` DRAFT โ†“ PENDING_REVIEW โ† re-moderation if edited while ACTIVE โ†“ ACTIVE โ† publishedAt timestamp โ†“ RESERVED โ† buyer offer โ†“ SOLD/RENTED โ† transaction complete Alternative: REJECTED โ†’ DRAFT (can re-submit) Alternative: EXPIRED โ†’ DRAFT (can re-list) ``` **Status Colors**: - DRAFT: Gray - PENDING_REVIEW: Yellow - ACTIVE: Green - RESERVED: Blue - SOLD: Dark Gray - RENTED: Dark Gray - EXPIRED: Orange - REJECTED: Red --- ### Listing Engagement Metrics ``` VIEWS 342 โ† listing.viewCount SAVES 28 โ† listing.saveCount INQUIRIES 12 โ† listing.inquiryCount ``` **Engagement Targets**: - Views โ†’ increased each time listing is viewed - Saves โ†’ increased when user bookmarks - Inquiries โ†’ increased when buyer sends inquiry --- ## ๐Ÿ’ก Common Conversions ### Price Formatting ```typescript // Input: priceVND = "2500000000" (string) const formatted = new Intl.NumberFormat('vi-VN', { style: 'currency', currency: 'VND' }).format(Number(priceVND)); // Output: "2.500.000.000 โ‚ซ" or "$2.5B" ``` ### Confidence to Stars ```typescript // Input: confidence = 0.82 (0.0-1.0) const stars = Math.round(confidence * 5); // 0-5 stars const label = confidence > 0.8 ? "High" : confidence > 0.6 ? "Good" : "Low"; ``` ### Response Time ```typescript // Input: responseTimeAvg = 9000 (seconds) const hours = (responseTimeAvg / 3600).toFixed(1); // Output: "2.5 hours" ``` ### Distance Display ```typescript // Input: distanceMeters = 890 const label = distanceMeters < 1000 ? `${distanceMeters}m` : `${(distanceMeters/1000).toFixed(1)}km`; ``` --- **Last Updated**: April 2026