Florida Property API
Endpoints

Get Parcel by County + Parcel ID

Look up a single Florida parcel by its natural key — county slug plus the county-assigned parcel id. Punctuation-insensitive.

GET /api/v1/parcels/by-parcel-id

Look up a single parcel by its natural key: the county slug plus the county-assigned parcel_id. The match is punctuation-insensitive — 12-34-56 matches 123456. Use this when you have a parcel id from a county property-appraiser site, a deed, or a tax bill and want the canonical record.

Authentication

All endpoints share the base URL https://api.floridapropertyapi.com/v1.

curl -H "X-API-Key: fpapi_test_..." \
  "https://api.floridapropertyapi.com/v1/parcels/by-parcel-id?county=hillsborough&parcel_id=192829-5040-001000-0010"
// JavaScript (fetch)
const res = await fetch(
  "https://api.floridapropertyapi.com/v1/parcels/by-parcel-id?county=hillsborough&parcel_id=192829-5040-001000-0010",
  { headers: { "X-API-Key": "fpapi_test_..." } },
);
const body = await res.json();
console.log(body.data);
# Python (requests)
import requests

res = requests.get(
    "https://api.floridapropertyapi.com/v1/parcels/by-parcel-id",
    params={"county": "hillsborough", "parcel_id": "192829-5040-001000-0010"},
    headers={"X-API-Key": "fpapi_test_..."},
)
res.raise_for_status()
print(res.json()["data"])

Query Parameters

NameTypeRequiredDescription
countystringyesCounty slug, e.g. hillsborough.
parcel_idstringyesCounty-assigned parcel id (punctuation ignored).

Response (200)

Object envelope { data: ParcelHit, meta } — the same shape as Get Parcel by ID, including the GeoJSON geometry polygon.

{
  "data": {
    "parcel_id": "192829-5040-001000-0010",
    "county_slug": "hillsborough",
    "county_name": "Hillsborough",
    "owner_name": "SMITH JOHN A & MARY B",
    "site_address_full": "123 BAYSHORE BLVD",
    "site_city": "TAMPA",
    "site_state": "FL",
    "site_zip": "33606",
    "dor_use_code": "0100",
    "property_use_code": "01",
    "land_use_description": "SINGLE FAMILY",
    "just_value": 485000,
    "assessed_value": 412300,
    "taxable_value": 387300,
    "year_built": 1998,
    "last_sale_date": "2021-04-15",
    "last_sale_price": 460000,
    "centroid_lat": 27.9221,
    "centroid_lng": -82.4839,
    "geometry": "{\"type\":\"Polygon\",\"coordinates\":[[[-82.4842,27.9219],[-82.4836,27.9219],[-82.4836,27.9223],[-82.4842,27.9223],[-82.4842,27.9219]]]}"
  },
  "meta": { "request_id": "req_1234567890abcdef12345", "dataset_status": "live" }
}

Error Responses

StatusCodeCause
400bad_requestMissing county or parcel_id.
401unauthorizedMissing or invalid API key.
404not_foundNo parcel matches that county + parcel id.
429rate_limitedRate limit exceeded.
500internal_errorServer error — retry with backoff.

Data Coverage

Parcel-roll coverage is live statewide across all 67 Florida counties. Sales history is importing and tax-delinquency coverage is rolling out county by county.

Rate Limits

Every /api/v1/* response (including 429) carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers, plus the IETF RateLimit structured field. See Rate Limits for per-tier quotas and backoff guidance.

On this page