ParcelBase API

Property data API with 145M+ US records. ATTOM-compatible response format — drop-in replacement.

Base URL https://api.parcelbase.ai/api/v1

Authentication

Include your API key in every request:

Authorization: Bearer pb_your_api_key_here

Credits

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.

PlanRecords / MonthPrice / MonthPer Record
Free100$0
Starter5,000$249$0.050
Growth25,000$499$0.020
Pro100,000$999$0.010
Scale500,000$2,499$0.005
EnterpriseCustomContact UsVolume

Every API call returns the full property record. No per-field charges. Unused records do not carry over.

Try It

Test the API right now — no signup needed.

Endpoints

Property by Address

GET /property/address
ParameterTypeDescription
address requiredstringFull street address (e.g., "123 Main St")
city required*stringCity name
state required*stringState abbreviation (e.g., "SC")
zipstringZIP code (can replace city+state)
pageintPage number (default: 1)
pagesizeintResults 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();

Property by Owner

GET /property/owner
ParameterTypeDescription
lastName requiredstringOwner last name
firstNamestringOwner first name
statestringFilter by state
citystringFilter by city

Property by Parcel (APN)

GET /property/parcel
ParameterTypeDescription
apn requiredstringAssessor Parcel Number
statestringState (recommended for accuracy)
countystringCounty name

ATTOM-Compatible Aliases

These endpoints return the same data, matching ATTOM's URL structure for drop-in replacement:

GET /property/detail
GET /property/detailowner
GET /property/detailmortgage
GET /property/detailmortgageowner
GET /sale/detail
GET /sale/history — requires id (property ID)
GET /assessment/detail — requires id (property ID)

Usage

GET /usage

Returns your credit balance, usage history, and account details.

Health Check

GET /health (no auth required)

Response Format

{
  "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": "..." } }
  }]
}

Error Codes

CodeMeaning
400Bad request — missing or invalid parameters
401Invalid or missing API key
402No credits remaining or credits expired
403API key disabled
404No properties found (no credit charged)
429Rate limit exceeded

Migration from ATTOM

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