{"openapi": "3.1.0", "info": {"title": "ParcelRiskCheck \u2014 Florida Permit, Code Violation & Lien Kill Sheets (Free Pilot)", "version": "0.5.0-pilot", "description": "Uninsured public-record municipal risk pre-screen (permits, code cases, 40-yr/SB 4-D recertification, and county code-lien mirrors). Not title insurance and does not replace a full Clerk Official Records or municipal lien estoppel search. Free Pilot ($0/screen): anonymous per-IP daily quota (configurable, default 25/day; 3-screen quick trial or 500+/day with a prc_pilot_<hex> Bearer key). Failed screens, out-of-coverage lookups, and ambiguity responses are always free ($0) and do not consume screen quota.", "termsOfService": "https://parcelriskcheck.com/terms", "contact": {"name": "ParcelRiskCheck Free Pilot", "email": "parcelriskcheck@proton.me", "url": "https://parcelriskcheck.com"}}, "servers": [{"url": "https://parcelriskcheck.com"}], "components": {"securitySchemes": {"PilotBearer": {"type": "http", "scheme": "bearer", "bearerFormat": "prc_pilot_<hex>"}}, "schemas": {"ErrorResponse": {"type": "object", "properties": {"error": {"type": "string"}, "message": {"type": "string"}, "charged_usd": {"type": "number"}, "coverage_status": {"type": "string"}, "candidates": {"type": "array", "items": {"type": "object"}}, "quota": {"$ref": "#/components/schemas/QuotaInfo"}}}, "QuotaInfo": {"type": "object", "properties": {"limit": {"type": "integer"}, "used": {"type": "integer"}, "remaining": {"type": "integer"}, "authenticated": {"type": "boolean"}}}, "ScreenRequest": {"type": "object", "required": ["address"], "properties": {"address": {"type": "string", "example": "210 W Par St, Orlando, FL"}, "unit": {"type": ["string", "null"], "example": "A317"}, "idempotency_key": {"type": "string", "description": "Optional caller key; auto-generated if omitted."}, "include_llm_brief": {"type": "boolean", "default": false}}}, "BatchRequest": {"type": "object", "required": ["raw_text"], "properties": {"raw_text": {"type": "string", "description": "Newline addresses (optional '| Unit') or CSV with address column."}, "include_llm_brief": {"type": "boolean", "default": false}}}, "Ch119DraftRequest": {"type": "object", "required": ["address", "scopes"], "properties": {"address": {"type": "string"}, "unit": {"type": ["string", "null"]}, "scopes": {"type": "array", "items": {"type": "string", "enum": ["permit_files", "code_orders", "fire_tanks", "open_permits", "code_violations", "unsafe_structures", "lien_payoff", "utility_balance"]}}}}, "FeedbackRequest": {"type": "object", "required": ["issue_type"], "properties": {"issue_type": {"type": "string"}, "input_address": {"type": "string"}, "request_id": {"type": ["string", "null"]}, "batch_id": {"type": ["string", "null"]}, "folio": {"type": ["string", "null"]}, "verdict_shown": {"type": ["string", "null"]}, "notes": {"type": "string"}, "contact_email": {"type": ["string", "null"]}}}, "HealthProbeRequest": {"type": "object", "additionalProperties": false, "properties": {"jurisdiction_id": {"type": ["string", "null"], "enum": ["fl_fort_lauderdale_city", "fl_hillsborough_unincorporated", "fl_jacksonville_city", "fl_miami_city", "fl_miami_dade_unincorporated", "fl_orlando_city", "fl_tampa_city", null], "description": "Optional jurisdiction_id to probe; omit or pass null to probe all 7 jurisdictions."}}}}}, "x-supported-jurisdictions": [{"jurisdiction_id": "fl_tampa_city", "name": "City of Tampa", "county": "Hillsborough County"}, {"jurisdiction_id": "fl_hillsborough_unincorporated", "name": "Unincorporated Hillsborough County", "county": "Hillsborough County"}, {"jurisdiction_id": "fl_miami_dade_unincorporated", "name": "Unincorporated Miami-Dade County", "county": "Miami-Dade County"}, {"jurisdiction_id": "fl_orlando_city", "name": "City of Orlando", "county": "Orange County"}, {"jurisdiction_id": "fl_fort_lauderdale_city", "name": "City of Fort Lauderdale", "county": "Broward County"}, {"jurisdiction_id": "fl_miami_city", "name": "City of Miami", "county": "Miami-Dade County"}, {"jurisdiction_id": "fl_jacksonville_city", "name": "City of Jacksonville (Duval Consolidated)", "county": "Duval County"}], "paths": {"/v1/coverage": {"get": {"summary": "Free GIS boundary, folio, unit, and source-health check", "parameters": [{"name": "address", "in": "query", "required": true, "schema": {"type": "string"}}, {"name": "unit", "in": "query", "required": false, "schema": {"type": "string"}}], "responses": {"200": {"description": "Coverage result with parcel metadata, coverage_gaps, and quota"}, "400": {"description": "Missing or invalid address syntax", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/v1/screen": {"post": {"summary": "Live municipal risk Kill Sheet screen ($0 Free Pilot)", "security": [{}, {"PilotBearer": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ScreenRequest"}}}}, "responses": {"200": {"description": "MunicipalRiskPacket (`coverage_status` is `partial` when `coverage_gaps` is non-empty, else `complete`) with verdict, permits, violations, Ch. 119 pack, and SHA-256 evidence"}, "400": {"description": "Malformed JSON or unparseable street address", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "401": {"description": "Invalid or revoked Pilot Bearer key", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "422": {"description": "OUT_OF_COVERAGE, PARCEL_NOT_FOUND, AMBIGUOUS_MULTI_FOLIO, or SOURCE_DEGRADED_FREE ($0 charge)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "429": {"description": "Daily Free Pilot quota exceeded (includes Retry-After and RateLimit headers)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/v1/batch/preview": {"post": {"summary": "Preview CSV/address coverage across rows ($0, does not consume screen quota)", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BatchRequest"}}}}, "responses": {"200": {"description": "Per-row coverage preview"}, "400": {"description": "Invalid batch input", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/v1/batch/run": {"post": {"summary": "Run concurrent Kill Sheet batch + 24h capability-token CSV/ZIP downloads ($0)", "security": [{}, {"PilotBearer": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BatchRequest"}}}}, "responses": {"200": {"description": "BatchKillSheetResult with verdict counts, sanitized rows, and csv/zip download URLs"}, "400": {"description": "Invalid input", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "429": {"description": "Daily quota exceeded", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/v1/ch119/draft": {"post": {"summary": "Draft municipal Fla. Stat. Ch. 119 / lien-desk request (draft only, never auto-sent)", "security": [{}, {"PilotBearer": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Ch119DraftRequest"}}}}, "responses": {"200": {"description": "Copyable Ch. 119 draft & mailto URL"}, "422": {"description": "Out of coverage or unsupported FOIA scope", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/v1/feedback": {"post": {"summary": "Submit pilot accuracy feedback or issue report", "security": [{}, {"PilotBearer": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FeedbackRequest"}}}}, "responses": {"200": {"description": "Feedback recorded"}, "400": {"description": "Validation error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/v1/health/sources": {"get": {"summary": "Configured & live canary portal health and lag status across 7 FL jurisdictions", "responses": {"200": {"description": "Dictionary of configured sources keyed by source_id"}}}}, "/v1/health/probe": {"post": {"summary": "Trigger live canary probe (rate-limited to 1/10 min for unauthenticated callers)", "security": [{}, {"PilotBearer": []}], "requestBody": {"required": false, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HealthProbeRequest"}}}}, "responses": {"200": {"description": "Probe results"}, "400": {"description": "Invalid JSON body, unexpected query params, or unknown jurisdiction_id", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "429": {"description": "Cooldown active", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}}}, "/mcp": {"post": {"summary": "Streamable HTTP MCP JSON-RPC 2.0 endpoint (ping, initialize, tools/list, tools/call)", "responses": {"200": {"description": "JSON-RPC 2.0 response with content and structuredContent"}}}}}}