Skip to main content

Properties

A property is the listing itself: its title and description, what it costs (for sale, for rent, or both), its media, its lifecycle status, and the type-specific details that matter for its kind. A residential listing carries bedrooms and square footage; a commercial listing carries zoning and loading docks; land carries lot size and utilities. One model, three detail shapes.

Property types and their type-specific detailsA property selects a property type of residential, commercial, or land. Each type carries a matching details block: residentialDetails (bedrooms, baths, square footage), commercialDetails (zoning, square footage, docks), or landDetails (lot size, zoning, utilities).Propertytitle · price · statusresidentialbedrooms · bathroomssquare footage · year builtpool · fireplace · garagehouse · condo · villa · …commercialzoning · square footageloading docks · elevatorsceiling height · poweroffice · retail · warehouse · …landlot size · zoningutilities · water · sewertopography · flood zonelot · farm · acreage

Create a property

import { PropertyType, PropertySubType, ListingType, ListingStatus, PropertyCondition } from 'wiil-js';

const property = await client.propertyConfig.create({
categoryId: 'cat_luxury',
addressId: 'addr_123',
title: 'Modern Downtown Condo',
description: 'Sleek 2BR condo with city skyline views',
propertyType: PropertyType.RESIDENTIAL,
propertySubType: PropertySubType.CONDO,
listingType: ListingType.SALE,
listingStatus: ListingStatus.ACTIVE,
salePrice: 750000,
salePriceCurrency: 'USD',
priceNegotiable: true,
features: {
bedrooms: 2,
bathrooms: 2,
parkingSpaces: 1,
squareFootage: 1200,
amenities: ['Gym', 'Pool', 'Concierge'],
utilities: ['Electric', 'Gas', 'Water'],
},
condition: PropertyCondition.NEW,
furnished: false,
images: ['https://example.com/living-room.jpg'],
isActive: true,
isFeatured: true,
});

For a rental, set listingType to rent, a rentalPrice, and a rentalPeriod (daily, weekly, monthly, yearly); for a listing that is both, set both with both prices.

const property = await client.propertyConfig.get('prop_123');
const result = await client.propertyConfig.list({ page: 1, pageSize: 20, includeDeleted: false });
const inCategory = await client.propertyConfig.getByCategory('cat_luxury', { page: 1, pageSize: 20 });
const found = await client.propertyConfig.search('oceanfront villa', { page: 1, pageSize: 10 });

Get by address

Looking a property up by its address is exposed through the TypeScript SDK.

const property = await client.propertyConfig.getByAddress('addr_123');

Update and delete

Update a property to change pricing, move its listingStatus through the sales cycle, or take it off the market.

import { ListingStatus } from 'wiil-js';

const updated = await client.propertyConfig.update({
id: 'prop_123',
salePrice: 725000,
listingStatus: ListingStatus.PENDING,
priceNegotiable: false,
});

await client.propertyConfig.delete('prop_123');

Batch create

import { PropertyType, PropertySubType, ListingType } from 'wiil-js';

const properties = await client.propertyConfig.createBatch([
{
categoryId: 'cat_luxury',
addressId: 'addr_001',
title: 'Oceanfront Villa',
propertyType: PropertyType.RESIDENTIAL,
propertySubType: PropertySubType.VILLA,
listingType: ListingType.SALE,
salePrice: 2500000,
features: { bedrooms: 5, bathrooms: 4, squareFootage: 4500 },
isActive: true,
},
]);
Limits

Both SDKs cap batch creation at 50 properties per request.

Property fields

FieldTypeRequiredDescription
idstringautoUnique identifier
categoryIdstringYesCategory the property belongs to
addressIdstringYesThe property's address
titlestringYesListing title
descriptionstring | nullNoDetailed description
propertyTypeenumYesresidential, commercial, land
propertySubTypeenumYeshouse, condo, office, lot, …
listingTypeenumYessale, rent, or both
listingStatusenumYesLifecycle status (default DRAFT)
salePrice / salePriceCurrencyNo / YesSale price and currency (default USD)
rentalPrice / rentalPeriod / rentalPriceCurrencyNoRental price, period, currency
priceNegotiablebooleanYesWhether price is negotiable (default false)
featuresobject | nullNoparkingSpaces, amenities, utilities
conditionenum | nullNonew, excellent, good, fair, needs_work, fixer_upper
furnishedbooleanYesWhether furnished (default false)
imagesarrayYesImage URLs (default [])
virtualTourUrl / videoUrlstring | nullNoMedia links
availableFrom / availableTonumber | nullNoAvailability window (rentals)
isActive / isFeatured / isVerifiedbooleanYesListing flags
mlsNumber / externalIdstring | nullNoMLS and external references
residentialDetails / commercialDetails / landDetailsobject | nullNoType-specific details (below)

Enums

EnumValues
PropertyTyperesidential, commercial, land
PropertySubTypehouse, apartment, condo, townhouse, villa, office, retail, warehouse, industrial, lot, farm, acreage
ListingTypesale, rent, both
ListingStatusDRAFT, ACTIVE, PENDING, SOLD, LEASED, OFF_MARKET, EXPIRED
RentalPerioddaily, weekly, monthly, yearly
PropertyConditionnew, excellent, good, fair, needs_work, fixer_upper

Type-specific details

Populate the block that matches the propertyType.

ResidentialDetails

bedrooms, bathrooms, and squareFootage are required; optional fields include halfBaths, lotSize/lotSizeUnit, yearBuilt, floors, basementType, atticFinished, heatingType, coolingType, roofType, exteriorMaterial, garageSpaces, hasPool, and hasFireplace.

CommercialDetails

squareFootage and zoningType are required; optional fields include usableSquareFootage, floors, ceilingHeight, loadingDocks, driveInDoors, freightElevator, passengerElevator, yearBuilt, previousUse, buildOutStatus (shell/partial/turnkey), hvacType, powerCapacity, and sprinklerSystem.

LandDetails

lotSize, lotSizeUnit, zoning, and utilitiesAvailable are required; optional fields include topography, roadFrontage, roadAccess, waterSource, sewerType, soilType, floodZone, floodZoneDesignation, easements, surveyAvailable, mineralRights, and timberValue.

Query options

Property queries filter by search, categoryId, addressIds, address, propertyType, propertySubType, listingType, listingStatus[], isActive, isFeatured, isVerified, condition, furnished, priceRange, bedroomsRange, bathroomsRange, and squareFootageRange, sorted by title, salePrice, rentalPrice, createdAt, displayOrder, or squareFootage (asc / desc).

tip

Match propertySubType to propertyType (a warehouse is commercial, not residential), populate the matching details block, and keep listingStatus current through the sales cycle so search and pipeline stay accurate.