How to Classify Property Type From an Address (API Guide)
By David Acimovic
To classify property type from an address, you need more than a map pin or a deliverability check. You need to know whether a given address is a single-family house, a condo, an apartment, a manufactured home, or a vacant lot. That distinction drives lead scoring, home-services targeting, insurance underwriting, and market analysis. This guide shows the property classes the AddressVerify API returns, how to get them in a single call, and how to pull detailed property data when you need it.
Why property type matters
Two addresses on the same street can be completely different prospects. A roofing company wants single-family homes, not apartment towers. A solar installer cares about ownership and roof, which starts with the property class. A lender sizing a market wants to separate condos from multi-family buildings. Property type is the first filter that turns a raw address into a qualified lead, and it is invisible to any tool that only checks the mailbox. If you have not seen how that plays out for list hygiene, read filtering PO boxes and non-residential addresses.
The seven property classes
Every lookup returns a homeType, one of seven values. Six describe a kind of dwelling, and one describes land with no home on it.
- SINGLE_FAMILY: a standalone house on its own parcel.
- APARTMENT: a unit in a rental building.
- CONDO: an individually owned unit in a shared building.
- TOWNHOUSE: an attached home that shares walls but has its own entrance.
- MULTI_FAMILY: a duplex, triplex, or small multi-unit property.
- MANUFACTURED: a manufactured or mobile home.
- LOT: vacant land, no dwelling present.
For most lead workflows, the six dwelling types are the ones you keep, and LOT is a signal to set the record aside. You can, of course, target LOT on purpose if you sell to land buyers or builders.
One call returns the classification
Send a single-line address in a POST body with your API key in the x-api-key header. Here it is with curl and with JavaScript.
curl -X POST 'https://api.addressverify.io/service/lookup/address' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"address": "20 Marie St, Iberia, MO 65486"}'const res = await fetch('https://api.addressverify.io/service/lookup/address', {
method: 'POST',
headers: {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ address: '20 Marie St, Iberia, MO 65486' }),
});
const { homeType, homeValue, addressValid } = await res.json();
console.log(homeType, homeValue, addressValid);The basic response is compact and gives you the class right away:
{
"address": "20 Marie St, Iberia, MO 65486",
"addressValid": true,
"homeType": "SINGLE_FAMILY",
"homeValue": 371000
}Going deeper with expanded=true
When the class alone is not enough, add ?expanded=true to the same endpoint. You get parsed address components, room counts, living area, year built, lot size, tax assessment, and listing status, all in one response and at no extra cost on any plan.
curl -X POST 'https://api.addressverify.io/service/lookup/address?expanded=true' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"address": "20 Marie St, Iberia, MO 65486"}'{
"address": "20 Marie St, Iberia, MO 65486",
"homeType": "SINGLE_FAMILY",
"addressValid": true,
"homeValue": 371000,
"addressInfo": {
"streetAddress": "20 Marie St",
"zipcode": "65486",
"city": "Iberia",
"state": "MO"
},
"propertyInfo": {
"bathrooms": 2,
"bedrooms": 4,
"livingArea": 2072,
"yearBuilt": 2001,
"lotSize": "1.84 acres"
},
"taxAssessment": {
"taxAssessedValue": 150210,
"taxAssessmentYear": "2024"
},
"listing": {
"lastSoldDate": "2025-05-22",
"isPreforeclosureAuction": false,
"listingStatus": "recentlySold"
}
}With that payload you can do a lot more than classify. You can score a lead by value band, target homes built before a certain year for a renovation offer, or flag pre-foreclosure listings. The full field reference lives in the API documentation.
Handling invalid or ambiguous results
Not every address resolves. Always check addressValid before you trust the rest of the response. When it is false, the address did not match a known property, which is your cue to skip the record or route it for manual review.
const data = await res.json();
if (!data.addressValid) {
// Address did not resolve; skip or queue for review.
return null;
}
if (data.homeType === 'LOT') {
// Vacant land, not a residence.
return { address: data.address, keep: false };
}
return { address: data.address, homeType: data.homeType, keep: true };A defensive rule of thumb: treat a missing or unexpected homeType as non-residential rather than assuming it is a home. That keeps bad records out of your funnel even if a new class shows up later.
Multi-line addresses
If your data is already split into fields, use the fields endpoint instead of a single string. It takes street, city, state, and zip, and returns the same shape.
curl -X POST 'https://api.addressverify.io/service/lookup/address/fields' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"street": "20 Marie St", "city": "Iberia", "state": "MO", "zip": "65486"}'Where to go next
The quickest way to see a classification is the free address verifier tool, which runs a live lookup in the browser. When you are ready to build, official SDKs for JavaScript, Python, Go, and Rust wrap every endpoint. To put this to work on a whole list, see how to filter PO boxes and non-residential addresses, or compare the approach with older tools in USPS Web Tools API alternatives. Pricing and limits are on the pricing page. For how these classes actually distribute across 500,000 real lookups, see The State of Address Data.
Try it on your own addresses
The AddressVerify free tier includes 50 API calls a month, no credit card required. Validate an address, classify the property type, and get an estimated value in one call.