This guide will walk you through how to use the Postman application for testing the Attom API. Postman is a great tool to demonstrate how to query via HTTP when developing with the Attom API.
Postman helps you be more efficient by allowing you to construct complex HTTP requests quickly, organize them in collections and share them. As always, if you have any questions, feel free to email us at datacustomercare@attomdata.com.
Postman is a free application that can be downloaded quickly from here https://www.getpostman.com. To use Postman, you will first need to install the application from their website.
Once Postman has been downloaded, we can use the Postman interface to make calls to the Attom API.
You’ll need to include your API Key as one of the headers for your requests to work. Attom offers a free 30-day trial with access to our API and you can sign up right here – https://api.developer.attomdata.com. Select “Sign Up” from the menu to get started.
You can find your API Key under the Account>Applications menu once you’ve signed up for an account and logged into the developer platform.
Use Case 1: Allow a user to view all properties within a radius of a particular point (lat/long).
In this example I will be using the /property resource and the /snapshot package and adding latitude, longitude and radius parameters. The APIs endpoint structure is:
https://api.gateway.attomdata.com/propertyapi/v1.0.0/RESOURCE/PACKAGE?{parameters}
The request will look like this:
https://api.gateway.attomdata.com/propertyapi/v1.0.0/property/snapshot?latitude=39.7047&longitude=-105.0814&radius=2
Here is some of the JSON response:
{
"status": {
"version": "1.0.0",
"code": 0,
"msg": "SuccessWithResult",
"total": 10000,
"page": 1,
"pagesize": 10
},
"property": [
{
"identifier": {
"obPropId": 5129424708059,
"fips": "08059",
"apn": "064443",
"apnOrig": "64443",
"attomId": 51294247
},
"lot": {
"lotSize1": 0.2285
},
"address": {
"country": "US",
"countrySubd": "CO",
"line1": "7775 W WOODARD CIR",
"line2": "LAKEWOOD, CO 80227",
"locality": "Lakewood",
"matchCode": "ExaStr",
"oneLine": "7775 W WOODARD CIR, LAKEWOOD, CO 80227",
"postal1": "80227",
"postal2": "3014",
"postal3": "C014"
},
"location": {
"accuracy": "Street",
"elevation": 0,
"latitude": "39.675828",
"longitude": "-105.084092",
"distance": 2,
"geoid": "CO08059, CS0892641, DB0804800, MT30001324, ND0000119249, ND0004682431, PL0843000, RS0000119288, SB0000075687, SB0000075692, SB0000075714, ZI80227"
},
"summary": {
"propclass": "Single Family Residence / Townhouse",
"propsubtype": "HOUSE",
"proptype": "SFR",
"yearbuilt": 1966,
"propLandUse": "SFR",
"propIndicator": "10"
},
"building": {
"size": {
"universalsize": 1402
},
"rooms": {
"bathstotal": 3,
"beds": 4
}
},
"vintage": {
"lastModified": "2018-8-10",
"pubDate": "2018-8-16"
}
},
You’ll notice above, that pagesize= 10. This is the default pagination but can be changed by adding a page size parameter to the end of your request (see below).
https://api.gateway.attomdata.com/propertyapi/v1.0.0/property/snapshot?latitude=39.7047&longitude=-105.0814&radius=2&pagesize=50
Now, let’s dig deeper into a specific property.
Use Case 2: Allow a user to see all characteristics of a specific property.
We’ll still be using the /property resource but will now use the /detail package and grabbing the “obPropId” from our previous response.
https://api.gateway.attomdata.com/propertyapi/v1.0.0/property/detail?ID=5129424708059
Your JSON response should look similar to this:
{
"status": {
"version": "1.0.0",
"code": 0,
"msg": "SuccessWithResult",
"total": 1,
"page": 1,
"pagesize": 10
},
"property": [
{
"identifier": {
"obPropId": 5129424708059,
"fips": "08059",
"apn": "064443",
"apnOrig": "64443",
"attomId": 51294247
},
"lot": {
"depth": 0,
"frontage": 0,
"lotnum": "2",
"lotsize1": 0.2285,
"lotsize2": 9953,
"pooltype": "NONE"
},
"area": {
"blockNum": "8",
"countrysecsubd": "Jefferson County",
"countyuse1": "1112",
"muncode": "JE",
"munname": "JEFFERSON",
"srvyRange": "69",
"srvySection": "26",
"srvyTownship": "04",
"subdname": "SOUTHERN GABLES",
"subdtractnum": "0",
"taxcodearea": "7015"
},
"address": {
"country": "US",
"countrySubd": "CO",
"line1": "7775 W WOODARD CIR",
"line2": "LAKEWOOD, CO 80227",
"locality": "Lakewood",
"matchCode": "ExaStr",
"oneLine": "7775 W WOODARD CIR, LAKEWOOD, CO 80227",
"postal1": "80227",
"postal2": "3014",
"postal3": "C014"
},
"location": {
"accuracy": "Street",
"elevation": 0,
"latitude": "39.675828",
"longitude": "-105.084092",
"distance": 0,
"geoid": "CO08059, CS0892641, DB0804800, MT30001324, ND0000119249, ND0004682431, PL0843000, RS0000119288, SB0000075687, SB0000075692, SB0000075714, ZI80227"
},
"summary": {
"absenteeInd": "OWNER OCCUPIED",
"propclass": "Single Family Residence / Townhouse",
"propsubtype": "HOUSE",
"proptype": "SFR",
"yearbuilt": 1966,
"propLandUse": "SFR",
"propIndicator": "10",
"legal1": "SECTION 26 TOWNSHIP 04 RANGE 69 SUBDIVISIONCD 696800 SUBDIVISIONNAME SOUTHERN GABLES BLOCK 008 LOT 0002 SIZE: 9953 TRACT VALUE: .228"
},
"utilities": {
"coolingtype": "AC.CENTRAL",
"heatingtype": "FORCED AIR"
},
"building": {
"size": {
"bldgsize": 3106,
"grosssize": 3106,
"grosssizeadjusted": 1402,
"groundfloorsize": 1402,
"livingsize": 1402,
"sizeInd": "LIVING SQFT ",
"universalsize": 1402
},
"rooms": {
"bathfixtures": 0,
"baths1qtr": 0,
"baths3qtr": 0,
"bathscalc": 3,
"bathsfull": 0,
"bathshalf": 0,
"bathstotal": 3,
"beds": 4,
"roomsTotal": 0
},
"interior": {
"bsmtsize": 1242,
"bsmttype": "UNFINISHED",
"fplccount": 0,
"fplcind": "Y",
"fplctype": "YES"
},
"construction": {
"constructiontype": "MASONRY",
"frameType": "MASONRY"
},
"parking": {
"garagetype": "ATTACHED GARAGE",
"prkgSize": 462,
"prkgSpaces": "0",
"prkgType": "GARAGE - ATTACHED"
},
"summary": {
"archStyle": "RANCH",
"bldgsNum": 1,
"bldgType": "HOUSE",
"imprType": "HOUSE",
"levels": 1,
"mobileHomeInd": " ",
"quality": "EXCELLENT",
"storyDesc": "HOUSE",
"unitsCount": "1",
"yearbuilteffective": 1966
}
},
"vintage": {
"lastModified": "2018-8-10",
"pubDate": "2018-8-16"
}
}
]
}
There is a lot of detail in this response! The /detail package provides us with building characteristics such as: basement size, number of fireplaces, parking structure and even heating/cooling and water services available. Check out a full list of responses for each package.
Finally, let’s look at Use Case 3: View a property’s last assessment and tax liability.
We’ll access the /assessment resource to get this information. Our request will look like this:
https://api.gateway.attomdata.com/propertyapi/v1.0.0/assessment/detail?ID=5129424708059
Create a Collection in Postman and add this request: https://github.com/Onboard-Informatics/postman-collections/blob/master/ATTOM%20Property%20Search%20Engine%20API.postman_collection.json to see additional HTTP requests.
The examples we’ve walked through can be used to build out property pages, giving end users detail at the house level. But, that’s just the beginning of what you can do, combined with Attom’s other content, you can display data related to schools, points of interest, and demographics to get a better understanding of a property’s surrounding neighborhood.
This quickstart guide will take you through all the steps necessary to start accessing the Attom API using cURL. As always, if you have any questions, feel free to email us at datacustomercase@attomdata.com
cURL allows transfer of data across a variety of protocols and is widely used as a way to send data across websites, including things like API interactions. A GET request is the default request method used, and is pretty straightforward. In fact, all of the examples in this guide will be GET requests. Learn more about cURL here.
You’ll need to include your API Key as one of the headers for your requests to work. Attom offers a free 30-day trial with access to our API and you can sign up right here – https://api.developer.attomdata.com. Select “Sign Up” from the menu to get started.
You can find your API Key under the Account>Applications menu once you’ve signed up for an account and logged into the developer platform.
Now that you have your API Key, let’s start making some requests to one of the endpoints for the Attom API:
https://api.gateway.attomdata.com/propertyapi/v1.0.0/RESOURCE/PACKAGE?{parameters}
All requests require the API Key be passed in the request header along with the “Accept” header to define either an XML or JSON response.
Let’s look at properties and their estimated values within a particular city. Using cURL, we would execute this curl command:
curl -X GET --header "Accept: application/json" --header "apikey: YOUR_API_KEY" "https://api.gateway.attomdata.com/propertyapi/v1.0.0/property/snapshot?cityname=Los%20Angeles"
Notes:
- /property is the resource, /snapshot is the package.
- A space character in the query string may be encoded as either "%20" or "+". You can use either, most people opt for "+" as it's more human readable and fewer bytes.
Your JSON response should look like this:
{
"status": {
"version": "1.0.0",
"code": 0,
"msg": "SuccessWithResult",
"total": 10000,
"page": 1,
"pagesize": 10
},
"property": [
{
"identifier": {
"obPropId": 32430951548283,
"fips": "48283",
"apn": "183112",
"attomId": 324309515
},
"lot": {
"lotSize1": 0
},
"address": {
"country": "US",
"countrySubd": "TX",
"line1": "12124 HIGHWAY 97",
"line2": "LOS ANGELES, TX 78014",
"locality": "Los Angeles",
"matchCode": "ExaZip",
"oneLine": "12124 HIGHWAY 97, LOS ANGELES, TX 78014",
"postal1": "78014"
},
"location": {
"accuracy": "Zip5",
"elevation": 0,
"latitude": "28.405690",
"longitude": "-99.085200",
"distance": 0,
"geoid": "CO48283, CS4890870, DB4815400, SB0000119531, ZI78014"
},
"summary": {
"propclass": "Single Family Residence / Townhouse",
"proptype": "MOBILE HOME",
"yearbuilt": 2011,
"propLandUse": "MOBILE HOME",
"propIndicator": "10"
},
"building": {
"size": {
"universalsize": 960
},
"rooms": {
"bathstotal": 0,
"beds": 0
}
},
"vintage": {
"lastModified": "2019-1-10",
"pubDate": "2019-1-24"
}
},
Next, we may want to see the most recent property valuation for a specific property. There is an additional parameter in the request, the mailing address for the property. "line1" and "line2" are pulled from "address" in the previous response example. In cURL it will look like this:
curl -X GET --header "Accept: application/json" --header "apikey: YOUR_API_KEY" "https://api.gateway.attomdata.com/propertyapi/v1.0.0/avm/detail?address1=11650+ANTWERP+AVE&address2=LOS+ANGELES+CA"
Upon success, you’ll receive a JSON response that should look like this:
{
"status": {
"version": "1.0.0",
"code": 0,
"msg": "SuccessWithResult",
"total": 1,
"page": 1,
"pagesize": 10
},
"property": [
{
"identifier": {
"obPropId": 15501518306037,
"fips": "06037",
"apn": "6148001075",
"apnOrig": "6148001075",
"attomId": 155015183
},
"lot": {
"depth": 0,
"frontage": 0,
"lotnum": "1",
"lotsize1": 0.1391,
"lotsize2": 6060,
"pooltype": "NONE"
},
"area": {
"countrysecsubd": "Los Angeles County",
"countyuse1": "010C",
"muncode": "LA",
"munname": "LOS ANGELES",
"subdname": "PINES",
"subdtractnum": "0",
"taxcodearea": "9753"
},
"address": {
"country": "US",
"countrySubd": "CA",
"line1": "11650 ANTWERP AVE",
"line2": "LOS ANGELES, CA 90059",
"locality": "Los Angeles",
"matchCode": "ExaStr",
"oneLine": "11650 ANTWERP AVE, LOS ANGELES, CA 90059",
"postal1": "90059",
"postal2": "1821",
"postal3": "C042"
},
"location": {
"accuracy": "Street",
"elevation": 0,
"latitude": "33.927618",
"longitude": "-118.248153",
"distance": 0,
"geoid": "CO06037, CS0690560, DB0609620, MT30002352, ND0000644111, ND0004662328, PL0685614, RS0000645674, SB0000069248, SB0000069249, SB0000069273, ZI90059"
},
"summary": {
"absenteeInd": "OWNER OCCUPIED",
"propclass": "Condominium (residential)",
"propsubtype": "MISCELLANEOUS INDUSTRIAL",
"proptype": "CONDOMINIUM",
"yearbuilt": 2001,
"propLandUse": "CONDOMINIUM",
"propIndicator": "11",
"legal1": "P M 329-32-33 LOT 1 CONDO UNIT 1 (AIRSPACE AND 1/2 INT IN COMMON AREA)"
},
"utilities": {
"heatingtype": "CENTRAL"
},
"building": {
"size": {
"bldgsize": 0,
"grosssize": 0,
"grosssizeadjusted": 1562,
"groundfloorsize": 0,
"livingsize": 1562,
"sizeInd": "LIVING SQFT ",
"universalsize": 1562
},
"rooms": {
"bathfixtures": 0,
"baths1qtr": 0,
"baths3qtr": 0,
"bathscalc": 2,
"bathsfull": 0,
"bathshalf": 0,
"bathstotal": 2,
"beds": 3,
"roomsTotal": 0
},
"interior": {
"bsmtsize": 0,
"fplccount": 0
},
"construction": {},
"parking": {
"prkgSize": 0
},
"summary": {
"bldgsNum": 0,
"bldgType": "MISCELLANEOUS INDUSTRIAL",
"levels": 0,
"mobileHomeInd": " ",
"storyDesc": "MISCELLANEOUS INDUSTRIAL",
"unitsCount": "0",
"yearbuilteffective": 2001
}
},
"vintage": {
"lastModified": "2019-3-28",
"pubDate": "2019-5-2"
},
"avm": {
"eventDate": "2019-3-28",
"amount": {
"scr": 71,
"value": 398000,
"high": 473000,
"low": 323000,
"valueRange": 150000
},
"calculations": {
"perSizeUnit": 254.8,
"ratioTaxAmt": 90.89,
"ratioTaxValue": 1.21,
"monthlyChgPct": 0,
"monthlyChgValue": 0,
"rangePctOfValue": 37.69
},
"AVMChange": {
"avmlastmonthvalue": 396000,
"avmamountchange": 2000,
"avmpercentchange": 1
},
"condition": {
"avmpoorlow": 306850,
"avmpoorhigh": 449350,
"avmpoorscore": 66,
"avmgoodlow": 323000,
"avmgoodhigh": 473000,
"avmgoodscore": 71,
"avmexcellentlow": 331075,
"avmexcellenthigh": 484825,
"avmexcellentscore": 73.5
}
}
}
]
}
Since we now have a "geoid" available, let’s try looking at all of the properties and their last sale price within the neighborhood. This is accomplished through a simple GET request to the /sale resource:
curl -X GET --header "Accept: application/json" --header "apikey: YOUR_API_KEY" --header "accept: application/json" "https://api.gateway.attomdata.com/propertyapi/v1.0.0/sale/snapshot?id=5129424708059"
The response to this request will include additional details about the sale like; sale amount, type of sale, sale record date and document numbers.
{
"status": {
"version": "1.0.0",
"code": 0,
"msg": "SuccessWithResult",
"total": 1,
"page": 1,
"pagesize": 10
},
"property": [
{
"identifier": {
"obPropId": 5129424708059,
"fips": "08059",
"apn": "064443",
"apnOrig": "64443",
"attomId": 51294247
},
"lot": {
"lotSize1": 0.2285
},
"sale": {
"salesearchdate": "2014-10-10",
"saleTransDate": "2014-10-10",
"amount": {
"saleamt": 265000,
"salerecdate": "2014-10-15",
"saledisclosuretype": 0,
"saledocnum": "0000087645",
"saletranstype": "Resale"
},
"calculation": {
"priceperbed": 66250,
"pricepersizeunit": 189
}
}
}
]
}
That’s just the beginning of what you can do with the Attom API. Check out the full documentation to find out about all of the other features of the API.