MapWise Parcels API Reference

The MapWise Parcels API provides enhanced programmatic access to Florida parcel data, allowing you to search by owner, PIN, address, acreage, sales, and more. This version includes improved performance, additional fields, and better error handling. Data is sourced from a variety of locations, including county property appraiser offices and the Florida Department of Revenue. This API is not intended for bulk data download, but for targeted queries and integrations.

Quick Start

Base URL

https://maps.mapwise.com/api_v2

Get Started in 3 Steps

  1. Try the test endpoint — no API key needed. Make a request to /api_v2/parcels/test to see the response format.
  2. Get your API key — log in to your MapWise account, go to My Account → API Dashboard, and generate an API key.
  3. Query the full endpoint — use your API key with /api_v2/parcels to access all 67 Florida counties.
TRY IT — NO API KEY NEEDED
curl "https://maps.mapwise.com/api_v2/parcels/test?searchCounty=ALACHUA&limit=1"

Authentication

API Key Authentication

All API endpoints require authentication using an API key. You can provide your API key in one of two ways:

Authentication Methods & Getting Your Key

Provide your API key via one of two headers:

  • Authorization Header: Authorization: Bearer YOUR_API_KEY
  • X-API-Key Header: X-API-Key: YOUR_API_KEY

To obtain an API key, log in to your MapWise account, navigate to My Account → API Dashboard, and generate a new key. You must have a valid MapWise subscription and Super Admin privileges.

Rate Limiting & Security

API keys are subject to rate limiting:

  • Global Limit: 60 requests per minute
  • User Limit: 180 requests per minute (burst)

Security Best Practices:

  • Store API keys in environment variables — never commit to version control
  • Rotate API keys regularly and use HTTPS for all requests
  • Monitor your API usage and rate limits
