{"openapi":"3.1.0","info":{"title":"StormAxis Partner API","description":"\n## StormAxis Storm Intelligence API\n\n### Partner API Access\nExternal partners can access storm data via the `/api/v1/partner/` endpoints.\n\n**Tiers:**\n- **Sandbox** (Free): 100 calls/day - Basic storm overview and alerts\n- **Growth** ($199/mo): 5,000 calls/day - Scored opportunities, MCP access\n- **Professional** ($499/mo): 25,000 calls/day - Property targeting, contractors, historical archive\n- **Enterprise** ($1,499/mo): 100,000 calls/day - Webhooks, bulk exports, dedicated support\n\nApply at: https://stormaxis.io/partner-apply\n\n### MCP Server\nAI agents can connect via MCP at `/api/mcp` using your API key.\nIncluded in all paid tiers (Growth+).\n    ","version":"1.0.0"},"paths":{"/api/v1/commercial/roof-report":{"get":{"tags":["commercial","commercial"],"summary":"Get Roof Report","operationId":"get_roof_report_api_v1_commercial_roof_report_get","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","description":"Full US address, e.g. '123 Main St, Austin TX 78701'","title":"Address"},"description":"Full US address, e.g. '123 Main St, Austin TX 78701'"},{"name":"lookback_days","in":"query","required":false,"schema":{"type":"integer","maximum":3650,"minimum":1,"default":90,"title":"Lookback Days"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/roof-report/bulk":{"post":{"tags":["commercial","commercial"],"summary":"Post Bulk Roof Report","operationId":"post_bulk_roof_report_api_v1_commercial_roof_report_bulk_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/roof-report/bulk/{job_id}":{"get":{"tags":["commercial","commercial"],"summary":"Get Bulk Status","operationId":"get_bulk_status_api_v1_commercial_roof_report_bulk__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/audit/{request_id}":{"get":{"tags":["commercial","commercial"],"summary":"Get Audit Log","description":"P3.NEW.5 — Replay the full audit trail for a specific API request.\n\nReturns the original inputs, computed outputs, model version, and timing\nfor any prior call that was logged to commercial_api_log.\nAccess is scoped to the authenticated account — other accounts' records\nreturn 404 (not 403) to avoid leaking existence.","operationId":"get_audit_log_api_v1_commercial_audit__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/locations":{"post":{"tags":["commercial","commercial"],"summary":"Create Location","operationId":"create_location_api_v1_commercial_locations_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["commercial","commercial"],"summary":"List Locations","operationId":"list_locations_api_v1_commercial_locations_get","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/locations/{location_id}":{"delete":{"tags":["commercial","commercial"],"summary":"Delete Location","operationId":"delete_location_api_v1_commercial_locations__location_id__delete","parameters":[{"name":"location_id","in":"path","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/triggers":{"post":{"tags":["commercial","commercial"],"summary":"Create Trigger","operationId":"create_trigger_api_v1_commercial_triggers_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["commercial","commercial"],"summary":"List Triggers","operationId":"list_triggers_api_v1_commercial_triggers_get","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/triggers/{trigger_id}":{"put":{"tags":["commercial","commercial"],"summary":"Update Trigger","operationId":"update_trigger_api_v1_commercial_triggers__trigger_id__put","parameters":[{"name":"trigger_id","in":"path","required":true,"schema":{"type":"string","title":"Trigger Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["commercial","commercial"],"summary":"Delete Trigger","operationId":"delete_trigger_api_v1_commercial_triggers__trigger_id__delete","parameters":[{"name":"trigger_id","in":"path","required":true,"schema":{"type":"string","title":"Trigger Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/trigger-events":{"get":{"tags":["commercial","commercial"],"summary":"List Trigger Events","operationId":"list_trigger_events_api_v1_commercial_trigger_events_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/commercial/triggers/test":{"post":{"tags":["commercial","commercial"],"summary":"Test Webhook","operationId":"test_webhook_api_v1_commercial_triggers_test_post","parameters":[{"name":"trigger_id","in":"query","required":true,"schema":{"type":"string","title":"Trigger Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/token":{"post":{"tags":["MCP OAuth"],"summary":"Oauth Token","description":"OAuth 2.0 client credentials token endpoint (RFC 6749 §4.4).\n\nExchange a partner client_id + client_secret for a Bearer access token.\nThe token is used in the Authorization header when connecting to the MCP server.\n\nRequest (application/x-www-form-urlencoded):\n    grant_type=client_credentials\n    client_id=<partner client_id>\n    client_secret=<partner client_secret>\n\nResponse:\n    {\n      \"access_token\": \"<JWT>\",\n      \"token_type\": \"bearer\",\n      \"expires_in\": 3600\n    }","operationId":"oauth_token_api_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_oauth_token_api_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/.well-known/oauth-authorization-server":{"get":{"tags":["MCP OAuth"],"summary":"Oauth Metadata","description":"OAuth 2.0 Authorization Server Metadata (RFC 8414).\n\nAllows MCP clients to auto-discover the token endpoint.","operationId":"oauth_metadata_api_oauth__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/.well-known/mcp/server-card.json":{"get":{"summary":"Smithery Server Card","operationId":"smithery_server_card_api__well_known_mcp_server_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/invite/{token}":{"get":{"tags":["auth"],"summary":"Get Invite Details","description":"Get invite details by token (for accept-invite page)","operationId":"get_invite_details_api_auth_invite__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/accept-invite":{"post":{"tags":["auth"],"summary":"Accept Invite","description":"Accept a team invitation and create user account","operationId":"accept_invite_api_auth_accept_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me":{"get":{"tags":["users"],"summary":"Get Current User Info","operationId":"get_current_user_info_api_users_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/notification-preferences":{"get":{"tags":["users"],"summary":"Get Notification Preferences","operationId":"get_notification_preferences_api_users_me_notification_preferences_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["users"],"summary":"Update Notification Preferences","operationId":"update_notification_preferences_api_users_me_notification_preferences_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreferences"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/onboarding":{"put":{"tags":["users"],"summary":"Update Onboarding Status","description":"Mark user's onboarding as completed","operationId":"update_onboarding_status_api_users_me_onboarding_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/app-mode":{"get":{"tags":["users"],"summary":"Get App Mode Preference","description":"Return the user's saved default app mode. Defaults to 'roofing'.","operationId":"get_app_mode_preference_api_users_me_app_mode_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["users"],"summary":"Update App Mode Preference","description":"Persist the user's preferred default app mode. Rejects unknown modes.","operationId":"update_app_mode_preference_api_users_me_app_mode_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppModePreference"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/":{"get":{"tags":["users"],"summary":"List Users","operationId":"list_users_api_users__get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"},"title":"Response List Users Api Users  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/territories/":{"post":{"tags":["territories"],"summary":"Create Territory","operationId":"create_territory_api_territories__post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerritoryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Territory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["territories"],"summary":"List Territories","operationId":"list_territories_api_territories__get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Territory"},"title":"Response List Territories Api Territories  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/territories":{"post":{"tags":["territories"],"summary":"Create Territory","operationId":"create_territory_api_territories_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerritoryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Territory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["territories"],"summary":"List Territories","operationId":"list_territories_api_territories_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Territory"},"title":"Response List Territories Api Territories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/territories/{territory_id}":{"get":{"tags":["territories"],"summary":"Get Territory","operationId":"get_territory_api_territories__territory_id__get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Territory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/recent":{"get":{"tags":["storms"],"summary":"Get Recent Storms","description":"Get recent storms from Supabase (primary data source).\nThis is the main endpoint for storm data.","operationId":"get_recent_storms_api_storms_recent_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"description":"Days to look back","default":7,"title":"Days"},"description":"Days to look back"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state (e.g., OHIO, TX)","title":"State"},"description":"Filter by state (e.g., OHIO, TX)"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by event type (e.g., Hail, Tornado)","title":"Event Type"},"description":"Filter by event type (e.g., Hail, Tornado)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/high-impact":{"get":{"tags":["storms"],"summary":"Get High Impact Storms","description":"Get high-impact storms (significant damage, casualties).\nThese are candidates for storm alerts and opportunity scoring.","operationId":"get_high_impact_storms_api_storms_high_impact_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days"}},{"name":"min_damage","in":"query","required":false,"schema":{"type":"integer","description":"Minimum property damage ($)","default":10000,"title":"Min Damage"},"description":"Minimum property damage ($)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/by-state/{state}":{"get":{"tags":["storms-api"],"summary":"Get Storms By State","description":"Get top storms for a state from Supabase.","operationId":"get_storms_by_state_api_storms_by_state__state__get","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Days"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1,"minimum":0,"default":0.5,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/by-zip/{zip_code}":{"get":{"tags":["storms-api"],"summary":"Get Storms By Zip","description":"Get storms affecting a specific ZIP code from Supabase.","operationId":"get_storms_by_zip_api_storms_by_zip__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":1,"default":365,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/stats":{"get":{"tags":["storms-api"],"summary":"Get Storm Stats","description":"Get aggregate statistics about storms (cached).","operationId":"get_storm_stats_api_storms_stats_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state","title":"State"},"description":"Filter by state"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":1,"description":"Lookback period in days","default":365,"title":"Days"},"description":"Lookback period in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StormStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/search":{"get":{"tags":["storms"],"summary":"Search Storms","description":"Search storms by state, county, or event type.","operationId":"search_storms_api_storms_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":365,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/detail/{noaa_event_key}":{"get":{"tags":["storms"],"summary":"Get Storm Detail","description":"Get detailed information for a specific storm.","operationId":"get_storm_detail_api_storms_detail__noaa_event_key__get","parameters":[{"name":"noaa_event_key","in":"path","required":true,"schema":{"type":"string","title":"Noaa Event Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/events":{"get":{"tags":["storms"],"summary":"List Storm Events","operationId":"list_storm_events_api_storms_events_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StormEvent"},"title":"Response List Storm Events Api Storms Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/impact-zones":{"get":{"tags":["storms"],"summary":"List Impact Zones","operationId":"list_impact_zones_api_storms_impact_zones_get","parameters":[{"name":"territory_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StormImpactZone"},"title":"Response List Impact Zones Api Storms Impact Zones Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/opportunities":{"get":{"tags":["storms"],"summary":"List Opportunities","operationId":"list_opportunities_api_storms_opportunities_get","parameters":[{"name":"min_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"default":50,"title":"Min Score"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OpportunityScore"},"title":"Response List Opportunities Api Storms Opportunities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/alerts/active":{"get":{"tags":["storms"],"summary":"Get Active Alerts","description":"Get active NOAA weather alerts (watches and warnings).\nIf no state specified, returns alerts for all states with operating zones.","operationId":"get_active_alerts_api_storms_alerts_active_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"State code (e.g., TX, OK)","title":"State"},"description":"State code (e.g., TX, OK)"},{"name":"include_watches","in":"query","required":false,"schema":{"type":"boolean","description":"Include watch-level alerts","default":true,"title":"Include Watches"},"description":"Include watch-level alerts"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/outlook":{"get":{"tags":["storms"],"summary":"Get Spc Outlook","description":"Get SPC convective outlooks (1-3 day severe weather forecasts).","operationId":"get_spc_outlook_api_storms_outlook_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/alerts/check":{"post":{"tags":["storms"],"summary":"Trigger Alert Check","description":"Manually trigger a storm alert check for your organization.\nSends email alerts if any watches/warnings affect your zones.","operationId":"trigger_alert_check_api_storms_alerts_check_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/territory-storms":{"get":{"tags":["storms"],"summary":"List Territory Storms","description":"Return clustered storm events filtered to the user's operating territory states.\nFor agency admins, includes storms across all client territories.","operationId":"list_territory_storms_api_storms_territory_storms_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(total_revenue|start_time|avg_opportunity_score|event_count)$","default":"start_time","title":"Sort By"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":1,"default":365,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/territory-summary":{"get":{"tags":["storms"],"summary":"Get Territory Storm Summary","description":"Summary stats for territory storms: total events, top severity, revenue pipeline.","operationId":"get_territory_storm_summary_api_storms_territory_summary_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":1,"default":365,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/plans":{"get":{"tags":["activations"],"summary":"List Activation Plans","operationId":"list_activation_plans_api_activations_plans_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActivationPlan"},"title":"Response List Activation Plans Api Activations Plans Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/":{"get":{"tags":["activations"],"summary":"List Activations","operationId":"list_activations_api_activations__get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Activation"},"title":"Response List Activations Api Activations  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["activations"],"summary":"Create Activation","description":"Create a new campaign activation.\n\nRequires: Campaign Activation module.","operationId":"create_activation_api_activations__post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations":{"get":{"tags":["activations"],"summary":"List Activations","operationId":"list_activations_api_activations_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Activation"},"title":"Response List Activations Api Activations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["activations"],"summary":"Create Activation","description":"Create a new campaign activation.\n\nRequires: Campaign Activation module.","operationId":"create_activation_api_activations_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}":{"get":{"tags":["activations"],"summary":"Get Activation","operationId":"get_activation_api_activations__activation_id__get","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/validate-capacity":{"post":{"tags":["activations"],"summary":"Validate Activation Capacity","operationId":"validate_activation_capacity_api_activations__activation_id__validate_capacity_post","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/channels":{"put":{"tags":["activations"],"summary":"Configure Channels","operationId":"configure_channels_api_activations__activation_id__channels_put","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivationChannelConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/validate-tracking":{"post":{"tags":["activations"],"summary":"Validate Tracking","operationId":"validate_tracking_api_activations__activation_id__validate_tracking_post","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/deploy":{"post":{"tags":["activations"],"summary":"Deploy Activation","operationId":"deploy_activation_api_activations__activation_id__deploy_post","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/jobs":{"get":{"tags":["activations"],"summary":"Get Deployment Jobs","operationId":"get_deployment_jobs_api_activations__activation_id__jobs_get","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeploymentJob"},"title":"Response Get Deployment Jobs Api Activations  Activation Id  Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/metrics":{"get":{"tags":["activations"],"summary":"Get Activation Metrics","operationId":"get_activation_metrics_api_activations__activation_id__metrics_get","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/throttle":{"post":{"tags":["activations"],"summary":"Throttle Activation","operationId":"throttle_activation_api_activations__activation_id__throttle_post","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/pause":{"post":{"tags":["activations"],"summary":"Pause Activation","operationId":"pause_activation_api_activations__activation_id__pause_post","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/close":{"post":{"tags":["activations"],"summary":"Close Activation","operationId":"close_activation_api_activations__activation_id__close_post","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/capacity-override":{"put":{"tags":["activations"],"summary":"Set Capacity Override","description":"Manual override: prevents automatic throttle or forces resume.","operationId":"set_capacity_override_api_activations__activation_id__capacity_override_put","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/budget":{"put":{"tags":["activations"],"summary":"Adjust Budget","description":"Adjust budget for an active activation.","operationId":"adjust_budget_api_activations__activation_id__budget_put","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/creative":{"put":{"tags":["activations"],"summary":"Swap Creative","description":"Swap creative set for an activation.","operationId":"swap_creative_api_activations__activation_id__creative_put","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activations/{activation_id}/duration":{"put":{"tags":["activations"],"summary":"Extend Duration","description":"Extend duration of an activation.","operationId":"extend_duration_api_activations__activation_id__duration_put","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/":{"post":{"tags":["leads"],"summary":"Create Lead","operationId":"create_lead_api_leads__post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["leads"],"summary":"List Leads","operationId":"list_leads_api_leads__get","parameters":[{"name":"activation_id","in":"query","required":false,"schema":{"type":"string","title":"Activation Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","title":"Search"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads":{"get":{"tags":["leads"],"summary":"List Leads","operationId":"list_leads_api_leads_get","parameters":[{"name":"activation_id","in":"query","required":false,"schema":{"type":"string","title":"Activation Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","title":"Search"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/{lead_id}":{"get":{"tags":["leads"],"summary":"Get Lead","operationId":"get_lead_api_leads__lead_id__get","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["leads"],"summary":"Update Lead","description":"Update lead fields including status.","operationId":"update_lead_api_leads__lead_id__patch","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/{lead_id}/status":{"put":{"tags":["leads"],"summary":"Update Lead Status","description":"Quick endpoint to update only the lead status.","operationId":"update_lead_status_api_leads__lead_id__status_put","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/leads/{lead_id}/interactions":{"post":{"tags":["leads"],"summary":"Add Lead Interaction","description":"Log an interaction with a lead and auto-update status.\n\nStatus auto-updates:\n- Call/Email logged → status becomes 'contacted' (if currently 'new')\n- Meeting/Site Visit scheduled → status becomes 'appointment_set' (if 'new' or 'contacted')\n- Sale/Contract logged → status becomes 'converted'","operationId":"add_lead_interaction_api_leads__lead_id__interactions_post","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Interaction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["leads"],"summary":"Get Lead Interactions","description":"Get all interactions for a lead.","operationId":"get_lead_interactions_api_leads__lead_id__interactions_get","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/capacity/profiles":{"get":{"tags":["capacity"],"summary":"List Capacity Profiles","operationId":"list_capacity_profiles_api_capacity_profiles_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CapacityProfile"},"title":"Response List Capacity Profiles Api Capacity Profiles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/dashboard":{"get":{"tags":["analytics"],"summary":"Get Dashboard Analytics","operationId":"get_dashboard_analytics_api_analytics_dashboard_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/roi":{"get":{"tags":["analytics"],"summary":"Get Roi Metrics","operationId":"get_roi_metrics_api_analytics_roi_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/revenue-attribution":{"get":{"tags":["analytics"],"summary":"Get Revenue Attribution","operationId":"get_revenue_attribution_api_analytics_revenue_attribution_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/activations-summary":{"get":{"tags":["analytics"],"summary":"Get Activations Summary","operationId":"get_activations_summary_api_analytics_activations_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/activations/{activation_id}":{"get":{"tags":["analytics"],"summary":"Get Activation Analytics","operationId":"get_activation_analytics_api_analytics_activations__activation_id__get","parameters":[{"name":"activation_id","in":"path","required":true,"schema":{"type":"string","title":"Activation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/revenue-by-territory":{"get":{"tags":["analytics"],"summary":"Get Revenue By Territory","operationId":"get_revenue_by_territory_api_analytics_revenue_by_territory_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":90,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/deployment-speed":{"get":{"tags":["analytics"],"summary":"Get Deployment Speed","operationId":"get_deployment_speed_api_analytics_deployment_speed_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":90,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/audit-logs":{"get":{"tags":["analytics"],"summary":"Get Audit Logs","description":"Audit logs for the current user's org.","operationId":"get_audit_logs_api_analytics_audit_logs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/":{"post":{"tags":["integrations"],"summary":"Create Integration","operationId":"create_integration_api_integrations__post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Integration"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["integrations"],"summary":"List Integrations","operationId":"list_integrations_api_integrations__get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Integration"},"title":"Response List Integrations Api Integrations  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations":{"get":{"tags":["integrations"],"summary":"List Integrations","operationId":"list_integrations_api_integrations_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Integration"},"title":"Response List Integrations Api Integrations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{integration_id}":{"get":{"tags":["integrations"],"summary":"Get Integration","operationId":"get_integration_api_integrations__integration_id__get","parameters":[{"name":"integration_id","in":"path","required":true,"schema":{"type":"string","title":"Integration Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maps/territory-heatmap":{"get":{"tags":["maps"],"summary":"Get Territory Heatmap","description":"Get territory heat map data with storm impact overlays.\n\nP0-1: Reads from live pipeline collections:\n  - storm_api_view          (denormalized, refreshed every 6h)\n  - storm_opportunity_scores (ML-scored storms)\n  - territories             (org's defined territories with zips_json)\n\nImpact zones are derived on the fly: territory ZIPs ∩ storm-affected ZIPs.\nThe old storm_events / storm_impact_zones / opportunity_scores collections\nare seed-only and are NOT read here.","operationId":"get_territory_heatmap_api_maps_territory_heatmap_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":30,"title":"Days"}},{"name":"min_severity","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Severity"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/predictions/storms":{"get":{"tags":["predictions"],"summary":"Get Predicted Storms","description":"Get predicted storms for the next 24-72 hours","operationId":"get_predicted_storms_api_predictions_storms_get","parameters":[{"name":"hours_ahead","in":"query","required":false,"schema":{"type":"integer","maximum":72,"default":48,"title":"Hours Ahead"}},{"name":"min_confidence","in":"query","required":false,"schema":{"type":"number","default":60,"title":"Min Confidence"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/predictions/alerts":{"get":{"tags":["predictions"],"summary":"Get Weather Alerts","description":"Get active weather alerts for user's territories","operationId":"get_weather_alerts_api_predictions_alerts_get","parameters":[{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Active Only"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/predictions/impact-forecast":{"get":{"tags":["predictions"],"summary":"Get Impact Forecast","description":"Get predicted impact forecasts for territories\nShows which territories will be hit and when","operationId":"get_impact_forecast_api_predictions_impact_forecast_get","parameters":[{"name":"territory_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Territory Id"}},{"name":"hours_ahead","in":"query","required":false,"schema":{"type":"integer","default":48,"title":"Hours Ahead"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/predictions/refresh-noaa-data":{"post":{"tags":["predictions"],"summary":"Refresh Noaa Data","description":"Manually trigger NOAA data refresh\nFetches latest alerts and creates predicted storms","operationId":"refresh_noaa_data_api_predictions_refresh_noaa_data_post","parameters":[{"name":"states","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":["TX","OK","KS","AR","LA"],"title":"States"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demo/request":{"post":{"tags":["demo"],"summary":"Create Demo Request","description":"Create a new demo request from the landing page","operationId":"create_demo_request_api_demo_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoRequestCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demo/requests":{"get":{"tags":["demo"],"summary":"List Demo Requests","description":"List all demo requests (for internal use)","operationId":"list_demo_requests_api_demo_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/demo/seed":{"post":{"tags":["demo"],"summary":"Seed Demo Data","description":"Manually trigger demo data seeding.\nRequires authenticated user with owner role.","operationId":"seed_demo_data_api_demo_seed_post","parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Force re-seed even if data exists","default":false,"title":"Force"},"description":"Force re-seed even if data exists"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscriptions/plans":{"get":{"tags":["subscriptions"],"summary":"Get Plans","description":"Get all subscription plans.","operationId":"get_plans_api_subscriptions_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/subscriptions/plans/contractor":{"get":{"tags":["subscriptions"],"summary":"Get Contractor Plans Endpoint","description":"Get contractor-facing plans in display order.","operationId":"get_contractor_plans_endpoint_api_subscriptions_plans_contractor_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/subscriptions/plans/agency":{"get":{"tags":["subscriptions"],"summary":"Get Agency Plans Endpoint","description":"Get agency plans.","operationId":"get_agency_plans_endpoint_api_subscriptions_plans_agency_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/subscriptions/agency/calculator":{"get":{"tags":["subscriptions"],"summary":"Calculate Agency Cost","description":"Calculate agency platform cost based on contractor count.","operationId":"calculate_agency_cost_api_subscriptions_agency_calculator_get","parameters":[{"name":"contractor_count","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Contractor Count"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscriptions/status":{"get":{"tags":["subscriptions"],"summary":"Get Subscription Status","description":"Check if user has an active subscription.\nCached server-side for 60 s per org to avoid hitting MongoDB on every page load.","operationId":"get_subscription_status_api_subscriptions_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscriptions/current":{"get":{"tags":["subscriptions"],"summary":"Get Current Subscription","operationId":"get_current_subscription_api_subscriptions_current_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscriptions/checkout/{plan_id}":{"post":{"tags":["subscriptions"],"summary":"Create Checkout Session","operationId":"create_checkout_session_api_subscriptions_checkout__plan_id__post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscriptions/checkout/status/{session_id}":{"get":{"tags":["subscriptions"],"summary":"Get Checkout Status","operationId":"get_checkout_status_api_subscriptions_checkout_status__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscriptions/webhook/stripe":{"post":{"tags":["subscriptions"],"summary":"Stripe Webhook","operationId":"stripe_webhook_api_subscriptions_webhook_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/subscriptions/usage":{"get":{"tags":["subscriptions"],"summary":"Get Usage","description":"Get current plan usage vs limits.","operationId":"get_usage_api_subscriptions_usage_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/weekly":{"post":{"tags":["reports"],"summary":"Send Weekly Report","operationId":"send_weekly_report_api_reports_weekly_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/trigger-all":{"post":{"tags":["reports"],"summary":"Trigger All Reports","description":"Manually trigger weekly reports for all active users (admin/owner only).","operationId":"trigger_all_reports_api_reports_trigger_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me":{"get":{"tags":["agencies"],"summary":"Get My Agency","operationId":"get_my_agency_api_agencies_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/clients":{"get":{"tags":["agencies"],"summary":"List Clients","operationId":"list_clients_api_agencies_me_clients_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["agencies"],"summary":"Add Client","operationId":"add_client_api_agencies_me_clients_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgencyClientCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/clients/{org_id}":{"delete":{"tags":["agencies"],"summary":"Remove Client","operationId":"remove_client_api_agencies_me_clients__org_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/portfolio":{"get":{"tags":["agencies"],"summary":"Get Portfolio","operationId":"get_portfolio_api_agencies_me_portfolio_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/clients/{org_id}/summary":{"get":{"tags":["agencies"],"summary":"Get Client Summary","operationId":"get_client_summary_api_agencies_me_clients__org_id__summary_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/alerts":{"get":{"tags":["agencies"],"summary":"Get Portfolio Alerts","operationId":"get_portfolio_alerts_api_agencies_me_alerts_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/branding":{"get":{"tags":["agencies"],"summary":"Get Branding","operationId":"get_branding_api_agencies_me_branding_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["agencies"],"summary":"Update Branding","operationId":"update_branding_api_agencies_me_branding_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Branding"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/bulk-deploy":{"post":{"tags":["agencies"],"summary":"Bulk Deploy","description":"Deploy activations across multiple clients simultaneously.\nBody: { client_org_ids: [str], storm_event_id: str, blueprint_id?: str,\n        channels: [str], budgets: {channel: amount},\n        budget_overrides: {org_id: {channel: amount}} }","operationId":"bulk_deploy_api_agencies_me_bulk_deploy_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/benchmarking":{"get":{"tags":["agencies"],"summary":"Get Benchmarking","description":"Cross-client performance comparison. Uses aggregation instead of N×5 queries.","operationId":"get_benchmarking_api_agencies_me_benchmarking_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/export":{"get":{"tags":["agencies"],"summary":"Export Portfolio Csv","description":"Export portfolio metrics as CSV.","operationId":"export_portfolio_csv_api_agencies_me_export_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/audit-logs":{"get":{"tags":["agencies"],"summary":"Get Agency Audit Logs","description":"Audit logs across all agency client accounts.","operationId":"get_agency_audit_logs_api_agencies_me_audit_logs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/audit-logs/export":{"get":{"tags":["agencies"],"summary":"Export Audit Logs Csv","operationId":"export_audit_logs_csv_api_agencies_me_audit_logs_export_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/operating-zones/":{"get":{"tags":["operating-zones"],"summary":"List Zones","operationId":"list_zones_api_operating_zones__get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OperatingZone"},"title":"Response List Zones Api Operating Zones  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["operating-zones"],"summary":"Create Zone","operationId":"create_zone_api_operating_zones__post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatingZoneCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatingZone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/operating-zones":{"get":{"tags":["operating-zones"],"summary":"List Zones","operationId":"list_zones_api_operating_zones_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OperatingZone"},"title":"Response List Zones Api Operating Zones Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["operating-zones"],"summary":"Create Zone","operationId":"create_zone_api_operating_zones_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatingZoneCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatingZone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/operating-zones/{zone_id}":{"get":{"tags":["operating-zones"],"summary":"Get Zone","operationId":"get_zone_api_operating_zones__zone_id__get","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatingZone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["operating-zones"],"summary":"Update Zone","operationId":"update_zone_api_operating_zones__zone_id__put","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatingZoneUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatingZone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["operating-zones"],"summary":"Delete Zone","operationId":"delete_zone_api_operating_zones__zone_id__delete","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/operating-zones/{zone_id}/recompute-zips":{"post":{"tags":["operating-zones"],"summary":"Recompute Zips","description":"Recompute ZIP membership based on current geometry_payload.","operationId":"recompute_zips_api_operating_zones__zone_id__recompute_zips_post","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/{storm_id}/cluster-runs":{"post":{"tags":["clusters"],"summary":"Trigger Cluster Run","description":"Trigger the v1_heuristic clustering for a storm + operating zone.","operationId":"trigger_cluster_run_api_storms__storm_id__cluster_runs_post","parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}},{"name":"operating_zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Zone Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/{storm_id}/clusters":{"get":{"tags":["clusters"],"summary":"List Storm Clusters","description":"List clusters for a storm, optionally filtered by operating zone.","operationId":"list_storm_clusters_api_storms__storm_id__clusters_get","parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}},{"name":"operating_zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Zone Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clusters/{cluster_id}":{"get":{"tags":["clusters"],"summary":"Get Cluster","operationId":"get_cluster_api_clusters__cluster_id__get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clusters/{cluster_id}/deployments":{"post":{"tags":["clusters"],"summary":"Create Deployment","operationId":"create_deployment_api_clusters__cluster_id__deployments_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterDeploymentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cluster-deployments/{dep_id}":{"put":{"tags":["clusters"],"summary":"Update Deployment","operationId":"update_deployment_api_cluster_deployments__dep_id__put","parameters":[{"name":"dep_id","in":"path","required":true,"schema":{"type":"string","title":"Dep Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/signals/":{"get":{"tags":["signals"],"summary":"List Signals","operationId":"list_signals_api_signals__get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"signal_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Signal"},"title":"Response List Signals Api Signals  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/signals":{"get":{"tags":["signals"],"summary":"List Signals","operationId":"list_signals_api_signals_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"signal_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Signal"},"title":"Response List Signals Api Signals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/signals/ingest":{"post":{"tags":["signals"],"summary":"Ingest Signal","operationId":"ingest_signal_api_signals_ingest_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Signal"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/signals/{signal_id}":{"get":{"tags":["signals"],"summary":"Get Signal","operationId":"get_signal_api_signals__signal_id__get","parameters":[{"name":"signal_id","in":"path","required":true,"schema":{"type":"string","title":"Signal Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Signal"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/":{"get":{"tags":["opportunities"],"summary":"List Opportunities","operationId":"list_opportunities_api_opportunities__get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"recommended_action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Action"}},{"name":"operating_zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Zone Id"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"expected_roi","title":"Sort By"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RevenueOpportunity"},"title":"Response List Opportunities Api Opportunities  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities":{"get":{"tags":["opportunities"],"summary":"List Opportunities","operationId":"list_opportunities_api_opportunities_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"recommended_action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Action"}},{"name":"operating_zone_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Zone Id"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"expected_roi","title":"Sort By"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RevenueOpportunity"},"title":"Response List Opportunities Api Opportunities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/{opp_id}":{"get":{"tags":["opportunities"],"summary":"Get Opportunity","operationId":"get_opportunity_api_opportunities__opp_id__get","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueOpportunity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/{opp_id}/approve":{"post":{"tags":["opportunities"],"summary":"Approve Opportunity","operationId":"approve_opportunity_api_opportunities__opp_id__approve_post","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/{opp_id}/execute":{"post":{"tags":["opportunities"],"summary":"Execute Opportunity Route","operationId":"execute_opportunity_route_api_opportunities__opp_id__execute_post","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/{opp_id}/throttle":{"post":{"tags":["opportunities"],"summary":"Throttle Opportunity Route","operationId":"throttle_opportunity_route_api_opportunities__opp_id__throttle_post","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}},{"name":"daily_budget_cap","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Daily Budget Cap"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/{opp_id}/complete":{"post":{"tags":["opportunities"],"summary":"Complete Opportunity","operationId":"complete_opportunity_api_opportunities__opp_id__complete_post","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/{opp_id}/attribution":{"get":{"tags":["opportunities"],"summary":"Get Attribution","operationId":"get_attribution_api_opportunities__opp_id__attribution_get","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/{opp_id}/decision-log":{"get":{"tags":["opportunities"],"summary":"Get Decision Log","operationId":"get_decision_log_api_opportunities__opp_id__decision_log_get","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunities/{opp_id}/scoring-explanation":{"get":{"tags":["opportunities"],"summary":"Get Scoring Explanation","description":"Explains the scoring factors for a revenue opportunity.","operationId":"get_scoring_explanation_api_opportunities__opp_id__scoring_explanation_get","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/blueprints":{"get":{"tags":["blueprints"],"summary":"List Blueprints","operationId":"list_blueprints_api_agencies_me_blueprints_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"active","title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["blueprints"],"summary":"Create Blueprint","operationId":"create_blueprint_api_agencies_me_blueprints_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/blueprints/{blueprint_id}":{"get":{"tags":["blueprints"],"summary":"Get Blueprint","operationId":"get_blueprint_api_agencies_me_blueprints__blueprint_id__get","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["blueprints"],"summary":"Update Blueprint","operationId":"update_blueprint_api_agencies_me_blueprints__blueprint_id__put","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["blueprints"],"summary":"Archive Blueprint","operationId":"archive_blueprint_api_agencies_me_blueprints__blueprint_id__delete","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/blueprints/{blueprint_id}/preview":{"post":{"tags":["blueprints"],"summary":"Preview Blueprint","description":"Preview what a deployment would look like for a given client + storm.\nBody: { client_name, client_slug, storm_name, date? }","operationId":"preview_blueprint_api_agencies_me_blueprints__blueprint_id__preview_post","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/creatives":{"get":{"tags":["creatives"],"summary":"List Creative Sets","operationId":"list_creative_sets_api_agencies_me_creatives_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"active","title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["creatives"],"summary":"Create Creative Set","operationId":"create_creative_set_api_agencies_me_creatives_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/creatives/{set_id}":{"get":{"tags":["creatives"],"summary":"Get Creative Set","operationId":"get_creative_set_api_agencies_me_creatives__set_id__get","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["creatives"],"summary":"Update Creative Set","operationId":"update_creative_set_api_agencies_me_creatives__set_id__put","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["creatives"],"summary":"Archive Creative Set","operationId":"archive_creative_set_api_agencies_me_creatives__set_id__delete","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/creatives/{set_id}/history":{"get":{"tags":["creatives"],"summary":"Get Creative History","description":"Get audit trail of changes for this creative set.","operationId":"get_creative_history_api_agencies_me_creatives__set_id__history_get","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/client-configs":{"get":{"tags":["client-configs"],"summary":"List Client Configs","operationId":"list_client_configs_api_agencies_me_client_configs_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agencies/me/client-configs/{org_id}":{"get":{"tags":["client-configs"],"summary":"Get Client Config","operationId":"get_client_config_api_agencies_me_client_configs__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["client-configs"],"summary":"Upsert Client Config","operationId":"upsert_client_config_api_agencies_me_client_configs__org_id__put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blueprints":{"get":{"tags":["blueprints"],"summary":"List Blueprints","operationId":"list_blueprints_api_blueprints_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"active","title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["blueprints"],"summary":"Create Blueprint","operationId":"create_blueprint_api_blueprints_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blueprints/{blueprint_id}":{"get":{"tags":["blueprints"],"summary":"Get Blueprint","operationId":"get_blueprint_api_blueprints__blueprint_id__get","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["blueprints"],"summary":"Update Blueprint","operationId":"update_blueprint_api_blueprints__blueprint_id__put","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["blueprints"],"summary":"Archive Blueprint","operationId":"archive_blueprint_api_blueprints__blueprint_id__delete","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blueprints/{blueprint_id}/preview":{"post":{"tags":["blueprints"],"summary":"Preview Blueprint","operationId":"preview_blueprint_api_blueprints__blueprint_id__preview_post","parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"string","title":"Blueprint Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creatives":{"get":{"tags":["creatives"],"summary":"List Creative Sets","operationId":"list_creative_sets_api_creatives_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"active","title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["creatives"],"summary":"Create Creative Set","operationId":"create_creative_set_api_creatives_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creatives/{set_id}":{"get":{"tags":["creatives"],"summary":"Get Creative Set","operationId":"get_creative_set_api_creatives__set_id__get","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["creatives"],"summary":"Update Creative Set","operationId":"update_creative_set_api_creatives__set_id__put","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["creatives"],"summary":"Archive Creative Set","operationId":"archive_creative_set_api_creatives__set_id__delete","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lp/{slug}":{"get":{"tags":["landing-pages"],"summary":"Get Landing Page","description":"Public endpoint — no auth required. Returns landing page data + org info.","operationId":"get_landing_page_api_lp__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lp/{slug}/submit":{"post":{"tags":["landing-pages"],"summary":"Submit Landing Page","description":"Public form submission — creates a lead from the landing page.","operationId":"submit_landing_page_api_lp__slug__submit_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meta-ads/status":{"get":{"tags":["meta-ads"],"summary":"Get Meta Ads Status","description":"Check if Meta Ads integration is configured and working.","operationId":"get_meta_ads_status_api_meta_ads_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meta-ads/campaigns":{"post":{"tags":["meta-ads"],"summary":"Create Campaign","description":"Create a new Meta Ads campaign.","operationId":"create_campaign_api_meta_ads_campaigns_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__meta_ads__CampaignCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__meta_ads__CampaignResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meta-ads/campaigns/{campaign_id}/insights":{"get":{"tags":["meta-ads"],"summary":"Get Campaign Insights","description":"Get performance metrics for a Meta Ads campaign.","operationId":"get_campaign_insights_api_meta_ads_campaigns__campaign_id__insights_get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"date_preset","in":"query","required":false,"schema":{"type":"string","default":"last_7d","title":"Date Preset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__meta_ads__InsightsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meta-ads/campaigns/{campaign_id}/pause":{"post":{"tags":["meta-ads"],"summary":"Pause Campaign","description":"Pause a running Meta Ads campaign.","operationId":"pause_campaign_api_meta_ads_campaigns__campaign_id__pause_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meta-ads/campaigns/{campaign_id}/activate":{"post":{"tags":["meta-ads"],"summary":"Activate Campaign","description":"Activate a paused Meta Ads campaign.","operationId":"activate_campaign_api_meta_ads_campaigns__campaign_id__activate_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meta-ads/images/upload":{"post":{"tags":["meta-ads"],"summary":"Upload Image To Meta","description":"Upload an image to Meta Ads and get back an image_hash for use in ad creatives.\nThe hash can be reused across multiple campaigns.","operationId":"upload_image_to_meta_api_meta_ads_images_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/google-ads/status":{"get":{"tags":["google-ads"],"summary":"Get Google Ads Status","description":"Check if Google Ads integration is configured and working.","operationId":"get_google_ads_status_api_google_ads_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/google-ads/campaigns":{"post":{"tags":["google-ads"],"summary":"Create Campaign","description":"Create a new Google Ads campaign with budget.","operationId":"create_campaign_api_google_ads_campaigns_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__google_ads__CampaignCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__google_ads__CampaignResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/google-ads/ad-groups":{"post":{"tags":["google-ads"],"summary":"Create Ad Group","description":"Create an ad group within a campaign.","operationId":"create_ad_group_api_google_ads_ad_groups_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdGroupCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/google-ads/keywords":{"post":{"tags":["google-ads"],"summary":"Add Keywords","description":"Add keywords to an ad group.","operationId":"add_keywords_api_google_ads_keywords_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddKeywordsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/google-ads/campaigns/{campaign_id}/insights":{"get":{"tags":["google-ads"],"summary":"Get Campaign Insights","description":"Get performance metrics for a Google Ads campaign.","operationId":"get_campaign_insights_api_google_ads_campaigns__campaign_id__insights_get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__google_ads__InsightsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/google-ads/campaigns/{campaign_id}/pause":{"post":{"tags":["google-ads"],"summary":"Pause Campaign","description":"Pause a running Google Ads campaign.","operationId":"pause_campaign_api_google_ads_campaigns__campaign_id__pause_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/google-ads/campaigns/{campaign_id}/activate":{"post":{"tags":["google-ads"],"summary":"Activate Campaign","description":"Activate a paused Google Ads campaign.","operationId":"activate_campaign_api_google_ads_campaigns__campaign_id__activate_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/meta/connect":{"post":{"tags":["integrations-oauth"],"summary":"Meta Connect","description":"Initiate Meta Ads OAuth connection.\nReturns authorization URL for redirect.\nAdmin only.","operationId":"meta_connect_api_integrations_meta_connect_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthConnectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/meta/callback":{"get":{"tags":["integrations-oauth"],"summary":"Meta Callback","description":"Handle Meta OAuth callback.\nExchanges code for tokens and stores credentials.","operationId":"meta_callback_api_integrations_meta_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/googleads/connect":{"post":{"tags":["integrations-oauth"],"summary":"Google Connect","description":"Initiate Google Ads OAuth connection.\nReturns authorization URL for redirect.\nAdmin only.","operationId":"google_connect_api_integrations_googleads_connect_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthConnectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/googleads/callback":{"get":{"tags":["integrations-oauth"],"summary":"Google Callback","description":"Handle Google OAuth callback.\nExchanges code for tokens and stores credentials.","operationId":"google_callback_api_integrations_googleads_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{provider}/status":{"get":{"tags":["integrations-oauth"],"summary":"Get Integration Status","description":"Get integration status for a provider.","operationId":"get_integration_status_api_integrations__provider__status_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{provider}/accounts":{"get":{"tags":["integrations-oauth"],"summary":"List Accounts","description":"List discovered ad accounts for a provider.","operationId":"list_accounts_api_integrations__provider__accounts_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdAccountResponse"},"title":"Response List Accounts Api Integrations  Provider  Accounts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{provider}/accounts/select":{"post":{"tags":["integrations-oauth"],"summary":"Select Accounts","description":"Select which ad accounts to sync.","operationId":"select_accounts_api_integrations__provider__accounts_select_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectAccountsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{provider}/disconnect":{"post":{"tags":["integrations-oauth"],"summary":"Disconnect Integration","description":"Disconnect an integration and remove credentials.","operationId":"disconnect_integration_api_integrations__provider__disconnect_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{provider}/validate":{"post":{"tags":["integrations-oauth"],"summary":"Validate Integration","description":"Validate integration by making a test API call.","operationId":"validate_integration_api_integrations__provider__validate_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-import/preview":{"post":{"tags":["crm-import"],"summary":"Preview Import","description":"Upload a CRM export file and get a preview of the data.\nReturns detected columns, suggested mappings, and sample records.","operationId":"preview_import_api_crm_import_preview_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_import_api_crm_import_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-import/execute":{"post":{"tags":["crm-import"],"summary":"Execute Import","description":"Execute the CRM import with the specified column mapping.\nCreates leads, conversions, and optionally new territories.","operationId":"execute_import_api_crm_import_execute_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_execute_import_api_crm_import_execute_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-import/jobs":{"get":{"tags":["crm-import"],"summary":"List Import Jobs","description":"List all import jobs for the organization","operationId":"list_import_jobs_api_crm_import_jobs_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-import/jobs/{job_id}":{"get":{"tags":["crm-import"],"summary":"Get Import Job","description":"Get details of a specific import job","operationId":"get_import_job_api_crm_import_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/members":{"get":{"tags":["team"],"summary":"List Team Members","description":"List all team members in the organization","operationId":"list_team_members_api_team_members_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeamMember"},"title":"Response List Team Members Api Team Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/seats":{"get":{"tags":["team"],"summary":"Get Seat Info","description":"Get seat usage information for the organization","operationId":"get_seat_info_api_team_seats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/invite":{"post":{"tags":["team"],"summary":"Invite Team Member","description":"Invite a new team member via email","operationId":"invite_team_member_api_team_invite_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/invites":{"get":{"tags":["team"],"summary":"List Invites","description":"List all invitations for the organization","operationId":"list_invites_api_team_invites_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/invites/{invite_id}":{"delete":{"tags":["team"],"summary":"Revoke Invite","description":"Revoke a pending invitation","operationId":"revoke_invite_api_team_invites__invite_id__delete","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/invites/{invite_id}/resend":{"post":{"tags":["team"],"summary":"Resend Invite","description":"Resend an invitation email","operationId":"resend_invite_api_team_invites__invite_id__resend_post","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/members/{user_id}":{"put":{"tags":["team"],"summary":"Update Team Member","description":"Update a team member's role or status","operationId":"update_team_member_api_team_members__user_id__put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["team"],"summary":"Remove Team Member","description":"Remove a team member from the organization","operationId":"remove_team_member_api_team_members__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/import-ml-models":{"post":{"tags":["admin"],"summary":"Import Ml Models","description":"Import pre-trained ML models into the database.\nThis endpoint contains embedded model data and can be called to seed production.","operationId":"import_ml_models_api_admin_import_ml_models_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stats":{"get":{"tags":["admin"],"summary":"Get Platform Stats","description":"Get platform-wide statistics","operationId":"get_platform_stats_api_admin_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/organizations":{"get":{"tags":["admin"],"summary":"List All Organizations","description":"List all organizations with filtering","operationId":"list_all_organizations_api_admin_organizations_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"plan","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Organization","description":"Create a new organization and send invite to owner.\nThis is the primary way to onboard new companies.","operationId":"create_organization_api_admin_organizations_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrgRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/organizations/{org_id}":{"get":{"tags":["admin"],"summary":"Get Organization Details","description":"Get detailed information about an organization","operationId":"get_organization_details_api_admin_organizations__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Update Organization","description":"Update organization details (plan, status, limits)","operationId":"update_organization_api_admin_organizations__org_id__put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Updates"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"tags":["admin"],"summary":"List All Users","description":"List all users across the platform","operationId":"list_all_users_api_admin_users_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}":{"put":{"tags":["admin"],"summary":"Update User Admin","description":"Update any user (super admin only)","operationId":"update_user_admin_api_admin_users__user_id__put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Updates"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/impersonate":{"post":{"tags":["admin"],"summary":"Impersonate User","description":"Generate a temporary token to impersonate a user for support purposes","operationId":"impersonate_user_api_admin_users__user_id__impersonate_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/organizations/{org_id}/extend-trial":{"post":{"tags":["admin"],"summary":"Extend Organization Trial","description":"Extend an organization's trial period.\nSuper admin only. Max 30 days extension.","operationId":"extend_organization_trial_api_admin_organizations__org_id__extend_trial_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendTrialRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/organizations/{org_id}/modules":{"get":{"tags":["admin"],"summary":"Get Organization Modules","description":"Get all modules enabled for an organization","operationId":"get_organization_modules_api_admin_organizations__org_id__modules_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/audit-log":{"get":{"tags":["admin"],"summary":"Get Audit Log","description":"Get platform audit log","operationId":"get_audit_log_api_admin_audit_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/plans":{"get":{"tags":["admin"],"summary":"Get All Plans","description":"Get all available plans","operationId":"get_all_plans_api_admin_plans_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/notifications":{"get":{"tags":["admin"],"summary":"Get Admin Notifications","description":"Get admin notifications (access requests, payments, etc.).","operationId":"get_admin_notifications_api_admin_notifications_get","parameters":[{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/notifications/{notif_id}/read":{"post":{"tags":["admin"],"summary":"Mark Notification Read","description":"Mark a notification as read.","operationId":"mark_notification_read_api_admin_notifications__notif_id__read_post","parameters":[{"name":"notif_id","in":"path","required":true,"schema":{"type":"string","title":"Notif Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-keys":{"get":{"tags":["admin"],"summary":"List Partner Keys","description":"List all partner API keys.","operationId":"list_partner_keys_api_admin_partner_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Partner Key","description":"Create a new partner API key. The full key is returned ONCE.","operationId":"create_partner_key_api_admin_partner_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePartnerKeyPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-keys/{partner_id}":{"put":{"tags":["admin"],"summary":"Update Partner Key","description":"Update a partner API key (name, status, rate limits, expiration).","operationId":"update_partner_key_api_admin_partner_keys__partner_id__put","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"string","title":"Partner Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePartnerKeyPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Partner Key","description":"Permanently delete a partner API key.","operationId":"delete_partner_key_api_admin_partner_keys__partner_id__delete","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"string","title":"Partner Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/system-health":{"get":{"tags":["admin"],"summary":"Get System Health","description":"Platform system health: database, scheduler, collections, digest history, subscribers.","operationId":"get_system_health_api_admin_system_health_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/revenue-intelligence/status":{"get":{"tags":["admin"],"summary":"Get Revenue Intelligence Status","description":"Get the status of the revenue intelligence system.","operationId":"get_revenue_intelligence_status_api_admin_revenue_intelligence_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/revenue-intelligence/refresh-census":{"post":{"tags":["admin"],"summary":"Trigger Census Refresh","description":"Manually trigger Census data refresh (admin only).","operationId":"trigger_census_refresh_api_admin_revenue_intelligence_refresh_census_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/revenue-intelligence/refresh-hail-swaths":{"post":{"tags":["admin"],"summary":"Trigger Hail Swath Backfill","description":"Manually trigger MRMS hail swath backfill (admin only).","operationId":"trigger_hail_swath_backfill_api_admin_revenue_intelligence_refresh_hail_swaths_post","parameters":[{"name":"start_year","in":"query","required":false,"schema":{"type":"integer","default":2012,"title":"Start Year"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/revenue-intelligence/refresh-fema":{"post":{"tags":["admin"],"summary":"Trigger Fema Ingestion","description":"Manually trigger FEMA claim proxy data ingestion (admin only).\n\nArgs:\n    start_year: Year to start fetching data from (default 2005)\n    background: If True (default), run in background and return immediately","operationId":"trigger_fema_ingestion_api_admin_revenue_intelligence_refresh_fema_post","parameters":[{"name":"start_year","in":"query","required":false,"schema":{"type":"integer","default":2005,"title":"Start Year"}},{"name":"background","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Background"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storm-alerts/send-test":{"post":{"tags":["admin"],"summary":"Send Test Storm Alert","description":"Send a test storm alert email to a specific user or the current user.","operationId":"send_test_storm_alert_api_admin_storm_alerts_send_test_post","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storm-alerts/run-daily":{"post":{"tags":["admin"],"summary":"Run Daily Storm Alerts","description":"Manually run the daily storm alert job (admin only).","operationId":"run_daily_storm_alerts_api_admin_storm_alerts_run_daily_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-api/metrics":{"get":{"tags":["admin"],"summary":"Get Partner Api Metrics","description":"Admin dashboard: Partner API usage metrics and health.","operationId":"get_partner_api_metrics_api_admin_partner_api_metrics_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/status":{"get":{"tags":["admin"],"summary":"Get Data Management Status","description":"Get comprehensive data ingestion status for all sources.","operationId":"get_data_management_status_api_admin_data_management_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/ingestion-logs":{"get":{"tags":["admin"],"summary":"Get Ingestion Logs","description":"Get detailed ingestion logs for all data sources.","operationId":"get_ingestion_logs_api_admin_data_management_ingestion_logs_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by source: census, fema, mrms","title":"Source"},"description":"Filter by source: census, fema, mrms"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/clear-cache":{"post":{"tags":["admin"],"summary":"Clear Data Cache","description":"Clear cached data to force recalculation.","operationId":"clear_data_cache_api_admin_data_management_clear_cache_post","parameters":[{"name":"cache_type","in":"query","required":true,"schema":{"type":"string","description":"Cache type to clear: ncpi, revenue, all","title":"Cache Type"},"description":"Cache type to clear: ncpi, revenue, all"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/score-from-supabase":{"post":{"tags":["admin"],"summary":"Trigger Supabase Scoring","description":"Trigger ML scoring of unscored storms from Supabase.\n\nThis fetches storms from the Supabase storm_events table that don't\nhave scores in MongoDB yet, and computes opportunity scores for them.","operationId":"trigger_supabase_scoring_api_admin_data_management_score_from_supabase_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":100,"default":2000,"title":"Limit"}},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":7,"default":180,"title":"Days Back"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/score-from-supabase/status":{"get":{"tags":["admin"],"summary":"Get Supabase Scoring Status","description":"Get current status of the Supabase scoring job.","operationId":"get_supabase_scoring_status_api_admin_data_management_score_from_supabase_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scoring/supabase-native":{"post":{"tags":["admin"],"summary":"Trigger Supabase Native Scoring","description":"Score storms and store results DIRECTLY in Supabase (no MongoDB).\n\nThis is the new preferred method that consolidates all storm data in Supabase.\nRuns as a background task - check status via GET /scoring/supabase-native/status","operationId":"trigger_supabase_native_scoring_api_admin_scoring_supabase_native_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":100,"default":5000,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scoring/supabase-native/status":{"get":{"tags":["admin"],"summary":"Get Supabase Native Scoring Status","description":"Get status of Supabase-native scoring job.","operationId":"get_supabase_native_scoring_status_api_admin_scoring_supabase_native_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/ml-rescore":{"post":{"tags":["admin"],"summary":"Trigger Ml Rescore","description":"Trigger ML re-scoring of all storm opportunities.\nThis runs as a background task and updates scores with ML predictions.","operationId":"trigger_ml_rescore_api_admin_data_management_ml_rescore_post","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":100,"default":500,"title":"Batch Size"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/ml-rescore/status":{"get":{"tags":["admin"],"summary":"Get Rescore Status","description":"Get current status of the ML rescore job.","operationId":"get_rescore_status_api_admin_data_management_ml_rescore_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/ml-rescore/cancel":{"post":{"tags":["admin"],"summary":"Cancel Rescore Job","description":"Cancel the running rescore job.","operationId":"cancel_rescore_job_api_admin_data_management_ml_rescore_cancel_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-management/ml-status":{"get":{"tags":["admin"],"summary":"Get Ml Seed Status","description":"Get ML model and data seed status for dashboard widget.","operationId":"get_ml_seed_status_api_admin_data_management_ml_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/download-ml-import-script":{"get":{"tags":["admin"],"summary":"Download Ml Import Script","description":"Download the ML models import script for production deployment.","operationId":"download_ml_import_script_api_admin_download_ml_import_script_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/cache/stats":{"get":{"tags":["admin"],"summary":"Get Cache Stats","description":"Get cache statistics (superadmin only).","operationId":"get_cache_stats_api_admin_cache_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/cache/warm":{"post":{"tags":["admin"],"summary":"Warm Cache","description":"Pre-warm the cache with frequently accessed data (superadmin only).","operationId":"warm_cache_api_admin_cache_warm_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"States"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/cache/invalidate":{"post":{"tags":["admin"],"summary":"Invalidate Cache","description":"Invalidate cache entries (superadmin only).\n\nArgs:\n    key: Specific key to invalidate\n    prefix: Prefix to invalidate all matching keys","operationId":"invalidate_cache_api_admin_cache_invalidate_post","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","title":"Key"}},{"name":"prefix","in":"query","required":false,"schema":{"type":"string","title":"Prefix"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/cache/invalidate-stats":{"post":{"tags":["admin"],"summary":"Invalidate Stats Cache","description":"Invalidate all API stats cache entries (superadmin only).","operationId":"invalidate_stats_cache_api_admin_cache_invalidate_stats_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storm-claims-ml/status":{"get":{"tags":["admin"],"summary":"Get Storm Claims Ml Status","description":"Get Storm-to-Claims ML training pipeline status.\nUsed by the DataMoatTab's StormClaimsMLPanel component.","operationId":"get_storm_claims_ml_status_api_admin_storm_claims_ml_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storm-claims-ml/run-pipeline":{"post":{"tags":["admin"],"summary":"Run Storm Claims Ml Pipeline","description":"Run the Storm-to-Claims ML training pipeline.\n\nThis pipeline:\n1. Matches NOAA storm events to FEMA declarations\n2. Aggregates claim data per storm\n3. Prepares training features\n4. Trains a gradient boosting model","operationId":"run_storm_claims_ml_pipeline_api_admin_storm_claims_ml_run_pipeline_post","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","title":"State"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ml-training/supabase/status":{"get":{"tags":["admin"],"summary":"Get Supabase Ml Training Status","description":"Get status of ML training data in Supabase.\nShows record counts, claim rates, and data quality metrics.","operationId":"get_supabase_ml_training_status_api_admin_ml_training_supabase_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ml-training/supabase/clear-data":{"post":{"tags":["admin"],"summary":"Clear Supabase Ml Training Data","description":"Clear all data from the ML training table in Supabase.\nUse this before re-running the population job to avoid duplicate data.","operationId":"clear_supabase_ml_training_data_api_admin_ml_training_supabase_clear_data_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ml-training/supabase/populate":{"post":{"tags":["admin"],"summary":"Populate Supabase Ml Training Data","description":"Populate the ML training table in Supabase.\n\nJoins 1M+ storm events with FEMA claims and exposure data.\nRuns in background - check status via GET /ml-training/supabase/status.\n\nArgs:\n    years_back: How many years of historical data to process (default: 10)","operationId":"populate_supabase_ml_training_data_api_admin_ml_training_supabase_populate_post","parameters":[{"name":"years_back","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Years Back"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ml-training/supabase/train":{"post":{"tags":["admin"],"summary":"Train Ml Model From Supabase","description":"Train an ML model directly from Supabase training data.\n\nUses the ml_storm_training_data table (populated via /populate endpoint).\nTrains a classifier to predict claim likelihood from storm features.\n\nArgs:\n    model_type: Type of model (gradient_boosting, random_forest)","operationId":"train_ml_model_from_supabase_api_admin_ml_training_supabase_train_post","parameters":[{"name":"model_type","in":"query","required":false,"schema":{"type":"string","default":"gradient_boosting","title":"Model Type"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ml-training/supabase/models":{"get":{"tags":["admin"],"summary":"Get Supabase Ml Models","description":"Get list of trained ML models stored in Supabase.","operationId":"get_supabase_ml_models_api_admin_ml_training_supabase_models_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storms/manual-entry":{"post":{"tags":["admin"],"summary":"Add Manual Storm","description":"Manually add a storm event to Supabase.\n\nUse this for recent storms not yet in the NOAA database (typically 2-3 week delay).\nThe storm will appear in all storm queries immediately.","operationId":"add_manual_storm_api_admin_storms_manual_entry_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualStormEntry"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storms/manual-entries":{"get":{"tags":["admin"],"summary":"List Manual Storms","description":"List all manually entered storms.","operationId":"list_manual_storms_api_admin_storms_manual_entries_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storms/manual-entry/{event_key}":{"delete":{"tags":["admin"],"summary":"Delete Manual Storm","description":"Delete a manually entered storm.","operationId":"delete_manual_storm_api_admin_storms_manual_entry__event_key__delete","parameters":[{"name":"event_key","in":"path","required":true,"schema":{"type":"string","title":"Event Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storm-alerts/trigger":{"post":{"tags":["admin"],"summary":"Trigger Storm Alerts","description":"Manually trigger storm alert generation.\n\nChecks Supabase for recent high-impact storms and creates alerts\nfor users whose operating zones match the storm locations.","operationId":"trigger_storm_alerts_api_admin_storm_alerts_trigger_post","parameters":[{"name":"hours_back","in":"query","required":false,"schema":{"type":"integer","description":"Hours to look back for storms (default 7 days)","default":168,"title":"Hours Back"},"description":"Hours to look back for storms (default 7 days)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storm-alerts/notifications":{"get":{"tags":["admin"],"summary":"List Storm Notifications","description":"List recent storm alert notifications.","operationId":"list_storm_notifications_api_admin_storm_alerts_notifications_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/storm-alerts/stats":{"get":{"tags":["admin"],"summary":"Get Storm Alert Stats","description":"Get storm alert statistics.","operationId":"get_storm_alert_stats_api_admin_storm_alerts_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/spc/ingest":{"post":{"tags":["admin"],"summary":"Ingest Spc Reports","description":"Ingest storm reports from NOAA Storm Prediction Center.\n\nSPC reports are available within hours of storms occurring,\nmuch faster than the NOAA Storm Events database (2-3 week delay).\n\nArgs:\n    report_types: Types to fetch - \"hail\", \"tornado\", \"wind\"\n    dates: \"today\", \"yesterday\", or YYMMDD format (e.g., \"260322\")","operationId":"ingest_spc_reports_api_admin_spc_ingest_post","parameters":[{"name":"report_types","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":["hail","tornado","wind"],"title":"Report Types"}},{"name":"dates","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":["today","yesterday"],"title":"Dates"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/spc/ingest-date-range":{"post":{"tags":["admin"],"summary":"Ingest Spc Date Range","description":"Ingest SPC storm reports for a date range.\n\nExample: To ingest 3/22/2026 to 3/24/2026:\n- start_date=260322\n- end_date=260324","operationId":"ingest_spc_date_range_api_admin_spc_ingest_date_range_post","parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","description":"Start date in YYMMDD format (e.g., 260322)","title":"Start Date"},"description":"Start date in YYMMDD format (e.g., 260322)"},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","description":"End date in YYMMDD format. If not provided, only start_date is ingested.","title":"End Date"},"description":"End date in YYMMDD format. If not provided, only start_date is ingested."},{"name":"report_types","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":["hail","wind","tornado"],"title":"Report Types"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/spc/reports":{"get":{"tags":["admin"],"summary":"Get Spc Reports","description":"Get recently ingested SPC storm reports.","operationId":"get_spc_reports_api_admin_spc_reports_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"description":"Hours to look back","default":48,"title":"Hours"},"description":"Hours to look back"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state (e.g., OH, TX)","title":"State"},"description":"Filter by state (e.g., OH, TX)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/spc/preview":{"get":{"tags":["admin"],"summary":"Preview Spc Reports","description":"Preview SPC reports without ingesting them.\nUseful for checking what data is available before ingestion.","operationId":"preview_spc_reports_api_admin_spc_preview_get","parameters":[{"name":"report_type","in":"query","required":false,"schema":{"type":"string","description":"hail, tornado, or wind","default":"hail","title":"Report Type"},"description":"hail, tornado, or wind"},{"name":"date","in":"query","required":false,"schema":{"type":"string","description":"today, yesterday, or YYMMDD","default":"yesterday","title":"Date"},"description":"today, yesterday, or YYMMDD"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-health/coverage":{"get":{"tags":["admin"],"summary":"Get Data Health Coverage","description":"Returns state-by-state Overture building-count backfill coverage from storm_scores.\n\nResponse shape:\n  {\n    \"summary\": { total, enriched, pct_enriched, states_with_any_coverage },\n    \"by_state\": [{ state, total, enriched, pct_enriched }, ...]  # sorted by total DESC\n  }","operationId":"get_data_health_coverage_api_admin_data_health_coverage_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noaa/backfill":{"post":{"tags":["noaa-historical"],"summary":"Trigger Backfill","description":"Trigger NOAA Storm Events backfill (admin only).\nDownloads and ingests historical storm data from NOAA/NCEI.\n\n- If years not specified, defaults to last 2 full years\n- Runs in background to avoid timeout\n- Idempotent: re-running will update existing records","operationId":"trigger_backfill_api_noaa_backfill_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NOAABackfillRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noaa/backfill/status":{"get":{"tags":["noaa-historical"],"summary":"Get Backfill Status","description":"Get status of the most recent backfill job","operationId":"get_backfill_status_api_noaa_backfill_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noaa/stats":{"get":{"tags":["noaa-historical"],"summary":"Get Storm Stats","description":"Get statistics about ingested historical storm data","operationId":"get_storm_stats_api_noaa_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noaa/events":{"get":{"tags":["noaa-historical"],"summary":"Query Historical Events","description":"Query historical storm events with filters.\nReturns paginated results from Supabase storm_events table.\nDefaults to the last 365 days when no date filter is provided.","operationId":"query_historical_events_api_noaa_events_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"State code (e.g., TX, OK)","title":"State"},"description":"State code (e.g., TX, OK)"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Event type (Hail, Tornado, etc.)","title":"Event Type"},"description":"Event type (Hail, Tornado, etc.)"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Year","title":"Year"},"description":"Year"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (YYYY-MM-DD)","title":"Start Date"},"description":"Start date (YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (YYYY-MM-DD)","title":"End Date"},"description":"End date (YYYY-MM-DD)"},{"name":"min_damage","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum property damage ($)","title":"Min Damage"},"description":"Minimum property damage ($)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noaa/events/{noaa_event_key}":{"get":{"tags":["noaa-historical"],"summary":"Get Event Detail","description":"Get detailed information about a specific storm event from Supabase","operationId":"get_event_detail_api_noaa_events__noaa_event_key__get","parameters":[{"name":"noaa_event_key","in":"path","required":true,"schema":{"type":"string","title":"Noaa Event Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noaa/events/by-location":{"get":{"tags":["noaa-historical"],"summary":"Query Events By Location","description":"Query storm events near a geographic point.\nUses PostGIS for geospatial queries (Supabase).","operationId":"query_events_by_location_api_noaa_events_by_location_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lon","in":"query","required":true,"schema":{"type":"number","description":"Longitude","title":"Lon"},"description":"Longitude"},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","description":"Search radius in miles","default":50,"title":"Radius Miles"},"description":"Search radius in miles"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noaa/summary/by-state":{"get":{"tags":["noaa-historical"],"summary":"Get Summary By State","description":"Get storm event summary grouped by state.\nUseful for heatmap visualization.","operationId":"get_summary_by_state_api_noaa_summary_by_state_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/noaa/summary/timeline":{"get":{"tags":["noaa-historical"],"summary":"Get Timeline Summary","description":"Get storm event counts by month for trend visualization.","operationId":"get_timeline_summary_api_noaa_summary_timeline_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/roi":{"get":{"tags":["storm-attribution"],"summary":"Get Storm Roi","operationId":"get_storm_roi_api_storm_attribution_roi_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/storm/{noaa_event_key}":{"get":{"tags":["storm-attribution"],"summary":"Get Storm Revenue Detail","operationId":"get_storm_revenue_detail_api_storm_attribution_storm__noaa_event_key__get","parameters":[{"name":"noaa_event_key","in":"path","required":true,"schema":{"type":"string","title":"Noaa Event Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/timeline":{"get":{"tags":["storm-attribution"],"summary":"Get Revenue Timeline","operationId":"get_revenue_timeline_api_storm_attribution_timeline_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/top-storms":{"get":{"tags":["storm-attribution"],"summary":"Get Top Storms By Revenue","operationId":"get_top_storms_by_revenue_api_storm_attribution_top_storms_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/contract/{conversion_id}":{"get":{"tags":["storm-attribution"],"summary":"Get Attribution For Conversion","description":"Return the full attribution record for a specific conversion,\nincluding all scored storm candidates, evidence breakdown, and\nthe final allocation with confidence band.","operationId":"get_attribution_for_conversion_api_storm_attribution_contract__conversion_id__get","parameters":[{"name":"conversion_id","in":"path","required":true,"schema":{"type":"string","title":"Conversion Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/lead/{lead_id}":{"get":{"tags":["storm-attribution"],"summary":"Get Attribution For Lead","description":"Return attribution for all conversions linked to a specific lead.\nUsed by the leads view attribution panel.","operationId":"get_attribution_for_lead_api_storm_attribution_lead__lead_id__get","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/override":{"patch":{"tags":["storm-attribution"],"summary":"Override Attribution","description":"Manually override the storm attributed to a conversion.\nSets decision_rule = MANUAL_OVERRIDE.\nPassing storm_id=null marks the conversion as NON_STORM.","operationId":"override_attribution_api_storm_attribution_override_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverrideRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/batch-run":{"post":{"tags":["storm-attribution"],"summary":"Trigger Batch Attribution","description":"Manually trigger a batch attribution run for this organisation.","operationId":"trigger_batch_attribution_api_storm_attribution_batch_run_post","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":120,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-attribution/precompute-zips":{"post":{"tags":["storm-attribution"],"summary":"Trigger Zip Precompute","description":"Admin utility: precompute impacted_zips for storm events lacking them.","operationId":"trigger_zip_precompute_api_storm_attribution_precompute_zips_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-integrations/connections":{"get":{"tags":["crm-integrations"],"summary":"List Crm Connections","description":"List all CRM connections for the organization.","operationId":"list_crm_connections_api_crm_integrations_connections_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-integrations/connections/{provider}":{"get":{"tags":["crm-integrations"],"summary":"Get Crm Connection","description":"Get details of a specific CRM connection.","operationId":"get_crm_connection_api_crm_integrations_connections__provider__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/CRMProvider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-integrations/connect":{"post":{"tags":["crm-integrations"],"summary":"Connect Crm","description":"Connect a CRM provider with API key.\n\nValidates the API key and establishes the connection.\nOnce connected, leads will be automatically pushed to the CRM.","operationId":"connect_crm_api_crm_integrations_connect_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CRMConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-integrations/disconnect/{provider}":{"delete":{"tags":["crm-integrations"],"summary":"Disconnect Crm","description":"Disconnect a CRM provider.\n\nThis will stop automatic lead pushes but won't delete existing data.","operationId":"disconnect_crm_api_crm_integrations_disconnect__provider__delete","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/CRMProvider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-integrations/connections/{provider}/settings":{"put":{"tags":["crm-integrations"],"summary":"Update Connection Settings","description":"Update CRM connection settings including status mapping.","operationId":"update_connection_settings_api_crm_integrations_connections__provider__settings_put","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/CRMProvider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CRMStatusMappingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-integrations/webhook/{provider}/{org_id}":{"post":{"tags":["crm-integrations"],"summary":"Handle Crm Webhook","description":"Webhook endpoint for receiving CRM updates.\n\nJobNimbus and AccuLynx will POST to this endpoint when:\n- Lead/contact status changes\n- Job status changes\n- Contract is signed\n- Revenue/value is updated","operationId":"handle_crm_webhook_api_crm_integrations_webhook__provider___org_id__post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"X-Webhook-Signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Webhook-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-integrations/sync/{provider}/lead/{lead_id}":{"post":{"tags":["crm-integrations"],"summary":"Manual Push Lead","description":"Manually push a specific lead to a CRM.\n\nUse this if auto-push is disabled or to retry a failed push.","operationId":"manual_push_lead_api_crm_integrations_sync__provider__lead__lead_id__post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/CRMProvider"}},{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/crm-integrations/sync-log":{"get":{"tags":["crm-integrations"],"summary":"Get Sync Log","description":"Get recent CRM sync operations log.","operationId":"get_sync_log_api_crm_integrations_sync_log_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CRMProvider"},{"type":"null"}],"title":"Provider"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/zcta/stats":{"get":{"tags":["zcta-enrichment"],"summary":"Get Zcta Stats","description":"Get ZCTA enrichment statistics.","operationId":"get_zcta_stats_api_zcta_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/zcta/load-centroids":{"post":{"tags":["zcta-enrichment"],"summary":"Load Zcta Centroids","description":"Load ZCTA centroid data (ZIP code → lat/lon mapping).\nRuns in background.","operationId":"load_zcta_centroids_api_zcta_load_centroids_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/zcta/enrich-storms":{"post":{"tags":["zcta-enrichment"],"summary":"Enrich Storm Events","description":"Batch enrich storm events with ZIP codes.","operationId":"enrich_storm_events_api_zcta_enrich_storms_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/zcta/zip/{zip_code}":{"get":{"tags":["zcta-enrichment"],"summary":"Get Zip Location","description":"Get location data for a specific ZIP code.","operationId":"get_zip_location_api_zcta_zip__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/zcta/nearby":{"get":{"tags":["zcta-enrichment"],"summary":"Find Nearby Zips","description":"Find ZIP codes near a geographic point.","operationId":"find_nearby_zips_api_zcta_nearby_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","title":"Lat"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","title":"Lng"}},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","default":25,"title":"Radius Miles"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/overview":{"get":{"tags":["storm-intelligence"],"summary":"Get Intelligence Overview","description":"Org-level intelligence summary: scored storms, revenue, data readiness.\n\nRequires: Storm Intelligence module.","operationId":"get_intelligence_overview_api_storm_intelligence_overview_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/top-opportunities":{"get":{"tags":["storm-intelligence"],"summary":"Get Top Opportunities","description":"Return scored storm opportunities ranked by opportunity_score.\nFilters to the org's operating zones unless ?use_org_states=false.","operationId":"get_top_opportunities_api_storm_intelligence_top_opportunities_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","default":0.25,"title":"Min Score"}},{"name":"use_org_states","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Use Org States"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/exposure/{noaa_event_key}":{"get":{"tags":["storm-intelligence"],"summary":"Get Storm Exposure Detail","description":"Return computed exposure metrics for a specific NOAA storm event.","operationId":"get_storm_exposure_detail_api_storm_intelligence_exposure__noaa_event_key__get","parameters":[{"name":"noaa_event_key","in":"path","required":true,"schema":{"type":"string","title":"Noaa Event Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/simulated-revenue/{noaa_event_key}":{"get":{"tags":["storm-intelligence"],"summary":"Get Simulated Revenue","description":"Revenue simulation for a specific storm event.","operationId":"get_simulated_revenue_api_storm_intelligence_simulated_revenue__noaa_event_key__get","parameters":[{"name":"noaa_event_key","in":"path","required":true,"schema":{"type":"string","title":"Noaa Event Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/zip-history":{"get":{"tags":["storm-intelligence"],"summary":"Get Zip Storm History","description":"Get storm history for specified ZIP codes or an entire state.","operationId":"get_zip_storm_history_api_storm_intelligence_zip_history_get","parameters":[{"name":"zips","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated ZIP codes","title":"Zips"},"description":"Comma-separated ZIP codes"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state abbreviation","title":"State"},"description":"Filter by state abbreviation"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/seed-property-data":{"post":{"tags":["storm-intelligence"],"summary":"Seed Property Data","description":"Admin: Seed ZIP-level property stats from ZCTA centroids.","operationId":"seed_property_data_api_storm_intelligence_seed_property_data_post","parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/backfill-scores":{"post":{"tags":["storm-intelligence"],"summary":"Backfill Opportunity Scores","description":"Admin: Batch compute opportunity scores for NOAA storm events.","operationId":"backfill_opportunity_scores_api_storm_intelligence_backfill_scores_post","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"default":500,"title":"Limit"}},{"name":"skip_scored","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Skip Scored"}},{"name":"clear_exposure_cache","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Clear Exposure Cache"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/build-zip-history":{"post":{"tags":["storm-intelligence"],"summary":"Build Zip History","description":"Admin: Aggregate storm scores by ZIP to build zip_storm_history collection.","operationId":"build_zip_history_api_storm_intelligence_build_zip_history_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/score/{noaa_event_key}":{"post":{"tags":["storm-intelligence"],"summary":"Score Single Storm","description":"Compute and return opportunity score for a single storm (on-demand).","operationId":"score_single_storm_api_storm_intelligence_score__noaa_event_key__post","parameters":[{"name":"noaa_event_key","in":"path","required":true,"schema":{"type":"string","title":"Noaa Event Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/score/{storm_id}":{"get":{"tags":["storm-intelligence"],"summary":"Get Storm Score","description":"Get storm details and opportunity score by storm_id (noaa_event_key or episode_id).","operationId":"get_storm_score_api_storm_intelligence_score__storm_id__get","parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/map-data":{"get":{"tags":["storm-intelligence"],"summary":"Get Map Data","description":"Return scored storm opportunities formatted for map display.\nIncludes lat/lng (from storm or state centroid fallback).\nCapped at 300 points for map performance.","operationId":"get_map_data_api_storm_intelligence_map_data_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":300,"title":"Limit"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","default":0.25,"title":"Min Score"}},{"name":"use_org_states","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Use Org States"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/search/zip/{zip_code}":{"get":{"tags":["storm-intelligence"],"summary":"Search Events By Zip","description":"Search for storm events and water alerts that impacted a specific ZIP code.\n\nThis endpoint is designed for:\n1. StormAxis Storm Intelligence module - ZIP code search\n2. RoofProof integration - Address-based storm history queries\n\nReturns storm events from storm_opportunity_scores and optionally\nactive water alerts from NWS that affect the ZIP code's area.","operationId":"search_events_by_zip_api_storm_intelligence_search_zip__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":1095,"minimum":1,"description":"Days to look back","default":365,"title":"Days"},"description":"Days to look back"},{"name":"include_water","in":"query","required":false,"schema":{"type":"boolean","description":"Include water events","default":true,"title":"Include Water"},"description":"Include water events"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/submit":{"post":{"tags":["access-requests"],"summary":"Submit Access Request","description":"Public: anyone can submit an access request.","operationId":"submit_access_request_api_access_requests_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests":{"get":{"tags":["access-requests"],"summary":"List Access Requests","description":"Admin: list all access requests.","operationId":"list_access_requests_api_access_requests_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/{request_id}/approve":{"post":{"tags":["access-requests"],"summary":"Approve Access Request","description":"Admin: approve a request and generate Stripe payment link for implementation fee.","operationId":"approve_access_request_api_access_requests__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveRequestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/{request_id}/reject":{"post":{"tags":["access-requests"],"summary":"Reject Access Request","description":"Admin: reject an access request.","operationId":"reject_access_request_api_access_requests__request_id__reject_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/{request_id}/send-payment-link":{"post":{"tags":["access-requests"],"summary":"Resend Payment Link","description":"Admin: mark payment link as sent (for tracking).","operationId":"resend_payment_link_api_access_requests__request_id__send_payment_link_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/verify-payment":{"get":{"tags":["access-requests"],"summary":"Verify Payment","description":"Public: verify payment status for an access request.","operationId":"verify_payment_api_access_requests_verify_payment_get","parameters":[{"name":"request_id","in":"query","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/create-account":{"post":{"tags":["access-requests"],"summary":"Create Account After Payment","description":"Public: create user account after successful implementation fee payment.","operationId":"create_account_after_payment_api_access_requests_create_account_post","parameters":[{"name":"request_id","in":"query","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"password","in":"query","required":true,"schema":{"type":"string","title":"Password"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/webhook/stripe":{"post":{"tags":["access-requests"],"summary":"Implementation Fee Webhook","operationId":"implementation_fee_webhook_api_access_requests_webhook_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/opportunity-radar/data":{"get":{"tags":["opportunity-radar"],"summary":"Get Opportunity Radar Data","description":"Return nationwide forward-looking storm opportunities.\nCombines live NOAA alerts + SPC convective outlooks with revenue estimates.\nCached 15 minutes.","operationId":"get_opportunity_radar_data_api_opportunity_radar_data_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/storm-events":{"get":{"tags":["opportunity-radar"],"summary":"List Storm Events","description":"Return paginated list of storm events with paths and revenue data.\nDefault window: 14 days back + 3 days forward from now.\n\nData source: Supabase/PostGIS storm_events table.","operationId":"list_storm_events_api_opportunity_radar_storm_events_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(total_revenue|start_time|avg_opportunity_score|event_count)$","default":"total_revenue","title":"Sort By"}},{"name":"severity","in":"query","required":false,"schema":{"type":"string","title":"Severity"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"type":"string","description":"Filter by primary event type (e.g. Hail, Tornado, Thunderstorm Wind)","title":"Event Type"},"description":"Filter by primary event type (e.g. Hail, Tornado, Thunderstorm Wind)"},{"name":"episode_id","in":"query","required":false,"schema":{"type":"integer","description":"Filter by specific episode ID","title":"Episode Id"},"description":"Filter by specific episode ID"},{"name":"min_revenue","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Min Revenue"}},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":1,"default":14,"title":"Days Back"}},{"name":"days_forward","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":0,"default":3,"title":"Days Forward"}},{"name":"include_forecasts","in":"query","required":false,"schema":{"type":"boolean","description":"Include forecast opportunities (set to false for faster loading)","default":true,"title":"Include Forecasts"},"description":"Include forecast opportunities (set to false for faster loading)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/storm-events/{episode_id}":{"get":{"tags":["opportunity-radar"],"summary":"Get Storm Event Detail","description":"Return detailed storm event with full path, individual events,\nopportunity zones, and revenue segments.\n\nData source: Supabase/PostGIS storm_events table.","operationId":"get_storm_event_detail_api_opportunity_radar_storm_events__episode_id__get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/storm-events/{episode_id}/zip-overlay":{"get":{"tags":["opportunity-radar"],"summary":"Get Zip Overlay","description":"Return ZIP property stats near a storm for the map overlay with revenue estimates.","operationId":"get_zip_overlay_api_opportunity_radar_storm_events__episode_id__zip_overlay_get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/storm-events/{episode_id}/generate-hitlist":{"post":{"tags":["opportunity-radar"],"summary":"Generate Hitlist From Storm","description":"Generate a scored hit list from a clustered storm event.","operationId":"generate_hitlist_from_storm_api_opportunity_radar_storm_events__episode_id__generate_hitlist_post","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GenerateHitlistParams"},{"type":"null"}],"title":"Params"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/storm-events/{episode_id}/generate-parcel-hitlist":{"post":{"tags":["opportunity-radar"],"summary":"Generate Parcel Hitlist","description":"Generate a hit list enriched with parcel data from Supabase.\n\nThis endpoint provides:\n- Owner names and types (individual, joint, entity)\n- Actual roof ages from parcel records\n- Building sqft and estimated property values\n- Address details for canvassing\n\n**Requires:** Growth Operator tier or above.","operationId":"generate_parcel_hitlist_api_opportunity_radar_storm_events__episode_id__generate_parcel_hitlist_post","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ParcelHitlistParams"},{"type":"null"}],"title":"Params"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/forecast-opportunities":{"get":{"tags":["opportunity-radar"],"summary":"Get Forecast Opportunities","description":"Score SPC convective outlooks against property exposure data.\n\nReturns ranked forecast opportunities showing WHERE upcoming storms\nwill create the most revenue opportunity, BEFORE they hit.\n\nCombines:\n- SPC Day 1/2 hail, wind, and tornado probability polygons\n- ZIP-level property exposure (buildings, values, roof ages)\n- ML replacement probability from the XGBoost model\n- Revenue estimates using local property values\n\nSorted by forecast_score (probability × opportunity score).","operationId":"get_forecast_opportunities_api_opportunity_radar_forecast_opportunities_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/storm-lifecycle":{"get":{"tags":["opportunity-radar"],"summary":"Get Storm Lifecycle","description":"Get storm lifecycle entries tracking forecast → ground truth → claims.\n\nEach entry represents a tracked storm system through its full lifecycle:\nforecast → watch → warning → active → verified → closed","operationId":"get_storm_lifecycle_api_opportunity_radar_storm_lifecycle_get","parameters":[{"name":"phase","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/scoring-model":{"get":{"tags":["opportunity-radar"],"summary":"Get Scoring Model Info","description":"Return current scoring model info and version history.","operationId":"get_scoring_model_info_api_opportunity_radar_scoring_model_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/scoring-outcome":{"post":{"tags":["opportunity-radar"],"summary":"Report Scoring Outcome","description":"Report actual outcomes for a scored storm to close the ML feedback loop.\n\nWhen claims or revenue data becomes available, this endpoint links it\nback to the scoring_audit table so the model can be retrained with\nreal outcome data.","operationId":"report_scoring_outcome_api_opportunity_radar_scoring_outcome_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutcomeReport"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/trigger-clustering":{"post":{"tags":["opportunity-radar"],"summary":"Trigger Clustering","description":"Manually trigger storm event clustering (admin/debug).","operationId":"trigger_clustering_api_opportunity_radar_trigger_clustering_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/refresh-episode-rollups":{"post":{"tags":["opportunity-radar"],"summary":"Refresh Episode Rollups","description":"Refresh the storm_episode_rollups materialized view (admin/debug).","operationId":"refresh_episode_rollups_api_opportunity_radar_refresh_episode_rollups_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/trigger-pipeline":{"post":{"tags":["opportunity-radar"],"summary":"Trigger Pipeline","description":"Manually trigger the full pipeline: fetch → score → cluster.","operationId":"trigger_pipeline_api_opportunity_radar_trigger_pipeline_post","parameters":[{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":3,"title":"Days Back"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/pipeline-status":{"get":{"tags":["opportunity-radar"],"summary":"Get Pipeline Status","description":"Return status of the live data pipeline and storm events.","operationId":"get_pipeline_status_api_opportunity_radar_pipeline_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/radar-config":{"get":{"tags":["opportunity-radar"],"summary":"Get Radar Config","description":"Get real-time radar overlay configuration for map integration.\nReturns WMS tile URLs and legend for radar display.","operationId":"get_radar_config_api_opportunity_radar_radar_config_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opportunity-radar/radar-status":{"get":{"tags":["opportunity-radar"],"summary":"Check Radar Status","description":"Check if radar data services are available.","operationId":"check_radar_status_api_opportunity_radar_radar_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/properties/resolve":{"post":{"tags":["integration"],"summary":"Resolve Property","description":"Resolve or create a canonical property record.\nReturns a stable property_id for the given address/coordinates.\nMust be called before submitting inspections.","operationId":"resolve_property_api_integration_properties_resolve_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyResolvePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/storm-lookup":{"get":{"tags":["integration"],"summary":"Storm Lookup","description":"Find scored storms near a location within a date range.\nUsed by RoofProof to find which storm(s) may have caused damage at a property.","operationId":"storm_lookup_api_integration_storm_lookup_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lng","in":"query","required":true,"schema":{"type":"number","description":"Longitude","title":"Lng"},"description":"Longitude"},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","description":"Search radius in miles","default":25,"title":"Radius Miles"},"description":"Search radius in miles"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (YYYY-MM-DD)","title":"Date From"},"description":"Start date (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (YYYY-MM-DD)","title":"Date To"},"description":"End date (YYYY-MM-DD)"},{"name":"min_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum opportunity score","title":"Min Score"},"description":"Minimum opportunity score"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/property-context":{"get":{"tags":["integration"],"summary":"Property Context","description":"Get ZIP-level property context for a location.\nReturns building counts, avg property value, roof age, density class.\nUsed by RoofProof to enrich inspection data with market context.","operationId":"property_context_api_integration_property_context_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Property latitude","title":"Lat"},"description":"Property latitude"},{"name":"lng","in":"query","required":true,"schema":{"type":"number","description":"Property longitude","title":"Lng"},"description":"Property longitude"},{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ZIP code (if known)","title":"Zip Code"},"description":"ZIP code (if known)"},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/inspections":{"post":{"tags":["integration"],"summary":"Ingest Inspections","description":"Ingest inspection results from RoofProof.\nEach inspection is matched to a storm (explicit storm_key or auto-match)\nand linked to a canonical property.","operationId":"ingest_inspections_api_integration_inspections_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InspectionBatchPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/inspections/{external_id}":{"put":{"tags":["integration"],"summary":"Update Inspection","description":"Update inspection outcome fields (RoofProof-sourced data only).\nFor claim/contract outcomes from CRM, use PUT /inspections/{id}/claim-outcome.","operationId":"update_inspection_api_integration_inspections__external_id__put","parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InspectionUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/inspections/{external_id}/claim-outcome":{"put":{"tags":["integration"],"summary":"Update Claim Outcome","description":"Push CRM claim/contract resolution data for an inspection.\nThis is the CRM-sourced data (claim status, contract value, etc.).\nWhen claim data arrives, a storm_outcome record is auto-created/updated.","operationId":"update_claim_outcome_api_integration_inspections__external_id__claim_outcome_put","parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimOutcomePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/inspections/by-storm/{storm_key}":{"get":{"tags":["integration"],"summary":"Inspections By Storm","description":"Get all inspections linked to a specific storm event.\nReturns the storm details + all matched inspections with their outcomes.","operationId":"inspections_by_storm_api_integration_inspections_by_storm__storm_key__get","parameters":[{"name":"storm_key","in":"path","required":true,"schema":{"type":"string","title":"Storm Key"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/stats/conversion-by-storm":{"get":{"tags":["integration"],"summary":"Conversion By Storm Stats","description":"Actual vs predicted conversion rates by storm.\nThe core data moat metric: how accurate are StormAxis opportunity scores\nat predicting actual claim approval rates?","operationId":"conversion_by_storm_stats_api_integration_stats_conversion_by_storm_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"min_inspections","in":"query","required":false,"schema":{"type":"integer","description":"Minimum inspections to include storm","default":3,"title":"Min Inspections"},"description":"Minimum inspections to include storm"},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integration/admin/model-accuracy":{"get":{"tags":["integration"],"summary":"Model Accuracy Dashboard","description":"Comprehensive model accuracy dashboard data — super_admin only.\nReturns KPIs, accuracy by event type, by score band, and per-storm detail.","operationId":"model_accuracy_dashboard_api_integration_admin_model_accuracy_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/storms/search":{"get":{"tags":["hit-lists"],"summary":"Search Storms For Picker","description":"Return scored storms for the hit list generation picker.\nDefault window: 2 weeks back to 3 days ahead.","operationId":"search_storms_for_picker_api_hit_lists_storms_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search term (state, county, event type)","default":"","title":"Q"},"description":"Search term (state, county, event type)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/generate":{"post":{"tags":["hit-lists"],"summary":"Generate Hit List","description":"Generate a scored hit list for a storm's impact area.\n\nRequires: Opportunity Targeting module with 'ai_hit_lists' feature.","operationId":"generate_hit_list_api_hit_lists_generate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateHitListPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists":{"get":{"tags":["hit-lists"],"summary":"List Hit Lists","description":"List all hit lists for the current user's org.","operationId":"list_hit_lists_api_hit_lists_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}":{"get":{"tags":["hit-lists"],"summary":"Get Hit List","description":"Get a hit list with paginated entries. Supports search by address or ZIP.","operationId":"get_hit_list_api_hit_lists__hit_list_id__get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":10,"default":50,"title":"Page Size"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","description":"Search entries by address or ZIP code","default":"","title":"Search"},"description":"Search entries by address or ZIP code"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hit-lists"],"summary":"Delete Hit List","description":"Delete a hit list and its entries.","operationId":"delete_hit_list_api_hit_lists__hit_list_id__delete","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/enrich":{"post":{"tags":["hit-lists"],"summary":"Trigger Enrichment","description":"Trigger geographic enrichment for a hit list.\n\nGenerates H3 targeting cells covering the storm impact area,\nscores each cell by opportunity potential, and links to the hit list.\n\nRuns asynchronously in the background.","operationId":"trigger_enrichment_api_hit_lists__hit_list_id__enrich_post","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichPayload","default":{"h3_resolution":8,"min_opportunity_score":20.0,"force":false}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/enrichment-status":{"get":{"tags":["hit-lists"],"summary":"Get Enrichment Status","description":"Get the enrichment status for a hit list.","operationId":"get_enrichment_status_api_hit_lists__hit_list_id__enrichment_status_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-cells":{"get":{"tags":["hit-lists"],"summary":"Get Targeting Cells","description":"Get H3 targeting cells for a hit list.\n\nReturns cells ranked by opportunity score with GeoJSON geometry\nfor map visualization.","operationId":"get_targeting_cells_api_hit_lists__hit_list_id__targeting_cells_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"default":0,"title":"Min Score"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-cells/geojson":{"get":{"tags":["hit-lists"],"summary":"Get Targeting Cells Geojson","description":"Get H3 targeting cells as a GeoJSON FeatureCollection for map rendering.","operationId":"get_targeting_cells_geojson_api_hit_lists__hit_list_id__targeting_cells_geojson_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"default":0,"title":"Min Score"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-cells/{cell_id}":{"get":{"tags":["hit-lists"],"summary":"Get Targeting Cell Detail","description":"Get detailed info for a single targeting cell.","operationId":"get_targeting_cell_detail_api_hit_lists__hit_list_id__targeting_cells__cell_id__get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"cell_id","in":"path","required":true,"schema":{"type":"string","title":"Cell Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/export/csv":{"get":{"tags":["hit-lists"],"summary":"Export Hit List Csv","description":"Export all hit list entries as a CSV file.\n\nRequires: Opportunity Targeting module with 'csv_kml_export' feature.","operationId":"export_hit_list_csv_api_hit_lists__hit_list_id__export_csv_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/routes/generate":{"post":{"tags":["hit-lists"],"summary":"Generate Routes","description":"Cluster hit list entries into canvassing routes using K-Means.","operationId":"generate_routes_api_hit_lists__hit_list_id__routes_generate_post","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRoutesPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/routes":{"get":{"tags":["hit-lists"],"summary":"List Routes","description":"List all routes for a hit list.","operationId":"list_routes_api_hit_lists__hit_list_id__routes_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/routes/{route_id}":{"get":{"tags":["hit-lists"],"summary":"Get Route Detail","description":"Get a route with its entries.","operationId":"get_route_detail_api_hit_lists__hit_list_id__routes__route_id__get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":10,"default":50,"title":"Page Size"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/routes/{route_id}/assign":{"put":{"tags":["hit-lists"],"summary":"Assign Route","description":"Assign a route to a sales rep.","operationId":"assign_route_api_hit_lists__hit_list_id__routes__route_id__assign_put","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__hit_lists__AssignRoutePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/routes/{route_id}/status":{"put":{"tags":["hit-lists"],"summary":"Update Route Status","description":"Update route status (unassigned, assigned, in_progress, completed).","operationId":"update_route_status_api_hit_lists__hit_list_id__routes__route_id__status_put","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRouteStatusPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-routes/generate":{"post":{"tags":["hit-lists"],"summary":"Generate H3 Routes","description":"Generate canvassing routes from H3 targeting cells using K-Means clustering.\nThis uses the new H3 hexagonal targeting cells instead of ZIP-based entries.","operationId":"generate_h3_routes_api_hit_lists__hit_list_id__targeting_routes_generate_post","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateH3RoutesPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-routes":{"get":{"tags":["hit-lists"],"summary":"List H3 Routes","description":"List all H3 targeting cell routes for a hit list.","operationId":"list_h3_routes_api_hit_lists__hit_list_id__targeting_routes_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-routes/{route_id}":{"get":{"tags":["hit-lists"],"summary":"Get H3 Route Detail","description":"Get details of an H3 targeting route with its cells.","operationId":"get_h3_route_detail_api_hit_lists__hit_list_id__targeting_routes__route_id__get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/known-properties":{"get":{"tags":["hit-lists"],"summary":"Get Known Properties Near Hit List","description":"Get known properties from our database that are near the hit list's storm center.\nThese can be overlaid on the H3 targeting map.","operationId":"get_known_properties_near_hit_list_api_hit_lists__hit_list_id__known_properties_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":50,"minimum":1,"default":15,"title":"Radius Miles"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-cells/filter":{"post":{"tags":["hit-lists"],"summary":"Filter Targeting Cells","description":"Advanced filtering for targeting cells with multiple criteria.","operationId":"filter_targeting_cells_api_hit_lists__hit_list_id__targeting_cells_filter_post","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetingCellsFilterPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-cells/export/csv":{"get":{"tags":["hit-lists"],"summary":"Export Targeting Cells Csv","description":"Export targeting cells as CSV for field teams.\n\nRequires: Opportunity Targeting module with 'csv_kml_export' feature.","operationId":"export_targeting_cells_csv_api_hit_lists__hit_list_id__targeting_cells_export_csv_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"default":0,"title":"Min Score"}},{"name":"max_distance","in":"query","required":false,"schema":{"type":"number","minimum":0,"default":50,"title":"Max Distance"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hit-lists/{hit_list_id}/targeting-cells/export/kml":{"get":{"tags":["hit-lists"],"summary":"Export Targeting Cells Kml","description":"Export targeting cells as KML for Google Earth/Maps navigation.\nField teams can load this into their GPS/navigation apps.\n\nRequires: Opportunity Targeting module with 'csv_kml_export' feature.","operationId":"export_targeting_cells_kml_api_hit_lists__hit_list_id__targeting_cells_export_kml_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":100,"minimum":0,"default":0,"title":"Min Score"}},{"name":"max_distance","in":"query","required":false,"schema":{"type":"number","minimum":0,"default":50,"title":"Max Distance"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms":{"get":{"tags":["public-storms"],"summary":"Get Public Storms","description":"Public endpoint: returns recent storms with estimated market opportunity.\nUsed by the Storm Opportunity Map at /storm-map.","operationId":"get_public_storms_api_public_storms_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":8760,"minimum":1,"default":4380,"title":"Hours"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":10,"minimum":0,"default":0.0,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storm-alerts/subscribe":{"post":{"tags":["public-storms"],"summary":"Subscribe Storm Alerts","description":"Public: subscribe to storm opportunity alerts.","operationId":"subscribe_storm_alerts_api_public_storm_alerts_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertSubscription"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storm-alerts/count":{"get":{"tags":["public-storms"],"summary":"Get Subscriber Count","description":"Public: show how many people are subscribed (social proof).","operationId":"get_subscriber_count_api_public_storm_alerts_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/storm-alerts/unsubscribe":{"post":{"tags":["public-storms"],"summary":"Unsubscribe Storm Alerts","description":"Public: unsubscribe from storm opportunity alerts.","operationId":"unsubscribe_storm_alerts_api_public_storm_alerts_unsubscribe_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["public-storms"],"summary":"Unsubscribe Storm Alerts Get","description":"Public: unsubscribe via GET link (for email links).","operationId":"unsubscribe_storm_alerts_get_api_public_storm_alerts_unsubscribe_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storm-report/{storm_id}":{"get":{"tags":["public-storms"],"summary":"Get Storm Report","description":"Public endpoint: returns a shareable storm intelligence report.\nUsed by /storm-report/{storm_id}.","operationId":"get_storm_report_api_public_storm_report__storm_id__get","parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/top":{"get":{"tags":["public-storms"],"summary":"Get Top Storms","description":"Return the top storms by estimated market value (for sidebar list).","operationId":"get_top_storms_api_public_storms_top_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storm-digest/trigger":{"post":{"tags":["public-storms"],"summary":"Trigger Storm Digest","description":"Admin-only endpoint: manually trigger the weekly storm digest.\nRequires super_admin role.","operationId":"trigger_storm_digest_api_public_storm_digest_trigger_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storm-digest/preview":{"get":{"tags":["public-storms"],"summary":"Preview Storm Digest","description":"Preview the digest email HTML without sending it.\nUseful for testing the template in a browser.","operationId":"preview_storm_digest_api_public_storm_digest_preview_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storm/{slug}":{"get":{"tags":["public-storms"],"summary":"Get Storm Landing Page Data","description":"Get comprehensive storm data for a public landing page.\n\nReturns data optimized for contractor landing pages including:\n- Storm-type specific metrics (wind mph, hail size, tornado rating, etc.)\n- Primary city with highest impact\n- All affected cities and states\n- Residential vs commercial breakdown\n- Detailed narrative/write-up\n\nHandles multiple slug formats for backwards compatibility.","operationId":"get_storm_landing_page_data_api_public_storm__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/callback":{"post":{"tags":["google-auth"],"summary":"Google Auth Callback","description":"Exchange Emergent Auth session_id for a StormAxis JWT.","operationId":"google_auth_callback_api_auth_google_callback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleCallbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/profile":{"put":{"tags":["profile"],"summary":"Update Profile","description":"Update the current user's profile fields.","operationId":"update_profile_api_users_me_profile_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["profile"],"summary":"Get Profile","description":"Get the current user's full profile.","operationId":"get_profile_api_users_me_profile_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-visuals/templates":{"get":{"tags":["ad-visuals"],"summary":"List Templates","description":"List available ad visual templates.","operationId":"list_templates_api_ad_visuals_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/ad-visuals/generate":{"post":{"tags":["ad-visuals"],"summary":"Generate Ad Visual","description":"Generate an advertising visual using customer's own LLM API key.\n\nRequires: Campaign Activation module with 'ai_creatives' feature.","operationId":"generate_ad_visual_api_ad_visuals_generate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-visuals":{"get":{"tags":["ad-visuals"],"summary":"List Ad Visuals","description":"List all ad visuals for the user's organization.","operationId":"list_ad_visuals_api_ad_visuals_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-visuals/{visual_id}":{"get":{"tags":["ad-visuals"],"summary":"Get Ad Visual","description":"Get a specific ad visual.","operationId":"get_ad_visual_api_ad_visuals__visual_id__get","parameters":[{"name":"visual_id","in":"path","required":true,"schema":{"type":"string","title":"Visual Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ad-visuals"],"summary":"Delete Ad Visual","description":"Delete an ad visual.","operationId":"delete_ad_visual_api_ad_visuals__visual_id__delete","parameters":[{"name":"visual_id","in":"path","required":true,"schema":{"type":"string","title":"Visual Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["ad-visuals"],"summary":"Update Ad Visual","description":"Update ad visual metadata.","operationId":"update_ad_visual_api_ad_visuals__visual_id__patch","parameters":[{"name":"visual_id","in":"path","required":true,"schema":{"type":"string","title":"Visual Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_update_ad_visual_api_ad_visuals__visual_id__patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-visuals/upload":{"post":{"tags":["ad-visuals"],"summary":"Upload Ad Visual","description":"Upload a custom ad visual to the library.\n\nSupports: JPG, PNG, WebP, GIF (max 10MB)\n\nThe visual will be added to the organization's ad visual library\nand can be used in campaigns and creative sets.","operationId":"upload_ad_visual_api_ad_visuals_upload_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_ad_visual_api_ad_visuals_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-visuals/upload-url":{"post":{"tags":["ad-visuals"],"summary":"Upload Visual From Url","description":"Add an external image URL to the ad visual library.\n\nThe image is downloaded and stored locally for reliability.","operationId":"upload_visual_from_url_api_ad_visuals_upload_url_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_upload_visual_from_url_api_ad_visuals_upload_url_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-visuals/upload/bulk":{"post":{"tags":["ad-visuals"],"summary":"Bulk Upload Ad Visuals","description":"Upload multiple ad visuals at once.\n\nSupports up to 20 files per request.\nEach file: JPG, PNG, WebP, GIF (max 10MB each)\n\nReturns summary of successful and failed uploads.","operationId":"bulk_upload_ad_visuals_api_ad_visuals_upload_bulk_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_bulk_upload_ad_visuals_api_ad_visuals_upload_bulk_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/llm/providers":{"get":{"tags":["llm-settings"],"summary":"List Providers","description":"List supported LLM providers with their info.","operationId":"list_providers_api_settings_llm_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/settings/llm":{"get":{"tags":["llm-settings"],"summary":"Get Llm Settings","description":"Get configured LLM keys for the organization (masked).","operationId":"get_llm_settings_api_settings_llm_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["llm-settings"],"summary":"Save Llm Key","description":"Save an LLM API key for the organization (encrypted).","operationId":"save_llm_key_api_settings_llm_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LLMKeyInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/llm/{provider}":{"delete":{"tags":["llm-settings"],"summary":"Delete Llm Key","description":"Remove an LLM API key.","operationId":"delete_llm_key_api_settings_llm__provider__delete","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/categories":{"get":{"tags":["support"],"summary":"List Categories","description":"List support case categories.","operationId":"list_categories_api_support_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/support/cases":{"post":{"tags":["support"],"summary":"Create Case","description":"Create a new support case with auto-captured context.","operationId":"create_case_api_support_cases_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["support"],"summary":"List Cases","description":"List support cases. Super admins see all; others see their own.","operationId":"list_cases_api_support_cases_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}},{"name":"severity","in":"query","required":false,"schema":{"type":"string","title":"Severity"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/cases/{case_id}":{"get":{"tags":["support"],"summary":"Get Case","description":"Get a support case by ID.","operationId":"get_case_api_support_cases__case_id__get","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["support"],"summary":"Update Case","description":"Update case (admin only for status/severity/assignment).","operationId":"update_case_api_support_cases__case_id__put","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/cases/{case_id}/comments":{"post":{"tags":["support"],"summary":"Add Comment","description":"Add a comment to a support case.","operationId":"add_comment_api_support_cases__case_id__comments_post","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCommentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/dashboard":{"get":{"tags":["support"],"summary":"Support Dashboard","description":"Support routing dashboard — admin overview of all cases by severity/status.","operationId":"support_dashboard_api_support_dashboard_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-alerts/preferences":{"get":{"tags":["storm-alerts"],"summary":"Get Preferences","operationId":"get_preferences_api_storm_alerts_preferences_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["storm-alerts"],"summary":"Update Preferences","operationId":"update_preferences_api_storm_alerts_preferences_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertPreferences"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-alerts/unread-count":{"get":{"tags":["storm-alerts"],"summary":"Unread Count","operationId":"unread_count_api_storm_alerts_unread_count_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-alerts":{"get":{"tags":["storm-alerts"],"summary":"List Alerts","operationId":"list_alerts_api_storm_alerts_get","parameters":[{"name":"dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dismissed"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-alerts/{alert_id}/dismiss":{"post":{"tags":["storm-alerts"],"summary":"Dismiss Alert","operationId":"dismiss_alert_api_storm_alerts__alert_id__dismiss_post","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-alerts/dismiss-all":{"post":{"tags":["storm-alerts"],"summary":"Dismiss All","operationId":"dismiss_all_api_storm_alerts_dismiss_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-alerts/generate":{"post":{"tags":["storm-alerts"],"summary":"Trigger Alert Generation","operationId":"trigger_alert_generation_api_storm_alerts_generate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-alerts/backfill":{"post":{"tags":["storm-alerts"],"summary":"Backfill Storm Alerts","description":"Backfill revenue alerts for the last N days. Super admin only.","operationId":"backfill_storm_alerts_api_storm_alerts_backfill_post","parameters":[{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days Back"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvasser/routes/{route_id}":{"get":{"tags":["Canvasser"],"summary":"Get Canvasser Route","description":"Get route details optimized for mobile canvasser view.\nIncludes all zones ordered by route_rank for efficient canvassing.\n\nRequires: Field Execution module.","operationId":"get_canvasser_route_api_canvasser_routes__route_id__get","parameters":[{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvasser/zones/{cell_id}/activity":{"post":{"tags":["Canvasser"],"summary":"Log Zone Activity","description":"Log canvasser activity for a targeting zone (H3 cell).","operationId":"log_zone_activity_api_canvasser_zones__cell_id__activity_post","parameters":[{"name":"cell_id","in":"path","required":true,"schema":{"type":"string","title":"Cell Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneActivityPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvasser/zones/{cell_id}/navigate":{"get":{"tags":["Canvasser"],"summary":"Get Navigation Link","description":"Get navigation links for a targeting zone.\nReturns links for Google Maps and Apple Maps.","operationId":"get_navigation_link_api_canvasser_zones__cell_id__navigate_get","parameters":[{"name":"cell_id","in":"path","required":true,"schema":{"type":"string","title":"Cell Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvasser/routes/{route_id}/stats":{"get":{"tags":["Canvasser"],"summary":"Get Route Stats","description":"Get aggregated stats for a canvassing route.","operationId":"get_route_stats_api_canvasser_routes__route_id__stats_get","parameters":[{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvasser/routes/{route_id}/assign":{"post":{"tags":["Canvasser"],"summary":"Assign Route To User","description":"Assign a route to a team member (or unassign).\n\nRequires: Field Execution module with 'team_dispatch' feature.","operationId":"assign_route_to_user_api_canvasser_routes__route_id__assign_post","parameters":[{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__canvasser__AssignRoutePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvasser/team-members":{"get":{"tags":["Canvasser"],"summary":"Get Team Members For Assignment","description":"Get list of team members available for route assignment.\n\nRequires: Field Execution module with 'team_dispatch' feature.","operationId":"get_team_members_for_assignment_api_canvasser_team_members_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvasser/routes/{route_id}/optimize":{"post":{"tags":["Canvasser"],"summary":"Optimize Route Order","description":"Optimize the order of zones in a route using nearest-neighbor TSP.\nThis minimizes total driving distance for the canvasser.\n\nRequires: Field Execution module with 'route_optimization' feature.","operationId":"optimize_route_order_api_canvasser_routes__route_id__optimize_post","parameters":[{"name":"route_id","in":"path","required":true,"schema":{"type":"string","title":"Route Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvasser/leaderboard/{hit_list_id}":{"get":{"tags":["Canvasser"],"summary":"Get Canvasser Leaderboard","description":"Get a performance leaderboard for canvassers working on a hit list.\nRanks reps by zones visited, doors knocked, contacts made, and appointments set.","operationId":"get_canvasser_leaderboard_api_canvasser_leaderboard__hit_list_id__get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-performance/record":{"post":{"tags":["creative-performance"],"summary":"Record Performance","description":"Record creative performance from a campaign deployment","operationId":"record_performance_api_creative_performance_record_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-performance/webhook/{platform}":{"post":{"tags":["creative-performance"],"summary":"Performance Webhook","description":"Webhook endpoint for Meta/Google to push performance updates.\nNo auth required - validated via platform-specific signatures.","operationId":"performance_webhook_api_creative_performance_webhook__platform__post","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-performance/insights":{"get":{"tags":["creative-performance"],"summary":"Get Creative Insights","description":"Get aggregated creative insights (admin only for cross-org data)","operationId":"get_creative_insights_api_creative_performance_insights_get","parameters":[{"name":"dimension","in":"query","required":false,"schema":{"type":"string","description":"Dimension to aggregate by","default":"template","title":"Dimension"},"description":"Dimension to aggregate by"},{"name":"period_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"default":90,"title":"Period Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-performance/insights/dashboard":{"get":{"tags":["creative-performance"],"summary":"Get Insights Dashboard","description":"Get comprehensive insights dashboard (super_admin only)","operationId":"get_insights_dashboard_api_creative_performance_insights_dashboard_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-performance/recommendations":{"get":{"tags":["creative-performance"],"summary":"Get Creative Recommendations","description":"Get AI-powered creative recommendations based on performance data","operationId":"get_creative_recommendations_api_creative_performance_recommendations_get","parameters":[{"name":"storm_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Type"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/recommendations":{"get":{"tags":["ab-testing"],"summary":"Get Recommendations","description":"Get pending A/B test recommendations.\nIf campaign_id provided, returns recommendations for that campaign.\nOtherwise returns all recommendations for the user's organization.","operationId":"get_recommendations_api_ab_testing_recommendations_get","parameters":[{"name":"campaign_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/recommendations/{recommendation_id}/apply":{"post":{"tags":["ab-testing"],"summary":"Apply Recommendation Endpoint","description":"Apply a recommendation (mark as actioned).","operationId":"apply_recommendation_endpoint_api_ab_testing_recommendations__recommendation_id__apply_post","parameters":[{"name":"recommendation_id","in":"path","required":true,"schema":{"type":"string","title":"Recommendation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/recommendations/{recommendation_id}/dismiss":{"post":{"tags":["ab-testing"],"summary":"Dismiss Recommendation Endpoint","description":"Dismiss a recommendation.","operationId":"dismiss_recommendation_endpoint_api_ab_testing_recommendations__recommendation_id__dismiss_post","parameters":[{"name":"recommendation_id","in":"path","required":true,"schema":{"type":"string","title":"Recommendation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DismissRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/analyze":{"post":{"tags":["ab-testing"],"summary":"Trigger Analysis","description":"Manually trigger A/B test analysis.\nIf campaign_id provided, analyzes that campaign only.\nOtherwise analyzes all campaigns for the organization.","operationId":"trigger_analysis_api_ab_testing_analyze_post","parameters":[{"name":"campaign_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/analyze/all":{"post":{"tags":["ab-testing"],"summary":"Trigger Platform Analysis","description":"Trigger platform-wide A/B test analysis (admin only).\nThis is what the nightly cron job calls.","operationId":"trigger_platform_analysis_api_ab_testing_analyze_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/stats":{"get":{"tags":["ab-testing"],"summary":"Get Ab Testing Stats","description":"Get A/B testing statistics for the organization.","operationId":"get_ab_testing_stats_api_ab_testing_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/fatigue-alerts":{"get":{"tags":["ab-testing"],"summary":"Get Fatigue Alerts","description":"Get fatigue alerts for the organization's creatives.\nIdentifies creatives with declining CTR (>20% drop).","operationId":"get_fatigue_alerts_api_ab_testing_fatigue_alerts_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/auto-pause":{"post":{"tags":["ab-testing"],"summary":"Run Auto Pause","description":"Identify and optionally pause significantly underperforming variants.\n\nSet dry_run=false to actually pause losers (creates auto_pause recommendations).\n\nCriteria:\n- 99% statistical confidence (p < 0.01)\n- Minimum 2000 impressions per variant\n- At least 25% worse than control","operationId":"run_auto_pause_api_ab_testing_auto_pause_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoPauseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/auto-pause/all":{"post":{"tags":["ab-testing"],"summary":"Run Platform Auto Pause","description":"Platform-wide auto-pause analysis (admin only).\nUsed by nightly cron job.","operationId":"run_platform_auto_pause_api_ab_testing_auto_pause_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoPauseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/context-insights":{"get":{"tags":["ab-testing"],"summary":"Get Context Insights Endpoint","description":"Get context-based insights for the organization.\n\nAnalyzes performance by:\n- Storm type (hail, wind, tornado, etc.)\n- Region (southwest, midwest, etc.)\n- Season (spring, summer, fall, winter)\n\nReturns insights like:\n\"For hail storms in TX, this creative converts 2.3x better than average\"","operationId":"get_context_insights_endpoint_api_ab_testing_context_insights_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/context-insights/generate":{"post":{"tags":["ab-testing"],"summary":"Generate Context Insights","description":"Generate and store context-based recommendations for the organization.\nCreates actionable recommendations based on historical context analysis.","operationId":"generate_context_insights_api_ab_testing_context_insights_generate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/context-performance":{"get":{"tags":["ab-testing"],"summary":"Get Context Performance","description":"Get detailed performance breakdown by context dimensions.\n\nFilter by:\n- variant_id: Specific creative variant\n- storm_type: hail, wind, tornado, hurricane, flood, ice\n- region: southwest, midwest, southeast, northeast, mountain, pacific\n- state: Two-letter state code (TX, OK, etc.)\n- season: spring, summer, fall, winter\n- days: Analysis period (default 90, max 365)","operationId":"get_context_performance_api_ab_testing_context_performance_get","parameters":[{"name":"variant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant Id"}},{"name":"storm_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Type"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/context-performance/compare":{"get":{"tags":["ab-testing"],"summary":"Compare Context Performance","description":"Compare multiple variants' performance within a specific context.\n\nUseful for questions like:\n\"Which creative performs best for hail storms in the Southwest?\"","operationId":"compare_context_performance_api_ab_testing_context_performance_compare_get","parameters":[{"name":"variant_ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated variant IDs to compare","title":"Variant Ids"},"description":"Comma-separated variant IDs to compare"},{"name":"storm_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Type"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/nightly-analysis/trigger":{"post":{"tags":["ab-testing"],"summary":"Trigger Nightly Analysis","description":"Manually trigger the nightly A/B testing analysis (admin only).\n\nThis runs the same analysis that the nightly cron job performs:\n- A/B test analysis for all campaigns\n- Fatigue detection\n- Context-based recommendations\n- Auto-pause identification (dry run)","operationId":"trigger_nightly_analysis_api_ab_testing_nightly_analysis_trigger_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ab-testing/scheduler/status":{"get":{"tags":["ab-testing"],"summary":"Get Ab Testing Scheduler Status","description":"Get A/B testing scheduler status and recent run logs (admin only).","operationId":"get_ab_testing_scheduler_status_api_ab_testing_scheduler_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-ml/train":{"post":{"tags":["creative-ml"],"summary":"Train Model","description":"Train the creative prediction model on historical data.\n\nThe model learns patterns from:\n- Storm type -> Creative performance\n- Region -> Creative performance\n- Season -> Creative performance\n\nArgs:\n    days: Number of days of historical data to use (default 90)","operationId":"train_model_api_creative_ml_train_post","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-ml/predict":{"get":{"tags":["creative-ml"],"summary":"Predict Best Creatives","description":"Get ML-powered predictions for best performing creatives.\n\nReturns ranked list of creatives with predicted performance scores\nand explanations for the given context.\n\nArgs:\n    storm_type: Type of storm (hail, wind, tornado, etc.)\n    region: Region name (southwest, midwest, etc.)\n    state: Two-letter state code (TX, OK, etc.)\n    season: Season (spring, summer, fall, winter) - auto-detected if not provided\n    top_k: Number of predictions to return (default 5)","operationId":"predict_best_creatives_api_creative_ml_predict_get","parameters":[{"name":"storm_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Type"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season"}},{"name":"top_k","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Top K"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-ml/suggest":{"post":{"tags":["creative-ml"],"summary":"Get Creative Suggestions","description":"Get AI-powered creative suggestions for a campaign.\n\nAnalyzes historical performance patterns and returns:\n- Top recommended creative with confidence score\n- Explanation of why this creative is recommended\n- Alternative options with relative performance\n\nThis is useful when creating a new campaign and wanting\ndata-driven creative selection.","operationId":"get_creative_suggestions_api_creative_ml_suggest_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignContext"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-ml/insights":{"get":{"tags":["creative-ml"],"summary":"Get Creative Insights","description":"Get detailed insights about creative performance patterns.\n\nIf variant_id is provided, returns insights for that specific creative.\nOtherwise, returns aggregate insights across all creatives.","operationId":"get_creative_insights_api_creative_ml_insights_get","parameters":[{"name":"variant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/creative-ml/compare":{"get":{"tags":["creative-ml"],"summary":"Compare Creatives","description":"Compare predicted performance of multiple creatives for a given context.\n\nReturns side-by-side comparison with predicted scores and rankings.","operationId":"compare_creatives_api_creative_ml_compare_get","parameters":[{"name":"variant_ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated variant IDs to compare","title":"Variant Ids"},"description":"Comma-separated variant IDs to compare"},{"name":"storm_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Type"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organization/profile":{"get":{"tags":["organization"],"summary":"Get Organization Profile","description":"Get the current user's organization profile.","operationId":"get_organization_profile_api_organization_profile_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["organization"],"summary":"Update Organization Profile","description":"Update the organization profile. Only admins and owners can update.","operationId":"update_organization_profile_api_organization_profile_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/catalog":{"get":{"tags":["modules"],"summary":"Get Module Catalog","description":"Get the full module catalog with pricing and features.\nPublic endpoint for pricing pages.","operationId":"get_module_catalog_api_modules_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/modules/catalog/agency":{"get":{"tags":["modules"],"summary":"Get Agency Catalog","description":"Get the agency tier catalog with pricing and features.\nPublic endpoint for agency pricing page.","operationId":"get_agency_catalog_api_modules_catalog_agency_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/modules/my-modules":{"get":{"tags":["modules"],"summary":"Get My Modules","description":"Get the current user's enabled modules and features.","operationId":"get_my_modules_api_modules_my_modules_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/check-access":{"get":{"tags":["modules"],"summary":"Check Feature Access","description":"Check if the current user has access to a specific module/feature.\nReturns access status and upgrade path if not accessible.","operationId":"check_feature_access_api_modules_check_access_get","parameters":[{"name":"module","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ModuleType"}},{"name":"feature","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureAccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/org/{org_id}":{"get":{"tags":["modules"],"summary":"Get Org Module Config","description":"Get module configuration for an organization.\nRequires admin access to the org.","operationId":"get_org_module_config_api_modules_org__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/org/{org_id}/modules":{"get":{"tags":["modules"],"summary":"Get Org Modules List","description":"Get a simplified list of enabled modules for an organization.\nUsed by admin UI for module management.","operationId":"get_org_modules_list_api_modules_org__org_id__modules_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/org/{org_id}/enable":{"post":{"tags":["modules"],"summary":"Enable Module For Org","description":"Enable a module for an organization.\nRequires super_admin or org admin role.","operationId":"enable_module_for_org_api_modules_org__org_id__enable_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnableModuleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/org/{org_id}/module/{module_type}/tier":{"put":{"tags":["modules"],"summary":"Update Module Tier","description":"Update the tier for an existing module.","operationId":"update_module_tier_api_modules_org__org_id__module__module_type__tier_put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"module_type","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ModuleType"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateModuleTierRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/org/{org_id}/module/{module_type}":{"delete":{"tags":["modules"],"summary":"Disable Module","description":"Disable a module for an organization.","operationId":"disable_module_api_modules_org__org_id__module__module_type__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"module_type","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ModuleType"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/org/{org_id}/set-agency-tier":{"post":{"tags":["modules"],"summary":"Set Agency Tier","description":"Set an organization as an agency with a specific tier.","operationId":"set_agency_tier_api_modules_org__org_id__set_agency_tier_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"tier","in":"query","required":true,"schema":{"$ref":"#/components/schemas/AgencyTier"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/org/{org_id}/set-contractor-license":{"post":{"tags":["modules"],"summary":"Set Contractor License","description":"Set an organization as a contractor with a specific license.","operationId":"set_contractor_license_api_modules_org__org_id__set_contractor_license_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"license_type","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ContractorLicenseType"}},{"name":"agency_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/checkout/module":{"post":{"tags":["modules"],"summary":"Create Module Checkout","description":"Create a Stripe checkout session for a single module subscription.\nAfter payment, the module will be enabled for the organization.","operationId":"create_module_checkout_api_modules_checkout_module_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleCheckoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/checkout/cart":{"post":{"tags":["modules"],"summary":"Create Cart Checkout","description":"Create a Stripe checkout session for multiple modules at once.\nThis is for the \"Build Your Stack\" flow.","operationId":"create_cart_checkout_api_modules_checkout_cart_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModuleCartCheckoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/checkout/status/{session_id}":{"get":{"tags":["modules"],"summary":"Get Module Checkout Status","description":"Check the status of a module checkout session.","operationId":"get_module_checkout_status_api_modules_checkout_status__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/webhook/stripe":{"post":{"tags":["modules"],"summary":"Module Stripe Webhook","description":"Handle Stripe webhooks for module payments.","operationId":"module_stripe_webhook_api_modules_webhook_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/modules/transactions":{"get":{"tags":["modules"],"summary":"Get Module Transactions","description":"Get module transaction history for the current organization.\nShows past purchases, upgrades, and subscription changes.","operationId":"get_module_transactions_api_modules_transactions_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/modules/transactions/summary":{"get":{"tags":["modules"],"summary":"Get Transaction Summary","description":"Get a summary of module spending for the organization.","operationId":"get_transaction_summary_api_modules_transactions_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/agencies/search":{"get":{"tags":["agency-onboarding"],"summary":"Search Agencies","description":"Public endpoint for contractors to search for agencies to join.\nReturns basic public info about agencies.","operationId":"search_agencies_api_agency_onboarding_agencies_search_get","parameters":[{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Query"},"description":"Search by name"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/invites/contractor":{"post":{"tags":["agency-onboarding"],"summary":"Create Contractor Invite","description":"Agency admin invites a contractor to join their network.\nCreates an invite that the contractor can accept to create an affiliated account.","operationId":"create_contractor_invite_api_agency_onboarding_invites_contractor_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContractorInviteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["agency-onboarding"],"summary":"List Contractor Invites","description":"List all contractor invites sent by this agency","operationId":"list_contractor_invites_api_agency_onboarding_invites_contractor_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/invites/contractor/{invite_id}":{"delete":{"tags":["agency-onboarding"],"summary":"Revoke Contractor Invite","description":"Revoke a pending contractor invite","operationId":"revoke_contractor_invite_api_agency_onboarding_invites_contractor__invite_id__delete","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/join-requests":{"post":{"tags":["agency-onboarding"],"summary":"Create Join Request","description":"Contractor creates a request to join an agency.\nThe agency admin will review and approve/reject.","operationId":"create_join_request_api_agency_onboarding_join_requests_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJoinRequestPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/join-requests/my":{"get":{"tags":["agency-onboarding"],"summary":"Get My Join Requests","description":"Get all join requests created by the current user's organization","operationId":"get_my_join_requests_api_agency_onboarding_join_requests_my_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/join-requests/{request_id}":{"delete":{"tags":["agency-onboarding"],"summary":"Withdraw Join Request","description":"Withdraw a pending join request","operationId":"withdraw_join_request_api_agency_onboarding_join_requests__request_id__delete","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/join-requests/pending":{"get":{"tags":["agency-onboarding"],"summary":"Get Pending Join Requests","description":"Get all pending join requests for the agency to review","operationId":"get_pending_join_requests_api_agency_onboarding_join_requests_pending_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/join-requests/{request_id}/review":{"post":{"tags":["agency-onboarding"],"summary":"Review Join Request","description":"Agency admin approves or rejects a join request.\nOn approval, the contractor org becomes affiliated with the agency.","operationId":"review_join_request_api_agency_onboarding_join_requests__request_id__review_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewJoinRequestPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/invites/contractor/accept":{"post":{"tags":["agency-onboarding"],"summary":"Accept Contractor Invite","description":"Public endpoint for contractors to accept an invite and create their account.\nCreates both the user and organization for the contractor.","operationId":"accept_contractor_invite_api_agency_onboarding_invites_contractor_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptContractorInvitePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/contractors":{"get":{"tags":["agency-onboarding"],"summary":"List Affiliated Contractors","description":"List all contractors affiliated with this agency","operationId":"list_affiliated_contractors_api_agency_onboarding_contractors_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agency-onboarding/contractors/{contractor_org_id}":{"delete":{"tags":["agency-onboarding"],"summary":"Remove Affiliated Contractor","description":"Remove a contractor from the agency's network","operationId":"remove_affiliated_contractor_api_agency_onboarding_contractors__contractor_org_id__delete","parameters":[{"name":"contractor_org_id","in":"path","required":true,"schema":{"type":"string","title":"Contractor Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-forecast/outlooks":{"get":{"tags":["storm-forecast"],"summary":"List Outlooks","description":"Get summary of all available SPC convective outlooks.\nReturns max risk level for each day and availability status.","operationId":"list_outlooks_api_storm_forecast_outlooks_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-forecast/day/{day}":{"get":{"tags":["storm-forecast"],"summary":"Get Day Outlook","description":"Get detailed convective outlook for a specific day.\n\nArgs:\n    day: \"1\", \"2\", \"3\", or \"4-8\"\n    include_probabilities: Whether to include individual threat probabilities\n\nReturns:\n    GeoJSON features for categorical risk and probability outlooks","operationId":"get_day_outlook_api_storm_forecast_day__day__get","parameters":[{"name":"day","in":"path","required":true,"schema":{"type":"string","title":"Day"}},{"name":"include_probabilities","in":"query","required":false,"schema":{"type":"boolean","description":"Include tornado/hail/wind probability layers","default":true,"title":"Include Probabilities"},"description":"Include tornado/hail/wind probability layers"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-forecast/risk-levels":{"get":{"tags":["storm-forecast"],"summary":"Get Risk Levels","description":"Get risk level definitions and colors.","operationId":"get_risk_levels_api_storm_forecast_risk_levels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/revenue-intelligence/health":{"get":{"tags":["revenue-intelligence"],"summary":"Health Check","description":"Health check for the Revenue Intelligence service.","operationId":"health_check_api_revenue_intelligence_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/revenue-intelligence/forecast/summary":{"get":{"tags":["revenue-intelligence"],"summary":"Get Forecast Revenue Summary","description":"Get a summary of forecasted revenue opportunities across all outlook days.\nUses actual Census data for proper weighting:\n- Housing units (roof count)\n- Median home values (roof replacement cost)\n- NCPI scores (claim propensity)\n- State claim culture (FEMA-derived)","operationId":"get_forecast_revenue_summary_api_revenue_intelligence_forecast_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/forecast/day/{day}":{"get":{"tags":["revenue-intelligence"],"summary":"Get Forecast Revenue By Day","description":"Get detailed forecasted revenue for a specific outlook day.\nReturns revenue estimates tied to the SPC categorical outlook polygons,\nweighted by actual Census exposure data using polygon-to-state intersection.","operationId":"get_forecast_revenue_by_day_api_revenue_intelligence_forecast_day__day__get","parameters":[{"name":"day","in":"path","required":true,"schema":{"type":"integer","title":"Day"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/observed/{episode_id}":{"get":{"tags":["revenue-intelligence"],"summary":"Get Observed Revenue","description":"Get revenue opportunity analysis for an observed storm event.","operationId":"get_observed_revenue_api_revenue_intelligence_observed__episode_id__get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/zip/{zip_code}":{"get":{"tags":["revenue-intelligence"],"summary":"Get Zip Revenue Profile","description":"Get revenue potential profile for a specific ZIP code.\nShows how much revenue a typical storm would generate.","operationId":"get_zip_revenue_profile_api_revenue_intelligence_zip__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/territory/{territory_id}/forecast":{"get":{"tags":["revenue-intelligence"],"summary":"Get Territory Forecast Revenue","description":"Get forecasted revenue for a specific territory.\nChecks if any SPC outlook polygons intersect with the territory.","operationId":"get_territory_forecast_revenue_api_revenue_intelligence_territory__territory_id__forecast_get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":7,"minimum":1,"default":7,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/territory/{territory_id}/historical":{"get":{"tags":["revenue-intelligence"],"summary":"Get Territory Historical Revenue","description":"Get historical revenue for a territory based on past storm events.","operationId":"get_territory_historical_revenue_api_revenue_intelligence_territory__territory_id__historical_get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":36,"minimum":1,"default":12,"title":"Months"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/territory/{territory_id}/monthly-trend":{"get":{"tags":["revenue-intelligence"],"summary":"Get Territory Monthly Trend","description":"Get monthly revenue trend for a territory.\nReturns data formatted for chart visualization.","operationId":"get_territory_monthly_trend_api_revenue_intelligence_territory__territory_id__monthly_trend_get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":36,"minimum":1,"default":12,"title":"Months"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/territory/{territory_id}/exposure":{"get":{"tags":["revenue-intelligence"],"summary":"Get Territory Exposure","description":"Get exposure data for a territory.\nReturns housing units, property values, and NCPI for the territory's ZIP codes.","operationId":"get_territory_exposure_api_revenue_intelligence_territory__territory_id__exposure_get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/org/territories/forecast":{"get":{"tags":["revenue-intelligence"],"summary":"Get Org Territories Forecast","description":"Get revenue forecasts for all territories in the user's organization.\nReturns territories sorted by forecasted revenue.","operationId":"get_org_territories_forecast_api_revenue_intelligence_org_territories_forecast_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/historical/storms":{"get":{"tags":["revenue-intelligence"],"summary":"Get Historical Storm Revenue","description":"Get historical storm events with calculated revenue data.\nSupports filtering, sorting, and pagination.","operationId":"get_historical_storm_revenue_api_revenue_intelligence_historical_storms_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date ISO format","title":"Start Date"},"description":"Start date ISO format"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date ISO format","title":"End Date"},"description":"End date ISO format"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state","title":"State"},"description":"Filter by state"},{"name":"min_revenue","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Minimum revenue threshold","title":"Min Revenue"},"description":"Minimum revenue threshold"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by event type (hail, wind, tornado)","title":"Event Type"},"description":"Filter by event type (hail, wind, tornado)"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Sort by: date, revenue, severity","default":"date","title":"Sort By"},"description":"Sort by: date, revenue, severity"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","description":"Sort order: asc, desc","default":"desc","title":"Sort Order"},"description":"Sort order: asc, desc"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revenue-intelligence/historical/summary":{"get":{"tags":["revenue-intelligence"],"summary":"Get Historical Revenue Summary","description":"Get summary statistics for historical storm revenue.\nNow queries Supabase storm_episode_rollups instead of MongoDB.","operationId":"get_historical_revenue_summary_api_revenue_intelligence_historical_summary_get","parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":36,"minimum":1,"default":12,"title":"Months"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/water-intelligence/alerts":{"get":{"tags":["water-intelligence"],"summary":"Get Water Alerts","description":"Get active water-related weather alerts (flood, freeze, ice storm).\nReturns alerts that affect water mitigation trade.","operationId":"get_water_alerts_api_water_intelligence_alerts_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state code (e.g., TX)","title":"State"},"description":"Filter by state code (e.g., TX)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/water-intelligence/catastrophe-alerts":{"get":{"tags":["water-intelligence"],"summary":"Get Catastrophe Alerts","description":"Get unified catastrophe alerts for water mitigation events.\nIncludes flood, freeze, and ice storm events with trade classification.","operationId":"get_catastrophe_alerts_api_water_intelligence_catastrophe_alerts_get","parameters":[{"name":"states","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated state codes","title":"States"},"description":"Comma-separated state codes"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/water-intelligence/zip/{zip_code}/risk":{"get":{"tags":["water-intelligence"],"summary":"Get Zip Water Risk","description":"Get comprehensive water damage risk assessment for a ZIP code.\nIncludes flood risk, freeze/thaw metrics, and revenue estimates.","operationId":"get_zip_water_risk_api_water_intelligence_zip__zip_code__risk_get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"include_forecast","in":"query","required":false,"schema":{"type":"boolean","description":"Include temperature forecast","default":true,"title":"Include Forecast"},"description":"Include temperature forecast"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/water-intelligence/freeze-risk":{"get":{"tags":["water-intelligence"],"summary":"Get Freeze Risk Summary","description":"Get freeze risk summary across territories or states.\nReturns ZIPs with elevated pipe burst or ice dam risk.","operationId":"get_freeze_risk_summary_api_water_intelligence_freeze_risk_get","parameters":[{"name":"states","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated state codes","title":"States"},"description":"Comma-separated state codes"},{"name":"min_probability","in":"query","required":false,"schema":{"type":"number","description":"Minimum pipe burst probability","default":0.1,"title":"Min Probability"},"description":"Minimum pipe burst probability"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/water-intelligence/temperature-forecast/{zip_code}":{"get":{"tags":["water-intelligence"],"summary":"Get Zip Temperature Forecast","description":"Get hourly temperature forecast for a ZIP code.\nUsed for freeze/thaw risk visualization.","operationId":"get_zip_temperature_forecast_api_water_intelligence_temperature_forecast__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"description":"Forecast hours (max 168)","default":72,"title":"Hours"},"description":"Forecast hours (max 168)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/water-intelligence/dashboard-summary":{"get":{"tags":["water-intelligence"],"summary":"Get Water Dashboard Summary","description":"Get water mitigation dashboard summary for user's territories.\nReturns active alerts, at-risk properties, and revenue estimates.","operationId":"get_water_dashboard_summary_api_water_intelligence_dashboard_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/water-intelligence/alerts/{alert_id}/generate-hitlist":{"post":{"tags":["water-intelligence"],"summary":"Generate Hitlist From Water Alert","description":"Generate a scored hit list from a water alert's affected area.\nUses neighborhood targeting similar to storm hit lists.","operationId":"generate_hitlist_from_water_alert_api_water_intelligence_alerts__alert_id__generate_hitlist_post","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"top_n","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":50,"default":500,"title":"Top N"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/status":{"get":{"tags":["media-engine"],"summary":"Get Media Engine Status","description":"Get the current status of the media engine.","operationId":"get_media_engine_status_api_media_engine_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/qualify/storm":{"post":{"tags":["media-engine"],"summary":"Qualify Storm","description":"Check if a storm event qualifies for social media distribution.\nReturns qualification result without publishing.","operationId":"qualify_storm_api_media_engine_qualify_storm_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualifyStormRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/publish/storm":{"post":{"tags":["media-engine"],"summary":"Publish Storm Alert","description":"Publish a storm alert to social media platforms.\n\nRequires super_admin or agency_admin role.","operationId":"publish_storm_alert_api_media_engine_publish_storm_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishStormRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/publish/forecast":{"post":{"tags":["media-engine"],"summary":"Publish Forecast Alert","description":"Publish a forecast outlook alert to social media platforms.","operationId":"publish_forecast_alert_api_media_engine_publish_forecast_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishForecastRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/alerts":{"get":{"tags":["media-engine"],"summary":"Get Recent Alerts","description":"Get recent media alerts.","operationId":"get_recent_alerts_api_media_engine_alerts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/alerts/{alert_id}":{"get":{"tags":["media-engine"],"summary":"Get Alert Details","description":"Get details for a specific alert.","operationId":"get_alert_details_api_media_engine_alerts__alert_id__get","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/stats":{"get":{"tags":["media-engine"],"summary":"Get Alert Stats","description":"Get media alert statistics.","operationId":"get_alert_stats_api_media_engine_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/test/facebook":{"post":{"tags":["media-engine"],"summary":"Test Facebook Connection","description":"Test Facebook API connection.","operationId":"test_facebook_connection_api_media_engine_test_facebook_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/test/linkedin":{"post":{"tags":["media-engine"],"summary":"Test Linkedin Connection","description":"Test LinkedIn API connection.","operationId":"test_linkedin_connection_api_media_engine_test_linkedin_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/trigger/forecast":{"post":{"tags":["media-engine"],"summary":"Trigger Forecast Alert","description":"Manually trigger a social media alert for the current Day 1 forecast.\n\nThis will:\n1. Fetch the current SPC Day 1 outlook\n2. Check qualification (unless force=true)\n3. Generate message and capture screenshot\n4. Publish to Facebook and LinkedIn","operationId":"trigger_forecast_alert_api_media_engine_trigger_forecast_post","parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Skip qualification checks","default":false,"title":"Force"},"description":"Skip qualification checks"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/preview/forecast":{"get":{"tags":["media-engine"],"summary":"Preview Forecast Message","description":"Preview the social media message for the current Day 1 forecast.\nDoes NOT publish - just shows what would be posted.","operationId":"preview_forecast_message_api_media_engine_preview_forecast_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/email/stats":{"get":{"tags":["media-engine"],"summary":"Get Email Stats","description":"Get email distribution statistics.","operationId":"get_email_stats_api_media_engine_email_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/email/send-forecast":{"post":{"tags":["media-engine"],"summary":"Send Forecast Email Alert","description":"Send forecast alert emails to subscribers.\n\nArgs:\n    day: Forecast day (1, 2, or 3)\n    target_states: Optional list of states to target (e.g., [\"TX\", \"OK\"])","operationId":"send_forecast_email_alert_api_media_engine_email_send_forecast_post","parameters":[{"name":"day","in":"query","required":false,"schema":{"type":"integer","maximum":3,"minimum":1,"default":1,"title":"Day"}},{"name":"target_states","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Target States"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/email/subscribers":{"get":{"tags":["media-engine"],"summary":"Get Subscribers List","description":"Get list of email subscribers.","operationId":"get_subscribers_list_api_media_engine_email_subscribers_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/analytics/summary":{"get":{"tags":["media-engine"],"summary":"Get Analytics Summary Endpoint","description":"Get analytics summary for the media engine.","operationId":"get_analytics_summary_endpoint_api_media_engine_analytics_summary_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/analytics/campaign/{campaign}":{"get":{"tags":["media-engine"],"summary":"Get Campaign Performance Endpoint","description":"Get performance metrics for a specific campaign.","operationId":"get_campaign_performance_endpoint_api_media_engine_analytics_campaign__campaign__get","parameters":[{"name":"campaign","in":"path","required":true,"schema":{"type":"string","title":"Campaign"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/analytics/track":{"post":{"tags":["media-engine"],"summary":"Track Event","description":"Public endpoint to track analytics events.\nUsed by frontend to track page views and conversions.","operationId":"track_event_api_media_engine_analytics_track_post","parameters":[{"name":"event_type","in":"query","required":true,"schema":{"type":"string","description":"page_view, conversion, email_click","title":"Event Type"},"description":"page_view, conversion, email_click"},{"name":"page_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Type"}},{"name":"page_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"}},{"name":"conversion_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversion Type"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"medium","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Medium"}},{"name":"campaign","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/screenshots/capture":{"post":{"tags":["media-engine"],"summary":"Capture Screenshot","description":"Capture a screenshot of a StormAxis view.\n\nSupported view_type:\n- opportunity_radar: Opportunity Radar map\n- storm_detail: Individual storm landing page\n- forecast: SPC forecast outlook\n- hit_list: Hit list visualization\n- revenue_dashboard: Revenue intelligence dashboard","operationId":"capture_screenshot_api_media_engine_screenshots_capture_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenshotRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/screenshots/list":{"get":{"tags":["media-engine"],"summary":"List Screenshots","description":"List all available screenshots.","operationId":"list_screenshots_api_media_engine_screenshots_list_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/screenshots/{filename}":{"get":{"tags":["media-engine"],"summary":"Get Screenshot","description":"Get a specific screenshot file.","operationId":"get_screenshot_api_media_engine_screenshots__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/screenshots/cleanup":{"delete":{"tags":["media-engine"],"summary":"Cleanup Screenshots","description":"Clean up old screenshots.","operationId":"cleanup_screenshots_api_media_engine_screenshots_cleanup_delete","parameters":[{"name":"max_age_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Max Age Hours"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media-engine/screenshots/capture-storm":{"post":{"tags":["media-engine"],"summary":"Capture Storm Screenshot Endpoint","description":"Capture a screenshot for a specific storm from the opportunity scores database.\nAutomatically centers on the storm location.","operationId":"capture_storm_screenshot_endpoint_api_media_engine_screenshots_capture_storm_post","parameters":[{"name":"storm_id","in":"query","required":true,"schema":{"type":"string","description":"NOAA storm event key","title":"Storm Id"},"description":"NOAA storm event key"},{"name":"platform","in":"query","required":false,"schema":{"type":"string","default":"facebook","title":"Platform"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/qualify":{"post":{"tags":["DemandOS"],"summary":"Qualify Storm Event","description":"Qualify a storm event and create a demand event.\n\nTakes a storm_event_id and runs it through the qualification pipeline.\nCreates a demand_event record with appropriate status.","operationId":"qualify_storm_event_api_internal_demandos_events_qualify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandEventCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/import-storm/{storm_key}":{"post":{"tags":["DemandOS"],"summary":"Import Storm To Demandos","description":"Manually import a storm event into DemandOS.\n\nUse this endpoint when the auto-qualification pipeline missed a storm\nthat should be in DemandOS.\n\nArgs:\n    storm_key: The noaa_event_key of the storm to import\n    force: If True, re-import even if already exists (updates status)\n\nReturns:\n    The created or existing demand event","operationId":"import_storm_to_demandos_api_internal_demandos_events_import_storm__storm_key__post","parameters":[{"name":"storm_key","in":"path","required":true,"schema":{"type":"string","title":"Storm Key"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Force import even if already exists","default":false,"title":"Force"},"description":"Force import even if already exists"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/import-by-episode/{episode_id}":{"post":{"tags":["DemandOS"],"summary":"Import Storm By Episode","description":"Manually import a storm event into DemandOS using episode_id.\n\nUse this endpoint for storms from Supabase storm_events that need\nto be imported into DemandOS for tracking.\n\nArgs:\n    episode_id: The episode_id from storm_events\n    force: If True, re-import even if already exists\n\nReturns:\n    The created demand event","operationId":"import_storm_by_episode_api_internal_demandos_events_import_by_episode__episode_id__post","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"integer","title":"Episode Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Force import even if already exists","default":false,"title":"Force"},"description":"Force import even if already exists"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/qualify-bulk":{"post":{"tags":["DemandOS"],"summary":"Qualify Bulk Storms","description":"Qualify multiple storm events in bulk.\n\nRuns qualification in background and returns immediately.","operationId":"qualify_bulk_storms_api_internal_demandos_events_qualify_bulk_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Storm Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events":{"get":{"tags":["DemandOS"],"summary":"List Demand Events","description":"List demand events with optional filters.\n\nReturns paginated list of demand events for the admin feed.","operationId":"list_demand_events_api_internal_demandos_events_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state","title":"State"},"description":"Filter by state"},{"name":"min_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Minimum qualification score","title":"Min Score"},"description":"Minimum qualification score"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/feed":{"get":{"tags":["DemandOS"],"summary":"Get Demand Feed","description":"Get the demand feed - recent qualified events for the dashboard.","operationId":"get_demand_feed_api_internal_demandos_events_feed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/generation-progress":{"get":{"tags":["DemandOS"],"summary":"Get Generation Progress","description":"Get generation progress for all events in 'drafted' status.\n\nReturns details about what step each drafted event is at,\nhelping identify stuck or in-progress asset generation.","operationId":"get_generation_progress_api_internal_demandos_events_generation_progress_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/retry-stuck-generation":{"post":{"tags":["DemandOS"],"summary":"Retry Stuck Generation","description":"Retry asset generation for stuck drafted events.\n\nFinds events that are in 'drafted' status but have no assets or\nincomplete generation, and triggers asset generation for them.","operationId":"retry_stuck_generation_api_internal_demandos_events_retry_stuck_generation_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"description":"Max items to retry","default":10,"title":"Limit"},"description":"Max items to retry"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/fix-stuck-status":{"post":{"tags":["DemandOS"],"summary":"Fix Stuck Status","description":"Fix events that have assets but are still in 'drafted' status.\n\nThese events should have transitioned to 'review_pending' but didn't.\nHandles multiple scenarios:\n1. Events with completed generation_progress but still drafted\n2. Events with assets in demand_assets collection but assets_count=0\n3. Events with no/incomplete generation_progress","operationId":"fix_stuck_status_api_internal_demandos_events_fix_stuck_status_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"description":"Max items to fix","default":50,"title":"Limit"},"description":"Max items to fix"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/{demand_event_id}/retry-generation":{"post":{"tags":["DemandOS"],"summary":"Retry Single Generation","description":"Retry asset generation for a single event.","operationId":"retry_single_generation_api_internal_demandos_events__demand_event_id__retry_generation_post","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/stats":{"get":{"tags":["DemandOS"],"summary":"Get Demand Stats","description":"Get overall demand event statistics.","operationId":"get_demand_stats_api_internal_demandos_events_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/{demand_event_id}":{"get":{"tags":["DemandOS"],"summary":"Get Demand Event","description":"Get a single demand event with its assets and metrics.","operationId":"get_demand_event_api_internal_demandos_events__demand_event_id__get","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/{demand_event_id}/generate-assets":{"post":{"tags":["DemandOS"],"summary":"Generate Assets","description":"Generate assets for a demand event.\n\nCreates planned assets (page, social, etc.) for the event.","operationId":"generate_assets_api_internal_demandos_events__demand_event_id__generate_assets_post","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"channels","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Specific channels","title":"Channels"},"description":"Specific channels"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/{demand_event_id}/approve":{"post":{"tags":["DemandOS"],"summary":"Approve Event","description":"Approve a demand event for publishing.","operationId":"approve_event_api_internal_demandos_events__demand_event_id__approve_post","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/{demand_event_id}/suppress":{"post":{"tags":["DemandOS"],"summary":"Suppress Event","description":"Suppress a demand event.","operationId":"suppress_event_api_internal_demandos_events__demand_event_id__suppress_post","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"reason","in":"query","required":true,"schema":{"type":"string","description":"Suppression reason","title":"Reason"},"description":"Suppression reason"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/events/{demand_event_id}/assets":{"get":{"tags":["DemandOS"],"summary":"Get Event Assets","description":"Get all assets for a specific demand event.","operationId":"get_event_assets_api_internal_demandos_events__demand_event_id__assets_get","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/assets/{asset_id}":{"get":{"tags":["DemandOS"],"summary":"Get Asset","description":"Get a single asset by ID.","operationId":"get_asset_api_internal_demandos_assets__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["DemandOS"],"summary":"Update Asset","description":"Update an asset's content or status.","operationId":"update_asset_api_internal_demandos_assets__asset_id__patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandAssetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/assets/{asset_id}/approve":{"post":{"tags":["DemandOS"],"summary":"Approve Asset","description":"Approve an asset for publishing.","operationId":"approve_asset_api_internal_demandos_assets__asset_id__approve_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/assets/{asset_id}/publish":{"post":{"tags":["DemandOS"],"summary":"Publish Asset","description":"Publish an approved asset.\n\nFor web: generates static page\nFor social: posts to platform\nFor email: queues for sending","operationId":"publish_asset_api_internal_demandos_assets__asset_id__publish_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/metrics/summary":{"get":{"tags":["DemandOS"],"summary":"Get Metrics Summary","description":"Get aggregated metrics summary across all demand events.","operationId":"get_metrics_summary_api_internal_demandos_metrics_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/metrics/by-event/{demand_event_id}":{"get":{"tags":["DemandOS"],"summary":"Get Event Metrics","description":"Get metrics for a specific demand event.","operationId":"get_event_metrics_api_internal_demandos_metrics_by_event__demand_event_id__get","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/metrics/by-channel":{"get":{"tags":["DemandOS"],"summary":"Get Channel Metrics","description":"Get metrics grouped by channel.","operationId":"get_channel_metrics_api_internal_demandos_metrics_by_channel_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/settings":{"get":{"tags":["DemandOS"],"summary":"Get Demandos Settings","description":"Get DemandOS settings.","operationId":"get_demandos_settings_api_internal_demandos_settings_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["DemandOS"],"summary":"Update Settings","description":"Update DemandOS settings.","operationId":"update_settings_api_internal_demandos_settings_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Updates"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["DemandOS"],"summary":"Update Demandos Settings","description":"Update DemandOS settings.","operationId":"update_demandos_settings_api_internal_demandos_settings_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/assets/bulk-approve":{"post":{"tags":["DemandOS"],"summary":"Bulk Approve Assets","description":"Bulk approve multiple assets.","operationId":"bulk_approve_assets_api_internal_demandos_assets_bulk_approve_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Asset Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/assets/bulk-publish":{"post":{"tags":["DemandOS"],"summary":"Bulk Publish Assets","description":"Bulk publish multiple approved assets.","operationId":"bulk_publish_assets_api_internal_demandos_assets_bulk_publish_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Asset Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/dashboard/metrics":{"get":{"tags":["DemandOS"],"summary":"Get Dashboard Metrics","description":"Get comprehensive dashboard metrics for the performance view.","operationId":"get_dashboard_metrics_api_internal_demandos_dashboard_metrics_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/dashboard/time-series":{"get":{"tags":["DemandOS"],"summary":"Get Time Series","description":"Get time-series data for charting.","operationId":"get_time_series_api_internal_demandos_dashboard_time_series_get","parameters":[{"name":"metric","in":"query","required":false,"schema":{"type":"string","description":"Metric to chart","default":"impressions","title":"Metric"},"description":"Metric to chart"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/dashboard/channel-performance":{"get":{"tags":["DemandOS"],"summary":"Get Channel Performance","description":"Get performance breakdown by channel.","operationId":"get_channel_performance_api_internal_demandos_dashboard_channel_performance_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/dashboard/top-events":{"get":{"tags":["DemandOS"],"summary":"Get Top Events","description":"Get top performing demand events.","operationId":"get_top_events_api_internal_demandos_dashboard_top_events_get","parameters":[{"name":"metric","in":"query","required":false,"schema":{"type":"string","description":"Metric to rank by","default":"clicks","title":"Metric"},"description":"Metric to rank by"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":10,"title":"Limit"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/dashboard/funnel":{"get":{"tags":["DemandOS"],"summary":"Get Conversion Funnel","description":"Get conversion funnel metrics.","operationId":"get_conversion_funnel_api_internal_demandos_dashboard_funnel_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/dashboard/attribution":{"get":{"tags":["DemandOS"],"summary":"Get Attribution Summary","description":"Get attribution summary by source and campaign.","operationId":"get_attribution_summary_api_internal_demandos_dashboard_attribution_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/pages/render/{demand_event_id}":{"post":{"tags":["DemandOS"],"summary":"Render Storm Page","description":"Render static storm page for a demand event.","operationId":"render_storm_page_api_internal_demandos_pages_render__demand_event_id__post","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Force re-render","default":false,"title":"Force"},"description":"Force re-render"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/pages/render-zip":{"post":{"tags":["DemandOS"],"summary":"Render Zip Page","description":"Render ZIP-specific variant of a storm page.","operationId":"render_zip_page_api_internal_demandos_pages_render_zip_post","parameters":[{"name":"demand_event_id","in":"query","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"zip_code","in":"query","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/pages/list":{"get":{"tags":["DemandOS"],"summary":"List Rendered Pages","description":"List all rendered storm pages.","operationId":"list_rendered_pages_api_internal_demandos_pages_list_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/queue/stats":{"get":{"tags":["DemandOS"],"summary":"Get Queue Stats","description":"Get distribution queue statistics.","operationId":"get_queue_stats_api_internal_demandos_queue_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/queue/jobs":{"get":{"tags":["DemandOS"],"summary":"List Queue Jobs","description":"List distribution jobs with filters.","operationId":"list_queue_jobs_api_internal_demandos_queue_jobs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/queue/process":{"post":{"tags":["DemandOS"],"summary":"Process Queue","description":"Process pending jobs in the queue.","operationId":"process_queue_api_internal_demandos_queue_process_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":10,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/queue/retry/{job_id}":{"post":{"tags":["DemandOS"],"summary":"Retry Job","description":"Retry a failed/dead-letter job.","operationId":"retry_job_api_internal_demandos_queue_retry__job_id__post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/social/preview":{"post":{"tags":["DemandOS"],"summary":"Generate Social Preview","description":"Generate a preview of social media content for a demand event.","operationId":"generate_social_preview_api_internal_demandos_social_preview_post","parameters":[{"name":"demand_event_id","in":"query","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","description":"Target social channel","default":"facebook","title":"Channel"},"description":"Target social channel"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/social/schedule":{"post":{"tags":["DemandOS"],"summary":"Schedule Social Post","description":"Schedule a social media post for future publishing.","operationId":"schedule_social_post_api_internal_demandos_social_schedule_post","parameters":[{"name":"asset_id","in":"query","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"scheduled_at","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"Scheduled At"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/pipeline/run":{"post":{"tags":["DemandOS"],"summary":"Run Qualification Pipeline","description":"Manually trigger the auto-qualification pipeline.\n\nFinds recent storm events with opportunity scores and qualifies them\ninto demand events.","operationId":"run_qualification_pipeline_api_internal_demandos_pipeline_run_post","parameters":[{"name":"lookback_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"default":48,"title":"Lookback Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"auto_generate_assets","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Auto Generate Assets"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/pipeline/qualify-single":{"post":{"tags":["DemandOS"],"summary":"Qualify Single Storm","description":"Qualify a single storm event by its NOAA event key.","operationId":"qualify_single_storm_api_internal_demandos_pipeline_qualify_single_post","parameters":[{"name":"noaa_event_key","in":"query","required":true,"schema":{"type":"string","title":"Noaa Event Key"}},{"name":"auto_generate_assets","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Auto Generate Assets"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/pipeline/stats":{"get":{"tags":["DemandOS"],"summary":"Get Pipeline Stats","description":"Get auto-qualification pipeline statistics.","operationId":"get_pipeline_stats_api_internal_demandos_pipeline_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/authority/profile/{demand_event_id}":{"post":{"tags":["DemandOS"],"summary":"Create Authority Profile","description":"Create or get authority profile for a demand event.\n\nAuthority profiles contain ONLY public-safe information\nfor trust signals on public pages.","operationId":"create_authority_profile_api_internal_demandos_authority_profile__demand_event_id__post","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/authority/trust-metadata/{demand_event_id}":{"get":{"tags":["DemandOS"],"summary":"Get Trust Metadata","description":"Get public trust metadata for a demand event.\n\nReturns ONLY safe-to-display information for public pages.","operationId":"get_trust_metadata_api_internal_demandos_authority_trust_metadata__demand_event_id__get","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/authority/verification":{"post":{"tags":["DemandOS"],"summary":"Record Verification","description":"Record a verification event from field inspections.\n\nUpdates the authority profile with verification signals.","operationId":"record_verification_api_internal_demandos_authority_verification_post","parameters":[{"name":"demand_event_id","in":"query","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"verification_type","in":"query","required":true,"schema":{"type":"string","description":"inspection_confirmed, contractor_observed, photo_verified","title":"Verification Type"},"description":"inspection_confirmed, contractor_observed, photo_verified"},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"roofproof","title":"Source"}},{"name":"damage_observations","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Damage Observations"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/authority/citation/{demand_event_id}":{"post":{"tags":["DemandOS"],"summary":"Generate Citation","description":"Generate citation assets for a demand event.\n\nCreates embed widget config, canonical URLs, and attribution line.","operationId":"generate_citation_api_internal_demandos_authority_citation__demand_event_id__post","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/authority/benchmark":{"post":{"tags":["DemandOS"],"summary":"Generate Benchmark","description":"Generate aggregated benchmark report.\n\nAll data is aggregated and anonymized for public publication.","operationId":"generate_benchmark_api_internal_demandos_authority_benchmark_post","parameters":[{"name":"report_type","in":"query","required":false,"schema":{"type":"string","description":"monthly, top_metros, verification_rates","default":"monthly","title":"Report Type"},"description":"monthly, top_metros, verification_rates"},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM for monthly reports","title":"Period"},"description":"YYYY-MM for monthly reports"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/authority/benchmarks":{"get":{"tags":["DemandOS"],"summary":"List Benchmarks","description":"List recent benchmark reports.","operationId":"list_benchmarks_api_internal_demandos_authority_benchmarks_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":10,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/roofproof/link-pending":{"post":{"tags":["DemandOS"],"summary":"Link Pending Inspections","description":"Manually trigger linking of pending RoofProof inspections to demand events.\n\nFinds inspections that were recorded before their corresponding\ndemand event was created and links them now.","operationId":"link_pending_inspections_api_internal_demandos_roofproof_link_pending_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/roofproof/stats":{"get":{"tags":["DemandOS"],"summary":"Get Roofproof Integration Stats","description":"Get RoofProof integration statistics for DemandOS.\n\nShows how many inspections are linked to demand events and\nthe verification status breakdown.","operationId":"get_roofproof_integration_stats_api_internal_demandos_roofproof_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/roofproof/demand-events/{demand_event_id}/inspections":{"get":{"tags":["DemandOS"],"summary":"Get Demand Event Inspections","description":"Get all RoofProof inspections linked to a demand event.\n\nShows verification details for the Data Authority Layer.","operationId":"get_demand_event_inspections_api_internal_demandos_roofproof_demand_events__demand_event_id__inspections_get","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/track/page-view":{"post":{"tags":["DemandOS Tracking"],"summary":"Track Page View","description":"Track a page view event.\n\nCalled when a visitor loads a public storm page.\nRate limited to prevent abuse.","operationId":"track_page_view_api_public_track_page_view_post","parameters":[{"name":"asset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"}},{"name":"demand_event_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demand Event Id"}},{"name":"visitor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visitor Id"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/track/cta-click":{"post":{"tags":["DemandOS Tracking"],"summary":"Track Cta Click","description":"Track a CTA click event.\n\nCalled when a visitor clicks a CTA on a public page.","operationId":"track_cta_click_api_public_track_cta_click_post","parameters":[{"name":"asset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"}},{"name":"demand_event_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demand Event Id"}},{"name":"visitor_id","in":"query","required":true,"schema":{"type":"string","title":"Visitor Id"}},{"name":"cta_type","in":"query","required":false,"schema":{"type":"string","description":"Type of CTA clicked","default":"signup","title":"Cta Type"},"description":"Type of CTA clicked"},{"name":"destination","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Destination URL","title":"Destination"},"description":"Destination URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/track/signup":{"post":{"tags":["DemandOS Tracking"],"summary":"Track Signup","description":"Track a signup conversion and link to attribution events.\n\nCalled after a user completes registration.","operationId":"track_signup_api_public_track_signup_post","parameters":[{"name":"visitor_id","in":"query","required":true,"schema":{"type":"string","title":"Visitor Id"}},{"name":"account_id","in":"query","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/track/activation":{"post":{"tags":["DemandOS Tracking"],"summary":"Track Activation","description":"Track an activation conversion (paid action).\n\nCalled when a user performs a monetizable action.","operationId":"track_activation_api_public_track_activation_post","parameters":[{"name":"account_id","in":"query","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"activation_type","in":"query","required":false,"schema":{"type":"string","description":"Type of activation","default":"hit_list_unlock","title":"Activation Type"},"description":"Type of activation"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/track/internal/link-signup":{"post":{"tags":["DemandOS Tracking"],"summary":"Link Signup Attribution","description":"Link attribution events to a new account.\n\nInternal endpoint called during registration flow.","operationId":"link_signup_attribution_api_public_track_internal_link_signup_post","parameters":[{"name":"account_id","in":"query","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"visitor_id","in":"query","required":true,"schema":{"type":"string","title":"Visitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/search/status":{"get":{"tags":["DemandOS Search"],"summary":"Get Indexing Status","description":"Get current indexing status and statistics.","operationId":"get_indexing_status_api_internal_demandos_search_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/search/submit-indexnow":{"post":{"tags":["DemandOS Search"],"summary":"Submit Urls To Indexnow","description":"Manually submit URLs to IndexNow.\n\nIf no URLs provided, submits all published storm pages.","operationId":"submit_urls_to_indexnow_api_internal_demandos_search_submit_indexnow_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_urls_to_indexnow_api_internal_demandos_search_submit_indexnow_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/search/submit-google":{"post":{"tags":["DemandOS Search"],"summary":"Submit Urls To Google","description":"Manually submit URLs to Google Indexing API.\n\nRequires Google API credentials to be configured.","operationId":"submit_urls_to_google_api_internal_demandos_search_submit_google_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_urls_to_google_api_internal_demandos_search_submit_google_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/search/reindex-all":{"post":{"tags":["DemandOS Search"],"summary":"Reindex All Pages","description":"Reindex all published storm pages.\n\nRuns in background due to potential volume.","operationId":"reindex_all_pages_api_internal_demandos_search_reindex_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/search/trigger-page/{demand_event_id}":{"post":{"tags":["DemandOS Search"],"summary":"Trigger Page Indexing","description":"Trigger indexing for a specific storm page.","operationId":"trigger_page_indexing_api_internal_demandos_search_trigger_page__demand_event_id__post","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/search/logs":{"get":{"tags":["DemandOS Search"],"summary":"Get Indexing Logs","description":"Get recent indexing logs.","operationId":"get_indexing_logs_api_internal_demandos_search_logs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/search/config/google":{"put":{"tags":["DemandOS Search"],"summary":"Configure Google Indexing","description":"Configure Google Indexing API credentials.\n\nExpects a Google service account JSON object.","operationId":"configure_google_indexing_api_internal_demandos_search_config_google_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Service Account Json"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/search/config":{"get":{"tags":["DemandOS Search"],"summary":"Get Search Config","description":"Get search discovery configuration.","operationId":"get_search_config_api_internal_demandos_search_config_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data-moat/parcels":{"get":{"tags":["Developer Sandbox"],"summary":"Get Parcels","description":"Get property/parcel data from 1.77M+ normalized parcels.\n\n**Data includes:** Owner name, owner type, address, year built, roof age, building sqft.\n\n**Sandbox Mode:** Limited to DFW metroplex (Dallas, Tarrant, Collin counties).\nUpgrade to Growth plan or higher for full database access.\n\n**Wow Moment #3:** \"Here's the owner's name, roof age, and value for each property\"","operationId":"get_parcels_api_data_moat_parcels_get","parameters":[{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by ZIP code (exact or prefix match)","title":"Zip Code"},"description":"Filter by ZIP code (exact or prefix match)"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state (2-letter code)","title":"State"},"description":"Filter by state (2-letter code)"},{"name":"owner_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by owner type: individual, joint, entity","title":"Owner Type"},"description":"Filter by owner type: individual, joint, entity"},{"name":"min_roof_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum roof age in years","title":"Min Roof Age"},"description":"Minimum roof age in years"},{"name":"min_sqft","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum building sqft","title":"Min Sqft"},"description":"Minimum building sqft"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParcelsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data-moat/zip-stats/{zip_code}":{"get":{"tags":["Developer Sandbox"],"summary":"Get Zip Parcel Stats","description":"Get enriched parcel statistics for a specific ZIP code.\n\nReturns aggregated data from 1.77M+ normalized parcels including:\n- Total parcels and unique owners\n- Roof age distribution (15+ years, 20+ years for targeting)\n- Owner type breakdown (individual, joint, entity)\n- Average sqft and year built range\n\n**Use case:** Quick ZIP qualification before generating hit lists.","operationId":"get_zip_parcel_stats_api_data_moat_zip_stats__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data-moat/zip-stats":{"get":{"tags":["Developer Sandbox"],"summary":"List Zip Stats","description":"List ZIP codes with parcel data, sorted by total parcels.\n\nUse this to discover which ZIPs have the most targeting data available.","operationId":"list_zip_stats_api_data_moat_zip_stats_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"State filter (2-letter code)","default":"TX","title":"State"},"description":"State filter (2-letter code)"},{"name":"min_parcels","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Minimum parcels in ZIP","default":100,"title":"Min Parcels"},"description":"Minimum parcels in ZIP"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data-moat/admin/refresh-zip-stats":{"post":{"tags":["Developer Sandbox"],"summary":"Refresh Zip Property Stats","description":"Admin endpoint to refresh zip_property_stats from normalized_parcels.\n\nThis aggregates parcel data by ZIP and updates the stats table with:\n- Total parcels, residential/commercial counts\n- Average property value, roof age, year built\n- Owner-occupied count and rate\n\n**Requires:** super_admin role","operationId":"refresh_zip_property_stats_api_data_moat_admin_refresh_zip_stats_post","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Limit to specific state (e.g., TX)","title":"State"},"description":"Limit to specific state (e.g., TX)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data-moat/admin/geocoding-stats":{"get":{"tags":["Developer Sandbox"],"summary":"Get Geocoding Stats","description":"Get statistics on parcel geocoding progress.\n\n**Requires:** super_admin role","operationId":"get_geocoding_stats_api_data_moat_admin_geocoding_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/data-moat/admin/geocode-parcels":{"post":{"tags":["Developer Sandbox"],"summary":"Geocode Parcels","description":"Trigger parcel geocoding.\n\n**Methods:**\n- `zip_centroid`: Fast bulk geocoding using ZIP code centers (approximate)\n- `census`: Precise geocoding using US Census Batch Geocoder (slower, accurate)\n\n**Requires:** super_admin role","operationId":"geocode_parcels_api_data_moat_admin_geocode_parcels_post","parameters":[{"name":"method","in":"query","required":false,"schema":{"type":"string","description":"Geocoding method: zip_centroid or census","default":"zip_centroid","title":"Method"},"description":"Geocoding method: zip_centroid or census"},{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Specific ZIP to process","title":"Zip Code"},"description":"Specific ZIP to process"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"Max parcels to process","default":10000,"title":"Limit"},"description":"Max parcels to process"},{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"description":"Batch size for census method","default":500,"title":"Batch Size"},"description":"Batch size for census method"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stormstrike/demo-cluster":{"get":{"tags":["Developer Sandbox"],"summary":"Get Demo Cluster","description":"Get a demo StormStrike H3 cluster for a recent storm.\n\nReturns a pre-built targeting cluster showing:\n- Property density within the hex cell\n- Owner-occupied percentage (targeting quality)\n- Estimated doors/hour for canvassing efficiency\n\n**Wow Moment #5:** \"This cluster = 18 doors/hour at 72% owner-occupied\"\n\nNote: This is demo data for Tarrant County, TX.\nFull StormStrike access requires Professional plan or higher.","operationId":"get_demo_cluster_api_stormstrike_demo_cluster_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoCluster"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stormstrike/clusters":{"get":{"tags":["Developer Sandbox"],"summary":"List Clusters","description":"List available StormStrike clusters.\n\n**Sandbox Mode:** Returns only the demo cluster for Tarrant County, TX.\nFull cluster access requires Professional plan or higher.","operationId":"list_clusters_api_stormstrike_clusters_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state","title":"State"},"description":"Filter by state"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sitemap.xml":{"get":{"tags":["Search Discovery"],"summary":"Get Sitemap Index","description":"Sitemap index file pointing to all sitemaps.\n\nThis is the main sitemap that search engines request.","operationId":"get_sitemap_index_api_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/api/sitemap-storms.xml":{"get":{"tags":["Search Discovery"],"summary":"Get Storms Sitemap","description":"Sitemap containing all storm pages.\n\nDynamically generated from demand events.","operationId":"get_storms_sitemap_api_sitemap_storms_xml_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/api/storms/feed.xml":{"get":{"tags":["Search Discovery"],"summary":"Get Storms Rss Feed","description":"RSS feed for storm updates.\n\nCan be used by:\n- News aggregators\n- Partner integrations\n- Monitoring tools","operationId":"get_storms_rss_feed_api_storms_feed_xml_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/api/{indexnow_key}.txt":{"get":{"tags":["Search Discovery"],"summary":"Get Indexnow Key File","description":"IndexNow key verification file.\n\nSearch engines request this to verify ownership.","operationId":"get_indexnow_key_file_api__indexnow_key__txt_get","parameters":[{"name":"indexnow_key","in":"path","required":true,"schema":{"type":"string","title":"Indexnow Key"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/index":{"get":{"tags":["Public Storm Pages"],"summary":"Get Storms Index","description":"Get data for the main storms index page.\n\nReturns recent significant storms, state summaries, and overall stats.\nPerfect for SEO landing page showing storm activity across the US.","operationId":"get_storms_index_api_public_storms_index_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/state/{state}":{"get":{"tags":["Public Storm Pages"],"summary":"Get State Storms","description":"Get data for a state page.\n\nReturns recent storms and county/metro breakdown for the given state.","operationId":"get_state_storms_api_public_storms_state__state__get","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":1825,"minimum":1,"default":365,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/metro/{state}/{metro}":{"get":{"tags":["Public Storm Pages"],"summary":"Get Metro Storms","description":"Get data for a metro/county page.\n\nReturns storms for a specific county/metro area.","operationId":"get_metro_storms_api_public_storms_metro__state___metro__get","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":3650,"minimum":1,"default":730,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/event/{event_key}":{"get":{"tags":["Public Storm Pages"],"summary":"Get Storm Event","description":"Get data for an individual storm detail page.\n\nReturns comprehensive storm details for a single event.","operationId":"get_storm_event_api_public_storms_event__event_key__get","parameters":[{"name":"event_key","in":"path","required":true,"schema":{"type":"string","title":"Event Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/search":{"get":{"tags":["Public Storm Pages"],"summary":"Search Storms","description":"Search storms by location, state, or event type.","operationId":"search_storms_api_public_storms_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state","title":"State"},"description":"Filter by state"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by event type","title":"Event Type"},"description":"Filter by event type"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/sitemap-data":{"get":{"tags":["Public Storm Pages"],"summary":"Get Sitemap Data","description":"Get data for generating the storms sitemap.\nReturns all state/county combinations with storm counts.","operationId":"get_sitemap_data_api_public_storms_sitemap_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/storms/search/zip/{zip_code}":{"get":{"tags":["Public Storm Pages"],"summary":"Public Search By Zip","description":"PUBLIC endpoint to search for recent storms near a ZIP code.\n\nReturns the most recent significant storms in the area for the\npublic storm map feature. No authentication required.\n\nResponse includes:\n- ZIP location info\n- Recent storms sorted by date (most recent first)\n- Estimated market opportunity","operationId":"public_search_by_zip_api_public_storms_search_zip__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":1095,"minimum":1,"description":"Days to look back","default":365,"title":"Days"},"description":"Days to look back"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max results","default":10,"title":"Limit"},"description":"Max results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/geo/reverse":{"get":{"tags":["Public Storm Pages"],"summary":"Reverse Geocode To Zip","description":"Reverse geocode coordinates to find the nearest ZIP code.\nUsed for geo-location auto-detect feature.","operationId":"reverse_geocode_to_zip_api_public_storms_geo_reverse_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"Longitude","title":"Lng"},"description":"Longitude"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/storms/geo/track-intent":{"post":{"tags":["Public Storm Pages"],"summary":"Track Geographic Intent","description":"Track geographic intent for DemandOS analytics.\nCalled when user's location is detected or they search a ZIP.","operationId":"track_geographic_intent_api_public_storms_geo_track_intent_post","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lng","in":"query","required":true,"schema":{"type":"number","description":"Longitude","title":"Lng"},"description":"Longitude"},{"name":"zip_code","in":"query","required":false,"schema":{"type":"string","description":"ZIP code if known","title":"Zip Code"},"description":"ZIP code if known"},{"name":"source","in":"query","required":false,"schema":{"type":"string","description":"How location was obtained","default":"geolocation","title":"Source"},"description":"How location was obtained"},{"name":"visitor_id","in":"query","required":false,"schema":{"type":"string","description":"Visitor ID for attribution","title":"Visitor Id"},"description":"Visitor ID for attribution"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/track2/page-view":{"post":{"tags":["Demand Graph Tracking"],"summary":"Track Page View","description":"Track a page view on a storm page.\n\nCall this when a visitor lands on any storm page (/storms/*).\nThis is the entry point of the demand graph.","operationId":"track_page_view_api_track2_page_view_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageViewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/track2/cta-click":{"post":{"tags":["Demand Graph Tracking"],"summary":"Track Cta Click","description":"Track a CTA click (e.g., \"Start Free Trial\").\n\nCall this when a visitor clicks any conversion CTA on storm pages.","operationId":"track_cta_click_api_track2_cta_click_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CTAClickRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/link-signup":{"post":{"tags":["Demand Graph Analytics"],"summary":"Link Signup","description":"Link a new signup to their previous visitor events.\n\nCall this from the signup flow to attribute the new user\nto their original demand event (first touch attribution).","operationId":"link_signup_api_internal_demandos_graph_link_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/track-activation":{"post":{"tags":["Demand Graph Analytics"],"summary":"Track Activation","description":"Track an activation event (hit list unlock, subscription, etc).","operationId":"track_activation_api_internal_demandos_graph_track_activation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/track-revenue":{"post":{"tags":["Demand Graph Analytics"],"summary":"Track Revenue","description":"Track revenue from an account (subscription payment, one-time purchase).","operationId":"track_revenue_api_internal_demandos_graph_track_revenue_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/summary":{"get":{"tags":["Demand Graph Analytics"],"summary":"Get Demand Graph Summary","description":"Get the full demand graph summary.\n\nShows the funnel: Storms → Page Views → CTA Clicks → Signups → Revenue","operationId":"get_demand_graph_summary_api_internal_demandos_graph_summary_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/event/{demand_event_id}/metrics":{"get":{"tags":["Demand Graph Analytics"],"summary":"Get Event Metrics","description":"Get metrics for a specific demand event.","operationId":"get_event_metrics_api_internal_demandos_graph_event__demand_event_id__metrics_get","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/top-performers":{"get":{"tags":["Demand Graph Analytics"],"summary":"Get Top Performers","description":"Get top performing demand events by a specific metric.","operationId":"get_top_performers_api_internal_demandos_graph_top_performers_get","parameters":[{"name":"metric","in":"query","required":false,"schema":{"type":"string","pattern":"^(signups|revenue|page_views|cta_clicks)$","default":"signups","title":"Metric"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/daily-funnel":{"get":{"tags":["Demand Graph Analytics"],"summary":"Get Daily Funnel","description":"Get daily funnel metrics for charting.","operationId":"get_daily_funnel_api_internal_demandos_graph_daily_funnel_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/visitor/{visitor_id}/journey":{"get":{"tags":["Demand Graph Analytics"],"summary":"Get Visitor Journey","description":"Get the full journey of a visitor through the demand graph.","operationId":"get_visitor_journey_api_internal_demandos_graph_visitor__visitor_id__journey_get","parameters":[{"name":"visitor_id","in":"path","required":true,"schema":{"type":"string","title":"Visitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/graph/account/{account_id}/attribution":{"get":{"tags":["Demand Graph Analytics"],"summary":"Get Account Attribution","description":"Get the full attribution data for an account.\n\nShows how this account was acquired (first touch demand event,\njourney through the funnel, total value generated).","operationId":"get_account_attribution_api_internal_demandos_graph_account__account_id__attribution_get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/optimize/variant":{"get":{"tags":["Conversion Optimization"],"summary":"Get Ab Variant","description":"Get the A/B test variant for a visitor at a specific location.\n\nReturns the variant config if a test is running, null otherwise.","operationId":"get_ab_variant_api_public_optimize_variant_get","parameters":[{"name":"visitor_id","in":"query","required":true,"schema":{"type":"string","minLength":8,"title":"Visitor Id"}},{"name":"location","in":"query","required":true,"schema":{"type":"string","description":"Test location e.g. storm_page_cta","title":"Location"},"description":"Test location e.g. storm_page_cta"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/optimize/ab-conversion":{"post":{"tags":["Conversion Optimization"],"summary":"Track Ab Conversion","description":"Track a conversion for an A/B test.","operationId":"track_ab_conversion_api_public_optimize_ab_conversion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ABConversionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/optimize/capture-email":{"post":{"tags":["Conversion Optimization"],"summary":"Capture Email","description":"Capture an email lead from a storm page.\n\nUsed for exit-intent popups, inline forms, and lead magnets.","operationId":"capture_email_api_public_optimize_capture_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCaptureRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/optimize/identify-segment":{"post":{"tags":["Conversion Optimization"],"summary":"Identify Segment","description":"Identify the visitor segment and get CTA configuration.\n\nReturns segment info and appropriate CTAs based on user state.","operationId":"identify_segment_api_public_optimize_identify_segment_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentIdentifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/optimize/cta-config":{"get":{"tags":["Conversion Optimization"],"summary":"Get Cta Config","description":"Get CTA configuration for a specific segment.","operationId":"get_cta_config_api_public_optimize_cta_config_get","parameters":[{"name":"segment","in":"query","required":false,"schema":{"type":"string","default":"anonymous","title":"Segment"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/optimize/ab-tests":{"post":{"tags":["Conversion Admin"],"summary":"Create Ab Test","description":"Create a new A/B test.","operationId":"create_ab_test_api_internal_demandos_optimize_ab_tests_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ABTestCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Conversion Admin"],"summary":"List Ab Tests","description":"List all A/B tests.","operationId":"list_ab_tests_api_internal_demandos_optimize_ab_tests_get","parameters":[{"name":"include_completed","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Completed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/optimize/ab-tests/active":{"get":{"tags":["Conversion Admin"],"summary":"List Active Tests","description":"List only active A/B tests.","operationId":"list_active_tests_api_internal_demandos_optimize_ab_tests_active_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/demandos/optimize/ab-tests/{test_id}":{"get":{"tags":["Conversion Admin"],"summary":"Get Ab Test Results","description":"Get detailed results for an A/B test.","operationId":"get_ab_test_results_api_internal_demandos_optimize_ab_tests__test_id__get","parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/optimize/ab-tests/{test_id}/start":{"post":{"tags":["Conversion Admin"],"summary":"Start Ab Test","description":"Start an A/B test.","operationId":"start_ab_test_api_internal_demandos_optimize_ab_tests__test_id__start_post","parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/optimize/ab-tests/{test_id}/pause":{"post":{"tags":["Conversion Admin"],"summary":"Pause Ab Test","description":"Pause an A/B test.","operationId":"pause_ab_test_api_internal_demandos_optimize_ab_tests__test_id__pause_post","parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/optimize/ab-tests/{test_id}/complete":{"post":{"tags":["Conversion Admin"],"summary":"Complete Ab Test","description":"Complete an A/B test and optionally declare a winner.","operationId":"complete_ab_test_api_internal_demandos_optimize_ab_tests__test_id__complete_post","parameters":[{"name":"test_id","in":"path","required":true,"schema":{"type":"string","title":"Test Id"}},{"name":"winner","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Winner"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/optimize/leads":{"get":{"tags":["Conversion Admin"],"summary":"List Leads","description":"List email leads with optional filters.","operationId":"list_leads_api_internal_demandos_optimize_leads_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"source_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/optimize/leads/stats":{"get":{"tags":["Conversion Admin"],"summary":"Get Lead Stats","description":"Get email lead statistics.","operationId":"get_lead_stats_api_internal_demandos_optimize_leads_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/optimize/segments/stats":{"get":{"tags":["Conversion Admin"],"summary":"Get Segment Stats","description":"Get visitor segment distribution.","operationId":"get_segment_stats_api_internal_demandos_optimize_segments_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calibration/settings":{"get":{"tags":["calibration"],"summary":"Get Settings","description":"Return current tenant settings, falling back to defaults.","operationId":"get_settings_api_calibration_settings_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["calibration"],"summary":"Update Settings","description":"Upsert tenant settings; returns the post-write row.","operationId":"update_settings_api_calibration_settings_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractorSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calibration/preview":{"get":{"tags":["calibration"],"summary":"Preview Revenue","description":"Combine the (tenant-agnostic) damage signal with the (tenant-specific)\ncontractor settings to produce a revenue projection. Returns BOTH so\nthe calibration UI can show the math.","operationId":"preview_revenue_api_calibration_preview_get","parameters":[{"name":"episode_id","in":"query","required":true,"schema":{"type":"integer","description":"storm episode_id","title":"Episode Id"},"description":"storm episode_id"},{"name":"structure_class","in":"query","required":false,"schema":{"type":"string","pattern":"^(residential|commercial)$","default":"residential","title":"Structure Class"}},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"optional season key, e.g. 'spring'","title":"Season"},"description":"optional season key, e.g. 'spring'"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calibration/damage-signal/{episode_id}":{"get":{"tags":["calibration"],"summary":"Get Damage Signal Route","description":"Tenant-agnostic damage facts. By design, this returns identical\nnumbers for every authenticated user — the contractor-side multipliers\nlive in /calibration/preview, not here.","operationId":"get_damage_signal_route_api_calibration_damage_signal__episode_id__get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"integer","title":"Episode Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/analytics/revenue-attribution":{"get":{"tags":["Advanced Analytics"],"summary":"Get Revenue Attribution","description":"Get comprehensive revenue attribution data.\n\nShows how revenue flows from storms through the funnel,\nwhich events generated the most revenue, and conversion metrics.","operationId":"get_revenue_attribution_api_internal_demandos_analytics_revenue_attribution_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/analytics/channel-performance":{"get":{"tags":["Advanced Analytics"],"summary":"Get Channel Performance","description":"Get performance comparison across channels.\n\nShows which traffic sources (web, social, email) convert best.","operationId":"get_channel_performance_api_internal_demandos_analytics_channel_performance_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/analytics/storm/{demand_event_id}/conversion-score":{"get":{"tags":["Advanced Analytics"],"summary":"Get Storm Conversion Score","description":"Get or calculate the predictive conversion score for a storm.\n\nBased on historical patterns of similar storms.","operationId":"get_storm_conversion_score_api_internal_demandos_analytics_storm__demand_event_id__conversion_score_get","parameters":[{"name":"demand_event_id","in":"path","required":true,"schema":{"type":"string","title":"Demand Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/analytics/high-potential-storms":{"get":{"tags":["Advanced Analytics"],"summary":"Get High Potential Storms","description":"Get storms with highest conversion potential.\n\nUseful for prioritizing outreach and ad spend.","operationId":"get_high_potential_storms_api_internal_demandos_analytics_high_potential_storms_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/analytics/recommendations":{"get":{"tags":["Advanced Analytics"],"summary":"Get Optimization Recommendations","description":"Get AI-powered optimization recommendations.\n\nBased on current performance data and patterns.","operationId":"get_optimization_recommendations_api_internal_demandos_analytics_recommendations_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/analytics/budget-allocation":{"post":{"tags":["Advanced Analytics"],"summary":"Get Budget Allocation","description":"Get suggested budget allocation across channels.\n\nBased on historical ROI data.","operationId":"get_budget_allocation_api_internal_demandos_analytics_budget_allocation_post","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetAllocationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/demandos/analytics/geographic-intent":{"get":{"tags":["Advanced Analytics"],"summary":"Get Geographic Intent Analytics","description":"Get geographic intent analytics - where is demand coming from?\n\nShows:\n- Top states by intent volume\n- Top cities/metros by intent\n- Heatmap data for visualization\n- Intent trends over time","operationId":"get_geographic_intent_analytics_api_internal_demandos_analytics_geographic_intent_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/h3/generate":{"post":{"tags":["Canvassing Territories"],"summary":"Generate H3 Cells","description":"Generate H3 storm cells for a specific storm event.\n\nCreates hexagonal cells around the storm impact point with\ndamage, density, distance, and recency scoring.","operationId":"generate_h3_cells_api_canvassing_h3_generate_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCellsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/h3/storm/{storm_event_id}":{"get":{"tags":["Canvassing Territories"],"summary":"Get Cells For Storm","description":"Get all H3 cells for a specific storm event.","operationId":"get_cells_for_storm_api_canvassing_h3_storm__storm_event_id__get","parameters":[{"name":"storm_event_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Event Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/h3/zip/{zip_code}":{"get":{"tags":["Canvassing Territories"],"summary":"Get Cells For Zip","description":"Get all H3 cells for a ZIP code above minimum score.","operationId":"get_cells_for_zip_api_canvassing_h3_zip__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.3,"title":"Min Score"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/h3/nearby":{"get":{"tags":["Canvassing Territories"],"summary":"Get Nearby High Opportunity Cells","description":"Get high-opportunity H3 cells near a location.","operationId":"get_nearby_high_opportunity_cells_api_canvassing_h3_nearby_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lng"}},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":50,"minimum":1,"default":20.0,"title":"Radius Miles"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.5,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/zip/{zip_code}":{"get":{"tags":["Canvassing Territories"],"summary":"Get Territories For Zip","description":"Get all canvassing territories for a ZIP code.","operationId":"get_territories_for_zip_api_canvassing_territories_zip__zip_code__get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":100.0,"minimum":0.0,"default":0.0,"title":"Min Score"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/metro/{metro}":{"get":{"tags":["Canvassing Territories"],"summary":"Get Territories For Metro","description":"Get top canvassing territories for a metro area.","operationId":"get_territories_for_metro_api_canvassing_territories_metro__metro__get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":100.0,"minimum":0.0,"default":0.0,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/storm/{storm_event_id}":{"get":{"tags":["Canvassing Territories"],"summary":"Get Territories For Storm","description":"Get canvassing territories for a specific storm event.\n\nReturns territories with their neighborhood boundary polygons for map display.\nFirst tries to find territories linked to the storm, then falls back to\nfinding territories in the storm's affected areas.","operationId":"get_territories_for_storm_api_canvassing_territories_storm__storm_event_id__get","parameters":[{"name":"storm_event_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Event Id"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":100.0,"minimum":0.0,"default":0.0,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/{territory_id}":{"get":{"tags":["Canvassing Territories"],"summary":"Get Territory Detail","description":"Get detailed information for a specific territory.","operationId":"get_territory_detail_api_canvassing_territories__territory_id__get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/{territory_id}/status":{"patch":{"tags":["Canvassing Territories"],"summary":"Update Territory Status","description":"Update the status of a territory.","operationId":"update_territory_status_api_canvassing_territories__territory_id__status_patch","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTerritoryStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/stats":{"get":{"tags":["Canvassing Territories"],"summary":"Get Territory Stats","description":"Get aggregate statistics for territories.","operationId":"get_territory_stats_api_canvassing_territories_stats_get","parameters":[{"name":"metro","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metro"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/generate/storm/{storm_event_id}":{"post":{"tags":["Canvassing Territories"],"summary":"Generate Territories For Storm","description":"Generate canvassing territories for a storm event.\n\nPrerequisites:\n1. H3 cells must be generated for the storm (POST /canvassing/h3/generate)\n2. Road clusters must exist in the area (POST /canvassing/roads/process/point)\n\nThis endpoint:\n- Matches H3 storm cells to road clusters\n- Computes territory scores\n- Applies size constraints (150-350 structures target)\n- Generates recommended start points\n- Persists territories to database","operationId":"generate_territories_for_storm_api_canvassing_generate_storm__storm_event_id__post","parameters":[{"name":"storm_event_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Event Id"}},{"name":"metro_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metro area key (dfw, okc)","title":"Metro Key"},"description":"Metro area key (dfw, okc)"},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"description":"Minimum H3 opportunity score","default":0.3,"title":"Min Score"},"description":"Minimum H3 opportunity score"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/generate/metro/{metro_key}":{"post":{"tags":["Canvassing Territories"],"summary":"Regenerate Territories For Metro","description":"Regenerate all territories for a metro area.\n\nThis clears existing territories and regenerates based on\nall H3 storm cells in the metro area.","operationId":"regenerate_territories_for_metro_api_canvassing_generate_metro__metro_key__post","parameters":[{"name":"metro_key","in":"path","required":true,"schema":{"type":"string","title":"Metro Key"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.3,"title":"Min Score"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/setup/indexes":{"post":{"tags":["Canvassing Territories"],"summary":"Setup Indexes","description":"Create database indexes for canvassing collections.","operationId":"setup_indexes_api_canvassing_setup_indexes_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/roads/metros":{"get":{"tags":["Canvassing Territories"],"summary":"Get Available Metros","description":"Get list of available metro areas for road network processing.","operationId":"get_available_metros_api_canvassing_roads_metros_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/roads/status":{"get":{"tags":["Canvassing Territories"],"summary":"Check Osmnx Status","description":"Check if osmnx is available for road network processing.","operationId":"check_osmnx_status_api_canvassing_roads_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/roads/process/metro/{metro_key}":{"post":{"tags":["Canvassing Territories"],"summary":"Process Metro Road Network","description":"Process road network for a metro area.\n\nThis is a long-running operation. For large metros like DFW,\nconsider running with smaller chunk sizes or in background.\n\nMetro keys: dfw, okc","operationId":"process_metro_road_network_api_canvassing_roads_process_metro__metro_key__post","parameters":[{"name":"metro_key","in":"path","required":true,"schema":{"type":"string","title":"Metro Key"}},{"name":"chunk_size","in":"query","required":false,"schema":{"type":"number","maximum":0.2,"minimum":0.01,"description":"Chunk size in degrees","default":0.05,"title":"Chunk Size"},"description":"Chunk size in degrees"},{"name":"resolution","in":"query","required":false,"schema":{"type":"number","maximum":2.0,"minimum":0.5,"description":"Louvain resolution parameter","default":1.0,"title":"Resolution"},"description":"Louvain resolution parameter"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/roads/process/point":{"post":{"tags":["Canvassing Territories"],"summary":"Process Point Road Network","description":"Process road network around a specific point.\n\nUseful for on-demand processing of areas outside pre-computed metros.","operationId":"process_point_road_network_api_canvassing_roads_process_point_post","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lng"}},{"name":"radius_meters","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":500,"default":3000,"title":"Radius Meters"}},{"name":"metro_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metro Key"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"number","maximum":2.0,"minimum":0.5,"default":1.0,"title":"Resolution"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/roads/clusters/metro/{metro_key}":{"get":{"tags":["Canvassing Territories"],"summary":"Get Road Clusters For Metro","description":"Get all road clusters for a metro area.","operationId":"get_road_clusters_for_metro_api_canvassing_roads_clusters_metro__metro_key__get","parameters":[{"name":"metro_key","in":"path","required":true,"schema":{"type":"string","title":"Metro Key"}},{"name":"min_nodes","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":10,"title":"Min Nodes"}},{"name":"max_entries","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":10,"title":"Max Entries"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/roads/clusters/nearby":{"get":{"tags":["Canvassing Territories"],"summary":"Get Road Clusters Nearby","description":"Get road clusters near a point.","operationId":"get_road_clusters_nearby_api_canvassing_roads_clusters_nearby_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lng"}},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":20,"minimum":1,"default":5.0,"title":"Radius Miles"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/{territory_id}/knocked":{"post":{"tags":["Canvassing Territories"],"summary":"Mark Territory Knocked","description":"Mark a territory as completely knocked.\n\nCreates a log entry for CRM sync and reporting.","operationId":"mark_territory_knocked_api_canvassing_territories__territory_id__knocked_post","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkKnockedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/knocked-log":{"get":{"tags":["Canvassing Territories"],"summary":"Get Knocked Log","description":"Get log of knocked territories for reporting.","operationId":"get_knocked_log_api_canvassing_knocked_log_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"metro","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metro"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/{territory_id}/crm-payload":{"get":{"tags":["Canvassing Territories"],"summary":"Get Crm Sync Payload","description":"Get territory data formatted for CRM sync.\n\nReturns standardized payload for HubSpot, Salesforce, etc.","operationId":"get_crm_sync_payload_api_canvassing_territories__territory_id__crm_payload_get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/export/csv":{"get":{"tags":["Canvassing Territories"],"summary":"Export Territories Csv","description":"Export territories to CSV format.\n\nReturns downloadable CSV file.","operationId":"export_territories_csv_api_canvassing_export_csv_get","parameters":[{"name":"metro","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metro"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/{territory_id}/route-sheet":{"get":{"tags":["Canvassing Territories"],"summary":"Get Route Sheet","description":"Get printable route sheet for a territory.\n\nReturns structured data for rendering a print-friendly sheet.","operationId":"get_route_sheet_api_canvassing_territories__territory_id__route_sheet_get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/territories/{territory_id}/link-hit-list":{"post":{"tags":["Canvassing Territories"],"summary":"Link Territory To Hit List","description":"Link a canvassing territory to an existing hit list.","operationId":"link_territory_to_hit_list_api_canvassing_territories__territory_id__link_hit_list_post","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkHitListRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/hit-lists/{hit_list_id}/territories":{"get":{"tags":["Canvassing Territories"],"summary":"Get Territories For Hit List","description":"Get all territories linked to a hit list.","operationId":"get_territories_for_hit_list_api_canvassing_hit_lists__hit_list_id__territories_get","parameters":[{"name":"hit_list_id","in":"path","required":true,"schema":{"type":"string","title":"Hit List Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/batch/refresh-status":{"get":{"tags":["Canvassing Territories"],"summary":"Get Refresh Status","description":"Get status of all metros for batch refresh scheduling.","operationId":"get_refresh_status_api_canvassing_batch_refresh_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/canvassing/batch/refresh/{metro_key}":{"post":{"tags":["Canvassing Territories"],"summary":"Refresh Metro Territories","description":"Trigger batch refresh of territories for a metro.\n\nRegenerates territories that are older than the threshold.","operationId":"refresh_metro_territories_api_canvassing_batch_refresh__metro_key__post","parameters":[{"name":"metro_key","in":"path","required":true,"schema":{"type":"string","title":"Metro Key"}},{"name":"days_threshold","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":7,"title":"Days Threshold"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/zip/{zip_code}/opportunity":{"get":{"tags":["Conversion Funnel"],"summary":"Get Zip Opportunity","description":"Stage 1: Get ZIP-level storm opportunity data.\nReturns storm confirmation panel with impact score, revenue estimates.","operationId":"get_zip_opportunity_api_funnel_zip__zip_code__opportunity_get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/zip/{zip_code}/neighborhoods/blurred":{"get":{"tags":["Conversion Funnel"],"summary":"Get Blurred Neighborhoods","description":"Stage 2: Get blurred neighborhood heatmap data.\nReturns neighborhood heat zones without revealing actual scores/names.","operationId":"get_blurred_neighborhoods_api_funnel_zip__zip_code__neighborhoods_blurred_get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/zip/{zip_code}/unlock-status":{"get":{"tags":["Conversion Funnel"],"summary":"Check Unlock Status","description":"Check if neighborhoods are unlocked for this ZIP.","operationId":"check_unlock_status_api_funnel_zip__zip_code__unlock_status_get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/inspection/upload":{"post":{"tags":["Conversion Funnel"],"summary":"Upload Inspection","description":"Stage 4-5: Upload a storm inspection to earn unlock credits.\nAfter 3 inspections, top neighborhoods are revealed.","operationId":"upload_inspection_api_funnel_inspection_upload_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InspectionUpload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/inspection/upload-photo":{"post":{"tags":["Conversion Funnel"],"summary":"Upload Inspection Photo","description":"Upload a photo for an inspection.\nReturns the URL to include in the inspection upload.","operationId":"upload_inspection_photo_api_funnel_inspection_upload_photo_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_inspection_photo_api_funnel_inspection_upload_photo_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/zip/{zip_code}/neighborhoods/top":{"get":{"tags":["Conversion Funnel"],"summary":"Get Top Neighborhoods","description":"Stage 6: Get top neighborhoods after unlock.\nReturns detailed data for unlocked neighborhoods.","operationId":"get_top_neighborhoods_api_funnel_zip__zip_code__neighborhoods_top_get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":3,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/unlock/trial":{"post":{"tags":["Conversion Funnel"],"summary":"Unlock Via Trial","description":"Alternative unlock: Start free trial to reveal all neighborhoods.","operationId":"unlock_via_trial_api_funnel_unlock_trial_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialUnlockRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/zip/{zip_code}/upgrade-info":{"get":{"tags":["Conversion Funnel"],"summary":"Get Upgrade Info","description":"Stage 7: Get info for paid upgrade prompt.\nReturns what user gets with full unlock.","operationId":"get_upgrade_info_api_funnel_zip__zip_code__upgrade_info_get","parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/funnel/analytics/summary":{"get":{"tags":["Conversion Funnel"],"summary":"Get Funnel Analytics","description":"Get funnel analytics summary (admin only in production).","operationId":"get_funnel_analytics_api_funnel_analytics_summary_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/submit":{"post":{"tags":["Inspection Ingestion"],"summary":"Create Submission","description":"Step 1: Create a new inspection submission.\n\nCreates the submission record - files are uploaded separately.\n\nReturns:\n    Submission ID and upload URL for files","operationId":"create_submission_api_inspections_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubmissionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/submit/{submission_id}/files":{"post":{"tags":["Inspection Ingestion"],"summary":"Upload Files","description":"Step 2: Upload inspection files to a submission.\n\nAccepts PDFs, images, documents. Stores raw files first.\n\nReturns:\n    List of file IDs and any duplicate warnings","operationId":"upload_files_api_inspections_submit__submission_id__files_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_files_api_inspections_submit__submission_id__files_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/submit/{submission_id}/process":{"post":{"tags":["Inspection Ingestion"],"summary":"Process Submission","description":"Step 3+: Process the submission through the pipeline.\n\nRuns:\n- Location extraction\n- Storm matching\n- Fraud detection\n- Determines outcome\n\nMay return:\n- location_pending: Need user to confirm/pin location\n- review_pending: Needs admin review\n- approved: Success! Data unlocked\n- rejected: Could not verify","operationId":"process_submission_api_inspections_submit__submission_id__process_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/submit/{submission_id}/confirm-location":{"post":{"tags":["Inspection Ingestion"],"summary":"Confirm Location","description":"Confirm property location when extraction confidence is low.\n\nCalled when user pins location on map or confirms extracted address.\nContinues processing after confirmation.","operationId":"confirm_location_api_inspections_submit__submission_id__confirm_location_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmLocationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/submit/{submission_id}/status":{"get":{"tags":["Inspection Ingestion"],"summary":"Get Submission Status","description":"Get current status of a submission.","operationId":"get_submission_status_api_inspections_submit__submission_id__status_get","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/check-unlock":{"get":{"tags":["Inspection Ingestion"],"summary":"Check Unlock Status","description":"Check if user has unlocked access for a ZIP.\n\nReturns unlock status and available features.","operationId":"check_unlock_status_api_inspections_check_unlock_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"zip_code","in":"query","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/admin/queue":{"get":{"tags":["Inspection Ingestion"],"summary":"Get Review Queue","description":"Get submissions pending admin review.\n\nRequires admin authentication.","operationId":"get_review_queue_api_inspections_admin_queue_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/admin/submission/{submission_id}":{"get":{"tags":["Inspection Ingestion"],"summary":"Get Submission Details","description":"Get detailed submission info for review.","operationId":"get_submission_details_api_inspections_admin_submission__submission_id__get","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/admin/submission/{submission_id}/review":{"post":{"tags":["Inspection Ingestion"],"summary":"Review Submission","description":"Admin approve or reject a submission.","operationId":"review_submission_api_inspections_admin_submission__submission_id__review_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/admin/stats":{"get":{"tags":["Inspection Ingestion"],"summary":"Get Admin Stats","description":"Get submission statistics for admin dashboard.","operationId":"get_admin_stats_api_inspections_admin_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/upload-inspection":{"post":{"tags":["Inspection Ingestion"],"summary":"Legacy Upload Inspection","description":"Legacy single-step upload endpoint.\n\nMaintains backward compatibility with existing frontend.\nCreates submission, uploads file, and processes in one call.","operationId":"legacy_upload_inspection_api_inspections_upload_inspection_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_legacy_upload_inspection_api_inspections_upload_inspection_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/admin/file/{file_id}":{"get":{"tags":["Inspection Ingestion"],"summary":"Get File Preview","description":"Get file content/preview for admin review.\n\nReturns the file content with appropriate content type.\nFor images, returns the image data.\nFor PDFs, returns the PDF data.\nFor text files, returns the extracted text.","operationId":"get_file_preview_api_inspections_admin_file__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inspections/admin/file/{file_id}/text":{"get":{"tags":["Inspection Ingestion"],"summary":"Get File Extracted Text","description":"Get extracted text content from a file.","operationId":"get_file_extracted_text_api_inspections_admin_file__file_id__text_get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maps/geocode":{"post":{"tags":["maps-proxy"],"summary":"Geocode Address","description":"Geocode an address to coordinates.\n\nThis proxies the request through the backend, hiding the API key.","operationId":"geocode_address_api_maps_geocode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maps/reverse-geocode":{"post":{"tags":["maps-proxy"],"summary":"Reverse Geocode","description":"Reverse geocode coordinates to an address.\n\nThis proxies the request through the backend, hiding the API key.","operationId":"reverse_geocode_api_maps_reverse_geocode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseGeocodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maps/usage/stats":{"get":{"tags":["maps-proxy"],"summary":"Get Usage Stats","description":"Get Maps API usage statistics.\n\nAdmin endpoint for monitoring API usage.","operationId":"get_usage_stats_api_maps_usage_stats_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maps/usage/acknowledge-alert/{alert_id}":{"post":{"tags":["maps-proxy"],"summary":"Acknowledge Alert","description":"Acknowledge an alert.","operationId":"acknowledge_alert_api_maps_usage_acknowledge_alert__alert_id__post","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maps/health":{"get":{"tags":["maps-proxy"],"summary":"Maps Health","description":"Check Maps API proxy health.","operationId":"maps_health_api_maps_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/storms":{"get":{"tags":["storms-api"],"summary":"List Storms","description":"List storms with optional filters.\n\nReturns paginated storm data from Supabase.","operationId":"list_storms_api_storms_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state (e.g., 'OKLAHOMA')","title":"State"},"description":"Filter by state (e.g., 'OKLAHOMA')"},{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by ZIP code","title":"Zip Code"},"description":"Filter by ZIP code"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by event type (e.g., 'Hail', 'Tornado')","title":"Event Type"},"description":"Filter by event type (e.g., 'Hail', 'Tornado')"},{"name":"min_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"description":"Minimum opportunity score","title":"Min Score"},"description":"Minimum opportunity score"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Severity category: 'severe', 'significant', 'minor'","title":"Severity"},"description":"Severity category: 'severe', 'significant', 'minor'"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start of date range","title":"Start Date"},"description":"Start of date range"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"End of date range","title":"End Date"},"description":"End of date range"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Results per page","default":50,"title":"Page Size"},"description":"Results per page"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Sort by: 'score', 'date', 'revenue'","default":"score","title":"Sort By"},"description":"Sort by: 'score', 'date', 'revenue'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StormListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/{event_id}":{"get":{"tags":["storms-api"],"summary":"Get Storm","description":"Get a single storm by event ID from Supabase.","operationId":"get_storm_api_storms__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StormResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storms/admin/view-status":{"get":{"tags":["storms-api"],"summary":"Get Api View Status","description":"Get status of the storm data from Supabase.\n\nAdmin endpoint for monitoring the API data health.","operationId":"get_api_view_status_api_storms_admin_view_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/storms/admin/refresh-view":{"post":{"tags":["storms-api"],"summary":"Trigger View Refresh","description":"Manually trigger a refresh of the storm_api_view.\n\nAdmin endpoint - runs the refresh synchronously (may take 1-2 minutes).","operationId":"trigger_view_refresh_api_storms_admin_refresh_view_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/storm-targeting/storm/{episode_id}":{"get":{"tags":["Storm Targeting"],"summary":"Get Storm Targeting Data","description":"Get tiered storm targeting data for the unified Storm Targeting page.\n\nReturns different levels of detail based on the user's subscription tier:\n- Starter: All ZIP codes with breakdowns\n- Professional: H3 clusters ranked by opportunity\n- Enterprise: Neighborhood-level canvassing territories\n\nAll tiers receive the base storm information.","operationId":"get_storm_targeting_data_api_storm_targeting_storm__episode_id__get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/storm/{episode_id}/generate":{"post":{"tags":["Storm Targeting"],"summary":"Generate Targeting Data","description":"Generate or refresh targeting data for a storm.\n\n- starter: Generates ZIP code breakdowns\n- professional: Generates H3 targeting cells (requires hit list)\n- enterprise: Generates canvassing territories (requires H3 cells)","operationId":"generate_targeting_data_api_storm_targeting_storm__episode_id__generate_post","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"tier","in":"query","required":false,"schema":{"type":"string","pattern":"^(starter|professional|enterprise)$","default":"starter","title":"Tier"}},{"name":"zone_count","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":10,"default":100,"title":"Zone Count"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/storm/{episode_id}/export/csv":{"get":{"tags":["Storm Targeting"],"summary":"Export Targeting Csv","description":"Export targeting data as CSV.\n\nAvailable for Professional and Enterprise tiers.","operationId":"export_targeting_csv_api_storm_targeting_storm__episode_id__export_csv_get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"tier","in":"query","required":false,"schema":{"type":"string","pattern":"^(starter|professional|enterprise)$","default":"starter","title":"Tier"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/storm/{episode_id}/refresh-cache":{"post":{"tags":["Storm Targeting"],"summary":"Refresh Storm Cache","description":"Refresh/invalidate the cached H3 cells and territories for a storm.\nForces regeneration on next request.","operationId":"refresh_storm_cache_api_storm_targeting_storm__episode_id__refresh_cache_post","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/cache/stats":{"get":{"tags":["Storm Targeting"],"summary":"Get Cache Stats","description":"Get statistics about cached storm targeting data.\nSuper admin only.","operationId":"get_cache_stats_api_storm_targeting_cache_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/territory/{territory_id}/assign":{"post":{"tags":["Storm Targeting"],"summary":"Assign Territory To Rep","description":"Assign a territory to a sales rep.\nUpdates both the cache and creates an assignment record.","operationId":"assign_territory_to_rep_api_storm_targeting_territory__territory_id__assign_post","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"rep_id","in":"query","required":true,"schema":{"type":"string","description":"User ID of the sales rep to assign","title":"Rep Id"},"description":"User ID of the sales rep to assign"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/territory/{territory_id}/status":{"post":{"tags":["Storm Targeting"],"summary":"Update Territory Status","description":"Update the status of a territory.","operationId":"update_territory_status_api_storm_targeting_territory__territory_id__status_post","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"status","in":"query","required":true,"schema":{"type":"string","pattern":"^(not_started|assigned|in_progress|completed)$","title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/territories/assignments":{"get":{"tags":["Storm Targeting"],"summary":"Get Territory Assignments","description":"Get territory assignments, optionally filtered by episode, rep, or status.","operationId":"get_territory_assignments_api_storm_targeting_territories_assignments_get","parameters":[{"name":"episode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Episode Id"}},{"name":"rep_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rep Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/territory/{territory_id}/route":{"get":{"tags":["Storm Targeting"],"summary":"Get Territory Route","description":"Get optimized walking route for a territory.\nReturns entry points in optimal order with distances and time estimates.","operationId":"get_territory_route_api_storm_targeting_territory__territory_id__route_get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/territory/{territory_id}/progress":{"post":{"tags":["Storm Targeting"],"summary":"Update Territory Progress","description":"Log progress for a territory canvassing session.","operationId":"update_territory_progress_api_storm_targeting_territory__territory_id__progress_post","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"doors_knocked","in":"query","required":true,"schema":{"type":"integer","minimum":0,"description":"Number of doors knocked","title":"Doors Knocked"},"description":"Number of doors knocked"},{"name":"leads_generated","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of leads generated","default":0,"title":"Leads Generated"},"description":"Number of leads generated"},{"name":"sales_closed","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of sales closed","default":0,"title":"Sales Closed"},"description":"Number of sales closed"},{"name":"notes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Storm Targeting"],"summary":"Get Territory Progress","description":"Get progress history and stats for a territory.","operationId":"get_territory_progress_api_storm_targeting_territory__territory_id__progress_get","parameters":[{"name":"territory_id","in":"path","required":true,"schema":{"type":"string","title":"Territory Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-targeting/progress/dashboard":{"get":{"tags":["Storm Targeting"],"summary":"Get Progress Dashboard","description":"Get canvassing progress dashboard for an organization.\nShows daily/weekly stats across all territories.","operationId":"get_progress_dashboard_api_storm_targeting_progress_dashboard_get","parameters":[{"name":"episode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Episode Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Number of days to include","default":7,"title":"Days"},"description":"Number of days to include"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/create-briefing-checkout":{"post":{"tags":["stripe"],"summary":"Create Briefing Checkout","description":"Create a Stripe Checkout session for Storm Intelligence Briefing.\n\nReturns a checkout URL that the frontend should redirect to.","operationId":"create_briefing_checkout_api_stripe_create_briefing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BriefingCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/briefing-session/{session_id}":{"get":{"tags":["stripe"],"summary":"Get Briefing Session","description":"Retrieve a checkout session status (for debugging/verification).","operationId":"get_briefing_session_api_stripe_briefing_session__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/webhook/briefing":{"post":{"tags":["stripe"],"summary":"Stripe Briefing Webhook","description":"Stripe webhook endpoint for briefing purchase events.\n\nHandles checkout.session.completed events to automatically\ngenerate and send Storm Intelligence Briefings.\n\nWebhook should be configured in Stripe dashboard to point to:\nhttps://your-domain.com/api/stripe/webhook/briefing","operationId":"stripe_briefing_webhook_api_stripe_webhook_briefing_post","parameters":[{"name":"Stripe-Signature","in":"header","required":false,"schema":{"type":"string","title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/webhook/briefing/test":{"post":{"tags":["stripe"],"summary":"Test Briefing Webhook","description":"Test endpoint to manually trigger briefing generation.\n\nFor development/testing only - simulates a successful purchase.","operationId":"test_briefing_webhook_api_stripe_webhook_briefing_test_post","parameters":[{"name":"storm_slug","in":"query","required":false,"schema":{"type":"string","default":"test-storm-tx-2026-03-17","title":"Storm Slug"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"test@example.com","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/webhook/briefing/send-test":{"post":{"tags":["stripe"],"summary":"Send Test Briefing","description":"Test endpoint to send a test briefing email with realistic sample data.\nUses insurance claim support calculation for revenue ranges.\n\nFor development/testing only.","operationId":"send_test_briefing_api_stripe_webhook_briefing_send_test_post","parameters":[{"name":"storm_slug","in":"query","required":false,"schema":{"type":"string","default":"test-storm-tx-2026-03-17","title":"Storm Slug"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"test@example.com","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/{slug}":{"get":{"tags":["storm-intelligence"],"summary":"Get Storm By Slug","description":"Get storm intelligence data by slug.\n\nThis endpoint is public (no auth required) for tripwire landing pages.","operationId":"get_storm_by_slug_api_storm_intelligence__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StormIntelligenceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-intelligence/":{"get":{"tags":["storm-intelligence"],"summary":"List Recent Storms","description":"List recent storms for discovery/SEO purposes.","operationId":"list_recent_storms_api_storm_intelligence__get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/contractor-licenses/{state}":{"post":{"tags":["Data Moat Admin"],"summary":"Upload Contractor Licenses","description":"Upload contractor license records for a state.\n\nUsed to detect market saturation from license application patterns.","operationId":"upload_contractor_licenses_api_admin_data_moat_contractor_licenses__state__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContractorLicenseRecord"},"title":"Records"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/contractor-licenses/{state}/csv":{"post":{"tags":["Data Moat Admin"],"summary":"Upload Contractor Licenses Csv","description":"Upload contractor license data from CSV file.\n\nExpected columns: license_number, business_name, applicant_name, \napplicant_state, county, license_type, application_date","operationId":"upload_contractor_licenses_csv_api_admin_data_moat_contractor_licenses__state__csv_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_contractor_licenses_csv_api_admin_data_moat_contractor_licenses__state__csv_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/contractor-licenses/{state}/saturation":{"get":{"tags":["Data Moat Admin"],"summary":"Get Saturation Summary","description":"Get market saturation summary for a state.","operationId":"get_saturation_summary_api_admin_data_moat_contractor_licenses__state__saturation_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/saturation/heatmap":{"get":{"tags":["Data Moat Admin"],"summary":"Get Saturation Heatmap Data","description":"Get market saturation data formatted for heatmap visualization.\n\nReturns GeoJSON-like data with county centroids and saturation levels.\nUsed by deck.gl HeatmapLayer in the admin UI.","operationId":"get_saturation_heatmap_data_api_admin_data_moat_saturation_heatmap_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"states","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"TX,OK,CO,KS,FL","title":"States"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/contractor-licenses/{state}/process":{"post":{"tags":["Data Moat Admin"],"summary":"Process Contractor Licenses","description":"Manually trigger license data processing for a state.","operationId":"process_contractor_licenses_api_admin_data_moat_contractor_licenses__state__process_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/building-permits/{source_id}":{"post":{"tags":["Data Moat Admin"],"summary":"Upload Building Permits","description":"Upload building permit records for a municipality.\n\nsource_id options: dallas_tx, fort_worth_tx, houston_tx, oklahoma_city_ok, denver_co","operationId":"upload_building_permits_api_admin_data_moat_building_permits__source_id__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuildingPermitRecord"},"title":"Records"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/building-permits/{source_id}/csv":{"post":{"tags":["Data Moat Admin"],"summary":"Upload Building Permits Csv","description":"Upload building permit data from CSV file.\n\nExpected columns: permit_number, permit_type, description, work_type,\naddress, zip_code, permit_date, contractor_name, valuation","operationId":"upload_building_permits_csv_api_admin_data_moat_building_permits__source_id__csv_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_building_permits_csv_api_admin_data_moat_building_permits__source_id__csv_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/building-permits/{state}/signals":{"get":{"tags":["Data Moat Admin"],"summary":"Get Permit Damage Signals","description":"Get permit-based damage signals for an area.","operationId":"get_permit_damage_signals_api_admin_data_moat_building_permits__state__signals_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"county","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County"}},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days Back"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/building-permits/{source_id}/process":{"post":{"tags":["Data Moat Admin"],"summary":"Process Building Permits","description":"Manually trigger permit data processing for a source.","operationId":"process_building_permits_api_admin_data_moat_building_permits__source_id__process_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/parcels/{county_id}":{"post":{"tags":["Data Moat Admin"],"summary":"Upload Parcel Data","description":"Upload raw parcel/assessor data for AI normalization.\n\ncounty_id options: harris_tx, dallas_tx, tarrant_tx, oklahoma_ok, denver_co, maricopa_az","operationId":"upload_parcel_data_api_admin_data_moat_parcels__county_id__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"county_id","in":"path","required":true,"schema":{"type":"string","title":"County Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ParcelRecord"},"title":"Records"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/parcels/{county_id}/csv":{"post":{"tags":["Data Moat Admin"],"summary":"Upload Parcel Data Csv","description":"Upload raw parcel data from CSV file.\n\nThe AI normalization service will automatically map columns to the standard schema.","operationId":"upload_parcel_data_csv_api_admin_data_moat_parcels__county_id__csv_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"county_id","in":"path","required":true,"schema":{"type":"string","title":"County Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_parcel_data_csv_api_admin_data_moat_parcels__county_id__csv_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/parcels/{county_id}/process":{"post":{"tags":["Data Moat Admin"],"summary":"Process Parcel Data","description":"Manually trigger AI normalization for a county's parcel data.","operationId":"process_parcel_data_api_admin_data_moat_parcels__county_id__process_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"county_id","in":"path","required":true,"schema":{"type":"string","title":"County Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/parcels/{county_id}/mappings":{"get":{"tags":["Data Moat Admin"],"summary":"Get Field Mappings","description":"Get the AI-generated field mappings for a county.","operationId":"get_field_mappings_api_admin_data_moat_parcels__county_id__mappings_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"county_id","in":"path","required":true,"schema":{"type":"string","title":"County Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/ai-mappings/all":{"get":{"tags":["Data Moat Admin"],"summary":"Get All Ai Mappings","description":"Get all AI-generated field mappings across all counties.\n\nUsed by admin UI to display AI mapping confidence and allow manual corrections.","operationId":"get_all_ai_mappings_api_admin_data_moat_ai_mappings_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/ai-mappings/{county_id}":{"put":{"tags":["Data Moat Admin"],"summary":"Update Field Mapping","description":"Manually update AI field mappings for a county.\n\nUsed by admin to correct AI mapping errors.\n\nExpected body:\n{\n    \"mappings\": {\"source_field\": \"target_field\", ...}\n}","operationId":"update_field_mapping_api_admin_data_moat_ai_mappings__county_id__put","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"county_id","in":"path","required":true,"schema":{"type":"string","title":"County Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Updates"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/data-quality/summary":{"get":{"tags":["Data Moat Admin"],"summary":"Get Data Quality Summary","description":"Get overall data quality metrics across all Data Moat sources.","operationId":"get_data_quality_summary_api_admin_data_moat_data_quality_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/parcels/search":{"get":{"tags":["Data Moat Admin"],"summary":"Search Parcels","description":"Search normalized parcel records.","operationId":"search_parcels_api_admin_data_moat_parcels_search_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}},{"name":"county","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County"}},{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"}},{"name":"min_year_built","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Year Built"}},{"name":"max_year_built","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Year Built"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/canvassing/optimal-times":{"get":{"tags":["Data Moat Admin"],"summary":"Get Optimal Knock Times","description":"Get optimal canvassing times based on cross-org aggregated data.\n\nArgs:\n    day_of_week: Optional day filter (1=Sunday, 7=Saturday)\n\nReturns:\n    Time slots ranked by effectiveness","operationId":"get_optimal_knock_times_api_admin_data_moat_canvassing_optimal_times_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"day_of_week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day Of Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/canvassing/neighborhood/{zip_code}":{"get":{"tags":["Data Moat Admin"],"summary":"Get Neighborhood Recommendation","description":"Get canvassing recommendation for a neighborhood.","operationId":"get_neighborhood_recommendation_api_admin_data_moat_canvassing_neighborhood__zip_code__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/canvassing/storm-timing":{"get":{"tags":["Data Moat Admin"],"summary":"Get Storm Timing Recommendation","description":"Get canvassing timing recommendation based on storm date.\n\nArgs:\n    storm_date: Storm event date (ISO format, e.g., \"2026-03-15\")","operationId":"get_storm_timing_recommendation_api_admin_data_moat_canvassing_storm_timing_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"storm_date","in":"query","required":true,"schema":{"type":"string","title":"Storm Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/canvassing/aggregate":{"post":{"tags":["Data Moat Admin"],"summary":"Trigger Canvassing Aggregation","description":"Manually trigger canvassing behavioral aggregation.","operationId":"trigger_canvassing_aggregation_api_admin_data_moat_canvassing_aggregate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/status":{"get":{"tags":["Data Moat Admin"],"summary":"Get Data Moat Status","description":"Get status of all data moat services.","operationId":"get_data_moat_status_api_admin_data_moat_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DataMoatStatus"},"type":"array","title":"Response Get Data Moat Status Api Admin Data Moat Status Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/test-data/generate":{"post":{"tags":["Data Moat Admin"],"summary":"Generate Test Data","description":"Generate sample test data for all data moat services.\n\nCreates realistic test data for:\n- Contractor licenses (TX)\n- Building permits (dallas_tx)\n- Parcel records (dallas_tx)","operationId":"generate_test_data_api_admin_data_moat_test_data_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/insurance/cancel-job":{"post":{"tags":["Data Moat Admin"],"summary":"Cancel Stuck Ingestion Job","description":"Cancel any stuck ingestion jobs by marking them as failed.","operationId":"cancel_stuck_ingestion_job_api_admin_data_moat_insurance_cancel_job_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/insurance/ingest":{"post":{"tags":["Data Moat Admin"],"summary":"Run Insurance Ingestion","description":"Trigger full insurance claims data ingestion from FEMA sources.\n\nThis fetches and aggregates:\n- FEMA disaster declarations\n- NFIP flood claims\n- Housing Assistance applications\n- Public Assistance projects\n\nArgs:\n    state: Optional state filter (e.g., \"TX\") to limit data fetch\n    background: Run in background (default True)\n\nNote: This runs in the background due to FEMA API rate limits.\nCheck /insurance/status for progress.","operationId":"run_insurance_ingestion_api_admin_data_moat_insurance_ingest_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"background","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Background"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/insurance/composite-score/{zip_code}":{"get":{"tags":["Data Moat Admin"],"summary":"Get Insurance Composite Score","description":"Get composite insurance claim propensity score for a ZIP code.\n\nReturns a score combining:\n- NFIP flood claims history\n- Housing Assistance applications\n- Public Assistance (county level)\n- State claim culture","operationId":"get_insurance_composite_score_api_admin_data_moat_insurance_composite_score__zip_code__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"county","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/insurance/status":{"get":{"tags":["Data Moat Admin"],"summary":"Get Insurance Data Status","description":"Get status of insurance claims data in the system.","operationId":"get_insurance_data_status_api_admin_data_moat_insurance_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/insurance/top-zip-codes":{"get":{"tags":["Data Moat Admin"],"summary":"Get Top Claim Propensity Zips","description":"Get ZIP codes with highest claim propensity scores.\n\nUseful for identifying high-opportunity areas.","operationId":"get_top_claim_propensity_zips_api_admin_data_moat_insurance_top_zip_codes_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/spotter-network/status":{"get":{"tags":["Data Moat Admin"],"summary":"Get Spotter Network Status","description":"Get status of the Spotter Network integration.\n\nReturns:\n- Whether credentials are configured\n- Report counts by type and source\n- Recent ingestion history","operationId":"get_spotter_network_status_api_admin_data_moat_spotter_network_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/spotter-network/ingest":{"post":{"tags":["Data Moat Admin"],"summary":"Run Spotter Network Ingestion","description":"Trigger manual Spotter Network data ingestion.\n\nArgs:\n    lookback_hours: Hours to look back (note: API returns last 180 mins max)\n    target_states: Comma-separated state codes to filter (e.g., \"TX,OK,KS\")\n\nReturns:\n    Ingestion results including reports fetched and stored","operationId":"run_spotter_network_ingestion_api_admin_data_moat_spotter_network_ingest_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"lookback_hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Lookback Hours"}},{"name":"target_states","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target States"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/spotter-network/test-auth":{"get":{"tags":["Data Moat Admin"],"summary":"Test Spotter Network Auth","description":"Test Spotter Network authentication.\n\nAttempts to authenticate with configured credentials and returns\nwhether authentication was successful.","operationId":"test_spotter_network_auth_api_admin_data_moat_spotter_network_test_auth_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/spotter-network/reports":{"get":{"tags":["Data Moat Admin"],"summary":"Get Spotter Reports","description":"Query stored spotter reports.\n\nArgs:\n    state: Filter by state code (e.g., \"TX\")\n    report_type: Filter by type (tornado, hail, wind, damage, etc.)\n    hours_back: Look back period in hours\n    limit: Max results to return\n\nReturns:\n    List of matching spotter reports","operationId":"get_spotter_reports_api_admin_data_moat_spotter_network_reports_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"report_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Type"}},{"name":"hours_back","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours Back"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/cocorahs/status":{"get":{"tags":["Data Moat Admin"],"summary":"Get Cocorahs Status","description":"Get status of CoCoRaHS hail data integration.\n\nReturns:\n- Total report counts\n- Counts by state\n- Recent activity summary\n- MRMS calibration status","operationId":"get_cocorahs_status_api_admin_data_moat_cocorahs_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/cocorahs/ingest":{"post":{"tags":["Data Moat Admin"],"summary":"Run Cocorahs Ingestion","description":"Trigger manual CoCoRaHS hail data ingestion.\n\nArgs:\n    days_back: Number of days to fetch (default 7)\n    states: Comma-separated state codes to filter (e.g., \"TX,OK,KS\")\n\nReturns:\n    Ingestion results","operationId":"run_cocorahs_ingestion_api_admin_data_moat_cocorahs_ingest_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days Back"}},{"name":"states","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"States"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/cocorahs/calibrate-mrms":{"post":{"tags":["Data Moat Admin"],"summary":"Build Mrms Calibration","description":"Build MRMS radar calibration factors from CoCoRaHS ground-truth data.\n\nArgs:\n    min_samples: Minimum samples needed per state for calibration\n    days_back: How far back to analyze\n\nReturns:\n    Calibration factors by state","operationId":"build_mrms_calibration_api_admin_data_moat_cocorahs_calibrate_mrms_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"min_samples","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Min Samples"}},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Days Back"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/cocorahs/activity/{state}":{"get":{"tags":["Data Moat Admin"],"summary":"Get Cocorahs Activity","description":"Get recent hail activity summary for a state.\n\nArgs:\n    state: State code (e.g., \"TX\")\n    hours_back: Time window (default 48 hours)\n\nReturns:\n    Activity summary with report counts, sizes, etc.","operationId":"get_cocorahs_activity_api_admin_data_moat_cocorahs_activity__state__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"hours_back","in":"query","required":false,"schema":{"type":"integer","default":48,"title":"Hours Back"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/nws/status":{"get":{"tags":["Data Moat Admin"],"summary":"Get Nws Alerts Status","description":"Get status of NWS weather alerts integration.\n\nReturns:\n- Total alert counts\n- Alerts by event type, state, severity\n- Recent alert summary","operationId":"get_nws_alerts_status_api_admin_data_moat_nws_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/nws/ingest":{"post":{"tags":["Data Moat Admin"],"summary":"Run Nws Alert Ingestion","description":"Trigger manual NWS weather alert ingestion.\n\nArgs:\n    states: Comma-separated state codes (defaults to hail belt states)\n    severe_only: Only fetch severe weather alerts (default True)\n\nReturns:\n    Ingestion results","operationId":"run_nws_alert_ingestion_api_admin_data_moat_nws_ingest_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"states","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"States"}},{"name":"severe_only","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Severe Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/nws/alerts/live":{"get":{"tags":["Data Moat Admin"],"summary":"Fetch Live Nws Alerts","description":"Fetch live alerts directly from NWS API (not from database).\n\nArgs:\n    state: Optional state code filter\n    event_type: Optional event type filter (e.g., \"Tornado Warning\")\n\nReturns:\n    Live alerts from NWS API","operationId":"fetch_live_nws_alerts_api_admin_data_moat_nws_alerts_live_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/nws/alerts/point":{"get":{"tags":["Data Moat Admin"],"summary":"Get Nws Alerts For Point","description":"Get active weather warnings for a specific geographic point.\n\nArgs:\n    lat: Latitude\n    lon: Longitude\n\nReturns:\n    Active warnings affecting the specified point","operationId":"get_nws_alerts_for_point_api_admin_data_moat_nws_alerts_point_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","title":"Lon"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/nws/alerts/{state}":{"get":{"tags":["Data Moat Admin"],"summary":"Get Stored Nws Alerts","description":"Query stored NWS alerts from MongoDB.\n\nArgs:\n    state: State code (e.g., \"TX\")\n    hours_back: How far back to look (default 24)\n    event_type: Optional event type filter\n\nReturns:\n    Stored alerts matching criteria","operationId":"get_stored_nws_alerts_api_admin_data_moat_nws_alerts__state__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}},{"name":"hours_back","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours Back"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/utility-outages/status":{"get":{"tags":["Data Moat Admin"],"summary":"Get Utility Outages Status","description":"Get status of utility outage monitoring.\n\nReturns:\n- Recent outage summary by state\n- Total customers affected\n- Configured utilities","operationId":"get_utility_outages_status_api_admin_data_moat_utility_outages_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/utility-outages/live/{state}":{"get":{"tags":["Data Moat Admin"],"summary":"Get Live State Outages","description":"Fetch live outage data from all utilities in a state.\n\nThis queries the utility APIs directly for real-time data.\n\nArgs:\n    state: State abbreviation (e.g., \"TX\")\n\nReturns:\n    Live outage data from utility APIs","operationId":"get_live_state_outages_api_admin_data_moat_utility_outages_live__state__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/utility-outages/utility/{utility_id}":{"get":{"tags":["Data Moat Admin"],"summary":"Get Utility Outages","description":"Fetch live outage data from a specific utility.\n\nArgs:\n    utility_id: Utility identifier (e.g., \"oncor\", \"centerpoint\", \"oge\", \"fpl\")\n\nReturns:\n    Live outage data from the utility's API","operationId":"get_utility_outages_api_admin_data_moat_utility_outages_utility__utility_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"utility_id","in":"path","required":true,"schema":{"type":"string","title":"Utility Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/utility-outages/ingest":{"post":{"tags":["Data Moat Admin"],"summary":"Run Utility Outage Ingestion","description":"Trigger manual utility outage data ingestion.\n\nArgs:\n    states: Comma-separated state codes (defaults to all monitored states)\n\nReturns:\n    Ingestion results","operationId":"run_utility_outage_ingestion_api_admin_data_moat_utility_outages_ingest_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"states","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"States"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/utility-outages/configured":{"get":{"tags":["Data Moat Admin"],"summary":"Get Configured Utilities","description":"Get list of configured utility APIs.\n\nReturns:\n    List of utilities with their API configuration","operationId":"get_configured_utilities_api_admin_data_moat_utility_outages_configured_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/utility-outages/poweroutage-us/{state}":{"get":{"tags":["Data Moat Admin"],"summary":"Get Poweroutage Us State","description":"Fetch outage data from PowerOutage.us for a specific state.\n\nPowerOutage.us aggregates data from 900+ utilities nationwide.\nNote: May be blocked by Cloudflare protection.\n\nArgs:\n    state: State abbreviation (e.g., \"TX\")\n\nReturns:\n    Outage data from PowerOutage.us","operationId":"get_poweroutage_us_state_api_admin_data_moat_utility_outages_poweroutage_us__state__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/utility-outages/test/{state}":{"get":{"tags":["Data Moat Admin"],"summary":"Test Utility Outage Sources","description":"Test all utility outage data sources for a state.\n\nReturns status of each source (working, blocked, error) and any data retrieved.\nUseful for debugging which APIs are functioning.\n\nArgs:\n    state: State abbreviation (e.g., \"TX\")\n\nReturns:\n    Test results for each data source","operationId":"test_utility_outage_sources_api_admin_data_moat_utility_outages_test__state__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/utility-outages/manual-entry":{"post":{"tags":["Data Moat Admin"],"summary":"Submit Manual Outage","description":"Manually submit utility outage data.\n\nUse this during storms when automatic data collection is unavailable.\n\nArgs:\n    entry: Outage data with state, utility name, and customer count\n\nReturns:\n    Confirmation of stored data","operationId":"submit_manual_outage_api_admin_data_moat_utility_outages_manual_entry_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualOutageEntry"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/utility-outages/bulk-entry":{"post":{"tags":["Data Moat Admin"],"summary":"Submit Bulk Outages","description":"Submit outage data for multiple states at once.\n\nArgs:\n    bulk: List of outage entries for different states\n\nReturns:\n    Summary of stored data","operationId":"submit_bulk_outages_api_admin_data_moat_utility_outages_bulk_entry_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOutageEntry"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/utility-outages/recent-entries":{"get":{"tags":["Data Moat Admin"],"summary":"Get Recent Outage Entries","description":"Get recent outage entries (both manual and automatic).\n\nArgs:\n    hours_back: How far back to look (default 48 hours)\n    state: Optional state filter\n\nReturns:\n    Recent outage snapshots","operationId":"get_recent_outage_entries_api_admin_data_moat_utility_outages_recent_entries_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"hours_back","in":"query","required":false,"schema":{"type":"integer","default":48,"title":"Hours Back"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/scores/recalculate":{"post":{"tags":["Data Moat Admin"],"summary":"Recalculate Opportunity Scores","description":"Trigger recalculation of opportunity scores using new Data Moat signals.\n\nThis updates existing storm_opportunity_scores with:\n- Insurance claim propensity signals\n- Actual parcel data (roof age, property values)\n- Canvassing behavioral patterns\n- Spotter Network ground-truth data\n- CoCoRaHS hail measurements\n- NWS active weather alerts\n- Updated revenue predictions\n\nArgs:\n    state: Optional filter by state (e.g., \"TX\")\n    limit: Max storms to recalculate (default 100000 for \"all\")\n    chunk_size: Number of storms to fetch per chunk (default 1000)\n    source: Force specific collection: \"noaa\", \"scores\", or \"auto\" (default)\n\nReturns:\n    Job status and count of storms queued for recalculation","operationId":"recalculate_opportunity_scores_api_admin_data_moat_scores_recalculate_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100000,"title":"Limit"}},{"name":"chunk_size","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Chunk Size"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/scores/recalculation-status":{"get":{"tags":["Data Moat Admin"],"summary":"Get Recalculation Status","description":"Get status of recent score recalculation jobs.","operationId":"get_recalculation_status_api_admin_data_moat_scores_recalculation_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/scores/recalculation-diagnose":{"get":{"tags":["Data Moat Admin"],"summary":"Diagnose Recalculation","description":"Diagnostic endpoint to help debug recalculation issues in production.\nShows collection counts and sample data to verify what's available.","operationId":"diagnose_recalculation_api_admin_data_moat_scores_recalculation_diagnose_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/scores/recalculation-cancel":{"post":{"tags":["Data Moat Admin"],"summary":"Cancel Recalculation Job","description":"Cancel/reset a stuck recalculation job.\n\nArgs:\n    job_id: Specific job ID to cancel (optional - cancels all running if not provided)\n\nReturns:\n    Confirmation of cancelled job(s)","operationId":"cancel_recalculation_job_api_admin_data_moat_scores_recalculation_cancel_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/scores/test-single-storm":{"get":{"tags":["Data Moat Admin"],"summary":"Test Single Storm Scoring","description":"Test scoring a single storm synchronously to diagnose failures.\nThis runs in the request thread, not background, so errors are visible.","operationId":"test_single_storm_scoring_api_admin_data_moat_scores_test_single_storm_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/scores/recalculate-sync":{"get":{"tags":["Data Moat Admin"],"summary":"Recalculate Sync","description":"Synchronous recalculation (runs in request, not background).\nUse this to test if batch processing works. Limited to 100 storms max.","operationId":"recalculate_sync_api_admin_data_moat_scores_recalculate_sync_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/scores/recalculation-cancel-all":{"get":{"tags":["Data Moat Admin"],"summary":"Cancel All Recalculation Jobs","description":"Cancel ALL stuck/running recalculation jobs (GET for easy browser access).","operationId":"cancel_all_recalculation_jobs_api_admin_data_moat_scores_recalculation_cancel_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/scores/recalculation-status-detailed":{"get":{"tags":["Data Moat Admin"],"summary":"Get Recalculation Status Detailed","description":"Get detailed status of recalculation including stuck detection.","operationId":"get_recalculation_status_detailed_api_admin_data_moat_scores_recalculation_status_detailed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/scores/recalculation-resume":{"post":{"tags":["Data Moat Admin"],"summary":"Resume Recalculation Job","description":"Resume a stuck/cancelled recalculation job from where it left off.\n\nThis is useful when a job gets stuck in production - instead of restarting\nfrom scratch, resume from the last successfully processed chunk.\n\nArgs:\n    job_id: The job ID to resume (from recalculation-diagnose)\n\nReturns:\n    New job status continuing from the previous progress","operationId":"resume_recalculation_job_api_admin_data_moat_scores_recalculation_resume_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"query","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/scores/sample-enhanced":{"get":{"tags":["Data Moat Admin"],"summary":"Get Sample Enhanced Scores","description":"Get sample of scores with Data Moat enhancements for verification.\n\nReturns scores that have the new data_moat_signals and enhanced components.","operationId":"get_sample_enhanced_scores_api_admin_data_moat_scores_sample_enhanced_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/export/transfer-package":{"get":{"tags":["Data Moat Admin"],"summary":"Download Transfer Package","description":"Download a complete transfer package with JSON files and Python script.\n\nJust unzip and run: python transfer_to_prod.py","operationId":"download_transfer_package_api_admin_data_moat_export_transfer_package_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/export/download":{"get":{"tags":["Data Moat Admin"],"summary":"Download Data Export","description":"Download pre-exported FEMA and ML data as compressed archives.\n\nAvailable parts:\n- No part param: fema_ml_data.tar.gz (2.8MB) - FEMA + ML data (recommended first)\n- part=storms1 through part=storms8: Storm events in 8 parts (~20MB each)\n\nThis allows transferring data from preview to production without\nre-running the FEMA API ingestion.","operationId":"download_data_export_api_admin_data_moat_export_download_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"part","in":"query","required":false,"schema":{"type":"string","title":"Part"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-moat/export/list":{"get":{"tags":["Data Moat Admin"],"summary":"List Available Exports","description":"List all available export files with download URLs.","operationId":"list_available_exports_api_admin_data_moat_export_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/data-moat/import/upload":{"post":{"tags":["Data Moat Admin"],"summary":"Upload Data Import","description":"Import data from an exported archive.\n\nUpload a fema_data_export.tar.gz file to import data into this environment.","operationId":"upload_data_import_api_admin_data_moat_import_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_data_import_api_admin_data_moat_import_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/fema-ingestion/download-backup":{"get":{"tags":["FEMA Ingestion Admin"],"summary":"Download Backup","description":"Download MongoDB backup file.","operationId":"download_backup_api_admin_fema_ingestion_download_backup_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/status":{"get":{"tags":["FEMA Ingestion Admin"],"summary":"Get Ingestion Status","description":"Get overall status of FEMA data ingestion.\nShows staging/production counts, active jobs, and data quality.","operationId":"get_ingestion_status_api_admin_fema_ingestion_status_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/job/{job_id}":{"get":{"tags":["FEMA Ingestion Admin"],"summary":"Get Job Status","description":"Get detailed status of a specific job.","operationId":"get_job_status_api_admin_fema_ingestion_job__job_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/nfip/start":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Start Nfip Ingestion","description":"Start NFIP flood claims ingestion from FEMA API.\n\nThis fetches historical NFIP claims data (2005-present by default)\nand stores in staging collection for validation before promotion.","operationId":"start_nfip_ingestion_api_admin_fema_ingestion_nfip_start_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/nfip/resume/{job_id}":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Resume Nfip Ingestion","description":"Resume a failed/stopped NFIP ingestion job from last checkpoint.","operationId":"resume_nfip_ingestion_api_admin_fema_ingestion_nfip_resume__job_id__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/ihp/start":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Start Ihp Ingestion","description":"Start IHP housing assistance ingestion from FEMA API.\n\nThis fetches Individual & Households Program data including\nrepair amounts, replacement amounts, and rental assistance.","operationId":"start_ihp_ingestion_api_admin_fema_ingestion_ihp_start_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/validate/{collection}":{"get":{"tags":["FEMA Ingestion Admin"],"summary":"Validate Staging Data","description":"Validate data in staging collection before promotion.\n\nReturns detailed report on data quality, distribution, and issues.","operationId":"validate_staging_data_api_admin_fema_ingestion_validate__collection__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/promote":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Promote To Production","description":"Promote validated staging data to production.\n\nThis should only be called after validation passes.\nUse merge=True to add to existing data, merge=False to replace.","operationId":"promote_to_production_api_admin_fema_ingestion_promote_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromotionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/match-claims":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Start Claims Matching","description":"Match FEMA claims to NOAA storms via disaster declarations.\n\nThis creates linkages between storms and their associated claims\nfor ML training and revenue estimation.","operationId":"start_claims_matching_api_admin_fema_ingestion_match_claims_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/generate-ml-training":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Generate Ml Training","description":"Generate ML training data from storm-claim linkages.\n\nCreates training records with features (storm characteristics, exposure)\nand labels (claim counts, amounts) for model training.","operationId":"generate_ml_training_api_admin_fema_ingestion_generate_ml_training_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/run-full-pipeline":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Run Full Pipeline","description":"Run the complete FEMA ingestion pipeline in sequence:\n1. Ingest NFIP claims\n2. Ingest IHP assistance\n3. Match claims to storms\n4. Generate ML training data\n\nThis is designed for production deployment via developer console.\nProgress can be monitored via /status endpoint.","operationId":"run_full_pipeline_api_admin_fema_ingestion_run_full_pipeline_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"start_year","in":"query","required":false,"schema":{"type":"integer","maximum":2026,"minimum":2000,"default":2005,"title":"Start Year"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/cancel/{job_id}":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Cancel Job","description":"Cancel a running job.","operationId":"cancel_job_api_admin_fema_ingestion_cancel__job_id__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/staging/{collection}":{"delete":{"tags":["FEMA Ingestion Admin"],"summary":"Clear Staging","description":"Clear staging collection (use before re-running ingestion).","operationId":"clear_staging_api_admin_fema_ingestion_staging__collection__delete","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/nfip/sync-batch":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Sync Nfip Batch","description":"Process NFIP records synchronously in a single request.\n\nThis is more reliable than background tasks in production because:\n- No asyncio task to get garbage collected\n- No worker recycling issues\n- Request completes or fails visibly\n\nCall repeatedly with increasing skip values:\n- First call: skip=0, limit=10000\n- Second call: skip=10000, limit=10000\n- Continue until records_fetched < limit (means we hit the end)\n\nReturns the next skip value to use.","operationId":"sync_nfip_batch_api_admin_fema_ingestion_nfip_sync_batch_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","description":"Skip this many records","default":0,"title":"Skip"},"description":"Skip this many records"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"description":"Records to process (max 20000)","default":10000,"title":"Limit"},"description":"Records to process (max 20000)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/nfip/auto-sync":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Auto Sync Nfip","description":"Process multiple batches in a single request (synchronously).\n\nMore efficient than calling sync-batch repeatedly.\nWill stop when:\n- max_batches reached\n- FEMA API returns 503\n- No more records\n\nReturns progress and the skip value to continue from.","operationId":"auto_sync_nfip_api_admin_fema_ingestion_nfip_auto_sync_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"start_skip","in":"query","required":false,"schema":{"type":"integer","description":"Starting skip value","default":0,"title":"Start Skip"},"description":"Starting skip value"},{"name":"max_batches","in":"query","required":false,"schema":{"type":"integer","maximum":50,"description":"Max batches to process","default":10,"title":"Max Batches"},"description":"Max batches to process"},{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"description":"Records per batch","default":5000,"title":"Batch Size"},"description":"Records per batch"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/diagnose-perf":{"get":{"tags":["FEMA Ingestion Admin"],"summary":"Diagnose Performance","description":"Diagnose what's slow - tests each component individually.","operationId":"diagnose_performance_api_admin_fema_ingestion_diagnose_perf_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/test-fema-fetch":{"get":{"tags":["FEMA Ingestion Admin"],"summary":"Test Fema Fetch Only","description":"Test FEMA fetch timing without any DB operations.","operationId":"test_fema_fetch_only_api_admin_fema_ingestion_test_fema_fetch_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/nfip/quick":{"post":{"tags":["FEMA Ingestion Admin"],"summary":"Quick Nfip Batch","description":"Ultra-fast NFIP fetch - only 500 records with 15s timeout.\nUses bulk writes for speed.","operationId":"quick_nfip_batch_api_admin_fema_ingestion_nfip_quick_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","description":"Skip this many records","default":0,"title":"Skip"},"description":"Skip this many records"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fema-ingestion/nfip/loop":{"get":{"tags":["FEMA Ingestion Admin"],"summary":"Loop Nfip Ingestion","description":"Run multiple quick batches in sequence.\nUses streaming response to avoid gateway timeout.","operationId":"loop_nfip_ingestion_api_admin_fema_ingestion_nfip_loop_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Start"}},{"name":"batches","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":10,"title":"Batches"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/overture/status":{"get":{"tags":["Overture Ingestion Admin"],"summary":"Get Overture Status","description":"Get overall status of Overture building data ingestion.\nShows ingestion log, active jobs, and table counts.","operationId":"get_overture_status_api_admin_overture_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/overture/job/{job_id}":{"get":{"tags":["Overture Ingestion Admin"],"summary":"Get Job Status","description":"Get detailed status of a specific ingestion job.","operationId":"get_job_status_api_admin_overture_job__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/overture/trigger-ingestion":{"post":{"tags":["Overture Ingestion Admin"],"summary":"Trigger Ingestion","description":"Trigger Overture building data ingestion for specific states.\n\nRuns in background. Monitor progress via /status or /job/{job_id}.\n\nExample:\n    POST /api/admin/overture/trigger-ingestion?states=TX&states=FL&states=CO","operationId":"trigger_ingestion_api_admin_overture_trigger_ingestion_post","parameters":[{"name":"states","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"description":"State codes to ingest, e.g. TX,FL,CO","title":"States"},"description":"State codes to ingest, e.g. TX,FL,CO"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/overture/run-full-pipeline":{"post":{"tags":["Overture Ingestion Admin"],"summary":"Run Full Pipeline","description":"Run full Overture ingestion for all 30 priority states in sequence.\n\nEstimated runtime: 4-7 hours. Monitor via /status.","operationId":"run_full_pipeline_api_admin_overture_run_full_pipeline_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/overture/refresh-views":{"post":{"tags":["Overture Ingestion Admin"],"summary":"Refresh Views","description":"Refresh overture_zip_exposure and overture_h3_exposure materialized views.\nLightweight — does not re-ingest data from Azure.","operationId":"refresh_views_api_admin_overture_refresh_views_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/overture/backfill-zip-exposure":{"post":{"tags":["Overture Ingestion Admin"],"summary":"Backfill Zip Exposure","description":"Sync Overture data into zip_exposure_profiles table.\nRun after ingestion or view refresh.","operationId":"backfill_zip_exposure_api_admin_overture_backfill_zip_exposure_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/overture/cancel/{job_id}":{"post":{"tags":["Overture Ingestion Admin"],"summary":"Cancel Job","description":"Cancel a running ingestion job.","operationId":"cancel_job_api_admin_overture_cancel__job_id__post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/supabase/status":{"get":{"tags":["supabase-admin"],"summary":"Supabase Status","description":"Return Supabase/PostGIS connection status (no auth required for health checks).","operationId":"supabase_status_api_admin_supabase_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/supabase/init-schema":{"post":{"tags":["supabase-admin"],"summary":"Supabase Init Schema","description":"Enable PostGIS and create all spatial tables + indexes.","operationId":"supabase_init_schema_api_admin_supabase_init_schema_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/supabase/tables":{"get":{"tags":["supabase-admin"],"summary":"Supabase List Tables","description":"List all Supabase tables with row counts.","operationId":"supabase_list_tables_api_admin_supabase_tables_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/supabase/test-spatial":{"post":{"tags":["supabase-admin"],"summary":"Supabase Test Spatial","description":"Run a spatial smoke test — insert a point, query it, then delete it.","operationId":"supabase_test_spatial_api_admin_supabase_test_spatial_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/supabase/build-polygons/phase1":{"post":{"tags":["supabase-admin"],"summary":"Build Polygons Phase1","description":"Trigger Phase 1: build convex-hull impact zones from storm_events point cloud.\nRuns in background; poll /polygon-stats or /polygon-job-status for progress.","operationId":"build_polygons_phase1_api_admin_supabase_build_polygons_phase1_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/supabase/build-polygons/phase2":{"post":{"tags":["supabase-admin"],"summary":"Build Polygons Phase2","description":"Trigger Phase 2: enhance polygons with official NWS Storm-Based Warnings from IEM API.\nRuns in background; poll /polygon-stats or /polygon-job-status for progress.","operationId":"build_polygons_phase2_api_admin_supabase_build_polygons_phase2_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/supabase/polygon-job-status":{"get":{"tags":["supabase-admin"],"summary":"Get Polygon Job Status","description":"Live status of the last phase-1 and phase-2 background dispatches.","operationId":"get_polygon_job_status_api_admin_supabase_polygon_job_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/supabase/polygon-stats":{"get":{"tags":["supabase-admin"],"summary":"Get Polygon Stats","description":"Current stats on the storm_polygons table.","operationId":"get_polygon_stats_api_admin_supabase_polygon_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/storm-polygons/market-leaderboard":{"get":{"tags":["storm-polygons"],"summary":"Get Market Leaderboard","description":"Return top storms ranked by PostGIS-derived revenue opportunity.\nUses ST_Intersects to aggregate zip_property_stats within each storm polygon.\nResults are cached in-memory for 10 minutes.","operationId":"get_market_leaderboard_api_storm_polygons_market_leaderboard_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"description":"Look-back window in days","default":180,"title":"Days"},"description":"Look-back window in days"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-polygons/count-properties":{"post":{"tags":["storm-polygons"],"summary":"Count Properties In Polygon","description":"Count properties within a user-drawn GeoJSON polygon.\nUses ST_Contains on the property_locations table (2.5M records).\nReturns property count, ZIP breakdown, and revenue estimate.","operationId":"count_properties_in_polygon_api_storm_polygons_count_properties_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolygonCountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-polygons/{episode_id}":{"get":{"tags":["storm-polygons"],"summary":"Get Storm Polygon","description":"Return the GeoJSON polygon for a single storm episode.\nUsed to render the impact zone overlay on the Opportunity Radar and Canvassing maps.\n\nIf no pre-built polygon exists, generates one on-the-fly from storm_events\nusing PostGIS ST_Buffer + ST_ConvexHull. Results cached 30 minutes.","operationId":"get_storm_polygon_api_storm_polygons__episode_id__get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-polygons/viewport/geojson":{"get":{"tags":["storm-polygons"],"summary":"Get Viewport Polygons","description":"Return all storm impact zone polygons within a map viewport bounding box.\nUseful for rendering multiple storm zones on the Opportunity Radar overview.","operationId":"get_viewport_polygons_api_storm_polygons_viewport_geojson_get","parameters":[{"name":"min_lat","in":"query","required":true,"schema":{"type":"number","description":"South bound of viewport","title":"Min Lat"},"description":"South bound of viewport"},{"name":"max_lat","in":"query","required":true,"schema":{"type":"number","description":"North bound of viewport","title":"Max Lat"},"description":"North bound of viewport"},{"name":"min_lng","in":"query","required":true,"schema":{"type":"number","description":"West bound of viewport","title":"Min Lng"},"description":"West bound of viewport"},{"name":"max_lng","in":"query","required":true,"schema":{"type":"number","description":"East bound of viewport","title":"Max Lng"},"description":"East bound of viewport"},{"name":"event_type","in":"query","required":false,"schema":{"type":"string","description":"Filter by event type","title":"Event Type"},"description":"Filter by event type"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-polygons/{episode_id}/property-estimate":{"get":{"tags":["storm-polygons"],"summary":"Get Property Estimate","description":"Estimate buildings and property value at risk using PostGIS ST_DWithin.\nResults cached for 30 minutes per episode.","operationId":"get_property_estimate_api_storm_polygons__episode_id__property_estimate_get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-analytics/historical-density":{"get":{"tags":["storm-analytics"],"summary":"Get Historical Density","description":"Return aggregated storm density data for the Storm Season Heatmap.\nCovers storm_events table for the full 2005-2026 historical record.","operationId":"get_historical_density_api_storm_analytics_historical_density_get","parameters":[{"name":"event_type","in":"query","required":false,"schema":{"type":"string","description":"Filter by event type","title":"Event Type"},"description":"Filter by event type"},{"name":"start_year","in":"query","required":false,"schema":{"type":"integer","default":2005,"title":"Start Year"}},{"name":"end_year","in":"query","required":false,"schema":{"type":"integer","default":2026,"title":"End Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-analytics/state/{state_name}":{"get":{"tags":["storm-analytics"],"summary":"Get State Detail","description":"Deep-dive historical storm data for a single US state.\nReturns annual trend + seasonal pattern + event breakdown.","operationId":"get_state_detail_api_storm_analytics_state__state_name__get","parameters":[{"name":"state_name","in":"path","required":true,"schema":{"type":"string","title":"State Name"}},{"name":"start_year","in":"query","required":false,"schema":{"type":"integer","default":2005,"title":"Start Year"}},{"name":"end_year","in":"query","required":false,"schema":{"type":"integer","default":2026,"title":"End Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-analytics/insurance-propensity":{"get":{"tags":["storm-analytics"],"summary":"Get Insurance Propensity","description":"Return insurance propensity scores per ZIP code, aggregated from\nFEMA NFIP flood insurance claims and IHP disaster assistance registrations.\nUsed to colour the Storm Season Heatmap with a 'market readiness' overlay.","operationId":"get_insurance_propensity_api_storm_analytics_insurance_propensity_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"Filter by state abbreviation (e.g. TX)","title":"State"},"description":"Filter by state abbreviation (e.g. TX)"},{"name":"min_claims","in":"query","required":false,"schema":{"type":"integer","description":"Min NFIP claims to include a ZIP","default":3,"title":"Min Claims"},"description":"Min NFIP claims to include a ZIP"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-analytics/insurance-propensity-state":{"get":{"tags":["storm-analytics"],"summary":"Get Insurance Propensity State","description":"Fast state-level insurance propensity summary.\nReturns FEMA NFIP claim counts and total payout per state.\nUsed for the Insurance Propensity heatmap overlay on the Opportunity Radar.\n\nCaching strategy (stale-while-revalidate):\n- <24h: serve cache directly.\n- >24h: serve stale cache instantly + kick off async refresh.\n- no cache: block on a 20s-bounded rebuild. On timeout return 504.","operationId":"get_insurance_propensity_state_api_storm_analytics_insurance_propensity_state_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/storm-analytics/outage-correlation":{"get":{"tags":["storm-analytics"],"summary":"Get Outage Correlation","description":"Return utility outage events correlated with storm episodes.\nUses the utility_outages PostGIS table (populated by ingest_utility_outages.py).\nFalls back to state-level aggregation if the table is empty.","operationId":"get_outage_correlation_api_storm_analytics_outage_correlation_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"Filter by state (e.g. TX)","title":"State"},"description":"Filter by state (e.g. TX)"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","description":"Look-back window in days","default":365,"title":"Days"},"description":"Look-back window in days"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storm-analytics/fema-loss-heatmap":{"get":{"tags":["storm-analytics"],"summary":"Get Fema Loss Heatmap","description":"Returns ZIP-level FEMA historical loss data joined with lat/lon coordinates\nfrom zip_property_stats. Used to render the 45-year FEMA Loss Map heatmap\noverlay on the Opportunity Radar.\n\nWeights are log-normalised total_paid values (0-10) suitable for deck.gl\nHeatmapLayer. Results cached in MongoDB for 24 hours.","operationId":"get_fema_loss_heatmap_api_storm_analytics_fema_loss_heatmap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/canvassing-territories/stats":{"get":{"tags":["canvassing-territories"],"summary":"Get Territory Stats","description":"Overall stats on the canvassing territories table.","operationId":"get_territory_stats_api_canvassing_territories_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/canvassing-territories/{episode_id}":{"get":{"tags":["canvassing-territories"],"summary":"Get Territories For Episode","description":"Return all canvassing territories for a storm episode.\nIncludes GeoJSON geometry and property metadata.","operationId":"get_territories_for_episode_api_canvassing_territories__episode_id__get","parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler/status":{"get":{"tags":["scheduler-admin"],"summary":"Get Scheduler Status","description":"Return all scheduled jobs with next run times.","operationId":"get_scheduler_status_api_admin_scheduler_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/trigger/{job_id}":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Job","description":"Manually trigger a named APScheduler job immediately.","operationId":"trigger_job_api_admin_scheduler_trigger__job_id__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler/storm-backfill":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Storm Backfill","description":"Trigger an immediate PostGIS→MongoDB storm backfill.\nProcesses storm events from the last `days_back` days that are\nnot yet in storm_scores / storm_api_view.\nRuns in the background — check logs for progress.","operationId":"trigger_storm_backfill_api_admin_scheduler_storm_backfill_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","default":365,"title":"Days Back"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler/revenue-refresh":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Revenue Refresh","description":"Recompute total_revenue for ALL storm clusters using PostGIS spatial query.\n\nApplies contractor capture rate (2.5%) and claim approval rate (67%) so\nfigures represent realistic per-contractor opportunity, not total market size.\nRuns in background — check server logs for progress.","operationId":"trigger_revenue_refresh_api_admin_scheduler_revenue_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/unified-model/status":{"get":{"tags":["scheduler-admin"],"summary":"Unified Model Status","description":"Return current unified damage model metadata.","operationId":"unified_model_status_api_admin_scheduler_unified_model_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/unified-model/reload":{"post":{"tags":["scheduler-admin"],"summary":"Reload Unified Model","description":"Force-reload the unified model from disk/MongoDB without retraining.","operationId":"reload_unified_model_api_admin_scheduler_unified_model_reload_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/unified-model/train":{"post":{"tags":["scheduler-admin"],"summary":"Train Unified Model","description":"Train the unified damage predictor on all NOAA + NFIP data.\nSet sample > 0 for a quick test run (e.g. sample=100000).\nRuns in background — model auto-reloads when done.","operationId":"train_unified_model_api_admin_scheduler_unified_model_train_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"sample","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Sample"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler/property-refresh-for-storm/{episode_id}":{"post":{"tags":["scheduler-admin"],"summary":"Property Refresh For Storm","description":"Storm-triggered property_locations refresh.\nFinds affected ZIPs via PostGIS spatial lookup using the storm's bounding box, then:\n  1. UPDATEs existing property_locations rows with fresh avg_value.\n  2. INSERTs missing rows so Property Counter works immediately.","operationId":"property_refresh_for_storm_api_admin_scheduler_property_refresh_for_storm__episode_id__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","title":"Episode Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler/census-refresh":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Census Refresh","description":"Trigger an immediate Census ACS data refresh.\n\nFetches housing and demographic data (median income, home values, \nhousing units, owner-occupied %) from Census Bureau API for all ZCTAs.\nUpdates zip_property_stats in PostGIS and exposure_data in MongoDB.\n\nRuns in background — check server logs for progress.","operationId":"trigger_census_refresh_api_admin_scheduler_census_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/utility-outage-refresh":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Utility Outage Refresh","description":"Trigger an immediate utility outage data refresh.\n\nDerives utility outage estimates from storm events with property damage.\nCorrelates power outages with storm activity for damage validation.\n\nRuns in background — check server logs for progress.","operationId":"trigger_utility_outage_refresh_api_admin_scheduler_utility_outage_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/h3-hexagon-populate":{"post":{"tags":["scheduler-admin"],"summary":"Trigger H3 Hexagon Populate","description":"Populate H3 hexagonal cells from recent storm events.\n\nConverts storm centroids into H3 hexagons for fine-grained spatial analysis.\nResolution 9 = ~0.1 km² (good for suburban), Resolution 10 = ~0.015 km² (urban).\n\nArgs:\n    days_back: How many days of storm data to process (default 90)\n    resolution: H3 resolution level 8-11 (default 9)\n\nRuns in background — check server logs for progress.","operationId":"trigger_h3_hexagon_populate_api_admin_scheduler_h3_hexagon_populate_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Days Back"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"integer","default":9,"title":"Resolution"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler/data-moat-status":{"get":{"tags":["scheduler-admin"],"summary":"Get Data Moat Status","description":"Get current status of all Data Moat components.\nShows row counts and last update times for key data sources.","operationId":"get_data_moat_status_api_admin_scheduler_data_moat_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/backfill-cocorahs":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Cocorahs Backfill","description":"Backfill historical CoCoRaHS hail reports.\n\nArgs:\n    start_date: Start date in YYYY-MM-DD format (default: 2020-01-01)\n    end_date: End date in YYYY-MM-DD format (default: today)\n    states: Comma-separated state codes (default: all hail belt states)\n\nCoCoRaHS data goes back to ~2010 with good coverage.\nRuns in background — check logs for progress.","operationId":"trigger_cocorahs_backfill_api_admin_scheduler_backfill_cocorahs_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","default":"2020-01-01","title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","title":"End Date"}},{"name":"states","in":"query","required":false,"schema":{"type":"string","title":"States"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler/backfill-lsr":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Lsr Backfill","description":"Backfill historical NWS Local Storm Reports from IEM.\n\nArgs:\n    start_date: Start date in YYYY-MM-DD format (default: 2020-01-01)\n    end_date: End date in YYYY-MM-DD format (default: today)\n    states: Comma-separated state codes (optional filter)\n    use_ai: Whether to use AI for damage parsing (expensive, default: false)\n\nIEM LSR data goes back to ~2003 with excellent coverage.\nRuns in background — check logs for progress.","operationId":"trigger_lsr_backfill_api_admin_scheduler_backfill_lsr_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","default":"2020-01-01","title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","title":"End Date"}},{"name":"states","in":"query","required":false,"schema":{"type":"string","title":"States"}},{"name":"use_ai","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Use Ai"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/scheduler/backfill-status":{"get":{"tags":["scheduler-admin"],"summary":"Get Backfill Status","description":"Get current status of backfill data sources (CoCoRaHS and LSR).\n\nReturns record counts, date ranges, and recommendations for backfill.","operationId":"get_backfill_status_api_admin_scheduler_backfill_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/property-enrichment":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Property Enrichment","description":"Enrich property data with Census-derived roof ages and targeting signals.\n\nUpdates zip_property_stats with:\n- avg_roof_age_years (from Census median_year_built)\n- properties.median_income (for ability-to-pay scoring)\n- properties.owner_occupied_rate (homeowner vs renter)\n- properties.estimated_roof_condition (good/fair/poor based on age)\n- properties.targeting_priority (composite score)\n\nRuns in background — check server logs for progress.","operationId":"trigger_property_enrichment_api_admin_scheduler_property_enrichment_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/partner-billing/run-monthly":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Partner Monthly Billing","description":"Manually trigger the monthly partner billing job.\n\nThis will:\n1. Calculate overage for all partners with active subscriptions\n2. Create Stripe invoice items for overages above the minimum threshold\n3. Record billing in the database\n\nNote: Does NOT reset counters - use /partner-billing/reset-monthly for that.","operationId":"trigger_partner_monthly_billing_api_admin_scheduler_partner_billing_run_monthly_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/partner-billing/reset-monthly":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Partner Monthly Reset","description":"Manually reset monthly usage counters for all partners.\n\nWARNING: This should typically only be run on the 1st of each month,\nor for testing purposes.","operationId":"trigger_partner_monthly_reset_api_admin_scheduler_partner_billing_reset_monthly_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/partner-billing/reset-daily":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Partner Daily Reset","description":"Manually reset daily usage counters for all partners.","operationId":"trigger_partner_daily_reset_api_admin_scheduler_partner_billing_reset_daily_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/partner-billing/check-usage-alerts":{"post":{"tags":["scheduler-admin"],"summary":"Trigger Partner Usage Alerts","description":"Manually check for partners approaching usage limits and send alerts.","operationId":"trigger_partner_usage_alerts_api_admin_scheduler_partner_billing_check_usage_alerts_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/scheduler/partner-billing/status":{"get":{"tags":["scheduler-admin"],"summary":"Get Partner Billing Status","description":"Get overview of partner billing status.\n\nReturns:\n- Total partners by tier\n- Partners with overages this month\n- Pending overage invoices\n- Recent billing activity","operationId":"get_partner_billing_status_api_admin_scheduler_partner_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/partner-management/applications":{"post":{"tags":["Partner Management"],"summary":"Submit Application","description":"Submit a partner API application.\nPublic endpoint - no authentication required.\nSandbox tier is auto-approved with instant key provisioning.","operationId":"submit_application_api_admin_partner_management_applications_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApplicationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Partner Management"],"summary":"List Applications","description":"List partner applications (admin only).","operationId":"list_applications_api_admin_partner_management_applications_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PartnerStatus"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/applications/{application_id}":{"get":{"tags":["Partner Management"],"summary":"Get Application","description":"Get a specific application.","operationId":"get_application_api_admin_partner_management_applications__application_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/applications/{application_id}/approve":{"post":{"tags":["Partner Management"],"summary":"Approve Application","description":"Approve a partner application and generate API key.","operationId":"approve_application_api_admin_partner_management_applications__application_id__approve_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveApplicationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/applications/{application_id}/reject":{"post":{"tags":["Partner Management"],"summary":"Reject Application","description":"Reject a partner application.","operationId":"reject_application_api_admin_partner_management_applications__application_id__reject_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectApplicationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/keys":{"get":{"tags":["Partner Management"],"summary":"List Api Keys","description":"List all API keys (admin only).","operationId":"list_api_keys_api_admin_partner_management_keys_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PartnerStatus"},{"type":"null"}],"title":"Status"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PartnerTier"},{"type":"null"}],"title":"Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/keys/{key_id}":{"get":{"tags":["Partner Management"],"summary":"Get Api Key","description":"Get API key details (not the actual key).","operationId":"get_api_key_api_admin_partner_management_keys__key_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Partner Management"],"summary":"Update Api Key","description":"Update API key settings.","operationId":"update_api_key_api_admin_partner_management_keys__key_id__put","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAPIKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/keys/{key_id}/rotate":{"post":{"tags":["Partner Management"],"summary":"Rotate Api Key","description":"Generate a new API key (invalidates old one).","operationId":"rotate_api_key_api_admin_partner_management_keys__key_id__rotate_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/keys/{key_id}/suspend":{"post":{"tags":["Partner Management"],"summary":"Suspend Api Key","description":"Suspend an API key.","operationId":"suspend_api_key_api_admin_partner_management_keys__key_id__suspend_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/keys/{key_id}/activate":{"post":{"tags":["Partner Management"],"summary":"Activate Api Key","description":"Reactivate a suspended API key.","operationId":"activate_api_key_api_admin_partner_management_keys__key_id__activate_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/analytics/overview":{"get":{"tags":["Partner Management"],"summary":"Get Partner Analytics Overview","description":"Get overview of partner API usage.","operationId":"get_partner_analytics_overview_api_admin_partner_management_analytics_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/admin/partner-management/analytics/key/{key_id}":{"get":{"tags":["Partner Management"],"summary":"Get Key Usage Analytics","description":"Get detailed usage analytics for a specific API key.","operationId":"get_key_usage_analytics_api_admin_partner_management_analytics_key__key_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/partner-management/tiers":{"get":{"tags":["Partner Management"],"summary":"Get Tier Configuration","description":"Get all tier configurations.","operationId":"get_tier_configuration_api_admin_partner_management_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/partner/apply":{"post":{"tags":["Partner Application"],"summary":"Submit Partner Application Public","description":"Public endpoint for partner API applications.","operationId":"submit_partner_application_public_api_partner_apply_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Request"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/storm/overview":{"get":{"tags":["Partner API v1"],"summary":"Get Storm Overview","description":"Get current storm activity overview.\n\nReturns active storm counts, recent activity, and general market conditions.\nAvailable on all tiers including Sandbox.","operationId":"get_storm_overview_api_v1_partner_storm_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/partner/storm/forecasts":{"get":{"tags":["Partner API v1"],"summary":"Get Storm Forecasts","description":"Get SPC storm outlook/forecast data.\n\nReturns convective outlook zones and risk levels for the next 1-7 days.\nAvailable on all tiers including Sandbox.","operationId":"get_storm_forecasts_api_v1_partner_storm_forecasts_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":7,"minimum":1,"default":3,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/storm/active-count":{"get":{"tags":["Partner API v1"],"summary":"Get Active Storm Count","description":"Get count of active storms in the last N hours.\n\nQuick lightweight endpoint for dashboards and monitoring.\nAvailable on all tiers including Sandbox.","operationId":"get_active_storm_count_api_v1_partner_storm_active_count_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Hours"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/storm/alerts":{"get":{"tags":["Partner API v1"],"summary":"Get Storm Alerts","description":"Get recent storm alerts/warnings.\n\nReturns high-severity weather events from the last 48 hours.\nAvailable on all tiers including Sandbox.","operationId":"get_storm_alerts_api_v1_partner_storm_alerts_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/opportunities":{"get":{"tags":["Partner API v1"],"summary":"Get Opportunities","description":"Get scored storm opportunities.\n\nReturns storms ranked by opportunity score with revenue estimates.\nRequires Growth tier or higher.","operationId":"get_opportunities_api_v1_partner_opportunities_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1,"minimum":0,"default":0.3,"title":"Min Score"}},{"name":"days_back","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days Back"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/opportunities/top":{"get":{"tags":["Partner API v1"],"summary":"Get Top Opportunities","description":"Get top-ranked storm opportunities (last 7 days).\n\nQuick endpoint for \"best opportunities right now\" use case.\nRequires Growth tier or higher.","operationId":"get_top_opportunities_api_v1_partner_opportunities_top_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":10,"title":"Limit"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/storm/{storm_id}":{"get":{"tags":["Partner API v1"],"summary":"Get Storm Detail","description":"Get detailed information about a specific storm.\n\nRequires Growth tier or higher.","operationId":"get_storm_detail_api_v1_partner_storm__storm_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/storm/{storm_id}/score":{"get":{"tags":["Partner API v1"],"summary":"Get Storm Score","description":"Get opportunity score details for a storm.\n\nRequires Growth tier or higher.\nEnterprise tier gets full score component breakdown.","operationId":"get_storm_score_api_v1_partner_storm__storm_id__score_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/analytics/insurance-propensity":{"get":{"tags":["Partner API v1"],"summary":"Get Insurance Propensity","description":"Get insurance claim propensity metrics by state.\n\nBased on historical FEMA claims data.\nRequires Growth tier or higher.","operationId":"get_insurance_propensity_api_v1_partner_analytics_insurance_propensity_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/pipeline/status":{"get":{"tags":["Partner API v1"],"summary":"Get Pipeline Status","description":"Get current data pipeline status.\n\nShows data freshness and ingestion status.\nRequires Growth tier or higher.","operationId":"get_pipeline_status_api_v1_partner_pipeline_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/partner/properties/target":{"get":{"tags":["Partner API v1"],"summary":"Get Property Targeting","description":"Get property targeting data for a storm.\n\nReturns properties affected by a storm, with prioritization scores.\nProfessional tier: max 100 per call\nEnterprise tier: max 500 per call","operationId":"get_property_targeting_api_v1_partner_properties_target_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"storm_id","in":"query","required":true,"schema":{"type":"string","description":"Storm ID to target","title":"Storm Id"},"description":"Storm ID to target"},{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/properties/{zip_code}":{"get":{"tags":["Partner API v1"],"summary":"Get Properties By Zip","description":"Get property data for a ZIP code.\n\nReturns aggregated property statistics and demographics.\nRequires Professional tier or higher.","operationId":"get_properties_by_zip_api_v1_partner_properties__zip_code__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"zip_code","in":"path","required":true,"schema":{"type":"string","title":"Zip Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/clusters/{h3_index}":{"get":{"tags":["Partner API v1"],"summary":"Get H3 Cluster","description":"Get data for an H3 hexagon cluster.\n\nReturns population density, storm history, and risk factors.\nRequires Professional tier or higher.","operationId":"get_h3_cluster_api_v1_partner_clusters__h3_index__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"h3_index","in":"path","required":true,"schema":{"type":"string","title":"H3 Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/fema/claims":{"get":{"tags":["Partner API v1"],"summary":"Get Fema Claims Summary","description":"Get FEMA claims data summary.\n\nHistorical insurance claims aggregated by geography.\nRequires Professional tier or higher.\nEnterprise tier can access more granular data.","operationId":"get_fema_claims_summary_api_v1_partner_fema_claims_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"}},{"name":"disaster_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disaster Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/info":{"get":{"tags":["Partner API v1"],"summary":"Get Api Info","description":"Get API information and current key status.\n\nReturns tier, limits, and usage for the authenticated API key.","operationId":"get_api_info_api_v1_partner_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/partner/health":{"get":{"tags":["Partner API v1"],"summary":"Partner Api Health","description":"API health check (no auth required).\n\nUse this to verify API availability.","operationId":"partner_api_health_api_v1_partner_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/partner/changelog":{"get":{"tags":["Partner API v1"],"summary":"Get Api Changelog","description":"API changelog — no auth required.","operationId":"get_api_changelog_api_v1_partner_changelog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/partner/targeting/generate":{"post":{"tags":["Partner API v1"],"summary":"Generate Storm Targeting","description":"Generate neighborhood-level targeting data for a storm.\n\nReturns H3 hex clusters ranked by canvass efficiency with:\n- Center coordinates for each cluster\n- Building count, residential count, avg property value\n- Roof age distribution\n- Recommended canvass priority score\n- Property addresses in the cluster\n\nProfessional tier required.","operationId":"generate_storm_targeting_api_v1_partner_targeting_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_generate_storm_targeting_api_v1_partner_targeting_generate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/partner/quickstart":{"get":{"tags":["Partner API v1"],"summary":"Get Quickstart Guide","description":"Quickstart guide content — no auth required.","operationId":"get_quickstart_guide_api_v1_partner_quickstart_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/partner/mcp/config":{"get":{"tags":["Partner API v1"],"summary":"Get Mcp Config","description":"Generate MCP client configuration for the authenticated partner.\n\nReturns connection config for Claude Desktop, Cursor, and other MCP clients.\nRequires Growth tier or above.","operationId":"get_mcp_config_api_v1_partner_mcp_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/partner/contractors":{"get":{"tags":["Partner API v1"],"summary":"Get Contractors","description":"Get licensed contractors in a given state/city.\n\nReturns contractor name, license number, license type, city, state,\nand expiration date. Professional tier required.","operationId":"get_contractors_api_v1_partner_contractors_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"state","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":2,"title":"State"}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"license_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/storm/historical":{"get":{"tags":["Partner API v1"],"summary":"Get Historical Storms","description":"Historical storm archive (2005-present).\n\nQuery historical storm events with filters for state, event type,\ndate range, and minimum magnitude. Professional tier required.","operationId":"get_historical_storms_api_v1_partner_storm_historical_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"year_start","in":"query","required":false,"schema":{"type":"integer","default":2005,"title":"Year Start"}},{"name":"year_end","in":"query","required":false,"schema":{"type":"integer","default":2026,"title":"Year End"}},{"name":"min_magnitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Magnitude"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/usage/summary":{"get":{"tags":["Partner Usage"],"summary":"Get Usage Summary","description":"Usage summary for the authenticated partner.\n\nReturns daily call counts, endpoint breakdown, error rates,\ncurrent limits, and remaining quota.","operationId":"get_usage_summary_api_v1_partner_usage_summary_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/webhooks/register":{"post":{"tags":["Webhooks"],"summary":"Register Webhook","description":"Register a webhook URL for event notifications.\nEnterprise tier required.","operationId":"register_webhook_api_v1_partner_webhooks_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_register_webhook_api_v1_partner_webhooks_register_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/partner/webhooks/":{"get":{"tags":["Webhooks"],"summary":"List Webhooks","description":"List registered webhooks for the authenticated partner.","operationId":"list_webhooks_api_v1_partner_webhooks__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/partner/webhooks/{webhook_id}":{"delete":{"tags":["Webhooks"],"summary":"Delete Webhook","description":"Delete a registered webhook.","operationId":"delete_webhook_api_v1_partner_webhooks__webhook_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/bulk-export/":{"post":{"tags":["Bulk Export"],"summary":"Create Bulk Export","description":"Create an async bulk export job.\n\nReturns a job_id. Poll GET /v1/partner/bulk-export/{job_id} for status.\nWhen complete, a signed download URL is provided.\nExport files expire after 24 hours. Enterprise tier required.","operationId":"create_bulk_export_api_v1_partner_bulk_export__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_bulk_export_api_v1_partner_bulk_export__post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/partner/bulk-export/{job_id}":{"get":{"tags":["Bulk Export"],"summary":"Get Export Status","description":"Check status of a bulk export job.","operationId":"get_export_status_api_v1_partner_bulk_export__job_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partner/bulk-export/{job_id}/download":{"get":{"tags":["Bulk Export"],"summary":"Download Export","description":"Download a completed export file.","operationId":"download_export_api_v1_partner_bulk_export__job_id__download_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partner-billing/create-subscription":{"post":{"tags":["Partner Billing"],"summary":"Create Subscription","description":"Create a Stripe checkout session for a partner subscription.\n\nAfter successful payment, the webhook will activate the partner's API key.","operationId":"create_subscription_api_partner_billing_create_subscription_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partner-billing/create-overage-invoice":{"post":{"tags":["Partner Billing"],"summary":"Create Overage Invoice","description":"Create an invoice for overage charges at month end.\n\nAdmin-only endpoint called by the monthly billing job.","operationId":"create_overage_invoice_api_partner_billing_create_overage_invoice_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverageInvoiceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/partner-billing/subscription/{partner_id}":{"get":{"tags":["Partner Billing"],"summary":"Get Subscription Status","description":"Get subscription status for a partner.","operationId":"get_subscription_status_api_partner_billing_subscription__partner_id__get","parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"string","title":"Partner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partner-billing/cancel-subscription/{partner_id}":{"post":{"tags":["Partner Billing"],"summary":"Cancel Subscription","description":"Cancel a partner's subscription.","operationId":"cancel_subscription_api_partner_billing_cancel_subscription__partner_id__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"partner_id","in":"path","required":true,"schema":{"type":"string","title":"Partner Id"}},{"name":"immediate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Immediate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partner-billing/webhook":{"post":{"tags":["Partner Billing"],"summary":"Stripe Partner Webhook","description":"Handle Stripe webhooks for partner subscriptions and billing.\n\nEvents handled:\n- checkout.session.completed: Activate subscription\n- customer.subscription.updated: Handle tier changes\n- customer.subscription.deleted: Downgrade to sandbox\n- invoice.payment_failed: Alert and track failures\n- invoice.paid: Track successful payments, mark overages paid\n- invoice.payment_succeeded: Clear payment failure flags","operationId":"stripe_partner_webhook_api_partner_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/partner-billing/pricing":{"get":{"tags":["Partner Billing"],"summary":"Get Pricing Info","description":"Get public pricing information for partner API tiers.","operationId":"get_pricing_info_api_partner_billing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/partner/portal/me":{"get":{"tags":["Partner Portal"],"summary":"Get Partner Profile","description":"Get partner profile and usage statistics.\n\nReturns account info, usage stats, and rate limit details.\nAuthenticate with X-API-Key header.","operationId":"get_partner_profile_api_partner_portal_me_get","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partner/portal/rotate-key":{"post":{"tags":["Partner Portal"],"summary":"Rotate Api Key","description":"Rotate (regenerate) the partner's API key.\n\nThis will:\n1. Generate a new API key\n2. Immediately invalidate the current key\n3. Return the new key (only shown once)\n\nWARNING: The old key will stop working immediately.","operationId":"rotate_api_key_api_partner_portal_rotate_key_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partner/portal/usage/daily":{"get":{"tags":["Partner Portal"],"summary":"Get Daily Usage","description":"Get daily usage breakdown for the past N days.","operationId":"get_daily_usage_api_partner_portal_usage_daily_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partner/portal/usage/endpoints":{"get":{"tags":["Partner Portal"],"summary":"Get Endpoint Usage","description":"Get endpoint usage breakdown for the past N days.","operationId":"get_endpoint_usage_api_partner_portal_usage_endpoints_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/storm-overview":{"get":{"tags":["openai-plugin"],"summary":"Active storm overview","description":"Returns a real-time snapshot of active US storm activity: counts by type (hail, tornado, wind, flood), top affected states, and current SPC convective outlook level. Updated every 15 minutes.","operationId":"storm_overview_api_plugin_storm_overview_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/forecast-opportunities":{"get":{"tags":["openai-plugin"],"summary":"Scored forecast storm opportunities","description":"Analyzes today's and tomorrow's SPC convective outlooks and cross-references with property exposure data to predict the best revenue opportunities BEFORE storms hit. Returns ranked opportunities with threat type, probability, estimated revenue, and top cities.","operationId":"forecast_opportunities_api_plugin_forecast_opportunities_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/top-opportunities":{"get":{"tags":["openai-plugin"],"summary":"Top-scored storm opportunities (last 30 days)","description":"Returns storms ranked by opportunity score (0-100) with revenue estimates, affected property counts, and storm classification.","operationId":"top_opportunities_api_plugin_top_opportunities_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"2-letter state code, e.g. TX","title":"State"},"description":"2-letter state code, e.g. TX"},{"name":"min_score","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":0,"description":"Minimum opportunity score (0-100)","default":60,"title":"Min Score"},"description":"Minimum opportunity score (0-100)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max results","default":10,"title":"Limit"},"description":"Max results"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/storm-score/{storm_id}":{"get":{"tags":["openai-plugin"],"summary":"Detailed score breakdown for a specific storm","description":"Returns the composite opportunity score (0-100) and component breakdown: storm relevance, property economics, and replacement probability.","operationId":"storm_score_api_plugin_storm_score__storm_id__get","parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/properties":{"get":{"tags":["openai-plugin"],"summary":"Search targetable properties by ZIP code","description":"Returns property records in a ZIP code with owner name, address, building sqft, estimated roof age, and property value. Use to plan canvassing after a storm.","operationId":"search_properties_api_plugin_properties_get","parameters":[{"name":"zip_code","in":"query","required":true,"schema":{"type":"string","description":"5-digit US ZIP code, e.g. 76109","title":"Zip Code"},"description":"5-digit US ZIP code, e.g. 76109"},{"name":"owner_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"individual, joint, or entity","title":"Owner Type"},"description":"individual, joint, or entity"},{"name":"min_roof_age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Minimum roof age in years","title":"Min Roof Age"},"description":"Minimum roof age in years"},{"name":"min_sqft","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Minimum building square footage","title":"Min Sqft"},"description":"Minimum building square footage"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/canvass-clusters/{storm_id}":{"get":{"tags":["openai-plugin"],"summary":"H3 canvass clusters for a storm","description":"Returns pre-computed hexagonal grid clusters ranked by canvassing priority. Each cluster has center coordinates, building count, avg roof age, property values, and estimated revenue.","operationId":"canvass_clusters_api_plugin_canvass_clusters__storm_id__get","parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"description":"Minimum priority score","default":0.3,"title":"Min Score"},"description":"Minimum priority score"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/neighborhood-targeting/{storm_id}":{"get":{"tags":["openai-plugin"],"summary":"Neighborhood door-knocking targets for a storm","description":"Returns ZIP-level clusters ranked by canvass priority with property details. Use to plan crew routing — start with highest priority (older roofs, more buildings, closer to storm center).","operationId":"neighborhood_targeting_api_plugin_neighborhood_targeting__storm_id__get","parameters":[{"name":"storm_id","in":"path","required":true,"schema":{"type":"string","title":"Storm Id"}},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","description":"Search radius from storm center in miles","default":15.0,"title":"Radius Miles"},"description":"Search radius from storm center in miles"},{"name":"min_roof_age","in":"query","required":false,"schema":{"type":"integer","description":"Only include areas with roofs this age or older","default":10,"title":"Min Roof Age"},"description":"Only include areas with roofs this age or older"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/insurance-propensity":{"get":{"tags":["openai-plugin"],"summary":"Insurance claim propensity by state","description":"Returns claim culture scores per state — how likely property owners are to file after storm damage. Higher = more claim-friendly = better market for contractors.","operationId":"insurance_propensity_api_plugin_insurance_propensity_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"2-letter state code. Omit for all states.","title":"State"},"description":"2-letter state code. Omit for all states."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/fema-claims":{"get":{"tags":["openai-plugin"],"summary":"Historical FEMA flood insurance claims by state","description":"Returns aggregated FEMA NFIP claim data by ZIP code showing frequency and dollar amounts of flood-related insurance claims.","operationId":"fema_claims_api_plugin_fema_claims_get","parameters":[{"name":"state","in":"query","required":true,"schema":{"type":"string","description":"2-letter state code, e.g. TX","title":"State"},"description":"2-letter state code, e.g. TX"},{"name":"year_start","in":"query","required":false,"schema":{"type":"integer","description":"Start year","default":2015,"title":"Year Start"},"description":"Start year"},{"name":"year_end","in":"query","required":false,"schema":{"type":"integer","description":"End year","default":2026,"title":"Year End"},"description":"End year"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin/pipeline-status":{"get":{"tags":["openai-plugin"],"summary":"StormAxis data pipeline health","description":"Returns last ingestion timestamps, record counts, and data freshness for each data source. Use to verify data recency before making decisions.","operationId":"pipeline_status_api_plugin_pipeline_status_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/outcomes/submit":{"post":{"tags":["outcomes"],"summary":"Submit Outcome","description":"Submit a job outcome for a storm event.\nImmediately writes to storm_outcomes collection.\nQueues ML retrain signal if >= 25 new outcomes since last retrain.","operationId":"submit_outcome_api_outcomes_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutcomeSubmission"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutcomeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/outcomes/stats/{state}":{"get":{"tags":["outcomes"],"summary":"Get Outcome Stats","description":"Return win-rate and payout stats for a state. Used for revenue model calibration.","operationId":"get_outcome_stats_api_outcomes_stats__state__get","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dispatch/events":{"get":{"tags":["water-dispatch"],"summary":"List active water dispatch events for contractor territory","operationId":"get_active_events_api_v1_water_dispatch_events_get","parameters":[{"name":"min_tier","in":"query","required":false,"schema":{"type":"string","description":"Minimum urgency tier to include","default":"moderate","title":"Min Tier"},"description":"Minimum urgency tier to include"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WaterDispatchEventResponse"},"title":"Response Get Active Events Api V1 Water Dispatch Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dispatch/events/{water_event_id}/properties":{"get":{"tags":["water-dispatch"],"summary":"Ranked property list for a water event","operationId":"get_event_properties_api_v1_water_dispatch_events__water_event_id__properties_get","parameters":[{"name":"water_event_id","in":"path","required":true,"schema":{"type":"string","title":"Water Event Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"min_urgency","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.0,"title":"Min Urgency"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterDispatchPropertiesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dispatch/sessions":{"post":{"tags":["water-dispatch"],"summary":"Start a new dispatch session","operationId":"start_session_api_v1_water_dispatch_sessions_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartSessionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterDispatchSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dispatch/sessions/{session_id}/route":{"get":{"tags":["water-dispatch"],"summary":"Get or refresh the dispatch route for a session","operationId":"get_session_route_api_v1_water_dispatch_sessions__session_id__route_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"start_lat","in":"query","required":true,"schema":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Start Lat"}},{"name":"start_lon","in":"query","required":true,"schema":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Start Lon"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchRouteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dispatch/sessions/{session_id}/knocks":{"post":{"tags":["water-dispatch"],"summary":"Log a door knock result","operationId":"log_door_knock_api_v1_water_dispatch_sessions__session_id__knocks_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterDoorKnockRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Log Door Knock Api V1 Water Dispatch Sessions  Session Id  Knocks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dispatch/sessions/{session_id}/complete":{"put":{"tags":["water-dispatch"],"summary":"Complete a dispatch session and record job outcomes","operationId":"complete_session_api_v1_water_dispatch_sessions__session_id__complete_put","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WaterJobOutcomeRequest"},"title":"Outcomes"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dispatch/scripts/{event_type}":{"get":{"tags":["water-dispatch"],"summary":"Get door knock script for an event type","operationId":"get_door_knock_script_api_v1_water_dispatch_scripts__event_type__get","parameters":[{"name":"event_type","in":"path","required":true,"schema":{"type":"string","title":"Event Type"}},{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{5}$"},{"type":"null"}],"description":"ZIP code for property-profile enrichment","title":"Zip Code"},"description":"ZIP code for property-profile enrichment"},{"name":"neighborhood","in":"query","required":false,"schema":{"type":"string","default":"your neighborhood","title":"Neighborhood"}},{"name":"event_date","in":"query","required":false,"schema":{"type":"string","default":"the recent event","title":"Event Date"}},{"name":"building_age_description","in":"query","required":false,"schema":{"type":"string","default":"older","title":"Building Age Description"}},{"name":"category_description","in":"query","required":false,"schema":{"type":"string","default":"significant","title":"Category Description"}},{"name":"contractor_name","in":"query","required":false,"schema":{"type":"string","default":"our technician","title":"Contractor Name"}},{"name":"company_name","in":"query","required":false,"schema":{"type":"string","default":"our company","title":"Company Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DoorKnockScriptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dispatch/sessions/{session_id}":{"get":{"tags":["water-dispatch"],"summary":"Get dispatch session details","operationId":"get_session_api_v1_water_dispatch_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterDispatchSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dashboard/summary":{"get":{"tags":["water-dashboard"],"summary":"Dashboard KPI summary for water restoration contractor","operationId":"get_dashboard_summary_api_v1_water_dashboard_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaterDashboardSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dashboard/urgency-map":{"get":{"tags":["water-dashboard"],"summary":"ZIP-level urgency scores for map overlay","operationId":"get_urgency_map_api_v1_water_dashboard_urgency_map_get","parameters":[{"name":"north","in":"query","required":false,"schema":{"type":"number","maximum":90.0,"minimum":-90.0,"description":"North latitude (default: CONUS)","default":49.0,"title":"North"},"description":"North latitude (default: CONUS)"},{"name":"south","in":"query","required":false,"schema":{"type":"number","maximum":90.0,"minimum":-90.0,"description":"South latitude (default: CONUS)","default":24.0,"title":"South"},"description":"South latitude (default: CONUS)"},{"name":"east","in":"query","required":false,"schema":{"type":"number","maximum":180.0,"minimum":-180.0,"description":"East longitude (default: CONUS)","default":-66.0,"title":"East"},"description":"East longitude (default: CONUS)"},{"name":"west","in":"query","required":false,"schema":{"type":"number","maximum":180.0,"minimum":-180.0,"description":"West longitude (default: CONUS)","default":-125.0,"title":"West"},"description":"West longitude (default: CONUS)"},{"name":"sw_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"deprecated":true,"title":"Sw Lat"},"deprecated":true},{"name":"sw_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"deprecated":true,"title":"Sw Lon"},"deprecated":true},{"name":"ne_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"deprecated":true,"title":"Ne Lat"},"deprecated":true},{"name":"ne_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"deprecated":true,"title":"Ne Lon"},"deprecated":true},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ZipUrgencyMapPoint"},"title":"Response Get Urgency Map Api V1 Water Dashboard Urgency Map Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dashboard/mold-alerts":{"get":{"tags":["water-dashboard"],"summary":"Active mold risk alerts for contractor territory","operationId":"get_mold_alerts_api_v1_water_dashboard_mold_alerts_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MoldRiskAlertResponse"},"title":"Response Get Mold Alerts Api V1 Water Dashboard Mold Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dashboard/job-outcomes":{"get":{"tags":["water-dashboard"],"summary":"Job outcome history for ML feedback and reporting","operationId":"get_job_outcomes_api_v1_water_dashboard_job_outcomes_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOutcomesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dashboard/stream-gauges":{"get":{"tags":["water-dashboard"],"summary":"Nearby USGS stream gauge readings","operationId":"get_stream_gauges_api_v1_water_dashboard_stream_gauges_get","parameters":[{"name":"zip_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{5}$"},{"type":"null"}],"title":"Zip Code"}},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":500.0,"minimum":1.0,"default":75.0,"title":"Radius Km"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreamGaugeResponse"},"title":"Response Get Stream Gauges Api V1 Water Dashboard Stream Gauges Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/water/dashboard/territory-risk":{"get":{"tags":["water-dashboard"],"summary":"Risk profile for contractor's service territory","operationId":"get_territory_risk_api_v1_water_dashboard_territory_risk_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerritoryRiskProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ws/storm-alerts/stats":{"get":{"tags":["websocket"],"summary":"Get Websocket Stats","description":"Get WebSocket connection statistics (admin only).","operationId":"get_websocket_stats_api_ws_storm_alerts_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/":{"get":{"summary":"Root","operationId":"root_api__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health":{"get":{"summary":"Health Check","description":"Comprehensive health check endpoint.\nReturns detailed status of all infrastructure components:\n- MongoDB (primary database)\n- PostGIS (geospatial database)\n- Scheduler status","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health/reconciliation":{"get":{"tags":["health"],"summary":"Reconciliation Health","description":"Return the most recent reconciliation report from db.reconciliation_reports.\nPass ?run_now=true to trigger an immediate on-demand check (admin only).","operationId":"reconciliation_health_api_health_reconciliation_get","parameters":[{"name":"run_now","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Run Now"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health/building-intersection":{"get":{"tags":["health"],"summary":"Building Intersection Health","description":"Reports the distribution of `calculation_method` (a.k.a. the\nBuildingIntersectionService tier) across recently-scored storms.\n\nTiers (see /app/docs/CANONICAL_DEFINITIONS.md §3):\n  precomputed          — storm_building_intersections MV hit (best)\n  overture_intersection — overture_zip_exposure MV hit      (Tier-2, today's workhorse)\n  zip_scaled           — zip_boundaries coverage fallback   (Tier-3)\n  estimate             — event_count × 2000 last-resort     (Tier-4)\n\nUsed by the `revenue_confidence` contract to be honest about where each\nstorm's building count came from.","operationId":"building_intersection_health_api_health_building_intersection_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health/score-storage":{"get":{"tags":["health"],"summary":"Score Storage Health","description":"Reports which storage layer is canonical for storm scores and the\ndelta between Postgres `storm_scores` and the legacy MongoDB\n`storm_opportunity_scores`. Used to track P2.REFACTOR.NEW.2 progress.\n\nFields:\n  authoritative_source: 'postgres' if DISABLE_MONGO_SCORE_WRITES is set,\n                        otherwise 'dual_write'.\n  counts.postgres:      row count in `storm_scores`.\n  counts.mongo_legacy:  doc count in `storm_opportunity_scores`.\n  delta.postgres_only:  rows in Postgres but not in Mongo (sample size only).\n  delta.mongo_only:     rows in Mongo but not in Postgres (sample size only).","operationId":"score_storage_health_api_health_score_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/metrics/snap-method":{"get":{"tags":["metrics"],"summary":"Snap Method Metrics","description":"JSON snapshot of the entry-point snap_method counter.\n\nUseful for dashboards that don't scrape Prometheus — tells you what\nfraction of storm-targeting entry points resolved to Overture vs Parcel\nvs cell-center fallback since process start.","operationId":"snap_method_metrics_api_metrics_snap_method_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Root Health Check","description":"Lightweight health probe for platform liveness checks.","operationId":"root_health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/diagnostics/zip-stats":{"get":{"summary":"Get Zip Stats Diagnostics","description":"Check ZIP property stats and migration status (super admin only).","operationId":"get_zip_stats_diagnostics_api_admin_diagnostics_zip_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/diagnostics/seed-zip-data":{"post":{"summary":"Seed Zip Data Manually","description":"Manually seed ZIP property stats from zcta_centroids (super admin only).","operationId":"seed_zip_data_manually_api_admin_diagnostics_seed_zip_data_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/diagnostics/run-zip-migration":{"post":{"summary":"Run Zip Migration Manually","description":"Manually trigger the ZIP state migration (super admin only).","operationId":"run_zip_migration_manually_api_admin_diagnostics_run_zip_migration_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ABConversionRequest":{"properties":{"visitor_id":{"type":"string","title":"Visitor Id"},"test_id":{"type":"string","title":"Test Id"},"conversion_type":{"type":"string","title":"Conversion Type"},"value":{"type":"number","title":"Value","default":0}},"type":"object","required":["visitor_id","test_id","conversion_type"],"title":"ABConversionRequest"},"ABTestCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"location":{"type":"string","title":"Location"},"variants":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Variants"},"traffic_percentage":{"type":"integer","title":"Traffic Percentage","default":100}},"type":"object","required":["name","description","location","variants"],"title":"ABTestCreate"},"AcceptContractorInvitePayload":{"properties":{"token":{"type":"string","title":"Token"},"name":{"type":"string","title":"Name"},"password":{"type":"string","title":"Password"},"company_name":{"type":"string","title":"Company Name"}},"type":"object","required":["token","name","password","company_name"],"title":"AcceptContractorInvitePayload"},"AcceptInviteRequest":{"properties":{"token":{"type":"string","title":"Token"},"name":{"type":"string","title":"Name"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","name","password"],"title":"AcceptInviteRequest"},"AccessRequest":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"company_name":{"type":"string","title":"Company Name"},"email":{"type":"string","title":"Email"},"account_type":{"type":"string","title":"Account Type","default":"enterprise"},"plan_id":{"type":"string","title":"Plan Id"},"status":{"type":"string","title":"Status","default":"pending"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"stripe_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Session Id"},"stripe_payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Url"},"implementation_fee":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Implementation Fee"},"paid_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid At"},"invite_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Token"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["name","company_name","email","plan_id"],"title":"AccessRequest"},"Activation":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"activation_plan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activation Plan Id"},"territory_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Territory Id"},"storm_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Event Id"},"operating_zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Zone Id"},"opportunity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opportunity Id"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"},"execution_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution State"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"channel_budgets":{"additionalProperties":true,"type":"object","title":"Channel Budgets"},"budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget"},"spent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Spent"},"status":{"$ref":"#/components/schemas/ActivationStatus","default":"draft"},"deployment_state":{"additionalProperties":true,"type":"object","title":"Deployment State"},"landing_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Page Id"},"landing_page_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Page Slug"},"capacity_override":{"type":"boolean","title":"Capacity Override","default":false},"blueprint_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blueprint Id"},"campaign_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Name"},"creative_set_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Set Id"},"tracking_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracking Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id"],"title":"Activation"},"ActivationChannelConfig":{"properties":{"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"budgets":{"additionalProperties":true,"type":"object","title":"Budgets"},"capacity_override":{"type":"boolean","title":"Capacity Override","default":false}},"type":"object","required":["channels","budgets"],"title":"ActivationChannelConfig"},"ActivationCreate":{"properties":{"storm_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Event Id"},"territory_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Territory Id"},"operating_zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Zone Id"},"blueprint_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blueprint Id"},"creative_set_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Set Id"},"target_org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Org Id"}},"type":"object","title":"ActivationCreate"},"ActivationPlan":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"opportunity_score_id":{"type":"string","title":"Opportunity Score Id"},"storm_impact_zone_id":{"type":"string","title":"Storm Impact Zone Id"},"recommended_channels":{"items":{"type":"string"},"type":"array","title":"Recommended Channels"},"budgets":{"additionalProperties":true,"type":"object","title":"Budgets"},"creative_templates":{"additionalProperties":true,"type":"object","title":"Creative Templates"},"landing_page_template":{"type":"string","title":"Landing Page Template"},"follow_up_sequences":{"items":{"type":"string"},"type":"array","title":"Follow Up Sequences"},"auto_approve":{"type":"boolean","title":"Auto Approve","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["org_id","opportunity_score_id","storm_impact_zone_id","recommended_channels","budgets","creative_templates","landing_page_template","follow_up_sequences"],"title":"ActivationPlan"},"ActivationRequest":{"properties":{"account_id":{"type":"string","title":"Account Id"},"activation_type":{"type":"string","title":"Activation Type"},"value":{"type":"number","title":"Value","default":0}},"type":"object","required":["account_id","activation_type"],"title":"ActivationRequest","description":"Track an activation event."},"ActivationStatus":{"type":"string","enum":["draft","validated","deploying","active","throttled","paused","closed","detected","impacted","scored","planned","pending_approval","ended"],"title":"ActivationStatus"},"AdAccountResponse":{"properties":{"id":{"type":"string","title":"Id"},"provider_account_id":{"type":"string","title":"Provider Account Id"},"provider_account_name":{"type":"string","title":"Provider Account Name"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"timezone_str":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone Str"},"is_selected":{"type":"boolean","title":"Is Selected","default":false}},"type":"object","required":["id","provider_account_id","provider_account_name"],"title":"AdAccountResponse"},"AdGroupCreateRequest":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id"},"name":{"type":"string","title":"Name"},"cpc_bid_micros":{"type":"integer","minimum":10000.0,"title":"Cpc Bid Micros","default":1000000}},"type":"object","required":["campaign_id","name"],"title":"AdGroupCreateRequest"},"AddCommentRequest":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"AddCommentRequest"},"AddKeywordsRequest":{"properties":{"ad_group_id":{"type":"string","title":"Ad Group Id"},"keywords":{"items":{"$ref":"#/components/schemas/KeywordRequest"},"type":"array","title":"Keywords"}},"type":"object","required":["ad_group_id","keywords"],"title":"AddKeywordsRequest"},"AdminReviewRequest":{"properties":{"action":{"type":"string","title":"Action","description":"approve or reject"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"unlock_level":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Unlock Level","default":1},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"}},"type":"object","required":["action"],"title":"AdminReviewRequest","description":"Admin review action request."},"AgencyClientCreate":{"properties":{"client_name":{"type":"string","title":"Client Name"},"contact_name":{"type":"string","title":"Contact Name"},"contact_email":{"type":"string","title":"Contact Email"},"contact_password":{"type":"string","title":"Contact Password"}},"type":"object","required":["client_name","contact_name","contact_email","contact_password"],"title":"AgencyClientCreate","description":"Request body for agency admin to onboard a new client."},"AgencyTier":{"type":"string","enum":["starter","growth","scale"],"title":"AgencyTier","description":"Agency subscription tiers"},"AlertPreferences":{"properties":{"min_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Min Score","description":"Min opportunity score to trigger alert","default":0.15},"min_revenue":{"type":"integer","minimum":0.0,"title":"Min Revenue","description":"Min estimated revenue ($) to trigger alert","default":100000},"email_enabled":{"type":"boolean","title":"Email Enabled","description":"Send email for high-value storms","default":true},"email_threshold_revenue":{"type":"integer","minimum":0.0,"title":"Email Threshold Revenue","description":"Revenue threshold for email alerts ($)","default":100000000},"nationwide":{"type":"boolean","title":"Nationwide","description":"Receive alerts for ALL US storms regardless of territory","default":false},"territory_settings":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Territory Settings","description":"Per-territory alert settings"}},"type":"object","title":"AlertPreferences"},"AlertSubscription":{"properties":{"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name"},"email":{"type":"string","maxLength":200,"minLength":5,"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"company_name":{"type":"string","maxLength":200,"minLength":1,"title":"Company Name"},"primary_state":{"type":"string","maxLength":50,"minLength":2,"title":"Primary State"},"role":{"type":"string","title":"Role","default":"contractor"},"roofs_per_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Roofs Per Year"}},"type":"object","required":["first_name","email","company_name","primary_state"],"title":"AlertSubscription"},"AppModePreference":{"properties":{"default_app_mode":{"type":"string","title":"Default App Mode","default":"roofing"}},"type":"object","title":"AppModePreference"},"ApproveApplicationRequest":{"properties":{"tier":{"$ref":"#/components/schemas/PartnerTier","default":"growth"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"custom_daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Custom Daily Limit"},"custom_monthly_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Custom Monthly Limit"},"is_sandbox":{"type":"boolean","title":"Is Sandbox","default":false}},"type":"object","title":"ApproveApplicationRequest"},"ApproveRequestBody":{"properties":{"implementation_fee_override":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Implementation Fee Override"},"plan_id_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Id Override"}},"type":"object","title":"ApproveRequestBody"},"AssetPayload":{"properties":{"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"cta_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Text"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"meta_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Description"},"hashtags":{"items":{"type":"string"},"type":"array","title":"Hashtags","default":[]},"structured_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Data"}},"type":"object","title":"AssetPayload","description":"Content payload for an asset."},"AssetStatus":{"type":"string","enum":["drafted","generated","approved","queued","published","failed"],"title":"AssetStatus","description":"Asset lifecycle states."},"AutoPauseRequest":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"type":"object","title":"AutoPauseRequest"},"Body_bulk_upload_ad_visuals_api_ad_visuals_upload_bulk_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"},"storm_type":{"type":"string","title":"Storm Type"},"tags":{"type":"string","title":"Tags"}},"type":"object","required":["files"],"title":"Body_bulk_upload_ad_visuals_api_ad_visuals_upload_bulk_post"},"Body_create_bulk_export_api_v1_partner_bulk_export__post":{"properties":{"data_type":{"type":"string","title":"Data Type","description":"parcels, contractors, or storms"},"filters":{"additionalProperties":true,"type":"object","title":"Filters","default":{}},"format":{"type":"string","title":"Format","description":"json or csv","default":"json"}},"type":"object","required":["data_type"],"title":"Body_create_bulk_export_api_v1_partner_bulk_export__post"},"Body_execute_import_api_crm_import_execute_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"column_mapping":{"type":"string","title":"Column Mapping"},"crm_source":{"type":"string","title":"Crm Source","default":"generic"},"create_missing_territories":{"type":"boolean","title":"Create Missing Territories","default":true}},"type":"object","required":["file","column_mapping"],"title":"Body_execute_import_api_crm_import_execute_post"},"Body_generate_storm_targeting_api_v1_partner_targeting_generate_post":{"properties":{"storm_id":{"type":"string","title":"Storm Id","description":"Storm episode ID or noaa_event_key"},"radius_miles":{"type":"number","title":"Radius Miles","description":"Targeting radius in miles","default":15},"min_roof_age":{"type":"integer","title":"Min Roof Age","description":"Minimum roof age in years","default":10},"limit":{"type":"integer","maximum":500.0,"title":"Limit","default":100}},"type":"object","required":["storm_id"],"title":"Body_generate_storm_targeting_api_v1_partner_targeting_generate_post"},"Body_legacy_upload_inspection_api_inspections_upload_inspection_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"session_id":{"type":"string","title":"Session Id"},"zip_code":{"type":"string","title":"Zip Code"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["file","session_id","zip_code"],"title":"Body_legacy_upload_inspection_api_inspections_upload_inspection_post"},"Body_oauth_token_api_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"}},"type":"object","required":["grant_type","client_id","client_secret"],"title":"Body_oauth_token_api_oauth_token_post"},"Body_preview_import_api_crm_import_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_preview_import_api_crm_import_preview_post"},"Body_register_webhook_api_v1_partner_webhooks_register_post":{"properties":{"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"type":"object","required":["url","events"],"title":"Body_register_webhook_api_v1_partner_webhooks_register_post"},"Body_submit_urls_to_google_api_internal_demandos_search_submit_google_post":{"properties":{"urls":{"items":{},"type":"array","title":"Urls"}},"type":"object","title":"Body_submit_urls_to_google_api_internal_demandos_search_submit_google_post"},"Body_submit_urls_to_indexnow_api_internal_demandos_search_submit_indexnow_post":{"properties":{"urls":{"items":{},"type":"array","title":"Urls"}},"type":"object","title":"Body_submit_urls_to_indexnow_api_internal_demandos_search_submit_indexnow_post"},"Body_update_ad_visual_api_ad_visuals__visual_id__patch":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"storm_type":{"type":"string","title":"Storm Type"},"tags":{"type":"string","title":"Tags"}},"type":"object","title":"Body_update_ad_visual_api_ad_visuals__visual_id__patch"},"Body_upload_ad_visual_api_ad_visuals_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"storm_type":{"type":"string","title":"Storm Type"},"tags":{"type":"string","title":"Tags"}},"type":"object","required":["file"],"title":"Body_upload_ad_visual_api_ad_visuals_upload_post"},"Body_upload_building_permits_csv_api_admin_data_moat_building_permits__source_id__csv_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_building_permits_csv_api_admin_data_moat_building_permits__source_id__csv_post"},"Body_upload_contractor_licenses_csv_api_admin_data_moat_contractor_licenses__state__csv_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_contractor_licenses_csv_api_admin_data_moat_contractor_licenses__state__csv_post"},"Body_upload_data_import_api_admin_data_moat_import_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_data_import_api_admin_data_moat_import_upload_post"},"Body_upload_files_api_inspections_submit__submission_id__files_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_files_api_inspections_submit__submission_id__files_post"},"Body_upload_inspection_photo_api_funnel_inspection_upload_photo_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["file","session_id"],"title":"Body_upload_inspection_photo_api_funnel_inspection_upload_photo_post"},"Body_upload_parcel_data_csv_api_admin_data_moat_parcels__county_id__csv_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_parcel_data_csv_api_admin_data_moat_parcels__county_id__csv_post"},"Body_upload_visual_from_url_api_ad_visuals_upload_url_post":{"properties":{"url":{"type":"string","title":"Url"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"storm_type":{"type":"string","title":"Storm Type"},"tags":{"type":"string","title":"Tags"}},"type":"object","required":["url"],"title":"Body_upload_visual_from_url_api_ad_visuals_upload_url_post"},"BriefingCheckoutRequest":{"properties":{"storm_slug":{"type":"string","title":"Storm Slug"},"storm_type":{"type":"string","title":"Storm Type"},"storm_state":{"type":"string","title":"Storm State"},"storm_date":{"type":"string","title":"Storm Date"},"storm_rev_min":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Rev Min"},"storm_rev_max":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Rev Max"},"storm_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storm Score"}},"type":"object","required":["storm_slug","storm_type","storm_state","storm_date"],"title":"BriefingCheckoutRequest","description":"Request body for creating a briefing checkout session."},"BudgetAllocationRequest":{"properties":{"total_budget":{"type":"number","title":"Total Budget","default":10000}},"type":"object","title":"BudgetAllocationRequest","description":"Budget allocation request."},"BuildingPermitRecord":{"properties":{"permit_number":{"type":"string","title":"Permit Number"},"permit_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permit Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"work_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Work Type"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"},"permit_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permit Date"},"issue_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issue Date"},"contractor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contractor Name"},"valuation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Valuation"}},"type":"object","required":["permit_number"],"title":"BuildingPermitRecord"},"BulkOutageEntry":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/ManualOutageEntry"},"type":"array","title":"Entries"}},"type":"object","required":["entries"],"title":"BulkOutageEntry","description":"Schema for bulk outage data entry (multiple states at once)."},"BulkRequest":{"properties":{"addresses":{"items":{"type":"string"},"type":"array","title":"Addresses"},"lookback_days":{"type":"integer","title":"Lookback Days","default":90}},"type":"object","required":["addresses"],"title":"BulkRequest"},"CRMConnectRequest":{"properties":{"provider":{"$ref":"#/components/schemas/CRMProvider"},"api_key":{"type":"string","title":"Api Key"},"auto_push_leads":{"type":"boolean","title":"Auto Push Leads","default":true},"sync_status_changes":{"type":"boolean","title":"Sync Status Changes","default":true},"sync_contract_values":{"type":"boolean","title":"Sync Contract Values","default":true}},"type":"object","required":["provider","api_key"],"title":"CRMConnectRequest","description":"Request to connect a CRM"},"CRMProvider":{"type":"string","enum":["jobnimbus","acculynx"],"title":"CRMProvider","description":"Supported CRM providers"},"CRMStatusMappingRequest":{"properties":{"status_mapping":{"additionalProperties":{"type":"string"},"type":"object","title":"Status Mapping"},"default_lead_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Lead Status"}},"type":"object","required":["status_mapping"],"title":"CRMStatusMappingRequest","description":"Request to update status mapping"},"CTAClickRequest":{"properties":{"demand_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demand Event Id"},"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"},"visitor_id":{"type":"string","minLength":8,"title":"Visitor Id"},"session_id":{"type":"string","minLength":8,"title":"Session Id"},"cta_type":{"type":"string","title":"Cta Type"},"destination":{"type":"string","title":"Destination"},"page_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Path"}},"type":"object","required":["visitor_id","session_id","cta_type","destination"],"title":"CTAClickRequest","description":"Track a CTA click event."},"CampaignContext":{"properties":{"storm_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Type"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"season":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season"},"budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"}},"type":"object","title":"CampaignContext"},"CapacityProfile":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"territory_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Territory Id"},"name":{"type":"string","title":"Name"},"inspections_per_day":{"type":"integer","title":"Inspections Per Day"},"sales_reps":{"type":"integer","title":"Sales Reps"},"max_uncontacted_leads":{"type":"integer","title":"Max Uncontacted Leads"},"backlog_days_threshold":{"type":"integer","title":"Backlog Days Threshold"},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id","name","inspections_per_day","sales_reps","max_uncontacted_leads","backlog_days_threshold"],"title":"CapacityProfile"},"CheckoutResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["checkout_url","session_id"],"title":"CheckoutResponse","description":"Response with checkout URL."},"ClaimOutcomePayload":{"properties":{"claim_filed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Claim Filed"},"claim_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Status","description":"open, approved, denied, supplement, closed"},"claim_amount_approved":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Claim Amount Approved"},"insurance_carrier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Insurance Carrier"},"contract_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Contract Value"},"contract_signed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Contract Signed"},"job_completed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Job Completed"},"revenue_collected":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue Collected"}},"type":"object","title":"ClaimOutcomePayload"},"ClusterDeploymentCreate":{"properties":{"channels_csv":{"type":"string","title":"Channels Csv","default":"google,meta"},"daily_budget":{"type":"number","title":"Daily Budget"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"status":{"$ref":"#/components/schemas/DeploymentStatus","default":"draft"}},"type":"object","required":["daily_budget"],"title":"ClusterDeploymentCreate"},"ConfirmLocationRequest":{"properties":{"submission_id":{"type":"string","title":"Submission Id"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"}},"type":"object","required":["submission_id","lat","lng"],"title":"ConfirmLocationRequest","description":"Request to confirm property location."},"ContractorLicenseRecord":{"properties":{"license_number":{"type":"string","title":"License Number"},"business_name":{"type":"string","title":"Business Name"},"applicant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicant Name"},"applicant_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applicant State"},"county":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County"},"license_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Type","default":"Roofing Contractor"},"application_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Date"},"issue_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issue Date"},"expiration_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiration Date"}},"type":"object","required":["license_number","business_name"],"title":"ContractorLicenseRecord"},"ContractorLicenseType":{"type":"string","enum":["field_operator","field_pro","independent_operator"],"title":"ContractorLicenseType","description":"Contractor license tiers"},"ContractorSettingsUpdate":{"properties":{"avg_ticket_residential":{"anyOf":[{"type":"integer","maximum":1000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Avg Ticket Residential"},"avg_ticket_commercial":{"anyOf":[{"type":"integer","maximum":10000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Avg Ticket Commercial"},"roof_cost_overrides":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Roof Cost Overrides"},"close_rate":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Close Rate"},"territory_radius_miles":{"anyOf":[{"type":"integer","maximum":500.0,"minimum":1.0},{"type":"null"}],"title":"Territory Radius Miles"},"crew_capacity_per_week":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Crew Capacity Per Week"},"season_factors":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Season Factors"}},"type":"object","title":"ContractorSettingsUpdate"},"CreateCaseRequest":{"properties":{"subject":{"type":"string","title":"Subject"},"description":{"type":"string","title":"Description"},"severity":{"type":"string","title":"Severity","default":"medium"},"category":{"type":"string","title":"Category","default":"other"},"affected_feature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Affected Feature"}},"type":"object","required":["subject","description"],"title":"CreateCaseRequest"},"CreateContractorInviteRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"contractor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contractor Name"},"license_tier":{"type":"string","title":"License Tier","default":"field_operator"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["email"],"title":"CreateContractorInviteRequest"},"CreateJoinRequestPayload":{"properties":{"agency_id":{"type":"string","title":"Agency Id"},"requested_license":{"type":"string","title":"Requested License","default":"field_operator"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["agency_id"],"title":"CreateJoinRequestPayload"},"CreateOrgRequest":{"properties":{"name":{"type":"string","title":"Name"},"owner_email":{"type":"string","format":"email","title":"Owner Email"},"owner_name":{"type":"string","title":"Owner Name"},"plan":{"type":"string","title":"Plan","default":"growth_operator"},"send_invite":{"type":"boolean","title":"Send Invite","default":true}},"type":"object","required":["name","owner_email","owner_name"],"title":"CreateOrgRequest","description":"Request to create a new organization"},"CreatePartnerKeyPayload":{"properties":{"partner_name":{"type":"string","title":"Partner Name"},"rate_limit_per_minute":{"type":"integer","title":"Rate Limit Per Minute","default":100},"rate_limit_per_day":{"type":"integer","title":"Rate Limit Per Day","default":10000},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["partner_name"],"title":"CreatePartnerKeyPayload"},"CreateSubmissionRequest":{"properties":{"session_id":{"type":"string","title":"Session Id","description":"Anonymous session ID"},"target_zip_code":{"type":"string","title":"Target Zip Code","description":"ZIP code to unlock"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"target_storm_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Storm Event Id"}},"type":"object","required":["session_id","target_zip_code"],"title":"CreateSubmissionRequest","description":"Request to create a new inspection submission."},"CreateSubscriptionRequest":{"properties":{"partner_id":{"type":"string","title":"Partner Id"},"tier":{"$ref":"#/components/schemas/PartnerTier"},"success_url":{"type":"string","title":"Success Url"},"cancel_url":{"type":"string","title":"Cancel Url"}},"type":"object","required":["partner_id","tier","success_url","cancel_url"],"title":"CreateSubscriptionRequest"},"DataMoatStatus":{"properties":{"service":{"type":"string","title":"Service"},"status":{"type":"string","title":"Status"},"last_run":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Run"},"records_count":{"type":"integer","title":"Records Count"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["service","status","records_count"],"title":"DataMoatStatus"},"DemandAssetUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"payload":{"anyOf":[{"$ref":"#/components/schemas/AssetPayload"},{"type":"null"}]},"status":{"anyOf":[{"$ref":"#/components/schemas/AssetStatus"},{"type":"null"}]},"requires_approval":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requires Approval"}},"type":"object","title":"DemandAssetUpdate","description":"Input for updating a demand asset."},"DemandEventCreate":{"properties":{"storm_event_id":{"type":"string","title":"Storm Event Id","description":"FK to noaa_storm_events"},"opportunity_score_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opportunity Score Id","description":"FK to storm_opportunity_scores"}},"type":"object","required":["storm_event_id"],"title":"DemandEventCreate","description":"Input for creating a demand event from a storm."},"DemoCluster":{"properties":{"cluster_id":{"type":"string","title":"Cluster Id"},"storm_episode_id":{"type":"integer","title":"Storm Episode Id"},"storm_event_type":{"type":"string","title":"Storm Event Type"},"storm_date":{"type":"string","title":"Storm Date"},"center":{"additionalProperties":true,"type":"object","title":"Center"},"h3_index":{"type":"string","title":"H3 Index"},"h3_resolution":{"type":"integer","title":"H3 Resolution","default":7},"properties_in_cluster":{"type":"integer","title":"Properties In Cluster"},"residential_count":{"type":"integer","title":"Residential Count"},"avg_property_value":{"type":"number","title":"Avg Property Value"},"owner_occupied_pct":{"type":"number","title":"Owner Occupied Pct"},"median_roof_age":{"type":"number","title":"Median Roof Age"},"cluster_score":{"type":"number","title":"Cluster Score"},"estimated_doors_per_hour":{"type":"integer","title":"Estimated Doors Per Hour"},"recommended_time_of_day":{"type":"string","title":"Recommended Time Of Day"},"zip_codes":{"items":{"type":"string"},"type":"array","title":"Zip Codes"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry"}},"type":"object","required":["cluster_id","storm_episode_id","storm_event_type","storm_date","center","h3_index","properties_in_cluster","residential_count","avg_property_value","owner_occupied_pct","median_roof_age","cluster_score","estimated_doors_per_hour","recommended_time_of_day","zip_codes"],"title":"DemoCluster","description":"StormStrike demo cluster data."},"DemoRequest":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"company":{"type":"string","title":"Company"},"phone":{"type":"string","title":"Phone"},"source":{"type":"string","title":"Source","default":"landing_page"},"status":{"type":"string","title":"Status","default":"new"},"notes":{"type":"string","title":"Notes","default":""},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","email","company","phone"],"title":"DemoRequest"},"DemoRequestCreate":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"company":{"type":"string","title":"Company"},"phone":{"type":"string","title":"Phone"}},"type":"object","required":["name","email","company","phone"],"title":"DemoRequestCreate"},"DeploymentJob":{"properties":{"id":{"type":"string","title":"Id"},"activation_id":{"type":"string","title":"Activation Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"job_type":{"$ref":"#/components/schemas/DeploymentJobType"},"status":{"$ref":"#/components/schemas/DeploymentJobStatus","default":"pending"},"result":{"additionalProperties":true,"type":"object","title":"Result"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["activation_id","job_type"],"title":"DeploymentJob"},"DeploymentJobStatus":{"type":"string","enum":["pending","in_progress","completed","failed","skipped"],"title":"DeploymentJobStatus"},"DeploymentJobType":{"type":"string","enum":["verify_tracking","publish_landing_page","deploy_meta","deploy_google","start_capacity_monitor"],"title":"DeploymentJobType"},"DeploymentStatus":{"type":"string","enum":["draft","pending_approval","active","paused","ended"],"title":"DeploymentStatus"},"DismissRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"DismissRequest"},"DispatchRouteResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"ordered_stops":{"items":{"$ref":"#/components/schemas/DispatchStopResponse"},"type":"array","title":"Ordered Stops"},"estimated_drive_minutes":{"type":"number","title":"Estimated Drive Minutes"},"total_properties":{"type":"integer","title":"Total Properties"},"route_h3_cells":{"items":{"type":"string"},"type":"array","title":"Route H3 Cells"}},"type":"object","required":["session_id","ordered_stops","estimated_drive_minutes","total_properties","route_h3_cells"],"title":"DispatchRouteResponse"},"DispatchStopResponse":{"properties":{"property_id":{"type":"string","title":"Property Id"},"address":{"type":"string","title":"Address"},"zip_code":{"type":"string","title":"Zip Code"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"stop_order":{"type":"integer","title":"Stop Order"},"h3_cell":{"type":"string","title":"H3 Cell"},"urgency_score":{"type":"number","title":"Urgency Score"},"estimated_job_value":{"type":"number","title":"Estimated Job Value"}},"type":"object","required":["property_id","address","zip_code","lat","lon","stop_order","h3_cell","urgency_score","estimated_job_value"],"title":"DispatchStopResponse"},"DoorKnockScriptResponse":{"properties":{"event_type":{"type":"string","title":"Event Type"},"title":{"type":"string","title":"Title"},"opening":{"type":"string","title":"Opening"},"value_prop":{"type":"string","title":"Value Prop"},"close":{"type":"string","title":"Close"},"leave_behind_text":{"type":"string","title":"Leave Behind Text"},"qr_code_url":{"type":"string","title":"Qr Code Url"}},"type":"object","required":["event_type","title","opening","value_prop","close","leave_behind_text","qr_code_url"],"title":"DoorKnockScriptResponse"},"EmailCaptureRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"visitor_id":{"type":"string","title":"Visitor Id"},"source_page":{"type":"string","title":"Source Page"},"source_type":{"type":"string","title":"Source Type","default":"exit_popup"},"demand_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demand Event Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["email","visitor_id","source_page"],"title":"EmailCaptureRequest"},"EnableModuleRequest":{"properties":{"module_type":{"$ref":"#/components/schemas/ModuleType"},"tier":{"$ref":"#/components/schemas/ModuleTier"}},"type":"object","required":["module_type","tier"],"title":"EnableModuleRequest"},"EnrichPayload":{"properties":{"h3_resolution":{"type":"integer","title":"H3 Resolution","default":8},"min_opportunity_score":{"type":"number","title":"Min Opportunity Score","default":20.0},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"EnrichPayload"},"ExtendTrialRequest":{"properties":{"days":{"type":"integer","title":"Days"}},"type":"object","required":["days"],"title":"ExtendTrialRequest"},"FeatureAccessResponse":{"properties":{"has_access":{"type":"boolean","title":"Has Access"},"module":{"type":"string","title":"Module"},"feature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature"},"requires_module":{"type":"boolean","title":"Requires Module","default":false},"requires_upgrade":{"type":"boolean","title":"Requires Upgrade","default":false},"upgrade_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upgrade Tier"}},"type":"object","required":["has_access","module"],"title":"FeatureAccessResponse"},"GenerateCellsRequest":{"properties":{"storm_event_id":{"type":"string","title":"Storm Event Id"},"radius_miles":{"type":"number","title":"Radius Miles","default":15.0}},"type":"object","required":["storm_event_id"],"title":"GenerateCellsRequest","description":"Request to generate H3 cells for a storm."},"GenerateH3RoutesPayload":{"properties":{"num_routes":{"type":"integer","maximum":50.0,"minimum":2.0,"title":"Num Routes","description":"Number of routes to create","default":5},"max_cells_per_route":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Cells Per Route","description":"Max targeting cells per route"},"min_opportunity_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Min Opportunity Score","description":"Min score for inclusion","default":30.0}},"type":"object","title":"GenerateH3RoutesPayload"},"GenerateHitListPayload":{"properties":{"storm_key":{"type":"string","title":"Storm Key","description":"NOAA event key from storm_opportunity_scores"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Custom name for this hit list"},"territory_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Territory Id"},"radius_override_miles":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Radius Override Miles","description":"Override auto-calculated impact radius"},"top_n":{"type":"integer","maximum":5000.0,"minimum":10.0,"title":"Top N","description":"Max entries to include","default":500},"min_damage_probability":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Min Damage Probability","description":"Minimum damage probability to include","default":0.0},"zone_count":{"type":"integer","maximum":500.0,"minimum":10.0,"title":"Zone Count","description":"Number of H3 targeting zones to generate","default":100},"include_states":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Include States","description":"Only include entries from these states (2-letter codes)"},"include_zips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Include Zips","description":"Only include entries from these ZIP codes"}},"type":"object","required":["storm_key"],"title":"GenerateHitListPayload"},"GenerateHitlistParams":{"properties":{"zone_count":{"type":"integer","maximum":500.0,"minimum":10.0,"title":"Zone Count","description":"Number of H3 targeting zones to generate","default":100},"include_states":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Include States","description":"Only include entries from these states (2-letter codes)"},"radius_override_miles":{"anyOf":[{"type":"number","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Radius Override Miles","description":"Override auto-calculated impact radius"},"min_roof_sqft":{"type":"number","minimum":0.0,"title":"Min Roof Sqft","description":"Minimum roof sqft to include (filter small sheds/mobile homes)","default":0},"residential_only":{"type":"boolean","title":"Residential Only","description":"Exclude commercial buildings","default":false},"exclude_multi_story":{"type":"boolean","title":"Exclude Multi Story","description":"Exclude buildings with 2+ floors","default":false},"max_overture_results":{"type":"integer","maximum":2000.0,"minimum":10.0,"title":"Max Overture Results","description":"Max Overture buildings to return","default":500}},"type":"object","title":"GenerateHitlistParams","description":"Parameters for hit list generation."},"GenerateRequest":{"properties":{"storm_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Event Id"},"template":{"type":"string","title":"Template","default":"free_inspection"},"custom_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Prompt"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}},"type":"object","title":"GenerateRequest"},"GenerateRoutesPayload":{"properties":{"num_routes":{"type":"integer","maximum":50.0,"minimum":2.0,"title":"Num Routes","description":"Number of canvassing routes to create","default":5},"max_entries_per_route":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Entries Per Route","description":"Cap per route (None = auto)"}},"type":"object","title":"GenerateRoutesPayload"},"GeocodeRequest":{"properties":{"address":{"type":"string","title":"Address"}},"type":"object","required":["address"],"title":"GeocodeRequest","description":"Request for geocoding an address."},"GeocodeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"formatted_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Formatted Address"},"place_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Id"},"components":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Components"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"GeocodeResponse","description":"Response from geocoding."},"GeometryType":{"type":"string","enum":["polygon","radius","zip_set","none"],"title":"GeometryType"},"GoogleCallbackRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["session_id"],"title":"GoogleCallbackRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImageUploadRequest":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"Public URL of the image to upload"}},"type":"object","required":["image_url"],"title":"ImageUploadRequest"},"ImageUploadResponse":{"properties":{"image_hash":{"type":"string","title":"Image Hash"},"url":{"type":"string","title":"Url"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"is_live":{"type":"boolean","title":"Is Live"}},"type":"object","required":["image_hash","url","width","height","is_live"],"title":"ImageUploadResponse"},"ImportResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"$ref":"#/components/schemas/ImportStatus"},"total_records":{"type":"integer","title":"Total Records"},"successful_records":{"type":"integer","title":"Successful Records"},"failed_records":{"type":"integer","title":"Failed Records"},"leads_created":{"type":"integer","title":"Leads Created"},"conversions_created":{"type":"integer","title":"Conversions Created"},"territories_created":{"type":"integer","title":"Territories Created"},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors"}},"type":"object","required":["job_id","status","total_records","successful_records","failed_records","leads_created","conversions_created","territories_created","errors"],"title":"ImportResponse","description":"Response after import completion"},"ImportStatus":{"type":"string","enum":["pending","processing","completed","failed","partial"],"title":"ImportStatus"},"IngestionRequest":{"properties":{"start_year":{"type":"integer","title":"Start Year","default":2005},"end_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"End Year"},"resume_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Job Id"}},"type":"object","title":"IngestionRequest"},"InspectionBatchPayload":{"properties":{"inspections":{"items":{"$ref":"#/components/schemas/InspectionPayload"},"type":"array","title":"Inspections"}},"type":"object","required":["inspections"],"title":"InspectionBatchPayload"},"InspectionOutcome":{"properties":{"damage_present":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Damage Present"},"damage_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Damage Type","description":"hail, wind, tornado, other"},"damage_severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Damage Severity","description":"MINOR, MODERATE, SEVERE"},"recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendation","description":"REPAIR, PARTIAL, REPLACE"},"roof_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Roof Type"},"roof_age_estimate_years":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Roof Age Estimate Years"},"roof_area_sqft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roof Area Sqft"}},"type":"object","title":"InspectionOutcome","description":"Inspection-level findings from RoofProof."},"InspectionPayload":{"properties":{"external_id":{"type":"string","title":"External Id","description":"RoofProof's unique inspection ID"},"property_id":{"type":"string","title":"Property Id","description":"Canonical property_id from /properties/resolve"},"property_lat":{"type":"number","title":"Property Lat","description":"Property latitude"},"property_lng":{"type":"number","title":"Property Lng","description":"Property longitude"},"property_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Address","description":"Full street address"},"property_zip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Zip","description":"ZIP code"},"inspection_date":{"type":"string","title":"Inspection Date","description":"ISO date of inspection (YYYY-MM-DD)"},"storm_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Key","description":"Explicit NOAA event key (skips auto-match)"},"lead_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Id","description":"StormAxis lead ID"},"territory_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Territory Id","description":"StormAxis territory ID"},"activation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activation Id","description":"StormAxis activation ID"},"inspection_outcome":{"anyOf":[{"$ref":"#/components/schemas/InspectionOutcome"},{"type":"null"}]},"roofproof_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roofproof Score","description":"RoofProof opportunity/probability score (0-1)"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Any additional data"}},"type":"object","required":["external_id","property_id","property_lat","property_lng","inspection_date"],"title":"InspectionPayload"},"InspectionUpdatePayload":{"properties":{"inspection_outcome":{"anyOf":[{"$ref":"#/components/schemas/InspectionOutcome"},{"type":"null"}]},"roofproof_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roofproof Score"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"InspectionUpdatePayload"},"InspectionUpload":{"properties":{"zip_code":{"type":"string","title":"Zip Code"},"session_id":{"type":"string","title":"Session Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"damage_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Damage Type"},"inspection_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inspection Date"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"claim_filed":{"type":"boolean","title":"Claim Filed","default":false},"estimated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Value"},"photo_urls":{"items":{"type":"string"},"type":"array","title":"Photo Urls","default":[]}},"type":"object","required":["zip_code","session_id"],"title":"InspectionUpload"},"Integration":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"provider":{"$ref":"#/components/schemas/IntegrationProvider"},"name":{"type":"string","title":"Name"},"encrypted_credentials":{"type":"string","title":"Encrypted Credentials","default":""},"config":{"additionalProperties":true,"type":"object","title":"Config"},"is_active":{"type":"boolean","title":"Is Active","default":true},"last_sync_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sync At"},"status":{"type":"string","title":"Status","default":"disconnected"},"created_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By User Id"},"connected_user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connected User Email"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"last_validated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Validated At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id","provider","name"],"title":"Integration"},"IntegrationCreate":{"properties":{"provider":{"$ref":"#/components/schemas/IntegrationProvider"},"name":{"type":"string","title":"Name"},"credentials":{"additionalProperties":true,"type":"object","title":"Credentials"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","required":["provider","name","credentials"],"title":"IntegrationCreate"},"IntegrationProvider":{"type":"string","enum":["hailtrace","meta_ads","google_ads","twilio","resend","stripe"],"title":"IntegrationProvider"},"IntegrationStatusResponse":{"properties":{"provider":{"type":"string","title":"Provider"},"status":{"type":"string","title":"Status"},"connected_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connected Email"},"last_validated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Validated At"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"accounts_count":{"type":"integer","title":"Accounts Count","default":0},"selected_accounts_count":{"type":"integer","title":"Selected Accounts Count","default":0}},"type":"object","required":["provider","status"],"title":"IntegrationStatusResponse"},"Interaction":{"properties":{"type":{"type":"string","title":"Type"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"}},"type":"object","required":["type"],"title":"Interaction","description":"Model for logging interactions with leads."},"InviteCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"role":{"type":"string","title":"Role","default":"sales_ops"}},"type":"object","required":["email"],"title":"InviteCreate","description":"Request to create an invite"},"InviteResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"invite_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Link"}},"type":"object","required":["id","email","role","status","expires_at"],"title":"InviteResponse","description":"Response after creating an invite"},"JobOutcomeConversionStats":{"properties":{"total_outcomes":{"type":"integer","title":"Total Outcomes"},"total_revenue":{"type":"number","title":"Total Revenue"},"avg_job_value":{"type":"number","title":"Avg Job Value"},"conversion_rate_pct":{"type":"number","title":"Conversion Rate Pct"}},"type":"object","required":["total_outcomes","total_revenue","avg_job_value","conversion_rate_pct"],"title":"JobOutcomeConversionStats"},"JobOutcomesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/WaterJobOutcomeResponse"},"type":"array","title":"Items"},"stats":{"$ref":"#/components/schemas/JobOutcomeConversionStats"}},"type":"object","required":["items","stats"],"title":"JobOutcomesResponse"},"KeywordRequest":{"properties":{"text":{"type":"string","title":"Text"},"match_type":{"type":"string","pattern":"^(EXACT|PHRASE|BROAD)$","title":"Match Type","default":"BROAD"}},"type":"object","required":["text"],"title":"KeywordRequest"},"LLMKeyInput":{"properties":{"provider":{"type":"string","title":"Provider"},"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["provider","api_key"],"title":"LLMKeyInput"},"Lead":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"activation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activation Id"},"landing_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Page Id"},"name":{"type":"string","title":"Name"},"phone":{"type":"string","title":"Phone"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"},"preferred_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Time"},"source":{"type":"string","title":"Source","default":"api"},"utm_params":{"additionalProperties":true,"type":"object","title":"Utm Params"},"attribution":{"additionalProperties":true,"type":"object","title":"Attribution"},"status":{"type":"string","title":"Status","default":"new"},"contacted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Contacted At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id","name","phone"],"title":"Lead"},"LeadCreate":{"properties":{"name":{"type":"string","title":"Name"},"phone":{"type":"string","title":"Phone"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"},"preferred_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Time"},"activation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activation Id"},"landing_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Page Id"},"utm_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Utm Params"}},"type":"object","required":["name","phone"],"title":"LeadCreate"},"LeadStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["status"],"title":"LeadStatusUpdate","description":"Model for updating lead status only."},"LeadUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"},"preferred_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Time"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"LeadUpdate","description":"Model for updating lead fields."},"LinkHitListRequest":{"properties":{"hit_list_id":{"type":"string","title":"Hit List Id"}},"type":"object","required":["hit_list_id"],"title":"LinkHitListRequest","description":"Request to link territory to hit list."},"LocationIn":{"properties":{"address":{"type":"string","title":"Address"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","default":{}}},"type":"object","required":["address"],"title":"LocationIn"},"LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/User"},"modules":{"items":{},"type":"array","title":"Modules","default":[]}},"type":"object","required":["access_token","user"],"title":"LoginResponse"},"ManualOutageEntry":{"properties":{"state":{"type":"string","title":"State"},"utility_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utility Name","default":"Unknown"},"customers_affected":{"type":"integer","title":"Customers Affected"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["state","customers_affected"],"title":"ManualOutageEntry","description":"Schema for manual outage data entry."},"ManualStormEntry":{"properties":{"event_type":{"type":"string","title":"Event Type"},"state":{"type":"string","title":"State"},"county":{"type":"string","title":"County"},"begin_time":{"type":"string","title":"Begin Time"},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time"},"magnitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Magnitude"},"magnitude_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Magnitude Type"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"damage_property":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Damage Property"},"damage_crops":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Damage Crops"},"injuries":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Injuries","default":0},"deaths":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deaths","default":0},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source":{"type":"string","title":"Source","default":"manual_entry"}},"type":"object","required":["event_type","state","county","begin_time"],"title":"ManualStormEntry"},"MarkKnockedRequest":{"properties":{"knocked_structures":{"type":"integer","title":"Knocked Structures","default":0},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"MarkKnockedRequest","description":"Request to mark territory as knocked."},"ModuleCartCheckoutRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ModuleCheckoutRequest"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ModuleCartCheckoutRequest","description":"Checkout for multiple modules at once"},"ModuleCheckoutRequest":{"properties":{"module_type":{"$ref":"#/components/schemas/ModuleType"},"tier":{"$ref":"#/components/schemas/ModuleTier"}},"type":"object","required":["module_type","tier"],"title":"ModuleCheckoutRequest"},"ModuleTier":{"type":"string","enum":["essential","starter","professional","enterprise"],"title":"ModuleTier","description":"Tier levels within modules"},"ModuleType":{"type":"string","enum":["storm_intelligence","opportunity_targeting","field_execution","campaign_activation","revenue_intelligence","storm_intelligence_portfolio","opportunity_engine","campaign_command","revenue_attribution"],"title":"ModuleType","description":"Available platform modules"},"MoldRiskAlertResponse":{"properties":{"alert_id":{"type":"string","title":"Alert Id"},"zip_code":{"type":"string","title":"Zip Code"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"risk_score":{"type":"number","title":"Risk Score"},"risk_tier":{"type":"string","title":"Risk Tier"},"hours_since_event":{"type":"number","title":"Hours Since Event"},"event_type":{"type":"string","title":"Event Type"},"alert_fired_at":{"type":"string","title":"Alert Fired At"},"resolved":{"type":"boolean","title":"Resolved"}},"type":"object","required":["alert_id","zip_code","lat","lon","risk_score","risk_tier","hours_since_event","event_type","alert_fired_at","resolved"],"title":"MoldRiskAlertResponse"},"NOAABackfillRequest":{"properties":{"years":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Years"},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"NOAABackfillRequest","description":"Request to trigger NOAA backfill"},"NotificationPreferences":{"properties":{"storm_alerts":{"type":"boolean","title":"Storm Alerts","default":true},"new_leads":{"type":"boolean","title":"New Leads","default":true},"capacity_alerts":{"type":"boolean","title":"Capacity Alerts","default":true},"weekly_report":{"type":"boolean","title":"Weekly Report","default":true}},"type":"object","title":"NotificationPreferences"},"OAuthConnectResponse":{"properties":{"auth_url":{"type":"string","title":"Auth Url"},"state":{"type":"string","title":"State"}},"type":"object","required":["auth_url","state"],"title":"OAuthConnectResponse"},"OnboardingUpdate":{"properties":{"onboarding_completed":{"type":"boolean","title":"Onboarding Completed","default":true}},"type":"object","title":"OnboardingUpdate"},"OperatingZone":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"name":{"type":"string","title":"Name"},"region_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Tag"},"geometry_type":{"$ref":"#/components/schemas/GeometryType","default":"none"},"geometry_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry Payload"},"computed_zips":{"items":{"type":"string"},"type":"array","title":"Computed Zips"},"settings":{"$ref":"#/components/schemas/OperatingZoneSettings"},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id","name"],"title":"OperatingZone"},"OperatingZoneCreate":{"properties":{"name":{"type":"string","title":"Name"},"region_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Tag"},"geometry_type":{"$ref":"#/components/schemas/GeometryType","default":"none"},"geometry_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry Payload"},"computed_zips":{"items":{"type":"string"},"type":"array","title":"Computed Zips"},"settings":{"$ref":"#/components/schemas/OperatingZoneSettings"}},"type":"object","required":["name"],"title":"OperatingZoneCreate"},"OperatingZoneSettings":{"properties":{"capacity_defaults_json":{"additionalProperties":true,"type":"object","title":"Capacity Defaults Json"},"economics_json":{"additionalProperties":true,"type":"object","title":"Economics Json"},"guardrails_json":{"additionalProperties":true,"type":"object","title":"Guardrails Json"},"automation_json":{"additionalProperties":true,"type":"object","title":"Automation Json"},"updated_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By User Id"}},"type":"object","title":"OperatingZoneSettings"},"OperatingZoneUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"region_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Tag"},"geometry_type":{"anyOf":[{"$ref":"#/components/schemas/GeometryType"},{"type":"null"}]},"geometry_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry Payload"},"computed_zips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Computed Zips"},"settings":{"anyOf":[{"$ref":"#/components/schemas/OperatingZoneSettings"},{"type":"null"}]},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"OperatingZoneUpdate"},"OpportunityScore":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"storm_impact_zone_id":{"type":"string","title":"Storm Impact Zone Id"},"score":{"type":"number","title":"Score"},"factors":{"additionalProperties":true,"type":"object","title":"Factors"},"recommendation":{"type":"string","title":"Recommendation"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["org_id","storm_impact_zone_id","score","recommendation"],"title":"OpportunityScore"},"OpportunityStatus":{"type":"string","enum":["new","approved","deployed","throttled","completed","archived"],"title":"OpportunityStatus"},"OrganizationProfileUpdate":{"properties":{"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"license_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Number"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"}},"type":"object","title":"OrganizationProfileUpdate"},"OutcomeReport":{"properties":{"noaa_event_key":{"type":"string","title":"Noaa Event Key","description":"Storm event key"},"actual_claims_filed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Claims Filed","description":"Number of claims filed"},"actual_revenue":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Actual Revenue","description":"Actual revenue captured ($)"}},"type":"object","required":["noaa_event_key"],"title":"OutcomeReport","description":"Report actual outcomes for scored storms to improve ML model."},"OutcomeResponse":{"properties":{"outcome_id":{"type":"string","title":"Outcome Id"},"received_at":{"type":"string","title":"Received At"},"retrain_queued":{"type":"boolean","title":"Retrain Queued"}},"type":"object","required":["outcome_id","received_at","retrain_queued"],"title":"OutcomeResponse"},"OutcomeSubmission":{"properties":{"storm_id":{"type":"string","title":"Storm Id","description":"storm_id from get_top_opportunities"},"partner_id":{"type":"string","title":"Partner Id","description":"Partner API key owner ID"},"zip_code":{"type":"string","title":"Zip Code","description":"Property ZIP code"},"job_won":{"type":"boolean","title":"Job Won","description":"True if job was won/contracted"},"payout_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Payout Amount","description":"Insurance payout in USD"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope","description":"roof_replacement, repair, siding, other"},"days_to_close":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days To Close","description":"Days from initial contact to signed contract"},"adjuster_approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Adjuster Approved","description":"Insurance adjuster approved claim"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"}},"type":"object","required":["storm_id","partner_id","zip_code","job_won"],"title":"OutcomeSubmission"},"OverageInvoiceRequest":{"properties":{"partner_id":{"type":"string","title":"Partner Id"},"overage_calls":{"type":"integer","title":"Overage Calls"},"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"}},"type":"object","required":["partner_id","overage_calls","period_start","period_end"],"title":"OverageInvoiceRequest"},"OverrideRequest":{"properties":{"conversion_id":{"type":"string","title":"Conversion Id"},"storm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["conversion_id"],"title":"OverrideRequest"},"PageViewRequest":{"properties":{"demand_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demand Event Id"},"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"},"visitor_id":{"type":"string","minLength":8,"title":"Visitor Id"},"session_id":{"type":"string","minLength":8,"title":"Session Id"},"page_path":{"type":"string","title":"Page Path"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"geo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geo"}},"type":"object","required":["visitor_id","session_id","page_path"],"title":"PageViewRequest","description":"Track a page view event."},"ParcelData":{"properties":{"zip_code":{"type":"string","title":"Zip Code"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"building_count":{"type":"integer","title":"Building Count","default":0},"residential_count":{"type":"integer","title":"Residential Count","default":0},"commercial_count":{"type":"integer","title":"Commercial Count","default":0},"avg_property_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Property Value"},"avg_roof_age_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Roof Age Years"},"median_year_built":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Year Built"},"total_assessed_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Assessed Value"},"parcel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parcel Id"},"owner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Name"},"owner_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Type"},"property_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Address"},"building_sqft":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Building Sqft"},"lot_sqft":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lot Sqft"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"}},"type":"object","required":["zip_code"],"title":"ParcelData","description":"Individual parcel/property data."},"ParcelHitlistParams":{"properties":{"zone_count":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Zone Count","default":200},"radius_override_miles":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.5},{"type":"null"}],"title":"Radius Override Miles"},"min_roof_age":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Min Roof Age","default":10},"owner_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Owner Types","default":["individual","joint"]},"min_sqft":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Sqft","default":1000}},"type":"object","title":"ParcelHitlistParams","description":"Parameters for parcel-enriched hit list generation."},"ParcelRecord":{"properties":{"parcel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parcel Id"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"},"year_built":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year Built"},"square_footage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Square Footage"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bathrooms"},"construction_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Construction Type"},"roof_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Roof Type"},"improvement_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Improvement Value"},"land_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Land Value"},"total_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Value"},"last_sale_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Sale Date"},"last_sale_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Sale Price"}},"type":"object","title":"ParcelRecord"},"ParcelsResponse":{"properties":{"parcels":{"items":{"$ref":"#/components/schemas/ParcelData"},"type":"array","title":"Parcels"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"sandbox_mode":{"type":"boolean","title":"Sandbox Mode","default":true},"sandbox_limit_msg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sandbox Limit Msg"}},"type":"object","required":["parcels","total","page","limit"],"title":"ParcelsResponse","description":"Response for parcels endpoint."},"PartnerApplicationRequest":{"properties":{"company_name":{"type":"string","title":"Company Name"},"contact_name":{"type":"string","title":"Contact Name"},"contact_email":{"type":"string","format":"email","title":"Contact Email"},"company_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Website"},"use_case":{"type":"string","title":"Use Case"},"expected_volume":{"type":"string","title":"Expected Volume"},"requested_tier":{"$ref":"#/components/schemas/PartnerTier","default":"growth"}},"type":"object","required":["company_name","contact_name","contact_email","use_case","expected_volume"],"title":"PartnerApplicationRequest"},"PartnerStatus":{"type":"string","enum":["pending","active","suspended","revoked"],"title":"PartnerStatus"},"PartnerTier":{"type":"string","enum":["sandbox","growth","professional","enterprise"],"title":"PartnerTier"},"PolygonCountRequest":{"properties":{"geojson":{"additionalProperties":true,"type":"object","title":"Geojson"}},"type":"object","required":["geojson"],"title":"PolygonCountRequest"},"ProfileUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"profile_picture_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Picture Url"}},"type":"object","title":"ProfileUpdate"},"PromotionRequest":{"properties":{"collection":{"type":"string","title":"Collection"},"merge":{"type":"boolean","title":"Merge","default":true}},"type":"object","required":["collection"],"title":"PromotionRequest"},"PropertyResolvePayload":{"properties":{"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Street address"},"lat":{"type":"number","title":"Lat","description":"Property latitude"},"lng":{"type":"number","title":"Lng","description":"Property longitude"}},"type":"object","required":["lat","lng"],"title":"PropertyResolvePayload"},"PublishForecastRequest":{"properties":{"day":{"type":"integer","title":"Day","default":1},"max_risk":{"type":"string","title":"Max Risk"},"total_revenue":{"type":"number","title":"Total Revenue"},"estimated_buildings":{"type":"integer","title":"Estimated Buildings","default":0},"affected_states":{"items":{"type":"string"},"type":"array","title":"Affected States","default":[]},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","required":["max_risk","total_revenue"],"title":"PublishForecastRequest","description":"Request to publish a forecast alert."},"PublishStormRequest":{"properties":{"storm_id":{"type":"string","title":"Storm Id"},"location":{"type":"string","title":"Location"},"primary_state":{"type":"string","title":"Primary State"},"estimated_revenue":{"type":"number","title":"Estimated Revenue"},"affected_buildings":{"type":"integer","title":"Affected Buildings"},"max_hail_size":{"type":"number","title":"Max Hail Size","default":0},"event_type":{"type":"string","title":"Event Type","default":"Hail"},"opportunity_score":{"type":"number","title":"Opportunity Score","default":0.7},"top_zips":{"items":{"type":"string"},"type":"array","title":"Top Zips","default":[]},"center_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lat"},"center_lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lng"},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","required":["storm_id","location","primary_state","estimated_revenue","affected_buildings"],"title":"PublishStormRequest","description":"Request to publish a storm alert."},"QualifyStormRequest":{"properties":{"estimated_revenue":{"type":"number","title":"Estimated Revenue"},"affected_buildings":{"type":"integer","title":"Affected Buildings"},"max_hail_size":{"type":"number","title":"Max Hail Size","default":0},"event_type":{"type":"string","title":"Event Type","default":"Hail"},"opportunity_score":{"type":"number","title":"Opportunity Score","default":0.7},"risk_level":{"type":"string","title":"Risk Level","default":""}},"type":"object","required":["estimated_revenue","affected_buildings"],"title":"QualifyStormRequest","description":"Request to check storm qualification."},"RecommendedAction":{"type":"string","enum":["deploy","monitor","throttle","ignore"],"title":"RecommendedAction"},"RejectApplicationRequest":{"properties":{"reason":{"type":"string","title":"Reason"}},"type":"object","required":["reason"],"title":"RejectApplicationRequest"},"ReportRequest":{"properties":{"recipient_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Recipient Email"}},"type":"object","title":"ReportRequest"},"ResponseWindowBreakdown":{"properties":{"critical_pct":{"type":"number","title":"Critical Pct","description":"Percent of revenue in critical tier"},"high_pct":{"type":"number","title":"High Pct","description":"Percent of revenue in high tier"},"moderate_pct":{"type":"number","title":"Moderate Pct","description":"Percent of revenue in moderate tier"}},"type":"object","required":["critical_pct","high_pct","moderate_pct"],"title":"ResponseWindowBreakdown"},"RevenueOpportunity":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"signal_id":{"type":"string","title":"Signal Id"},"signal_type":{"type":"string","title":"Signal Type"},"territory_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Territory Id"},"operating_zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operating Zone Id"},"cluster_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Run Id"},"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"},"time_window_start":{"type":"string","format":"date-time","title":"Time Window Start"},"time_window_end":{"type":"string","format":"date-time","title":"Time Window End"},"projections":{"additionalProperties":true,"type":"object","title":"Projections"},"economics":{"additionalProperties":true,"type":"object","title":"Economics"},"cost_model":{"additionalProperties":true,"type":"object","title":"Cost Model"},"expected_roi":{"type":"number","title":"Expected Roi","default":0.0},"expected_cpsr":{"type":"number","title":"Expected Cpsr","default":0.0},"confidence_score":{"type":"number","title":"Confidence Score","default":0.0},"priority_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority Tier"},"opportunity_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Opportunity Score"},"recommended_action":{"$ref":"#/components/schemas/RecommendedAction","default":"monitor"},"decision_reason":{"additionalProperties":true,"type":"object","title":"Decision Reason"},"capacity_snapshot":{"additionalProperties":true,"type":"object","title":"Capacity Snapshot"},"status":{"$ref":"#/components/schemas/OpportunityStatus","default":"new"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id","signal_id","signal_type","time_window_start","time_window_end"],"title":"RevenueOpportunity"},"RevenueRequest":{"properties":{"account_id":{"type":"string","title":"Account Id"},"amount":{"type":"number","title":"Amount"},"revenue_type":{"type":"string","title":"Revenue Type","default":"subscription"},"transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Id"}},"type":"object","required":["account_id","amount"],"title":"RevenueRequest","description":"Track revenue from an account."},"ReverseGeocodeRequest":{"properties":{"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"}},"type":"object","required":["lat","lng"],"title":"ReverseGeocodeRequest","description":"Request for reverse geocoding coordinates."},"ReviewJoinRequestPayload":{"properties":{"action":{"type":"string","title":"Action"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"license_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Tier"}},"type":"object","required":["action"],"title":"ReviewJoinRequestPayload"},"ScreenshotRequest":{"properties":{"view_type":{"type":"string","title":"View Type","default":"opportunity_radar"},"storm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storm Id"},"center_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lat"},"center_lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lng"},"zoom":{"type":"integer","title":"Zoom","default":6},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"hit_list_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hit List Id"},"day":{"type":"integer","title":"Day","default":1},"platform":{"type":"string","title":"Platform","default":"facebook"}},"type":"object","title":"ScreenshotRequest","description":"Request to capture a screenshot."},"SegmentIdentifyRequest":{"properties":{"visitor_id":{"type":"string","title":"Visitor Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"subscription_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Tier"}},"type":"object","required":["visitor_id"],"title":"SegmentIdentifyRequest"},"SelectAccountsRequest":{"properties":{"account_ids":{"items":{"type":"string"},"type":"array","title":"Account Ids"}},"type":"object","required":["account_ids"],"title":"SelectAccountsRequest"},"SessionSummaryResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"properties_visited":{"type":"integer","title":"Properties Visited"},"properties_contacted":{"type":"integer","title":"Properties Contacted"},"jobs_created":{"type":"integer","title":"Jobs Created"},"total_revenue":{"type":"number","title":"Total Revenue"},"time_spent_minutes":{"type":"number","title":"Time Spent Minutes"},"roi":{"type":"number","title":"Roi"}},"type":"object","required":["session_id","properties_visited","properties_contacted","jobs_created","total_revenue","time_spent_minutes","roi"],"title":"SessionSummaryResponse"},"Signal":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"source":{"$ref":"#/components/schemas/SignalSource"},"signal_type":{"$ref":"#/components/schemas/SignalType"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"confidence":{"type":"number","title":"Confidence","default":0.5},"status":{"$ref":"#/components/schemas/SignalStatus","default":"new"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id","source","signal_type","occurred_at"],"title":"Signal"},"SignalCreate":{"properties":{"source":{"$ref":"#/components/schemas/SignalSource","default":"manual"},"signal_type":{"$ref":"#/components/schemas/SignalType"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"confidence":{"type":"number","title":"Confidence","default":0.7}},"type":"object","required":["signal_type","occurred_at"],"title":"SignalCreate"},"SignalSource":{"type":"string","enum":["noaa_nws","noaa_radar","manual","provider_x","perf_anomaly"],"title":"SignalSource"},"SignalStatus":{"type":"string","enum":["new","processed","ignored","error"],"title":"SignalStatus"},"SignalType":{"type":"string","enum":["storm","hail","wind","flood","seasonality","performance"],"title":"SignalType"},"SignupLinkRequest":{"properties":{"visitor_id":{"type":"string","minLength":8,"title":"Visitor Id"},"account_id":{"type":"string","title":"Account Id"},"user_email":{"type":"string","title":"User Email"},"signup_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Source"}},"type":"object","required":["visitor_id","account_id","user_email"],"title":"SignupLinkRequest","description":"Link a signup to previous visitor events."},"StartSessionRequest":{"properties":{"water_event_id":{"type":"string","minLength":1,"title":"Water Event Id"},"territory_zip_codes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Territory Zip Codes"},"start_lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Start Lat"},"start_lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Start Lon"}},"type":"object","required":["water_event_id","territory_zip_codes","start_lat","start_lon"],"title":"StartSessionRequest"},"StormEvent":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"event_type":{"type":"string","title":"Event Type"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry"},"severity":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Severity"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"raw_payload_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Payload Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["source","event_type","start_time"],"title":"StormEvent"},"StormImpact":{"properties":{"opportunity_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Opportunity Score"},"score_band":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Band"},"estimated_revenue":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Revenue"},"buildings_affected":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Buildings Affected"},"area_sq_miles":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area Sq Miles"},"avg_property_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Property Value"}},"type":"object","title":"StormImpact"},"StormImpactZone":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"storm_event_id":{"type":"string","title":"Storm Event Id"},"territory_id":{"type":"string","title":"Territory Id"},"intersection_geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Intersection Geometry"},"impact_metrics":{"additionalProperties":true,"type":"object","title":"Impact Metrics"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["org_id","storm_event_id","territory_id"],"title":"StormImpactZone"},"StormIntelligenceResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"storm_type":{"type":"string","title":"Storm Type"},"state":{"type":"string","title":"State"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"event_date":{"type":"string","title":"Event Date"},"opportunity_score":{"type":"integer","title":"Opportunity Score"},"revenue_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue Min"},"revenue_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue Max"},"report_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Report Count"},"hail_size":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hail Size"},"wind_speed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wind Speed"},"top_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Top Areas"}},"type":"object","required":["slug","storm_type","state","event_date","opportunity_score"],"title":"StormIntelligenceResponse","description":"Public storm data for landing pages."},"StormListResponse":{"properties":{"storms":{"items":{"$ref":"#/components/schemas/StormResponse"},"type":"array","title":"Storms"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["storms","total","page","page_size","has_more"],"title":"StormListResponse"},"StormLocation":{"properties":{"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"county":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County"},"zips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Zips"}},"type":"object","title":"StormLocation"},"StormResponse":{"properties":{"event_id":{"type":"string","title":"Event Id"},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"},"severity":{"anyOf":[{"$ref":"#/components/schemas/StormSeverity"},{"type":"null"}]},"location":{"anyOf":[{"$ref":"#/components/schemas/StormLocation"},{"type":"null"}]},"timing":{"anyOf":[{"$ref":"#/components/schemas/StormTiming"},{"type":"null"}]},"impact":{"anyOf":[{"$ref":"#/components/schemas/StormImpact"},{"type":"null"}]},"data_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Version"}},"type":"object","required":["event_id"],"title":"StormResponse"},"StormSeverity":{"properties":{"magnitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Magnitude"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","title":"StormSeverity"},"StormStats":{"properties":{"total_storms":{"type":"integer","title":"Total Storms"},"by_state":{"additionalProperties":true,"type":"object","title":"By State"},"by_severity":{"additionalProperties":true,"type":"object","title":"By Severity"},"by_event_type":{"additionalProperties":true,"type":"object","title":"By Event Type"},"avg_opportunity_score":{"type":"number","title":"Avg Opportunity Score"},"total_estimated_revenue":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Estimated Revenue"},"total_damage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Damage"},"date_range":{"additionalProperties":true,"type":"object","title":"Date Range"}},"type":"object","required":["total_storms","by_state","by_severity","by_event_type","avg_opportunity_score","date_range"],"title":"StormStats"},"StormTiming":{"properties":{"start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"},"end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},"type":"object","title":"StormTiming"},"StreamGaugeResponse":{"properties":{"gauge_id":{"type":"string","title":"Gauge Id"},"site_name":{"type":"string","title":"Site Name"},"state":{"type":"string","title":"State"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"stage_ft":{"type":"number","title":"Stage Ft"},"action_stage_ft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Action Stage Ft"},"flood_stage_ft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flood Stage Ft"},"stage_status":{"type":"string","title":"Stage Status"},"reading_time":{"type":"string","title":"Reading Time"},"distance_km":{"type":"number","title":"Distance Km"}},"type":"object","required":["gauge_id","site_name","state","lat","lon","stage_ft","action_stage_ft","flood_stage_ft","stage_status","reading_time","distance_km"],"title":"StreamGaugeResponse"},"SubscriptionResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["checkout_url","session_id"],"title":"SubscriptionResponse"},"TargetingCellsFilterPayload":{"properties":{"min_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Min Score","default":0},"max_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Max Score","default":100},"min_distance":{"type":"number","minimum":0.0,"title":"Min Distance","default":0},"max_distance":{"type":"number","minimum":0.0,"title":"Max Distance","default":50},"zip_codes":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Zip Codes","description":"Filter by specific ZIP codes"},"min_buildings":{"type":"integer","minimum":0.0,"title":"Min Buildings","default":0},"route_assigned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Route Assigned","description":"Filter by route assignment status"},"sort_by":{"type":"string","title":"Sort By","description":"Sort field","default":"opportunity_score"},"sort_order":{"type":"string","title":"Sort Order","description":"asc or desc","default":"desc"},"limit":{"type":"integer","maximum":2000.0,"minimum":1.0,"title":"Limit","default":500}},"type":"object","title":"TargetingCellsFilterPayload"},"TeamMember":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name"},"role":{"type":"string","title":"Role"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"}},"type":"object","required":["id","email","name","role","is_active","created_at"],"title":"TeamMember","description":"Team member info for listing"},"Territory":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"brand_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Profile Id"},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["org_id","name","type"],"title":"Territory"},"TerritoryCreate":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"geometry":{"additionalProperties":true,"type":"object","title":"Geometry"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"brand_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Profile Id"}},"type":"object","required":["name","type","geometry"],"title":"TerritoryCreate"},"TerritoryRiskProfile":{"properties":{"high_risk_zip_count":{"type":"integer","title":"High Risk Zip Count"},"avg_urgency_score":{"type":"number","title":"Avg Urgency Score"},"nfip_coverage_pct":{"type":"number","title":"Nfip Coverage Pct"},"cso_community_count":{"type":"integer","title":"Cso Community Count"},"building_age_risk_score":{"type":"number","title":"Building Age Risk Score"},"soil_saturation_avg":{"type":"number","title":"Soil Saturation Avg"}},"type":"object","required":["high_risk_zip_count","avg_urgency_score","nfip_coverage_pct","cso_community_count","building_age_risk_score","soil_saturation_avg"],"title":"TerritoryRiskProfile"},"Token":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/User"}},"type":"object","required":["access_token","user"],"title":"Token"},"TopUrgencyZip":{"properties":{"zip_code":{"type":"string","title":"Zip Code"},"urgency_score":{"type":"number","title":"Urgency Score"},"urgency_tier":{"type":"string","title":"Urgency Tier"},"estimated_revenue":{"type":"number","title":"Estimated Revenue"},"event_type":{"type":"string","title":"Event Type"}},"type":"object","required":["zip_code","urgency_score","urgency_tier","estimated_revenue","event_type"],"title":"TopUrgencyZip"},"TrialUnlockRequest":{"properties":{"zip_code":{"type":"string","title":"Zip Code"},"session_id":{"type":"string","title":"Session Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["zip_code","session_id","email"],"title":"TrialUnlockRequest"},"TriggerIn":{"properties":{"name":{"type":"string","title":"Name"},"criteria":{"additionalProperties":true,"type":"object","title":"Criteria"},"delivery":{"additionalProperties":true,"type":"object","title":"Delivery"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["name","criteria","delivery"],"title":"TriggerIn"},"TriggerUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"criteria":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Criteria"},"delivery":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Delivery"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"TriggerUpdate"},"UpdateAPIKeyRequest":{"properties":{"tier":{"anyOf":[{"$ref":"#/components/schemas/PartnerTier"},{"type":"null"}]},"status":{"anyOf":[{"$ref":"#/components/schemas/PartnerStatus"},{"type":"null"}]},"custom_daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Custom Daily Limit"},"custom_monthly_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Custom Monthly Limit"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"UpdateAPIKeyRequest"},"UpdateCaseRequest":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"assigned_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned To"},"internal_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Notes"}},"type":"object","title":"UpdateCaseRequest"},"UpdateModuleTierRequest":{"properties":{"tier":{"$ref":"#/components/schemas/ModuleTier"}},"type":"object","required":["tier"],"title":"UpdateModuleTierRequest"},"UpdatePartnerKeyPayload":{"properties":{"partner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Name"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"rate_limit_per_minute":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit Per Minute"},"rate_limit_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit Per Day"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","title":"UpdatePartnerKeyPayload"},"UpdateRouteStatusPayload":{"properties":{"status":{"type":"string","title":"Status","description":"Route status: unassigned, assigned, in_progress, completed"}},"type":"object","required":["status"],"title":"UpdateRouteStatusPayload"},"UpdateTerritoryStatusRequest":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"UpdateTerritoryStatusRequest","description":"Request to update territory status."},"UploadResponse":{"properties":{"inserted":{"type":"integer","title":"Inserted"},"errors":{"type":"integer","title":"Errors"},"message":{"type":"string","title":"Message"}},"type":"object","required":["inserted","errors","message"],"title":"UploadResponse"},"UrgencyBreakdown":{"properties":{"critical_count":{"type":"integer","title":"Critical Count"},"high_count":{"type":"integer","title":"High Count"},"moderate_count":{"type":"integer","title":"Moderate Count"},"critical_pct":{"type":"number","title":"Critical Pct"},"high_pct":{"type":"number","title":"High Pct"},"moderate_pct":{"type":"number","title":"Moderate Pct"}},"type":"object","required":["critical_count","high_count","moderate_count","critical_pct","high_pct","moderate_pct"],"title":"UrgencyBreakdown"},"User":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"agency_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Id"},"email":{"type":"string","format":"email","title":"Email"},"name":{"type":"string","title":"Name"},"role":{"$ref":"#/components/schemas/UserRole","default":"read_only"},"is_active":{"type":"boolean","title":"Is Active","default":true},"onboarding_completed":{"type":"boolean","title":"Onboarding Completed","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["email","name"],"title":"User"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"type":"string","title":"Name"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"},"agency_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Name"},"account_type":{"type":"string","title":"Account Type","default":"client"},"role":{"anyOf":[{"$ref":"#/components/schemas/UserRole"},{"type":"null"}],"default":"owner"},"visitor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visitor Id"}},"type":"object","required":["email","password","name"],"title":"UserCreate"},"UserLogin":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"UserLogin"},"UserRole":{"type":"string","enum":["super_admin","agency_admin","agency_operator","owner","admin","marketing","sales_ops","read_only"],"title":"UserRole"},"UserUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UserUpdate","description":"Update user details"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WaterDashboardSummary":{"properties":{"active_events_count":{"type":"integer","title":"Active Events Count"},"critical_events_count":{"type":"integer","title":"Critical Events Count"},"total_revenue_opportunity":{"type":"number","title":"Total Revenue Opportunity"},"active_sessions_count":{"type":"integer","title":"Active Sessions Count"},"properties_dispatched_today":{"type":"integer","title":"Properties Dispatched Today"},"jobs_created_30d":{"type":"integer","title":"Jobs Created 30D"},"revenue_captured_30d":{"type":"number","title":"Revenue Captured 30D"},"mold_risk_alerts_active":{"type":"integer","title":"Mold Risk Alerts Active"},"top_urgency_zips":{"items":{"$ref":"#/components/schemas/TopUrgencyZip"},"type":"array","title":"Top Urgency Zips"},"response_window_breakdown":{"$ref":"#/components/schemas/ResponseWindowBreakdown"}},"type":"object","required":["active_events_count","critical_events_count","total_revenue_opportunity","active_sessions_count","properties_dispatched_today","jobs_created_30d","revenue_captured_30d","mold_risk_alerts_active","top_urgency_zips","response_window_breakdown"],"title":"WaterDashboardSummary"},"WaterDispatchEventResponse":{"properties":{"water_event_id":{"type":"string","title":"Water Event Id"},"event_type":{"type":"string","title":"Event Type"},"onset_time":{"type":"string","format":"date-time","title":"Onset Time"},"hours_elapsed":{"type":"number","title":"Hours Elapsed"},"affected_zip_count":{"type":"integer","title":"Affected Zip Count"},"total_estimated_revenue":{"type":"number","title":"Total Estimated Revenue"},"top_urgency_tier":{"type":"string","title":"Top Urgency Tier"},"urgency_score":{"type":"number","title":"Urgency Score"}},"type":"object","required":["water_event_id","event_type","onset_time","hours_elapsed","affected_zip_count","total_estimated_revenue","top_urgency_tier","urgency_score"],"title":"WaterDispatchEventResponse"},"WaterDispatchPropertiesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/WaterDispatchPropertyResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"urgency_breakdown":{"$ref":"#/components/schemas/UrgencyBreakdown"}},"type":"object","required":["items","total","urgency_breakdown"],"title":"WaterDispatchPropertiesResponse"},"WaterDispatchPropertyResponse":{"properties":{"property_id":{"type":"string","title":"Property Id"},"address":{"type":"string","title":"Address"},"zip_code":{"type":"string","title":"Zip Code"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"urgency_score":{"type":"number","title":"Urgency Score"},"urgency_tier":{"type":"string","title":"Urgency Tier"},"building_age_factor":{"type":"number","title":"Building Age Factor"},"nfip_flag":{"type":"boolean","title":"Nfip Flag"},"prior_claim_flag":{"type":"boolean","title":"Prior Claim Flag"},"cso_flag":{"type":"boolean","title":"Cso Flag"},"estimated_damage_category":{"type":"string","title":"Estimated Damage Category"},"avg_job_value":{"type":"number","title":"Avg Job Value"},"estimated_job_value":{"type":"number","title":"Estimated Job Value"},"h3_cell":{"type":"string","title":"H3 Cell"}},"type":"object","required":["property_id","address","zip_code","lat","lon","urgency_score","urgency_tier","building_age_factor","nfip_flag","prior_claim_flag","cso_flag","estimated_damage_category","avg_job_value","estimated_job_value","h3_cell"],"title":"WaterDispatchPropertyResponse"},"WaterDispatchSessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"org_id":{"type":"string","title":"Org Id"},"water_event_id":{"type":"string","title":"Water Event Id"},"territory_zips":{"items":{"type":"string"},"type":"array","title":"Territory Zips"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"properties_visited":{"type":"integer","title":"Properties Visited"},"properties_contacted":{"type":"integer","title":"Properties Contacted"},"jobs_created":{"type":"integer","title":"Jobs Created"},"initial_route":{"anyOf":[{"$ref":"#/components/schemas/DispatchRouteResponse"},{"type":"null"}]}},"type":"object","required":["session_id","org_id","water_event_id","territory_zips","started_at","completed_at","properties_visited","properties_contacted","jobs_created","initial_route"],"title":"WaterDispatchSessionResponse"},"WaterDoorKnockRequest":{"properties":{"property_id":{"type":"string","minLength":1,"title":"Property Id"},"property_address":{"type":"string","minLength":1,"title":"Property Address"},"zip_code":{"type":"string","pattern":"^\\d{5}$","title":"Zip Code"},"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon"},"result":{"type":"string","title":"Result","description":"One of: no_answer | not_interested | interested | scheduled | already_hired"},"notes":{"type":"string","title":"Notes","default":""},"script_used":{"type":"string","title":"Script Used","default":""}},"type":"object","required":["property_id","property_address","zip_code","lat","lon","result"],"title":"WaterDoorKnockRequest"},"WaterJobOutcomeRequest":{"properties":{"property_id":{"type":"string","minLength":1,"title":"Property Id"},"zip_code":{"type":"string","pattern":"^\\d{5}$","title":"Zip Code"},"job_category":{"type":"string","minLength":1,"title":"Job Category"},"job_value":{"type":"number","minimum":0.0,"title":"Job Value"}},"type":"object","required":["property_id","zip_code","job_category","job_value"],"title":"WaterJobOutcomeRequest"},"WaterJobOutcomeResponse":{"properties":{"outcome_id":{"type":"string","title":"Outcome Id"},"property_id":{"type":"string","title":"Property Id"},"zip_code":{"type":"string","title":"Zip Code"},"job_category":{"type":"string","title":"Job Category"},"job_value":{"type":"number","title":"Job Value"},"session_id":{"type":"string","title":"Session Id"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["outcome_id","property_id","zip_code","job_category","job_value","session_id","created_at"],"title":"WaterJobOutcomeResponse"},"ZipUrgencyMapPoint":{"properties":{"zip_code":{"type":"string","title":"Zip Code"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"urgency_score":{"type":"number","title":"Urgency Score"},"urgency_tier":{"type":"string","title":"Urgency Tier"},"estimated_revenue":{"type":"number","title":"Estimated Revenue"},"event_type":{"type":"string","title":"Event Type"}},"type":"object","required":["zip_code","lat","lon","urgency_score","urgency_tier","estimated_revenue","event_type"],"title":"ZipUrgencyMapPoint"},"ZoneActivityPayload":{"properties":{"status":{"type":"string","title":"Status","description":"visited | skipped | in_progress"},"doors_knocked":{"type":"integer","minimum":0.0,"title":"Doors Knocked","default":0},"contacts_made":{"type":"integer","minimum":0.0,"title":"Contacts Made","default":0},"appointments_set":{"type":"integer","minimum":0.0,"title":"Appointments Set","default":0},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["status"],"title":"ZoneActivityPayload"},"routes__canvasser__AssignRoutePayload":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"User ID to assign, or null to unassign"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"User email for display"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name","description":"User name for display"}},"type":"object","title":"AssignRoutePayload"},"routes__google_ads__CampaignCreateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"daily_budget_micros":{"type":"integer","minimum":100000.0,"title":"Daily Budget Micros","description":"Budget in micros (1,000,000 = $1)","default":5000000},"channel_type":{"type":"string","title":"Channel Type","default":"SEARCH"}},"type":"object","required":["name"],"title":"CampaignCreateRequest"},"routes__google_ads__CampaignResponse":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"provider":{"type":"string","title":"Provider"},"is_live":{"type":"boolean","title":"Is Live"},"budget_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget Id"}},"type":"object","required":["campaign_id","name","status","provider","is_live"],"title":"CampaignResponse"},"routes__google_ads__InsightsResponse":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id"},"impressions":{"type":"integer","title":"Impressions"},"clicks":{"type":"integer","title":"Clicks"},"cost_micros":{"type":"integer","title":"Cost Micros"},"cost_dollars":{"type":"number","title":"Cost Dollars","default":0},"conversions":{"type":"number","title":"Conversions","default":0},"ctr":{"type":"number","title":"Ctr","default":0},"avg_cpc_micros":{"type":"integer","title":"Avg Cpc Micros","default":0},"avg_cpc_dollars":{"type":"number","title":"Avg Cpc Dollars","default":0},"provider":{"type":"string","title":"Provider"},"is_live":{"type":"boolean","title":"Is Live"}},"type":"object","required":["campaign_id","impressions","clicks","cost_micros","provider","is_live"],"title":"InsightsResponse"},"routes__hit_lists__AssignRoutePayload":{"properties":{"assigned_to":{"type":"string","title":"Assigned To","description":"Email of the assigned rep"}},"type":"object","required":["assigned_to"],"title":"AssignRoutePayload"},"routes__meta_ads__CampaignCreateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"objective":{"type":"string","title":"Objective","default":"OUTCOME_LEADS"},"daily_budget":{"type":"integer","minimum":100.0,"title":"Daily Budget","description":"Budget in cents","default":5000},"special_ad_categories":{"items":{"type":"string"},"type":"array","title":"Special Ad Categories","default":[]}},"type":"object","required":["name"],"title":"CampaignCreateRequest"},"routes__meta_ads__CampaignResponse":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id"},"name":{"type":"string","title":"Name"},"objective":{"type":"string","title":"Objective"},"status":{"type":"string","title":"Status"},"provider":{"type":"string","title":"Provider"},"is_live":{"type":"boolean","title":"Is Live"}},"type":"object","required":["campaign_id","name","objective","status","provider","is_live"],"title":"CampaignResponse"},"routes__meta_ads__InsightsResponse":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id"},"impressions":{"type":"integer","title":"Impressions"},"clicks":{"type":"integer","title":"Clicks"},"spend":{"type":"number","title":"Spend"},"reach":{"type":"integer","title":"Reach"},"cpm":{"type":"number","title":"Cpm","default":0},"cpc":{"type":"number","title":"Cpc","default":0},"ctr":{"type":"number","title":"Ctr","default":0},"provider":{"type":"string","title":"Provider"},"is_live":{"type":"boolean","title":"Is Live"}},"type":"object","required":["campaign_id","impressions","clicks","spend","reach","provider","is_live"],"title":"InsightsResponse"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-Admin-Key"},"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Partner API v1","description":"External partner data endpoints (rate limited)"},{"name":"Partner Billing","description":"Subscription and billing management"},{"name":"Partner Management","description":"Admin: API key management and analytics"},{"name":"Partner Usage","description":"Partner-facing usage analytics"},{"name":"Webhooks","description":"Real-time event notifications (Enterprise)"}]}