Developers · Private beta

PropDocket API

Florida property intelligence — parcel + jurisdiction + flood / wind / seismic hazards + permit data. Server-to-server REST endpoints designed for narrow queries: surgical responses, low latency, no upstream API quota waste.

Why this design

Slim by default

Responses ship with parsed values, not raw upstream JSON. A flood-zone query returns the zone — not 22 KB of FEMA NFHL attribute dumps.

Narrow tools first

Use a single-purpose endpoint when your question is single-purpose. get_property_flood is <500 B and only fires the FEMA call. The wide endpoints are escape hatches.

Pay for what you fetch

When you pass `fields`, we skip the FEMA / USGS / ArcGIS / county-appraiser calls your slice doesn't need. Saves you upstream API quota and 5–8× of latency.

Quickstart

All endpoints accept JSON POST, return JSON, and authenticate via a server-side API key in the x-api-key header. Keys are issued per organization on request — see the bottom of this page.

# Look up the flood zone for any Florida address (must include "FL")
curl -s -X POST https://api.propdocket.com/v1/get_property_flood \
  -H "x-api-key: $PROPDOCKET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"address":"123 Main St, Anytown, FL 33000"}'

# Response (~480 B):
# {
#   "success": true,
#   "match_status": "exact",
#   "input": { "address": "123 Main St, Anytown, FL 33000" },
#   "location": { "latitude": ..., "longitude": ..., "matched_address": "..." },
#   "property": { "parcel_id": "..." },
#   "hazards": {
#     "flood": {
#       "payload": {
#         "zone": "X", "is_sfha": false, "static_bfe": null,
#         "vertical_datum": "", "dfirm_id": "12099C"
#       }
#     }
#   }
# }

Endpoints

All endpoints are POST. /v1/... base path. Sizes are typical responses for a Florida residential parcel.

Narrow — single-purpose, fast, cheap

EndpointPurposeSize
get_property_basicsParcel id, situs, owner, building department.~600 B
get_property_floodFEMA NFHL flood zone, BFE, FIRM panel, is_sfha.<500 B
get_property_windASCE 7-22 wind speeds. Optional `risk_levels` param.1–3 KB
get_property_seismicUSGS ASCE 7-22 seismic params. Florida is low-seismic — usually only for commercial Risk III/IV.<1 KB
get_permit_statusPermit number, status, applied/issued/expires dates, contractor, owner.<1 KB
get_permit_inspectionsThe inspection list for a specific permit.<2 KB
get_permit_documentsThe document list (plans, NOC, product approvals, etc.).<2 KB
get_permit_workflowReviews + conditions only. Rare — admin / escalation use.varies

Wide — full picture in one call

EndpointPurposeSize
get_property_reportParcel + jurisdiction + flood + wind + seismic + elevation. Slim by default. Use `fields` for surgical projection or `include_*: true` to opt back into raw upstream payloads.~12 KB default
get_permitFull single-permit detail. Slim by default — no raw_payload, no workflow, no contacts.varies
list_permits_at_propertyAll known permits for a property by BD + address/parcel.varies
search_propertiesFL DOR parcel search by address/parcel/owner/coords. 10.8M-record cache + ArcGIS fallback.varies

The fields parameter

All wide endpoints accept an optional fields: string[]. Pass dotted JSON paths or named groups. The response contains only the requested paths plus a thin envelope (success, match_status, request_id, input, location). Unknown paths are silently skipped.

When you pass fields, PropDocket also skips the upstream FEMA / USGS / ArcGIS / county-appraiser HTTP calls your slice doesn't need. Single-purpose responses are 5–8× faster than the wide-endpoint defaults.

Named groups

GroupIncludesSize
plan_review_coreparcel_id, year_built, situs (address/city/zip), BD name, permit portal URL, flood (zone/is_sfha/BFE), all 4 wind risk categories~3.8 KB
intake_verifyparcel_id, situs_address, owner_name, BD name~600 B
estimate_basicsparcel_id, year_built, living_area_sqft, BD name, flood zone, wind cat 2~2 KB
permit_statuspermit number, status_normalized, status_raw, applied_at, issued_at, expires_at, contractor_name, owner_name<1 KB

Example — explicit dotted paths

POST /v1/get_property_report
{
  "address": "123 Main St, Anytown, FL 33000",
  "fields": [
    "property.parcel_id",
    "property.owner_name",
    "hazards.flood.payload.zone",
    "hazards.wind.payload.categories.2.value.speed_mph"
  ]
}

include_* flags

Default to false on all endpoints. Pass true to opt back into the heavy data — typically only useful when debugging upstream parsing or building data exports.

FlagWhen set to true
include_rawOn property: includes hazards.{flood,seismic,wind}.payload.raw and per-category value.raw (FEMA NFHL attributes, USGS multi-period spectra, ArcGIS contour samples). On permit: includes detail.permit.raw_payload.
include_county_appraiserIncludes the heavy county_appraiser_data block. The lightweight county_appraiser summary (status, slug, counts) is always returned regardless.
include_dor_attributesIncludes property.dor_attributes — the full FL DOR record dump (~100 fields). The flat property.* fields cover what most callers need.
include_workflowOn permit endpoints: includes reviews + conditions (approval/condition tree).
include_contactsOn permit endpoints: includes parties (owner, contractor, applicant contacts).

Latency & size benchmarks

Real measurements from a Florida residential parcel. Numbers are warm-cache; cold-start adds 1–2 seconds for the runtime spin-up.

CallSizeLatencyUpstream calls
get_property_report (no fields)~12 KB~9 sall (FEMA + USGS + ArcGIS + county appraiser + elevation)
fields: ["intake_verify"]624 B1.1 snone optional
fields: ["plan_review_core"]3.8 KB1.8 sFEMA + ArcGIS only
get_property_flood478 B1.8 sFEMA only
get_permit_status<1 KB<1 snone optional
get_property_report w/ all include_*: true~50–150 KB~9 sall + heavy upstream payloads

Use with Claude / AI agents

PropDocket ships an MCP (Model Context Protocol) server that exposes these endpoints as Claude tools — slim by default, with the same fields + include_* conventions. Agent-side responses are typically 12 KB or less without any prompt-engineering, well inside Claude's tool-result budget.

MCP endpoint

https://propdocket-mcp-production.up.railway.app/mcp

Install in Claude Code

claude mcp add --transport http propdocket https://propdocket-mcp-production.up.railway.app/mcp

Restart Claude Code after adding. The 12 propdocket tools (4 wide + 8 narrow) appear automatically.

Install in Claude Desktop

  1. Open Settings → Connectors → Add custom connector
  2. Name: propdocket
  3. URL: https://propdocket-mcp-production.up.railway.app/mcp
  4. Cmd+Q to fully quit Claude Desktop, then relaunch (window-close alone won't pick up new connectors)

Smoke test

Once connected, ask Claude:

  • “What's the flood zone for any FL address?” — exercises get_property_flood
  • “Verify this address and tell me the building department.” — exercises get_property_basics
  • “What's the status of permit X in Pinellas County?” — exercises get_permit_status

The MCP is currently in private beta. The endpoint is open today (URL-obscured) while we finish user-side authentication. For team installs, deeper integrations, or production access, reach out via Request API Access.

Get an API key

The API is in private beta. Tell us about your use case and we'll provision a server-side key for your environment, plus the latest endpoint catalog and examples.