Property data API with 145M+ US records. ATTOM-compatible response format — drop-in replacement.
Base URL https://api.parcelbase.ai/api/v1
Include your API key in every request:
Authorization: Bearer pb_your_api_key_here
Each property returned costs 1 credit. A call returning 25 properties = 25 credits. Failed lookups (404, 400, etc.) cost 0 credits. Default page size is 25, max 100.
| Plan | Records / Month | Price / Month | Per Record |
|---|---|---|---|
| Free | 100 | $0 | — |
| Starter | 5,000 | $249 | $0.050 |
| Growth | 25,000 | $499 | $0.020 |
| Pro | 100,000 | $999 | $0.010 |
| Scale | 500,000 | $2,499 | $0.005 |
| Enterprise | Custom | Contact Us | Volume |
Every API call returns the full property record. No per-field charges. Unused records do not carry over.
Test the API right now — no signup needed.
| Parameter | Type | Description |
|---|---|---|
address required | string | Full street address (e.g., "123 Main St") |
city required* | string | City name |
state required* | string | State abbreviation (e.g., "SC") |
zip | string | ZIP code (can replace city+state) |
page | int | Page number (default: 1) |
pagesize | int | Results per page (default: 25, max: 100) |
# curl
curl -H "Authorization: Bearer pb_your_key" \
"https://api.parcelbase.ai/api/v1/property/address?address=123+Main+St&city=Anytown&state=SC"
# Python
import requests
r = requests.get("https://api.parcelbase.ai/api/v1/property/address",
headers={"Authorization": "Bearer pb_your_key"},
params={"address": "123 Main St", "city": "Anytown", "state": "SC"})
print(r.json())
# Node.js
const res = await fetch(
"https://api.parcelbase.ai/api/v1/property/address?address=123+Main+St&city=Anytown&state=SC",
{ headers: { Authorization: "Bearer pb_your_key" } }
);
const data = await res.json();
| Parameter | Type | Description |
|---|---|---|
lastName required | string | Owner last name |
firstName | string | Owner first name |
state | string | Filter by state |
city | string | Filter by city |
| Parameter | Type | Description |
|---|---|---|
apn required | string | Assessor Parcel Number |
state | string | State (recommended for accuracy) |
county | string | County name |
These endpoints return the same data, matching ATTOM's URL structure for drop-in replacement:
id (property ID)id (property ID)Returns your credit balance, usage history, and account details.
{
"status": {
"code": 0,
"msg": "Success",
"total": 1,
"page": 1,
"pagesize": 25,
"transactionID": "uuid"
},
"property": [{
"identifier": { "Id": "...", "fips": "...", "apn": "..." },
"address": { "oneLine": "...", "locality": "...", "countrySubd": "...", "postal1": "..." },
"location": { "latitude": 0.0, "longitude": 0.0, "county": "..." },
"summary": { "proptype": "...", "yearbuilt": 2000 },
"lot": { "lotsize1": 8500, "lotsize2": 0.2 },
"building": { "size": { "universalsize": 2100 }, "rooms": { "beds": 3, "bathstotal": 2 } },
"owner": { "owner1": { "fullName": "...", "lastName": "..." }, "mailingAddress": { ... } },
"assessment": { "assessed": { "total": 250000 }, "market": { "total": 310000 } },
"sale": { "lastSale": { "price": 280000, "date": "2021-05-15" } },
"mortgage": { "amount": 220000, "lender": { "companyname": "..." } }
}]
}
| Code | Meaning |
|---|---|
| 400 | Bad request — missing or invalid parameters |
| 401 | Invalid or missing API key |
| 402 | No credits remaining or credits expired |
| 403 | API key disabled |
| 404 | No properties found (no credit charged) |
| 429 | Rate limit exceeded |
ParcelBase uses the same response structure as ATTOM. To migrate:
# Change base URL
- https://api.gateway.attomdata.com/propertyapi/v1.0.0
+ https://api.parcelbase.ai/api/v1
# Change auth header
- apikey: your_attom_key
+ Authorization: Bearer pb_your_parcelbase_key
# Response format is identical — no code changes needed