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
| Endpoint | Purpose | Size |
|---|---|---|
| get_property_basics | Parcel id, situs, owner, building department. | ~600 B |
| get_property_flood | FEMA NFHL flood zone, BFE, FIRM panel, is_sfha. | <500 B |
| get_property_wind | ASCE 7-22 wind speeds. Optional `risk_levels` param. | 1–3 KB |
| get_property_seismic | USGS ASCE 7-22 seismic params. Florida is low-seismic — usually only for commercial Risk III/IV. | <1 KB |
| get_permit_status | Permit number, status, applied/issued/expires dates, contractor, owner. | <1 KB |
| get_permit_inspections | The inspection list for a specific permit. | <2 KB |
| get_permit_documents | The document list (plans, NOC, product approvals, etc.). | <2 KB |
| get_permit_workflow | Reviews + conditions only. Rare — admin / escalation use. | varies |
Wide — full picture in one call
| Endpoint | Purpose | Size |
|---|---|---|
| get_property_report | Parcel + 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_permit | Full single-permit detail. Slim by default — no raw_payload, no workflow, no contacts. | varies |
| list_permits_at_property | All known permits for a property by BD + address/parcel. | varies |
| search_properties | FL 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
| Group | Includes | Size |
|---|---|---|
| plan_review_core | parcel_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_verify | parcel_id, situs_address, owner_name, BD name | ~600 B |
| estimate_basics | parcel_id, year_built, living_area_sqft, BD name, flood zone, wind cat 2 | ~2 KB |
| permit_status | permit 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.
| Flag | When set to true |
|---|---|
| include_raw | On 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_appraiser | Includes the heavy county_appraiser_data block. The lightweight county_appraiser summary (status, slug, counts) is always returned regardless. |
| include_dor_attributes | Includes property.dor_attributes — the full FL DOR record dump (~100 fields). The flat property.* fields cover what most callers need. |
| include_workflow | On permit endpoints: includes reviews + conditions (approval/condition tree). |
| include_contacts | On 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.
| Call | Size | Latency | Upstream calls |
|---|---|---|---|
| get_property_report (no fields) | ~12 KB | ~9 s | all (FEMA + USGS + ArcGIS + county appraiser + elevation) |
| fields: ["intake_verify"] | 624 B | 1.1 s | none optional |
| fields: ["plan_review_core"] | 3.8 KB | 1.8 s | FEMA + ArcGIS only |
| get_property_flood | 478 B | 1.8 s | FEMA only |
| get_permit_status | <1 KB | <1 s | none optional |
| get_property_report w/ all include_*: true | ~50–150 KB | ~9 s | all + 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/mcpInstall 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
- Open Settings → Connectors → Add custom connector
- Name: propdocket
- URL: https://propdocket-mcp-production.up.railway.app/mcp
- 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.