GET /api_v2/parcels
curl -X GET "https://maps.mapwise.com/api_v2/parcels?searchCounty=ALACHUA&limit=1" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json"
import requests api_key = "YOUR_API_KEY" url = "https://maps.mapwise.com/api_v2/parcels" params = { "searchCounty": "ALACHUA", "limit": 1 } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } response = requests.get(url, params=params, headers=headers) data = response.json() print(data)
const apiKey = "YOUR_API_KEY"; const url = "https://maps.mapwise.com/api_v2/parcels?searchCounty=ALACHUA&limit=1"; fetch(url, { method: "GET", headers: { "Authorization": `Bearer ${apiKey}`, "Content-Type": "application/json" } }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error("Error:", error));
<?php $api_key = "YOUR_API_KEY"; $url = "https://maps.mapwise.com/api_v2/parcels"; $params = [ "searchCounty" => "ALACHUA", "limit" => 1 ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url . "?" . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer " . $api_key, "Content-Type: application/json" ]); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); print_r($data); ?>

Building a Query

Parcels Endpoint

The /api_v2/parcels endpoint provides comprehensive access to parcel data across all supported counties. This endpoint requires authentication and provides full access to the complete dataset.

Parcels Endpoint

  • Endpoint: https://maps.mapwise.com/api_v2/parcels (GET)
  • Authentication: API key required (Bearer token or X-API-Key header)
  • Full Data Access: Complete parcel data across all 67 Florida counties
  • Response Format: JSON (default) or HTML, with pagination and aggregation support
  • Rate Limiting: Based on your subscription tier

Data Access & Pricing

  • County Coverage: All 67 Florida counties with complete sales history and property records
  • Data Updates: Monthly from official county property appraiser sources
  • Per-record billing: $0.06 per record returned (metered monthly via Stripe)
  • Test endpoint: Free — requests to /api_v2/parcels/test do not count toward billing

The MapWise API v2 supports various query parameters to filter and customize your results. All parameters are optional unless otherwise noted.

Query Parameters

searchCounty string required
Florida county name to search (e.g., 'HILLSBOROUGH', 'POLK'). Use 'ALL' for statewide search. Either searchCounty, lat_lon, or bbox is required.
Example: HILLSBOROUGH
lat_lon string required
Coordinate pair for point-in-polygon search within Florida bounding box. Either searchCounty, lat_lon, or bbox is required.
Example: 27.9506,-82.4572
searchOwner string
Owner name substring match (case-insensitive).
Example: SMITH
searchPin string
Parcel identification number (PIN) – partial matches allowed.
Example: A-14-29-18-4PP
bbox string required
Bounding box for spatial search (xmin,ymin,xmax,ymax in EPSG:4326). Either searchCounty, lat_lon, or bbox is required.
Example: -82.35,29.64,-82.30,29.67

More Parameters

searchCountyMulti string
Comma-separated list of counties (overrides searchCounty).
Example: HILLSBOROUGH,POLK,ORANGE
searchMailing string
Mailing address substring match across owner address fields.
Example: 123 MAIN ST
searchCityOwner string
Owner mailing address city starts-with filter (searches o_city field).
Example: TAMPA
searchStateOwner string
Owner mailing address state starts-with filter (searches o_state field).
Example: FL
searchZipcodeOwner string
Owner mailing address ZIP code starts-with filter (searches o_zipcode field).
Example: 33602
searchParcelId string
Parcel identification number (PIN) – exact match for unique parcel lookup.
Example: A-14-29-18-4PP-000008-00008.0
searchCity string
Site city starts-with filter.
Example: TAMPA
searchZipcode string
ZIP code starts-with filter (5-digit or ZIP+4).
Example: 33602
searchAddress string
Site address substring match (searches s_address field).
Example: 123 MAIN ST
searchNumber string
Site address street number filter (searches s_number field).
Example: 123
searchStreet string
Site address street name filter (searches s_name field).
Example: MAIN ST
searchUnit string
Site address unit/apartment number filter (searches s_unit field).
Example: APT 101
searchAcresMin number
Minimum GIS acres filter.
Example: 0.5
searchAcresMax number
Maximum GIS acres filter.
Example: 10.0
saleDateMin date
Return parcels with most recent sale on or after this date (YYYY-MM-DD).
Example: 2020-01-01
saleDateMax date
Return parcels with most recent sale on or before this date (YYYY-MM-DD).
Example: 2023-12-31
saleAmountMin number
Minimum sale amount filter (dollars).
Example: 100000
saleAmountMax number
Maximum sale amount filter (dollars).
Example: 500000
searchAggType string
Aggregation type for results. NOAGG = no aggregation (default), OWNER = group by owner across counties, OWNERSINGLE = group by owner within a single county, SALE = group by sale transaction.
Example: OWNER
sortBy string
Column to sort results by (default: 'owner').
Example: owner
order string
Sort direction (default: ASC).
Example: ASC
limit number
Maximum records returned per page (default: 50, max: 100).
Example: 50
offset number
Offset for pagination (default: 0).
format string
Response format (JSON, HTML).
Example: JSON
includeGeometry boolean
Include GeoJSON geometry fields in output (default: false).
Example: true
includeLegal boolean
Include legal description fields in output (default: false). Adds legal.full, legal.legal1 through legal.legal6.
Example: true
legacy boolean
Return output in legacy format (default: false).
Example: false
fields string
Comma-separated list of fields to include in the response. Supports dot notation for nested fields.
Example: owner.name,site.address,land.acres
GET /api_v2/parcels
curl -X GET "https://maps.mapwise.com/api_v2/parcels" \ -G \ --data-urlencode "searchCounty=HILLSBOROUGH" \ --data-urlencode "searchParcelId=A-14-29-18-4PP-000008-00008.0" \ --data-urlencode "limit=10" \ --data-urlencode "offset=0" \ --data-urlencode "sortBy=owner" \ --data-urlencode "order=ASC" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json"
import requests api_key = "YOUR_API_KEY" url = "https://maps.mapwise.com/api_v2/parcels" params = { "searchCounty": "HILLSBOROUGH", "searchParcelId": "A-14-29-18-4PP-000008-00008.0", "limit": 10, "offset": 0, "sortBy": "owner", "order": "ASC" } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } response = requests.get(url, params=params, headers=headers) data = response.json() print(data)
const apiKey = "YOUR_API_KEY"; const url = "https://maps.mapwise.com/api_v2/parcels"; const params = new URLSearchParams({ searchCounty: "HILLSBOROUGH", searchParcelId: "A-14-29-18-4PP-000008-00008.0", limit: 10, offset: 0, sortBy: "owner", order: "ASC" }); fetch(`${url}?${params}`, { method: "GET", headers: { "Authorization": `Bearer ${apiKey}`, "Content-Type": "application/json" } }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error("Error:", error));
<?php $api_key = "YOUR_API_KEY"; $url = "https://maps.mapwise.com/api_v2/parcels"; $params = [ "searchCounty" => "HILLSBOROUGH", "searchParcelId" => "A-14-29-18-4PP-000008-00008.0", "limit" => 10, "offset" => 0, "sortBy" => "owner", "order" => "ASC" ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url . "?" . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer " . $api_key, "Content-Type: application/json" ]); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); print_r($data); ?>
EXAMPLE RESPONSE
{ "success": true, "status": 200, "timestamp": "2025-07-30 16:42:32.933652", "meta": { "record_count": 1, "total_count": 3418 }, "data": [ { "meta": { "ogc_fid": 915070044, "county": "HILLSBOROUGH", "extracted_at": "20250724", "count": 1, "pa_pin_link": "http://gis.hcpafl.org/propertysearch/#/parcel/basic/1829144PP000008000080A" }, "identifiers": { "pin": "A-14-29-18-4PP-000008-00008.0", "pin_clean": "A1429184PP000008000080", "pin2": "1829144PP000008000080A", "pin2_clean": "1829144PP000008000080A", "altkey": "A-14-29-18-4PP-000008-00008.0", "prop_details": null }, "owner": { "primary_name": "10 MINUTE LOCKSMITH LLC", "secondary_name": null, "tertiary_name": null, "address_line1": "8870 N HIMES AVE", "address_line2": null, "address_line3": null, "city": "TAMPA", "state": "FL", "zipcode": "33614-1627" }, "site": { "address": "1002 W NASSAU ST", "city": "TAMPA", "zipcode": "33607", "subdivision": null, "subdivision_common": null, "subdivision_id": "4PP", "condo": "NO" }, "land": { "acres_deed": null, "acres_gis": "0.10901891648857046", "zoning": null, "land_use": { "luse": "0100", "luse_desc": null, "lusedor": "01", "lusedor_desc": "Single Family Residential" } }, "building": { "num_buildings": 1, "stories": 1, "sqft": { "heated": 860, "total": 903, "adjusted": null }, "year_built_actual": 1944, "year_built_effective": 1984, "beds": 1, "baths": { "full": 1, "half": null } }, "valuation": { "market": { "building": 80705, "improvements": 0, "land": 118560, "ag": null, "total": 199265 }, "assessed_total": 166361, "exempt_total": null, "taxable_total": 166361 }, "sales": { "recent": { "date": "2018-12-28", "amount": 118000, "type": "WD", "qual": "U", "vac": "I", "book": "26315", "page": "1274", "docnum": "2019007364", "grantor": "FEDERAL NATIONAL MORTGAGE ASSOC" } } } ] }

Testing a Query

Test Endpoint

The /api_v2/parcels/test endpoint allows you to test API queries without requiring an API key. This endpoint is specifically designed for development and testing purposes.

Test Endpoint

  • Endpoint: https://maps.mapwise.com/api_v2/parcels/test (GET)
  • No API Key Required: Perfect for testing and development
  • Same Response Format: Returns the same data structure as the main endpoint
  • All Parameters Supported: Refer to the Building a Query section for details
  • Rate Limiting: 1 request per second per IP address

Data Scope Restrictions

  • County: ALACHUA only — all other counties return empty results
  • City: GAINESVILLE only for site address searches
  • Sale Dates: 1990-01-01 to 2000-12-31 only

While all parameters work, results are limited to this data scope. Use the full /api_v2/parcels endpoint with your API key for complete access.

GET/api_v2/parcels/test
curl -X GET "https://maps.mapwise.com/api_v2/parcels/test" \ -G \ --data-urlencode "searchCounty=ALACHUA" \ --data-urlencode "searchParcelId=13123-000-000" \ --data-urlencode "limit=1" \ -H "Content-Type: application/json"
import requests url = "https://maps.mapwise.com/api_v2/parcels/test" params = { "searchCounty": "ALACHUA", "searchParcelId": "13123-000-000", "limit": 1 } response = requests.get(url, params=params) data = response.json() print(data)
const url = "https://maps.mapwise.com/api_v2/parcels/test"; const params = new URLSearchParams({ searchCounty: "ALACHUA", searchParcelId: "13123-000-000", limit: 1 }); fetch(`${url}?${params}`, { method: "GET", headers: { "Content-Type": "application/json" } }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error("Error:", error));
<?php $url = "https://maps.mapwise.com/api_v2/parcels/test"; $params = [ "searchCounty" => "ALACHUA", "searchParcelId" => "13123-000-000", "limit" => 1 ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url . "?" . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json" ]); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); print_r($data); ?>
TEST RESPONSE
{ "success": true, "status": 200, "timestamp": "2025-07-30 20:41:34.759100", "meta": { "record_count": 1, "total_count": 1, "test_mode": true, "data_scope": { "county": "ALACHUA" } }, "data": [ { "meta": { "ogc_fid": 884409165, "county": "ALACHUA", "extracted_at": "20250705", "count": 1, "pa_pin_link": "https://qpublic.schneidercorp.com/Application.aspx?AppID=1081&LayerID=26490&PageTypeID=4&PageID=10770&Q=422075161&KeyValue=13123-000-000" }, "identifiers": { "pin": "13123-000-000", "pin_clean": "13123000000", "pin2": null, "pin2_clean": null, "altkey": null, "prop_details": null }, "owner": { "primary_name": "ORANGE AND BLUE APARTMENT INVESTORS LLC", "secondary_name": null, "tertiary_name": null, "address_line1": "6626 ROXBURY LN", "address_line2": null, "address_line3": null, "city": "MIAMI BEACH", "state": "FL", "zipcode": "33141" }, "site": { "address": "1130 SW 5TH AVE", "city": "GAINESVILLE", "zipcode": "32601", "subdivision": "HICKSONS S/D BLK 8 UIV HTS", "subdivision_common": null, "subdivision_id": "092500", "condo": "NO" }, "land": { "acres_deed": null, "acres_gis": "0.2687370362524729", "zoning": "U5", "land_use": { "luse": "0300", "luse_desc": "MFR>10 UNITS", "lusedor": "03", "lusedor_desc": "Multi Family 10+ Units" } }, "building": { "num_buildings": null, "stories": null, "sqft": { "heated": 19371, "total": null, "adjusted": null }, "year_built_actual": 2012, "year_built_effective": 2012, "beds": null, "baths": { "full": null, "half": null } }, "valuation": { "market": { "building": 3779359, "improvements": null, "land": 426741, "ag": 0, "total": 4206100 }, "assessed_total": 2292874, "exempt_total": 0, "taxable_total": 2292874 }, "sales": { "recent": { "date": "2018-06-14", "amount": 17800000, "type": "MS ", "qual": "Q", "vac": "No", "book": "4608 ", "page": "0879 ", "docnum": null, "grantor": null } } } ] }

The Parcels Object

Each parcel in the response contains comprehensive property information organized into logical categories. The object structure uses nested objects for better organization and supports field filtering for performance optimization.

Object Fields

meta.county string
County name
identifiers.pin string
Primary parcel identification number
owner.primary_name string
Primary owner name
site.address string
Site/property address

More Fields

meta.pa_pin_link string
Link to Property Appraiser website
meta.extracted_at string
Data extraction date
identifiers.pin_clean string
Cleaned PIN without formatting
identifiers.pin2 string
Alternative PIN format
identifiers.altkey string
Alternative parcel key
owner.secondary_name string
Secondary owner name
owner.tertiary_name string
Tertiary owner name
owner.address_line1 string
Owner mailing address line 1
owner.address_line2 string
Owner mailing address line 2
owner.address_line3 string
Owner mailing address line 3
owner.city string
Owner mailing city
owner.state string
Owner mailing state
owner.zipcode string
Owner mailing ZIP code
site.city string
Site city
site.zipcode string
Site ZIP code
site.subdivision string
Subdivision name
site.subdivision_id string
Subdivision ID
site.condo string
Condominium status
land.acres_gis number
Property size in acres (from GIS)
land.acres_deed number
Property size in acres (from deed)
land.zoning string
Zoning classification
land.land_use.luse string
Land use code
land.land_use.lusedor string
Land use DOR code
building.num_buildings number
Number of buildings on property
building.stories number
Number of stories
building.sqft.heated number
Heated square footage
building.sqft.total number
Total square footage
building.year_built_actual number
Actual year built
building.year_built_effective number
Effective year built
building.beds number
Number of bedrooms
building.baths.full number
Number of full bathrooms
building.baths.half number
Number of half bathrooms
valuation.market.building number
Building market value
valuation.market.land number
Land market value
valuation.market.total number
Total market value
valuation.assessed_total number
Total assessed value
valuation.taxable_total number
Total taxable value
sales.recent.date string
Date of most recent sale
sales.recent.amount number
Amount of most recent sale
sales.recent.type string
Type of most recent sale
sales.recent.book string
Deed book number
sales.recent.page string
Deed page number
sales.recent.docnum string
Document number
sales.recent.grantor string
Grantor name
sales.recent.vac string
Vacant/improved indicator
sales.recent.qual string
Sale qualification code
sales.previous array
Previous sales history (same structure as sales.recent)
land.land_use.luse_desc string
Land use description
land.land_use.lusedor_desc string
DOR land use description
building.sqft.adjusted number
Adjusted square footage
valuation.market.improvements number
Market value of improvements
valuation.market.ag number
Agricultural market value
valuation.exempt_total number
Total exempt value
geometry.geojson string
GeoJSON polygon geometry (when includeGeometry=true)
geometry.zoom_polygon string
Map zoom polygon (when includeGeometry=true)
geometry.bbox string
Bounding box (when includeGeometry=true)
geometry.lat number
Centroid latitude (when includeGeometry=true)
geometry.lon number
Centroid longitude (when includeGeometry=true)
legal.full string
Complete legal description (when includeLegal=true)
legal.legal1 string
Legal description line 1 (when includeLegal=true)
legal.legal2 string
Legal description line 2 (when includeLegal=true)
legal.legal3 string
Legal description line 3 (when includeLegal=true)
legal.legal4 string
Legal description line 4 (when includeLegal=true)
legal.legal5 string
Legal description line 5 (when includeLegal=true)
legal.legal6 string
Legal description line 6 (when includeLegal=true)
THE PARCELS OBJECT
{ "meta": {
"ogc_fid": 884409165,
"county": "ALACHUA",
"extracted_at": 20250705,
"count": 1,
"pa_pin_link": "https://qpublic.schneidercorp.com/Application.aspx?AppID=1081&LayerID=26490&PageTypeID=4&PageID=10770&Q=422075161&KeyValue=13123-000-000"
}
, "identifiers": {
"pin": "13123-000-000",
"pin_clean": 13123000000,
"pin2": null,
"pin2_clean": null,
"altkey": null,
"prop_details": null
}
, "owner": {
"primary_name": "ORANGE AND BLUE APARTMENT INVESTORS LLC",
"secondary_name": null,
"tertiary_name": null,
"address_line1": "6626 ROXBURY LN",
"address_line2": null,
"address_line3": null,
"city": "MIAMI BEACH",
"state": "FL",
"zipcode": 33141
}
, "site": {
"address": "1130 SW 5TH AVE",
"city": "GAINESVILLE",
"zipcode": 32601,
"subdivision": "HICKSONS S/D BLK 8 UIV HTS",
"subdivision_common": null,
"subdivision_id": 092500,
"condo": "NO"
}
, "land": {
"acres_deed": null,
"acres_gis": 0.2687370362524729,
"zoning": "U5",
"land_use": {
"luse": 0300,
"luse_desc": "MFR>10 UNITS",
"lusedor": 03,
"lusedor_desc": "Multi Family 10+ Units"
}

}
, "building": {
"num_buildings": null,
"stories": null,
"sqft": {
"heated": 19371,
"total": null,
"adjusted": null
}
,
"year_built_actual": 2012,
"year_built_effective": 2012,
"beds": null,
"baths": {
"full": null,
"half": null
}

}
, "valuation": {
"market": {
"building": 3779359,
"improvements": null,
"land": 426741,
"ag": 0,
"total": 4206100
}
,
"assessed_total": 2292874,
"exempt_total": 0,
"taxable_total": 2292874
}
, "sales": {
"recent": {
"date": "2018-06-14",
"amount": 17800000,
"type": "MS",
"qual": "Q",
"vac": "No",
"book": 4608,
"page": 0879,
"docnum": null,
"grantor": null
}
,
"previous": {

}

}
, "geometry": {
"geojson": "{"type":"Polygon","coordinates":[[[-82.325,29.651],[-82.324,29.651],[-82.324,29.652],[-82.325,29.652],[-82.325,29.651]]]}",
"zoom_polygon": "-82.325,29.651,-82.324,29.652",
"bbox": "-82.325,29.651,-82.324,29.652",
"lat": 29.6515,
"lon": -82.3245
}
, "legal": {
"full": "HICKSONS S/D BLK 8 UIV HTS LOTS 1-4",
"legal1": "HICKSONS S/D BLK 8",
"legal2": "UIV HTS LOTS 1-4",
"legal3": null,
"legal4": null,
"legal5": null,
"legal6": null
}
}

Error Responses

HTTP Status Codes

Status CodeDescriptionCommon Cause
400Bad RequestMissing searchCounty, lat_lon, or bbox
401UnauthorizedMissing or invalid API key
404Not FoundNo parcels match the search criteria
429Too Many RequestsRate limit exceeded (60 req/min)
500Internal Server ErrorUnexpected server failure

Best Practices

  • Validate all user-supplied input before sending requests.
  • Check meta.record_count to determine if any results were returned.
  • Handle non-200 HTTP status codes gracefully in your application.
  • Implement exponential backoff when you receive a 429 response.
  • All error responses include success: false and an errormsg field.

Need More Information?

If you need additional information, have questions about the API, or are looking for custom integrations and enterprise pricing, we're here to help.

Contact Us