{"openapi":"3.1.0","info":{"title":"Dynamo CSMS API","description":"\n    **Dynamo CSMS** - Complete Charging Station Management System API\n    \n    A comprehensive API for managing electric vehicle charging infrastructure with support for:\n    \n    * **OCPP 2.0.1 & 1.6** - Full protocol implementation\n    * **Charge Point Management** - Registration, monitoring, and control\n    * **Billing & Pricing** - Flexible billing rules, promotional codes, revenue sharing\n    * **User Management** - Roles, personas, and billing classifications\n    * **Commissioning** - Complete installer workflow and charge point setup\n    * **Real-time Monitoring** - WebSocket-based status updates and meter values\n    * **Developer Platform** - API keys, webhooks, and integrations\n    \n    ## Authentication\n    \n    Most endpoints require authentication via Bearer token or API key:\n    \n    ```\n    Authorization: Bearer your_api_key_here\n    ```\n    \n    Or use the `X-API-Key` header for developer API keys.\n    \n    ## Getting Started\n    \n    Contact your administrator for API access.\n    3. Use **Try it out** in the [Swagger UI](/swagger) to test with your key\n    4. Browse the full [API Reference](/docs) for endpoint details\n    \n    ## Rate Limits\n    \n    - **Free Tier**: 1000 requests/hour\n    - **Pro Tier**: 10000 requests/hour\n    - **Enterprise**: Custom limits\n    \n    ## Support\n    \n    - **Documentation**: [docs.dynamo-csms.com](https://docs.dynamo-csms.com)\n    - **Support**: support@dynamo-csms.com\n    - **Status**: [status.dynamo-csms.com](https://status.dynamo-csms.com)\n    ","version":"1.0.0"},"paths":{"/api/v1/status/charge-points/{charge_point_id}/commissioning-status":{"get":{"tags":["status-monitoring"],"summary":"Get Commissioning Status","description":"Get commissioning status of a charge point (Story 4.1).","operationId":"get_commissioning_status_api_v1_status_charge_points__charge_point_id__commissioning_status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/commissioning-progress":{"get":{"tags":["status-monitoring"],"summary":"Get Commissioning Progress","description":"Get detailed commissioning progress tracking.","operationId":"get_commissioning_progress_api_v1_status_charge_points__charge_point_id__commissioning_progress_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Commissioning Progress Api V1 Status Charge Points  Charge Point Id  Commissioning Progress Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/connection-health":{"get":{"tags":["status-monitoring"],"summary":"Get Connection Health","description":"Get connection health status of a charge point (Story 4.2).","operationId":"get_connection_health_api_v1_status_charge_points__charge_point_id__connection_health_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionHealthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/heartbeat-status":{"get":{"tags":["status-monitoring"],"summary":"Get Heartbeat Status","description":"Get heartbeat monitoring status.","operationId":"get_heartbeat_status_api_v1_status_charge_points__charge_point_id__heartbeat_status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/projects/{project_id}/status-overview":{"get":{"tags":["status-monitoring"],"summary":"Get Project Status Overview","description":"Get status overview for all charge points in a project.","operationId":"get_project_status_overview_api_v1_status_projects__project_id__status_overview_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusOverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/commissioning-logs":{"get":{"tags":["status-monitoring"],"summary":"Get Commissioning Logs","description":"Get detailed commissioning logs for troubleshooting.","operationId":"get_commissioning_logs_api_v1_status_charge_points__charge_point_id__commissioning_logs_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Commissioning Logs Api V1 Status Charge Points  Charge Point Id  Commissioning Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/commissioning-failure":{"post":{"tags":["status-monitoring"],"summary":"Record Commissioning Failure","description":"Record a commissioning failure.","operationId":"record_commissioning_failure_api_v1_status_charge_points__charge_point_id__commissioning_failure_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Failure Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Record Commissioning Failure Api V1 Status Charge Points  Charge Point Id  Commissioning Failure Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/connection-errors":{"get":{"tags":["status-monitoring"],"summary":"Get Connection Errors","description":"Get connection errors for troubleshooting.","operationId":"get_connection_errors_api_v1_status_charge_points__charge_point_id__connection_errors_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Connection Errors Api V1 Status Charge Points  Charge Point Id  Connection Errors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/mark-offline":{"post":{"tags":["status-monitoring"],"summary":"Mark Charge Point Offline","description":"Mark a charge point as offline.","operationId":"mark_charge_point_offline_api_v1_status_charge_points__charge_point_id__mark_offline_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Offline Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mark Charge Point Offline Api V1 Status Charge Points  Charge Point Id  Mark Offline Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/reconnection":{"post":{"tags":["status-monitoring"],"summary":"Record Reconnection","description":"Record a charge point reconnection.","operationId":"record_reconnection_api_v1_status_charge_points__charge_point_id__reconnection_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Reconnection Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Record Reconnection Api V1 Status Charge Points  Charge Point Id  Reconnection Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/projects/{project_id}/status-analytics":{"get":{"tags":["status-monitoring"],"summary":"Get Status Analytics","description":"Get status analytics and dashboard data.","operationId":"get_status_analytics_api_v1_status_projects__project_id__status_analytics_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Status Analytics Api V1 Status Projects  Project Id  Status Analytics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/live-status":{"get":{"tags":["status-monitoring"],"summary":"Get Live Status","description":"Get real-time Firebase/Firestore status with proper enum types.","operationId":"get_live_status_api_v1_status_charge_points__charge_point_id__live_status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/alert-config":{"post":{"tags":["status-monitoring"],"summary":"Configure Status Alerts","description":"Configure status alerts and notifications. Installer or site owner with access only.","operationId":"configure_status_alerts_api_v1_status_charge_points__charge_point_id__alert_config_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Alert Config"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Configure Status Alerts Api V1 Status Charge Points  Charge Point Id  Alert Config Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/active-alerts":{"get":{"tags":["status-monitoring"],"summary":"Get Active Alerts","description":"Get active alerts for a charge point.","operationId":"get_active_alerts_api_v1_status_charge_points__charge_point_id__active_alerts_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Active Alerts Api V1 Status Charge Points  Charge Point Id  Active Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/alert-history":{"get":{"tags":["status-monitoring"],"summary":"Get alert history for a charge point","description":"Returns paginated list of alerts for the charge point in the last 7 days (or custom range). Installer or site owner with access only.","operationId":"get_alert_history_api_v1_status_charge_points__charge_point_id__alert_history_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Alert History Api V1 Status Charge Points  Charge Point Id  Alert History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/charge-points/{charge_point_id}/status-override":{"post":{"tags":["status-monitoring"],"summary":"Manual Status Override","description":"Manual override of status if needed.","operationId":"manual_status_override_api_v1_status_charge_points__charge_point_id__status_override_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Override Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Manual Status Override Api V1 Status Charge Points  Charge Point Id  Status Override Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/projects/{project_id}/charge-points-status":{"get":{"tags":["status-monitoring"],"summary":"Get Multi Charge Point Status","description":"Get status for all charge points in a project.","operationId":"get_multi_charge_point_status_api_v1_status_projects__project_id__charge_points_status_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Multi Charge Point Status Api V1 Status Projects  Project Id  Charge Points Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/projects/{project_id}/export-status":{"post":{"tags":["status-monitoring"],"summary":"Export Status Data","description":"Export status data for reporting.","operationId":"export_status_data_api_v1_status_projects__project_id__export_status_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Export Params"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Export Status Data Api V1 Status Projects  Project Id  Export Status Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/usage/today":{"get":{"tags":["api-usage"],"summary":"Get Today Usage","description":"Get today's API usage summary","operationId":"get_today_usage_api_v1_analytics_usage_today_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailySummary"}}}}}}},"/api/v1/analytics/usage/date/{target_date}":{"get":{"tags":["api-usage"],"summary":"Get Date Usage","description":"Get API usage summary for a specific date","operationId":"get_date_usage_api_v1_analytics_usage_date__target_date__get","parameters":[{"name":"target_date","in":"path","required":true,"schema":{"type":"string","title":"Target Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailySummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/usage/recent":{"get":{"tags":["api-usage"],"summary":"Get Recent Usage","description":"Get API usage summaries for recent days","operationId":"get_recent_usage_api_v1_analytics_usage_recent_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Number of recent days to retrieve","default":7,"title":"Days"},"description":"Number of recent days to retrieve"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DailySummary"},"title":"Response Get Recent Usage Api V1 Analytics Usage Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/usage/top-endpoints":{"get":{"tags":["api-usage"],"summary":"Get Top Endpoints","description":"Get top endpoints by call count for a specific date","operationId":"get_top_endpoints_api_v1_analytics_usage_top_endpoints_get","parameters":[{"name":"target_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date in YYYY-MM-DD format (default: today)","title":"Target Date"},"description":"Date in YYYY-MM-DD format (default: today)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of top endpoints to return","default":10,"title":"Limit"},"description":"Number of top endpoints to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EndpointUsage"},"title":"Response Get Top Endpoints Api V1 Analytics Usage Top Endpoints Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/usage/analytics":{"get":{"tags":["api-usage"],"summary":"Get Usage Analytics","description":"Get comprehensive usage analytics for recent days","operationId":"get_usage_analytics_api_v1_analytics_usage_analytics_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Number of recent days to analyze","default":7,"title":"Days"},"description":"Number of recent days to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageAnalytics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/usage/force-summary":{"post":{"tags":["api-usage"],"summary":"Force Daily Summary","description":"Force write current daily summary (useful for testing or end-of-day)","operationId":"force_daily_summary_api_v1_analytics_usage_force_summary_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Force Daily Summary Api V1 Analytics Usage Force Summary Post"}}}}}}},"/api/v1/alerts/{alert_id}/acknowledge":{"patch":{"tags":["alerts"],"summary":"Acknowledge an alert","description":"Mark an alert as acknowledged (manual_ack). Installer or site owner with access to the charge point only.","operationId":"acknowledge_alert_api_v1_alerts__alert_id__acknowledge_patch","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"}}}}}}},"/internal/billing/monthly-close":{"post":{"tags":["internal"],"summary":"Post Monthly Close","description":"Run monthly close for a given month: aggregate sessions and upsert draft bills\nfor each org with activity. Defaults to previous month if year/month omitted.","operationId":"post_monthly_close_internal_billing_monthly_close_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthlyCloseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/send-overdue-reminders":{"post":{"tags":["internal"],"summary":"Post Overdue Reminders","description":"Trigger overdue invoice reminder emails. Secured by internal token.","operationId":"post_overdue_reminders_internal_billing_send_overdue_reminders_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reminder_interval_days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Reminder Interval Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverdueRemindersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ocpp16/send_command":{"post":{"tags":["OCPP 1.6"],"summary":"Send Ocpp16 Command","description":"Send a generic OCPP 1.6 command to a charge point.\n\nThis endpoint allows you to send any OCPP 1.6 message to a connected charge point.\nThe charge point must be connected via WebSocket and using OCPP 1.6 protocol.\n\n## Supported Actions\n\n### Core Profile\n- `BootNotification` - Charge point registration\n- `Heartbeat` - Keep-alive message\n- `StatusNotification` - Connector status updates\n- `Authorize` - Authorization request\n\n### Smart Charging Profile\n- `SetChargingProfile` - Configure charging limits\n- `ClearChargingProfile` - Remove charging profiles\n- `GetChargingProfiles` - Retrieve active profiles\n\n### Remote Trigger Profile\n- `RemoteStartTransaction` - Start charging session\n- `RemoteStopTransaction` - Stop charging session\n- `TriggerMessage` - Request specific message\n\n### Firmware Management Profile\n- `UpdateFirmware` - Firmware update command\n- `GetDiagnostics` - Request diagnostics\n\n## Prerequisites\n- Charge point must be connected via WebSocket\n- Charge point must be using OCPP 1.6 protocol\n- Valid authentication token required\n\n## Request Format\n```json\n{\n    \"charge_point_id\": \"CP001\",\n    \"action\": \"RemoteStartTransaction\",\n    \"message\": {\n        \"id_tag\": \"RFID123456\",\n        \"connector_id\": 1\n    }\n}\n```\n\n## Response Format\n```json\n{\n    \"status\": \"success\",\n    \"message\": \"Command 'RemoteStartTransaction' sent to charge point CP001\"\n}\n```\n\n## Error Scenarios\n\n### 404 - Charge Point Not Connected\n```json\n{\n    \"detail\": \"Charge point is not connected\"\n}\n```\n\n### 400 - Wrong Protocol\n```json\n{\n    \"detail\": \"Charge point is not using OCPP 1.6\"\n}\n```\n\n### 500 - Command Execution Error\n```json\n{\n    \"detail\": \"Error sending command to charge point CP001: Connection timeout\"\n}\n```\n\n## Usage Examples\n\n### Start a Transaction\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/ocpp16/send_command\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -H \"Content-Type: application/json\"          -d '{\n       \"charge_point_id\": \"CP001\",\n       \"action\": \"RemoteStartTransaction\",\n       \"message\": {\n         \"id_tag\": \"RFID123456\",\n         \"connector_id\": 1\n       }\n     }'\n```\n\n### Set Charging Profile\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/ocpp16/send_command\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -H \"Content-Type: application/json\"          -d '{\n       \"charge_point_id\": \"CP001\",\n       \"action\": \"SetChargingProfile\",\n       \"message\": {\n         \"connector_id\": 1,\n         \"charging_profile\": {\n           \"charging_profile_id\": 1,\n           \"stack_level\": 0,\n           \"charging_profile_purpose\": \"TxProfile\",\n           \"charging_profile_kind\": \"Absolute\",\n           \"charging_schedule\": {\n             \"charging_rate_unit\": \"W\",\n             \"charging_schedule_period\": [\n               {\n                 \"start_period\": 0,\n                 \"limit\": 11000\n               }\n             ]\n           }\n         }\n       }\n     }'\n```\n\n## Troubleshooting\n\n### Charge Point Not Responding\n1. Check WebSocket connection status\n2. Verify charge point is online\n3. Check network connectivity\n4. Review charge point logs\n\n### Invalid Message Format\n1. Validate JSON structure\n2. Check required fields for the action\n3. Verify data types match OCPP 1.6 specification\n4. Review action-specific requirements\n\n## Related Endpoints\n- `GET /api/v1/ocpp16/charge_points/status` - Check connection status\n- `GET /api/v1/ocpp16/active_transactions/{charge_point_id}` - View active transactions","operationId":"send_ocpp16_command_api_v1_ocpp16_send_command_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OCPP16CommandRequest"}}},"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/ocpp16/remote_start_transaction":{"post":{"tags":["OCPP 1.6"],"summary":"Remote Start Transaction","description":"Start a charging transaction remotely on an OCPP 1.6 charge point.","operationId":"remote_start_transaction_api_v1_ocpp16_remote_start_transaction_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoteStartTransactionRequest"}}},"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/ocpp16/remote_stop_transaction":{"post":{"tags":["OCPP 1.6"],"summary":"Remote Stop Transaction","description":"Stop an ongoing charging transaction on an OCPP 1.6 charge point.","operationId":"remote_stop_transaction_api_v1_ocpp16_remote_stop_transaction_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoteStopTransactionRequest"}}},"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/ocpp16/change_availability":{"post":{"tags":["OCPP 1.6"],"summary":"Change Availability","description":"Change the availability of a connector on an OCPP 1.6 charge point.","operationId":"change_availability_api_v1_ocpp16_change_availability_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeAvailabilityRequest"}}},"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/ocpp16/set_charging_profile":{"post":{"tags":["OCPP 1.6"],"summary":"Set Charging Profile","description":"Set a charging profile on an OCPP 1.6 charge point.","operationId":"set_charging_profile_api_v1_ocpp16_set_charging_profile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetChargingProfileRequest"}}},"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/ocpp16/clear_charging_profile":{"post":{"tags":["OCPP 1.6"],"summary":"Clear Charging Profile","description":"Clear charging profiles on an OCPP 1.6 charge point.","operationId":"clear_charging_profile_api_v1_ocpp16_clear_charging_profile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClearChargingProfileRequest"}}},"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/ocpp16/reset":{"post":{"tags":["OCPP 1.6"],"summary":"Reset Charge Point","description":"Reset an OCPP 1.6 charge point.","operationId":"reset_charge_point_api_v1_ocpp16_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetRequest"}}},"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/ocpp16/trigger_message":{"post":{"tags":["OCPP 1.6"],"summary":"Trigger Message","description":"Trigger a specific message from an OCPP 1.6 charge point.","operationId":"trigger_message_api_v1_ocpp16_trigger_message_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerMessageRequest"}}},"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/ocpp16/reserve_now":{"post":{"tags":["OCPP 1.6"],"summary":"Reserve Now","description":"Reserve a connector on an OCPP 1.6 charge point.","operationId":"reserve_now_api_v1_ocpp16_reserve_now_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReserveNowRequest"}}},"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/ocpp16/cancel_reservation":{"post":{"tags":["OCPP 1.6"],"summary":"Cancel Reservation","description":"Cancel a reservation on an OCPP 1.6 charge point.","operationId":"cancel_reservation_api_v1_ocpp16_cancel_reservation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelReservationRequest"}}},"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/ocpp16/active_transactions/{charge_point_id}":{"get":{"tags":["OCPP 1.6"],"summary":"Get Active Transactions","description":"Get all active transactions for an OCPP 1.6 charge point.","operationId":"get_active_transactions_api_v1_ocpp16_active_transactions__charge_point_id__get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ocpp16/charge_points/status":{"get":{"tags":["OCPP 1.6"],"summary":"Get Ocpp16 Charge Points Status","description":"Get status of all connected OCPP 1.6 charge points.","operationId":"get_ocpp16_charge_points_status_api_v1_ocpp16_charge_points_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/signup":{"post":{"tags":["installer-onboarding"],"summary":"Installer Signup","description":"Register a new installer account with Supabase Auth\n\nThis endpoint creates a new installer account in the system. The account is created\nwith Supabase Auth integration, which handles user authentication, email verification,\nand password management.\n\n## Registration Process\n\n1. **Account Creation**: Creates user account in Supabase Auth\n2. **Profile Setup**: Creates installer profile in local database\n3. **Email Confirmation**: Supabase automatically sends confirmation email\n4. **User Record**: Creates compatibility user record for system integration\n\n## Prerequisites\n- Valid email address (not already registered)\n- Strong password (minimum 8 characters)\n- Company information (optional but recommended)\n\n## Request Format\n```json\n{\n    \"email\": \"installer@company.com\",\n    \"password\": \"SecurePass123!\",\n    \"full_name\": \"John Smith\",\n    \"company_name\": \"EV Installations Ltd\",\n    \"phone\": \"+1-555-0123\"\n}\n```\n\n## Response Format\n```json\n{\n    \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n    \"refresh_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n    \"user\": {\n        \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n        \"email\": \"installer@company.com\",\n        \"full_name\": \"John Smith\",\n        \"company_name\": \"EV Installations Ltd\",\n        \"phone\": \"+1-555-0123\",\n        \"verification_status\": \"pending\",\n        \"terms_accepted\": false,\n        \"terms_version\": null,\n        \"created_at\": \"2024-01-15T10:30:00Z\",\n        \"updated_at\": \"2024-01-15T10:30:00Z\"\n    }\n}\n```\n\n## Email Confirmation Flow\n\nAfter successful registration:\n1. Supabase sends confirmation email to the provided address\n2. User must click the confirmation link in the email\n3. Email verification is required before full account access\n4. Confirmation email expires after 24 hours\n\n## Error Scenarios\n\n### 409 - Email Already Exists\n```json\n{\n    \"detail\": \"User with this email already exists\"\n}\n```\n\n### 400 - Invalid Password Format\n```json\n{\n    \"detail\": \"Invalid password format\"\n}\n```\n\n### 400 - Invalid Email Format\n```json\n{\n    \"detail\": \"Invalid email format\"\n}\n```\n\n### 500 - Account Creation Failed\n```json\n{\n    \"detail\": \"Internal server error: Database connection failed\"\n}\n```\n\n## Usage Examples\n\n### Basic Registration\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/installer/signup\"          -H \"Content-Type: application/json\"          -d '{\n       \"email\": \"installer@company.com\",\n       \"password\": \"SecurePass123!\",\n       \"full_name\": \"John Smith\",\n       \"company_name\": \"EV Installations Ltd\",\n       \"phone\": \"+1-555-0123\"\n     }'\n```\n\n### Minimal Registration\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/installer/signup\"          -H \"Content-Type: application/json\"          -d '{\n       \"email\": \"installer@company.com\",\n       \"password\": \"SecurePass123!\",\n       \"full_name\": \"John Smith\"\n     }'\n```\n\n## Security Considerations\n\n- Passwords are hashed using bcrypt before storage\n- Email addresses are validated and normalized\n- Supabase handles secure token generation\n- Account creation is logged for audit purposes\n\n## Post-Registration Steps\n\n1. **Email Verification**: Check email and click confirmation link\n2. **Terms Acceptance**: Accept terms and conditions\n3. **Profile Completion**: Update profile with additional information\n4. **Identity Verification**: Submit verification documents (optional)\n\n## Troubleshooting\n\n### Email Not Received\n1. Check spam/junk folder\n2. Verify email address is correct\n3. Wait up to 5 minutes for delivery\n4. Use resend verification endpoint if needed\n\n### Account Creation Fails\n1. Verify all required fields are provided\n2. Check password meets requirements\n3. Ensure email format is valid\n4. Contact support if issue persists\n\n## Related Endpoints\n- `POST /api/v1/installer/signup-with-confirmation` - Signup with email confirmation required\n- `POST /api/v1/installer/resend-verification-email` - Resend email verification\n- `POST /api/v1/installer/accept-terms` - Accept terms and conditions\n- `GET /api/v1/installer/email-verification-status` - Check verification status","operationId":"installer_signup_api_v1_installer_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallerSignupRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/signup-with-confirmation":{"post":{"tags":["installer-onboarding"],"summary":"Installer Signup With Confirmation","description":"Epic 1 - Create installer account with email confirmation required\n\nThis method uses Supabase native signup which sends a confirmation email.\nUser must confirm email before they can sign in.","operationId":"installer_signup_with_confirmation_api_v1_installer_signup_with_confirmation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallerSignupRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/login":{"post":{"tags":["installer-onboarding"],"summary":"Installer Login","description":"Epic 1 - Story 1.1: Installer Login\n\nAuthenticate installer with Supabase Auth","operationId":"installer_login_api_v1_installer_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallerLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/accept-terms":{"post":{"tags":["installer-onboarding"],"summary":"Accept Terms","description":"Epic 1 - Story 1.1: Accept Terms and Conditions\n\nRecord installer's acceptance of terms and conditions","operationId":"accept_terms_api_v1_installer_accept_terms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TermsAcceptanceRequest"}}},"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/installer/verify-identity":{"post":{"tags":["installer-onboarding"],"summary":"Verify Identity","description":"Submit identity verification documents for installer account verification\n\nThis endpoint allows installers to submit identity verification documents to complete\ntheir account verification process. Documents are stored securely and reviewed by\nadministrators to verify installer credentials.\n\n## Verification Process\n\n1. **Document Submission**: Upload verification documents\n2. **Admin Review**: Documents reviewed by system administrators\n3. **Status Update**: Verification status updated based on review\n4. **Notification**: Installer notified of verification result\n\n## Supported Document Types\n\n### ID Card (`id_card`)\n- Government-issued photo identification\n- Driver's license, passport, national ID\n- Must be current and valid\n- Clear, readable image required\n\n### Certification (`certification`)\n- Professional certification documents\n- Electrical contractor license\n- EV installation certification\n- Industry-specific credentials\n\n### Business License (`business_license`)\n- Business registration documents\n- Tax identification certificates\n- Professional liability insurance\n- Company incorporation papers\n\n## File Upload Requirements\n\n### Supported Formats\n- **Images**: JPG, JPEG, PNG, GIF, WebP\n- **Documents**: PDF, DOC, DOCX\n- **Maximum file size**: 10MB per file\n- **Maximum files**: 5 documents per submission\n\n### File Quality Requirements\n- Clear, high-resolution images\n- All text must be readable\n- No blurry or distorted images\n- Proper lighting and contrast\n\n## Request Format (Multipart Form Data)\n\n```\nContent-Type: multipart/form-data\n\ndocument_type: id_card\ndocument_number: DL123456789\nnotes: Driver's license for John Smith\ndocument_file: [binary file data]\n```\n\n## Response Format\n```json\n{\n    \"status\": \"success\",\n    \"message\": \"Identity verification submitted for review\",\n    \"verification_id\": \"verif_12345\",\n    \"verification_status\": \"pending_review\"\n}\n```\n\n## Verification Status Values\n\n### `pending`\n- Initial status after account creation\n- No documents submitted yet\n- Can proceed with limited functionality\n\n### `pending_review`\n- Documents submitted and awaiting review\n- Admin review in progress\n- Full functionality available\n\n### `approved`\n- Documents verified and approved\n- Full account access granted\n- Can access all features\n\n### `rejected`\n- Documents rejected during review\n- Must resubmit with corrections\n- Limited functionality until resolved\n\n### `expired`\n- Documents have expired\n- Must resubmit current documents\n- Account access may be restricted\n\n## Error Scenarios\n\n### 400 - Invalid Document Type\n```json\n{\n    \"detail\": \"Invalid document type\"\n}\n```\n\n### 400 - File Too Large\n```json\n{\n    \"detail\": \"File size must be less than 10MB\"\n}\n```\n\n### 400 - Invalid File Format\n```json\n{\n    \"detail\": \"Invalid file type. Allowed types: jpg, jpeg, png, pdf, doc, docx\"\n}\n```\n\n### 500 - Upload Failed\n```json\n{\n    \"detail\": \"Failed to store verification document\"\n}\n```\n\n## Usage Examples\n\n### Submit Driver's License\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/installer/verify-identity\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -F \"document_type=id_card\"          -F \"document_number=DL123456789\"          -F \"notes=Driver's license for John Smith\"          -F \"document_file=@/path/to/license.jpg\"\n```\n\n### Submit Business License\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/installer/verify-identity\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -F \"document_type=business_license\"          -F \"document_number=BL987654321\"          -F \"notes=Business license for EV Installations Ltd\"          -F \"document_file=@/path/to/business_license.pdf\"\n```\n\n### Submit Multiple Documents\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/installer/verify-identity\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -F \"document_type=certification\"          -F \"document_number=CERT123456\"          -F \"notes=EV Installation Certification\"          -F \"document_file=@/path/to/certification.pdf\"\n```\n\n## Security and Privacy\n\n### Document Storage\n- Documents stored in encrypted Supabase Storage\n- Access restricted to administrators only\n- Automatic deletion after verification period\n- Audit trail maintained for compliance\n\n### Data Protection\n- Personal information encrypted at rest\n- Secure transmission over HTTPS\n- GDPR compliance for EU users\n- Regular security audits performed\n\n## Review Process\n\n### Admin Review Timeline\n- **Standard review**: 2-3 business days\n- **Expedited review**: 24 hours (premium accounts)\n- **Peak periods**: Up to 5 business days\n\n### Review Criteria\n- Document authenticity verification\n- Information accuracy validation\n- Compliance with local regulations\n- Professional qualification assessment\n\n## Troubleshooting\n\n### Upload Fails\n1. Check file size (must be < 10MB)\n2. Verify file format is supported\n3. Ensure stable internet connection\n4. Try uploading one file at a time\n\n### Document Rejected\n1. Review rejection reason in notification\n2. Ensure document is current and valid\n3. Check image quality and readability\n4. Resubmit with corrected information\n\n### Verification Delayed\n1. Check review timeline expectations\n2. Contact support for expedited review\n3. Verify all required documents submitted\n4. Check for additional information requests\n\n## Related Endpoints\n- `GET /verification-status` - Check verification status\n- `GET /profile` - View installer profile\n- `PUT /profile` - Update profile information\n- `POST /accept-terms` - Accept terms and conditions","operationId":"verify_identity_api_v1_installer_verify_identity_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_verify_identity_api_v1_installer_verify_identity_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/v1/installer/profile":{"get":{"tags":["installer-onboarding"],"summary":"Get Installer Profile","description":"Get current installer profile\n\nFIXED: Uses unified authentication to resolve \"Failed to retrieve user profile\" issue.\nThe installer profile is now retrieved directly from the authentication dependency,\neliminating the duplicate database call that was causing failures.","operationId":"get_installer_profile_api_v1_installer_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallerProfileResponse"}}}}}},"put":{"tags":["installer-onboarding"],"summary":"Update Installer Profile","description":"Update installer profile information","operationId":"update_installer_profile_api_v1_installer_profile_put","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_update_installer_profile_api_v1_installer_profile_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/verification-status":{"get":{"tags":["installer-onboarding"],"summary":"Get Verification Status","description":"Get identity verification status","operationId":"get_verification_status_api_v1_installer_verification_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/logout":{"post":{"tags":["installer-onboarding"],"summary":"Installer Logout","description":"Logout installer (invalidate session)","operationId":"installer_logout_api_v1_installer_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/delete-account":{"delete":{"tags":["installer-onboarding"],"summary":"Delete Installer Account","description":"Epic 1 - Story 1.1: Delete Installer Account\n\nDelete installer account and all associated data","operationId":"delete_installer_account_api_v1_installer_delete_account_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/forgot-password":{"post":{"tags":["installer-onboarding"],"summary":"Forgot Password","description":"Epic 1 - Password Reset Request\n\nSend password reset email using Supabase native functionality","operationId":"forgot_password_api_v1_installer_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"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/installer/reset-password":{"post":{"tags":["installer-onboarding"],"summary":"Reset Password","description":"Epic 1 - Password Reset\n\nReset password using token from email","operationId":"reset_password_api_v1_installer_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordUpdateRequest"}}},"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/installer/charge-points/create":{"post":{"tags":["installer-onboarding"],"summary":"Create Charge Point","description":"Create a new charge point (Epic 3 - required by Epic 4).","operationId":"create_charge_point_api_v1_installer_charge_points_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__installer_onboarding_api__ChargePointCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__installer_onboarding_api__ChargePointResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/resend-verification-email":{"post":{"tags":["installer-onboarding"],"summary":"Resend Verification Email","description":"Resend email verification using Supabase\n\nThis endpoint allows installers to resend email verification if they\nhaven't received it or if it expired.","operationId":"resend_verification_email_api_v1_installer_resend_verification_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/email-verification-status":{"get":{"tags":["installer-onboarding"],"summary":"Get Email Verification Status","description":"Check if user's email is verified in Supabase\n\nReturns the verification status of the current user's email address.","operationId":"get_email_verification_status_api_v1_installer_email_verification_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationStatusResponse"}}}}}}},"/api/v1/installer/profile-picture":{"put":{"tags":["installer-onboarding"],"summary":"Upload Profile Picture","description":"Upload profile picture for installer.\n\nThis endpoint allows installers to upload a profile picture that will be stored\nin Supabase Storage and the URL will be saved to their installer profile.\n\nArgs:\n    profile_picture: The image file to upload (multipart/form-data)\n    current_user: Authenticated installer user data\n    \nReturns:\n    Dict containing success message and profile picture URL\n    \nRaises:\n    HTTPException: 400 for invalid file type or size\n    HTTPException: 401 for authentication issues\n    HTTPException: 500 for server errors","operationId":"upload_profile_picture_api_v1_installer_profile_picture_put","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_profile_picture_api_v1_installer_profile_picture_put"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Profile Picture Api V1 Installer Profile Picture Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects":{"post":{"tags":["project-management"],"summary":"Create Project","description":"Create a new installation project.","operationId":"create_project_api_v1_installer_projects_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["project-management"],"summary":"List Projects","description":"List all projects for the current installer.","operationId":"list_projects_api_v1_installer_projects_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project status","title":"Status"},"description":"Filter by project status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/ProjectResponse"}},"title":"Response List Projects Api V1 Installer Projects Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}":{"get":{"tags":["project-management"],"summary":"Get Project","description":"Get project details by ID.","operationId":"get_project_api_v1_installer_projects__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["project-management"],"summary":"Update Project","description":"Update project details.","operationId":"update_project_api_v1_installer_projects__project_id__put","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["project-management"],"summary":"Delete Project","description":"Delete a project.","operationId":"delete_project_api_v1_installer_projects__project_id__delete","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/status":{"patch":{"tags":["project-management"],"summary":"Update Project Status","description":"Update project status.","operationId":"update_project_status_api_v1_installer_projects__project_id__status_patch","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/charge-points":{"post":{"tags":["project-management"],"summary":"Add Charge Point To Project","description":"Add a charge point to a project.","operationId":"add_charge_point_to_project_api_v1_installer_projects__project_id__charge_points_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddChargePointRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__project_management_api__ChargePointResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["project-management"],"summary":"List Project Charge Points","description":"List all charge points in a project.","operationId":"list_project_charge_points_api_v1_installer_projects__project_id__charge_points_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/csms__presentation__api__project_management_api__ChargePointResponse"}},"title":"Response List Project Charge Points Api V1 Installer Projects  Project Id  Charge Points Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/summary":{"get":{"tags":["project-management"],"summary":"Get Project Summary","description":"Get project summary with statistics.","operationId":"get_project_summary_api_v1_installer_projects__project_id__summary_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/counts":{"get":{"tags":["project-management"],"summary":"Get Project Counts","description":"Get project counts by status for the current installer.\n\nPHASE 4 CLEANUP: Moved from dashboard_api.py to project_management_api.py\nThis endpoint belongs with other project-related functionality.","operationId":"get_project_counts_api_v1_installer_projects_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/charge-points":{"post":{"tags":["charge-point-commissioning"],"summary":"Register Charge Point","description":"Register a new charge point.","operationId":"register_charge_point_api_v1_installer_charge_points_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterChargePointRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__charge_point_commissioning_api__ChargePointResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["charge-point-commissioning"],"summary":"List Charge Points","description":"List all charge points for the installer.","operationId":"list_charge_points_api_v1_installer_charge_points_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":"commissioning_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by commissioning status","title":"Commissioning Status"},"description":"Filter by commissioning status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/csms__presentation__api__charge_point_commissioning_api__ChargePointResponse"}},"title":"Response List Charge Points Api V1 Installer Charge Points Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}":{"get":{"tags":["charge-point-commissioning"],"summary":"Get Charge Point","description":"Get charge point details.","operationId":"get_charge_point_api_v1_installer_charge_points__charge_point_id__get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__charge_point_commissioning_api__ChargePointResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["charge-point-commissioning"],"summary":"Update Charge Point","description":"Update charge point information.","operationId":"update_charge_point_api_v1_installer_charge_points__charge_point_id__put","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChargePointRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__charge_point_commissioning_api__ChargePointResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["charge-point-commissioning"],"summary":"Delete Charge Point","description":"Delete a charge point - UPDATED VERSION.","operationId":"delete_charge_point_api_v1_installer_charge_points__charge_point_id__delete","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/certificates/generate":{"post":{"tags":["charge-point-commissioning"],"summary":"Generate Certificate","description":"Generate security certificates for charge point.","operationId":"generate_certificate_api_v1_installer_charge_points__charge_point_id__certificates_generate_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCertificateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertificateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/certificates":{"get":{"tags":["charge-point-commissioning"],"summary":"List Certificates","description":"List certificates for a charge point.","operationId":"list_certificates_api_v1_installer_charge_points__charge_point_id__certificates_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/certificates/{certificate_id}/download":{"get":{"tags":["charge-point-commissioning"],"summary":"Download Certificate","description":"Download certificate files as ZIP.","operationId":"download_certificate_api_v1_installer_charge_points__charge_point_id__certificates__certificate_id__download_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"certificate_id","in":"path","required":true,"schema":{"type":"string","title":"Certificate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/config/template":{"get":{"tags":["charge-point-commissioning"],"summary":"Get Configuration Template","description":"Get configuration template for charge point.","operationId":"get_configuration_template_api_v1_installer_charge_points__charge_point_id__config_template_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/config/customize":{"post":{"tags":["charge-point-commissioning"],"summary":"Customize Configuration","description":"Customize configuration for charge point.","operationId":"customize_configuration_api_v1_installer_charge_points__charge_point_id__config_customize_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomizeConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/config/download":{"get":{"tags":["charge-point-commissioning"],"summary":"Download Configuration","description":"Download configuration file.","operationId":"download_configuration_api_v1_installer_charge_points__charge_point_id__config_download_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"Configuration format: json or csv","default":"json","title":"Format"},"description":"Configuration format: json or csv"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/test-connection":{"post":{"tags":["charge-point-commissioning"],"summary":"Test Connection","description":"Test connection to charge point.","operationId":"test_connection_api_v1_installer_charge_points__charge_point_id__test_connection_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestConnectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/connection-status":{"get":{"tags":["charge-point-commissioning"],"summary":"Get Connection Status","description":"Get real-time connection status.","operationId":"get_connection_status_api_v1_installer_charge_points__charge_point_id__connection_status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/connection-logs":{"get":{"tags":["charge-point-commissioning"],"summary":"Get Connection Logs","description":"Get connection logs for troubleshooting.","operationId":"get_connection_logs_api_v1_installer_charge_points__charge_point_id__connection_logs_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Maximum number of logs to return","default":100,"title":"Limit"},"description":"Maximum number of logs to return"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by log level","title":"Level"},"description":"Filter by log level"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/retry-connection":{"post":{"tags":["charge-point-commissioning"],"summary":"Retry Connection","description":"Retry failed connection.","operationId":"retry_connection_api_v1_installer_charge_points__charge_point_id__retry_connection_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryConnectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/commission":{"post":{"tags":["charge-point-commissioning"],"summary":"Commission Charge Point","description":"Commission a charge point to mark it as ready for handover.","operationId":"commission_charge_point_api_v1_installer_charge_points__charge_point_id__commission_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/status":{"get":{"tags":["charge-point-commissioning"],"summary":"Get Charge Point Status","description":"Get charge point status including commissioning status.","operationId":"get_charge_point_status_api_v1_installer_charge_points__charge_point_id__status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/start":{"post":{"tags":["commissioning"],"summary":"Start Commissioning","description":"Start the commissioning process for a charge point\n\nThis endpoint initiates a comprehensive commissioning workflow for an EVSE (Electric Vehicle Supply Equipment).\nThe commissioning process includes hardware verification, network setup, CSMS authentication, configuration\ndownload, and operational testing.\n\n## Commissioning Workflow\n\nThe commissioning process follows these standardized steps:\n\n1. **Hardware Verification** (5 min)\n   - Power supply validation\n   - Safety system checks\n   - Connector functionality test\n   - Ground fault detection\n\n2. **Network Connection** (5 min)\n   - Ethernet connectivity test\n   - IP configuration validation\n   - DNS resolution check\n   - Internet connectivity verification\n\n3. **CSMS Authentication** (2 min)\n   - WebSocket connection establishment\n   - Certificate validation\n   - Boot notification\n   - Heartbeat confirmation\n\n4. **Configuration Download** (8 min)\n   - Charging profile setup\n   - Tariff configuration\n   - Authorization list download\n   - Security parameter configuration\n\n5. **Operational Testing** (5 min)\n   - Connector availability test\n   - Transaction simulation\n   - Meter value validation\n   - Error handling verification\n\n## Prerequisites\n\n- Charge point must exist in the system\n- Installer must be authenticated\n- No active commissioning session for this charge point\n- Charge point must be physically accessible\n\n## Request Format\n```json\n{\n    \"installer_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"commissioning_type\": \"full\",\n    \"options\": {\n        \"auto_generate_certificates\": true,\n        \"auto_configure\": true,\n        \"test_connection\": true,\n        \"notification_email\": \"installer@company.com\",\n        \"force_recommissioning\": false\n    }\n}\n```\n\n## Response Format\n```json\n{\n    \"commissioning_id\": \"comm_12345\",\n    \"status\": \"started\",\n    \"estimated_duration\": \"00:25:00\",\n    \"steps\": [\n        {\n            \"commissioning_session_id\": \"comm_12345\",\n            \"step_id\": \"hardware_check\",\n            \"step_name\": \"Hardware Verification\",\n            \"step_description\": \"Verify power supply and safety systems\",\n            \"status\": \"pending\",\n            \"estimated_time\": \"00:05:00\"\n        },\n        {\n            \"commissioning_session_id\": \"comm_12345\",\n            \"step_id\": \"network\",\n            \"step_name\": \"Network Connection\",\n            \"step_description\": \"Establish network connectivity\",\n            \"status\": \"pending\",\n            \"estimated_time\": \"00:05:00\"\n        }\n    ]\n}\n```\n\n## Commissioning Types\n\n### Full Commissioning (`full`)\n- Complete 5-step process\n- All safety and functionality tests\n- Estimated duration: 25 minutes\n- Recommended for new installations\n\n### Quick Commissioning (`quick`)\n- Essential steps only\n- Basic connectivity and authentication\n- Estimated duration: 10 minutes\n- Suitable for maintenance\n\n### Maintenance Commissioning (`maintenance`)\n- Focused on specific components\n- Customizable step selection\n- Estimated duration: 15 minutes\n- For troubleshooting\n\n## Background Processing\n\nThe commissioning process runs asynchronously in the background:\n- Real-time status updates via WebSocket\n- Progress tracking and logging\n- Automatic error handling and recovery\n- Email notifications for completion/failure\n\n## Error Scenarios\n\n### 404 - Charge Point Not Found\n```json\n{\n    \"detail\": \"Charge point not found\"\n}\n```\n\n### 409 - Commissioning Already Active\n```json\n{\n    \"commissioning_id\": \"comm_existing\",\n    \"status\": \"in_progress\",\n    \"estimated_duration\": \"00:25:00\",\n    \"steps\": [...]\n}\n```\n\n### 500 - Commissioning Engine Error\n```json\n{\n    \"detail\": \"Internal server error\"\n}\n```\n\n## Usage Examples\n\n### Start Full Commissioning\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/installer/commissioning/CP001/start\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -H \"Content-Type: application/json\"          -d '{\n       \"installer_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n       \"commissioning_type\": \"full\",\n       \"options\": {\n         \"auto_generate_certificates\": true,\n         \"auto_configure\": true,\n         \"test_connection\": true,\n         \"notification_email\": \"installer@company.com\"\n       }\n     }'\n```\n\n### Force Recommissioning\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/installer/commissioning/CP001/start\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -H \"Content-Type: application/json\"          -d '{\n       \"installer_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n       \"commissioning_type\": \"full\",\n       \"options\": {\n         \"force_recommissioning\": true\n       }\n     }'\n```\n\n## Template System\n\nCommissioning templates are automatically selected based on:\n- Charge point manufacturer\n- Model family\n- Hardware configuration\n\nAvailable templates:\n- **ABB Terra Standard**: 25-minute full process\n- **Tesla Charger Standard**: 20-minute optimized process\n- **Generic EVSE**: 25-minute standard process\n\n## Monitoring and Control\n\nOnce started, you can:\n- Monitor progress: `GET /{charge_point_id}/status`\n- View logs: `GET /{charge_point_id}/logs`\n- Pause process: `POST /{charge_point_id}/pause`\n- Stop process: `POST /{charge_point_id}/stop`\n- Report issues: `POST /{charge_point_id}/report-issue`\n\n## Troubleshooting\n\n### Commissioning Fails to Start\n1. Verify charge point exists and is accessible\n2. Check installer authentication\n3. Ensure no active session exists\n4. Review system logs for errors\n\n### Process Stalls\n1. Check network connectivity\n2. Verify charge point is responding\n3. Review commissioning logs\n4. Consider restarting the process\n\n## Related Endpoints\n- `GET /{charge_point_id}/status` - Monitor commissioning progress\n- `GET /{charge_point_id}/logs` - View commissioning logs\n- `POST /{charge_point_id}/stop` - Stop commissioning process\n- `GET /templates` - View available commissioning templates","operationId":"start_commissioning_api_v1_installer_commissioning__charge_point_id__start_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartCommissioningRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Start Commissioning Api V1 Installer Commissioning  Charge Point Id  Start Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/status":{"get":{"tags":["commissioning"],"summary":"Get Commissioning Status","description":"Get real-time commissioning status for a charge point\n\nThis endpoint provides comprehensive real-time status information about an active\ncommissioning session. It includes progress tracking, step completion status,\nestimated completion time, and current activity details.\n\n## Real-Time Updates\n\nThe status information is updated in real-time as the commissioning process progresses:\n- Step completion status changes\n- Progress percentage updates\n- Current activity descriptions\n- Error and warning notifications\n- Elapsed time calculations\n\n## Status States\n\n### `pending`\n- Commissioning session created but not yet started\n- All steps are in pending state\n- Progress: 0%\n\n### `in_progress`\n- Active commissioning process running\n- Steps are being executed sequentially\n- Progress: 1-99%\n\n### `paused`\n- Process temporarily stopped by installer\n- Can be resumed from current step\n- Progress: Maintained at pause point\n\n### `completed`\n- All steps successfully finished\n- Commissioning process finished\n- Progress: 100%\n\n### `failed`\n- Process stopped due to critical error\n- Requires manual intervention\n- Progress: Stopped at failure point\n\n### `stopped`\n- Process manually stopped by installer\n- Cannot be resumed\n- Progress: Stopped at current step\n\n## Response Format\n```json\n{\n    \"commissioning_session_id\": \"comm_12345\",\n    \"status\": \"in_progress\",\n    \"current_step\": \"network\",\n    \"progress_percentage\": 40,\n    \"estimated_completion\": \"2024-01-15T11:00:00Z\",\n    \"started_at\": \"2024-01-15T10:30:00Z\",\n    \"elapsed_time\": \"00:10:30\",\n    \"steps\": [\n        {\n            \"id\": \"hardware_check\",\n            \"name\": \"Hardware Verification\",\n            \"status\": \"completed\",\n            \"completed_at\": \"2024-01-15T10:35:00Z\",\n            \"duration\": \"00:05:00\",\n            \"estimated_time\": \"00:05:00\"\n        },\n        {\n            \"id\": \"network\",\n            \"name\": \"Network Connection\",\n            \"status\": \"in_progress\",\n            \"completed_at\": null,\n            \"duration\": null,\n            \"estimated_time\": \"00:05:00\"\n        }\n    ],\n    \"current_activity\": \"Executing step: network\",\n    \"last_error\": null,\n    \"warnings\": [\n        {\n            \"type\": \"slow_progress\",\n            \"message\": \"Commissioning is taking longer than expected\",\n            \"severity\": \"warning\"\n        }\n    ]\n}\n```\n\n## Progress Calculation\n\nProgress is calculated based on completed steps:\n```\nprogress_percentage = (completed_steps / total_steps) * 100\n```\n\n- **Completed steps**: Steps with status \"completed\"\n- **Total steps**: All steps in the commissioning template\n- **Current step**: Currently executing step\n\n## Time Estimation\n\n### Elapsed Time\n- Calculated from session start time\n- Updated in real-time\n- Format: `HH:MM:SS`\n\n### Estimated Completion\n- Based on average step duration\n- Adjusted based on actual progress\n- Updated dynamically as process continues\n\n## Step Status Details\n\n### Step Status Values\n- **`pending`**: Not yet started\n- **`in_progress`**: Currently executing\n- **`completed`**: Successfully finished\n- **`error`**: Failed with error\n- **`skipped`**: Skipped due to conditions\n\n### Step Timing\n- **`estimated_time`**: Expected duration from template\n- **`duration`**: Actual time taken (when completed)\n- **`completed_at`**: Timestamp when step finished\n\n## Warnings and Errors\n\n### Warning Types\n- **`slow_progress`**: Process taking longer than expected\n- **`network_delay`**: Network connectivity issues\n- **`resource_usage`**: High system resource usage\n\n### Error Information\n- **`last_error`**: Most recent error details\n- **`error_code`**: Specific error identifier\n- **`error_message`**: Human-readable error description\n- **`recovery_suggestion`**: Recommended action\n\n## WebSocket Integration\n\nFor real-time updates, connect to the WebSocket endpoint:\n```\nws://localhost:8080/api/v1/installer/commissioning/{charge_point_id}/commissioning/ocpp-debug\n```\n\nWebSocket messages include:\n- Status updates\n- Step completion notifications\n- Error and warning alerts\n- Progress percentage changes\n\n## Error Scenarios\n\n### 404 - No Active Session\n```json\n{\n    \"detail\": \"No active commissioning session found\"\n}\n```\n\n### 500 - Status Retrieval Error\n```json\n{\n    \"detail\": \"Internal server error\"\n}\n```\n\n## Usage Examples\n\n### Get Current Status\n```bash\ncurl -X GET \"http://localhost:8080/api/v1/installer/commissioning/CP001/status\"          -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### Monitor with WebSocket\n```javascript\nconst ws = new WebSocket('ws://localhost:8080/api/v1/installer/commissioning/CP001/commissioning/ocpp-debug');\n\nws.onmessage = function(event) {\n    const data = JSON.parse(event.data);\n    console.log('Status update:', data);\n};\n```\n\n## Performance Considerations\n\n- Status endpoint responds in < 100ms\n- Real-time updates via WebSocket\n- Cached step information for fast retrieval\n- Optimized database queries\n\n## Troubleshooting\n\n### Status Not Updating\n1. Check WebSocket connection\n2. Verify commissioning process is running\n3. Review system logs for errors\n4. Refresh status endpoint\n\n### Inaccurate Progress\n1. Verify step completion timestamps\n2. Check for stuck or failed steps\n3. Review commissioning logs\n4. Consider restarting process\n\n## Related Endpoints\n- `POST /{charge_point_id}/start` - Start commissioning process\n- `GET /{charge_point_id}/logs` - View detailed logs\n- `POST /{charge_point_id}/pause` - Pause process\n- `POST /{charge_point_id}/stop` - Stop process","operationId":"get_commissioning_status_api_v1_installer_commissioning__charge_point_id__status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Commissioning Status Api V1 Installer Commissioning  Charge Point Id  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/stop":{"post":{"tags":["commissioning"],"summary":"Stop Commissioning","description":"Stop an active commissioning process.","operationId":"stop_commissioning_api_v1_installer_commissioning__charge_point_id__stop_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stop Commissioning Api V1 Installer Commissioning  Charge Point Id  Stop Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/pause":{"post":{"tags":["commissioning"],"summary":"Pause Commissioning","description":"Pause commissioning process.","operationId":"pause_commissioning_api_v1_installer_commissioning__charge_point_id__pause_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pause Commissioning Api V1 Installer Commissioning  Charge Point Id  Pause Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/resume":{"post":{"tags":["commissioning"],"summary":"Resume Commissioning","description":"Resume a paused commissioning process.","operationId":"resume_commissioning_api_v1_installer_commissioning__charge_point_id__resume_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resume Commissioning Api V1 Installer Commissioning  Charge Point Id  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/restart":{"post":{"tags":["commissioning"],"summary":"Restart Commissioning","description":"Restart commissioning process completely - clear all steps and start fresh\n\nThis endpoint allows the installer to restart the commissioning process from scratch\nwhen there are issues or problems. It clears all existing commissioning steps and\nresets the session to initial state.\n\n## Use Cases\n\n- **Hardware Issues**: When charge point hardware needs to be reset\n- **Configuration Problems**: When configuration gets corrupted\n- **Network Issues**: When communication problems require fresh start\n- **Installer Error**: When installer makes mistakes and needs to start over\n\n## Process\n\n1. Validates charge point is in commissioning mode\n2. Clears all existing commissioning steps\n3. Resets session status to 'in_progress'\n4. Logs the restart event\n5. Returns updated session information\n\n## Response\n\nReturns the updated commissioning session with cleared steps and reset status.","operationId":"restart_commissioning_api_v1_installer_commissioning__charge_point_id__restart_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Restart Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Restart Commissioning Api V1 Installer Commissioning  Charge Point Id  Restart Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/steps":{"get":{"tags":["commissioning"],"summary":"Get Available Commissioning Steps","description":"Get available commissioning steps for frontend rendering\n\nThis endpoint returns the standard commissioning steps that the frontend\ncan use to render the commissioning UI. These are the step definitions\nthat will be colored in based on their completion status.\n\n## Response Structure\n\nEach step contains:\n- **id**: Unique identifier for the step\n- **name**: Human-readable step name\n- **description**: Detailed description of what this step involves\n- **estimated_time**: Expected duration for this step\n- **required**: Whether this step is mandatory\n- **order**: Display order for the frontend\n- **icon**: Icon identifier for UI display\n- **ocpp_message**: Which OCPP message triggers this step\n\n## Frontend Usage\n\nUse this endpoint to:\n1. Render the commissioning step list\n2. Set up progress tracking UI\n3. Display step descriptions and estimated times\n4. Color steps based on status from the status endpoint","operationId":"get_available_commissioning_steps_api_v1_installer_commissioning_steps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Available Commissioning Steps Api V1 Installer Commissioning Steps Get"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/logs":{"get":{"tags":["commissioning"],"summary":"Get Commissioning Logs","description":"Get commissioning logs for a charge point with advanced filtering and pagination\n\nThis endpoint provides comprehensive access to commissioning logs with powerful filtering\ncapabilities. Logs are returned in chronological order (newest first) with pagination\nsupport for efficient data retrieval.\n\n## Log Structure\n\nEach log entry contains:\n- **Timestamp**: When the event occurred\n- **Level**: Severity level (info, warning, error, success)\n- **Message**: Human-readable description\n- **Source**: Origin of the log (System, Hardware, Network, CSMS, installer)\n- **Stage**: Commissioning phase when event occurred\n- **Step ID**: Specific step identifier (if applicable)\n- **Metadata**: Additional structured data\n- **Installer Info**: Who performed the action\n\n## Filtering Options\n\n### Log Level Filtering (`level`)\nFilter by severity levels using comma-separated values:\n- `info` - General information messages\n- `warning` - Non-critical issues that need attention\n- `error` - Critical errors that require intervention\n- `success` - Successful operation confirmations\n\n**Example**: `level=error,warning` returns only error and warning logs\n\n### Source Filtering (`source`)\nFilter by log source using comma-separated values:\n- `System` - Internal system operations\n- `Hardware` - Physical hardware interactions\n- `Network` - Network connectivity events\n- `CSMS` - Central System Management Server events\n- `installer` - Manual installer actions\n\n**Example**: `source=Hardware,Network` returns hardware and network logs\n\n### Stage Filtering (`stage`)\nFilter by commissioning stage using comma-separated values:\n- `initialization` - Process startup and preparation\n- `hardware_check` - Hardware verification phase\n- `network` - Network connectivity phase\n- `authentication` - CSMS authentication phase\n- `configuration` - Configuration download phase\n- `testing` - Operational testing phase\n- `completed` - Process completion\n- `error` - Error handling phase\n\n**Example**: `stage=hardware_check,network` returns hardware and network stage logs\n\n### Time Filtering (`since`)\nGet logs since a specific timestamp:\n- Format: ISO 8601 datetime string\n- Timezone: UTC (automatically converted)\n- Inclusive: Includes logs at the exact timestamp\n\n**Example**: `since=2024-01-15T10:30:00Z`\n\n## Pagination\n\n### Parameters\n- **`page`**: Page number (starts at 1)\n- **`per_page`**: Items per page (1-1000, default 100)\n\n### Response Structure\n```json\n{\n    \"logs\": [...],\n    \"pagination\": {\n        \"page\": 1,\n        \"per_page\": 100,\n        \"total\": 250,\n        \"has_more\": true\n    },\n    \"summary\": {\n        \"total_logs\": 250,\n        \"by_level\": {\n            \"info\": 180,\n            \"warning\": 45,\n            \"error\": 20,\n            \"success\": 5\n        },\n        \"by_stage\": {\n            \"hardware_check\": 50,\n            \"network\": 45,\n            \"authentication\": 30,\n            \"configuration\": 60,\n            \"testing\": 65\n        }\n    }\n}\n```\n\n## Response Format\n```json\n{\n    \"logs\": [\n        {\n            \"id\": \"log_12345\",\n            \"timestamp\": \"2024-01-15T10:35:00Z\",\n            \"level\": \"info\",\n            \"message\": \"Hardware verification completed successfully\",\n            \"source\": \"Hardware\",\n            \"stage\": \"hardware_check\",\n            \"step_id\": \"hardware_check\",\n            \"metadata\": {\n                \"power_supply\": \"400V_3_phase\",\n                \"safety_systems\": \"operational\",\n                \"duration\": \"00:04:30\"\n            },\n            \"installer_id\": \"inst_12345\",\n            \"installer_name\": \"John Smith\"\n        }\n    ],\n    \"pagination\": {\n        \"page\": 1,\n        \"per_page\": 100,\n        \"total\": 250,\n        \"has_more\": true\n    },\n    \"summary\": {\n        \"total_logs\": 250,\n        \"by_level\": {\n            \"info\": 180,\n            \"warning\": 45,\n            \"error\": 20,\n            \"success\": 5\n        },\n        \"by_stage\": {\n            \"hardware_check\": 50,\n            \"network\": 45,\n            \"authentication\": 30,\n            \"configuration\": 60,\n            \"testing\": 65\n        }\n    }\n}\n```\n\n## Metadata Details\n\nWhen `include_metadata=true`, additional structured data is included:\n\n### Hardware Logs\n```json\n{\n    \"power_supply\": \"400V_3_phase\",\n    \"voltage\": 400.5,\n    \"frequency\": 50.0,\n    \"safety_systems\": \"operational\",\n    \"contactors\": \"functional\",\n    \"duration\": \"00:04:30\"\n}\n```\n\n### Network Logs\n```json\n{\n    \"ip_address\": \"192.168.1.100\",\n    \"subnet_mask\": \"255.255.255.0\",\n    \"gateway\": \"192.168.1.1\",\n    \"dns_servers\": [\"8.8.8.8\", \"8.8.4.4\"],\n    \"latency_ms\": 15,\n    \"packet_loss\": 0\n}\n```\n\n### CSMS Logs\n```json\n{\n    \"websocket_url\": \"wss://csms.dynamo.com/ocpp/1.6\",\n    \"connection_status\": \"connected\",\n    \"last_heartbeat\": \"2024-01-15T10:34:45Z\",\n    \"message_count\": 25,\n    \"response_time_ms\": 120\n}\n```\n\n## Error Scenarios\n\n### 404 - No Active Session\n```json\n{\n    \"detail\": \"No active commissioning session found\"\n}\n```\n\n### 400 - Invalid Filter Parameters\n```json\n{\n    \"detail\": \"Invalid log level filter. Valid values: info, warning, error, success\"\n}\n```\n\n### 500 - Log Retrieval Error\n```json\n{\n    \"detail\": \"Internal server error\"\n}\n```\n\n## Usage Examples\n\n### Get All Logs (First Page)\n```bash\ncurl -X GET \"http://localhost:8080/api/v1/installer/commissioning/CP001/logs\"          -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### Filter by Error Level Only\n```bash\ncurl -X GET \"http://localhost:8080/api/v1/installer/commissioning/CP001/logs?level=error\"          -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### Get Recent Logs (Last Hour)\n```bash\ncurl -X GET \"http://localhost:8080/api/v1/installer/commissioning/CP001/logs?since=2024-01-15T09:30:00Z\"          -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### Complex Filtering\n```bash\ncurl -X GET \"http://localhost:8080/api/v1/installer/commissioning/CP001/logs?level=error,warning&source=Hardware,Network&stage=hardware_check,network&per_page=50\"          -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### Include Detailed Metadata\n```bash\ncurl -X GET \"http://localhost:8080/api/v1/installer/commissioning/CP001/logs?include_metadata=true\"          -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n## Performance Considerations\n\n- **Response Time**: < 200ms for typical queries\n- **Pagination**: Efficient for large log volumes\n- **Filtering**: Indexed database queries for fast results\n- **Caching**: Recent logs cached for improved performance\n\n## Log Retention\n\n- **Active Sessions**: All logs retained\n- **Completed Sessions**: Logs retained for 90 days\n- **Failed Sessions**: Logs retained for 180 days\n- **Archived Logs**: Compressed storage after retention period\n\n## Troubleshooting\n\n### No Logs Returned\n1. Verify commissioning session is active\n2. Check filter parameters are valid\n3. Ensure time range includes log period\n4. Verify installer has access to charge point\n\n### Slow Response\n1. Reduce `per_page` parameter\n2. Add more specific filters\n3. Use time-based filtering\n4. Check system performance\n\n### Missing Metadata\n1. Set `include_metadata=true`\n2. Verify log source supports metadata\n3. Check log level includes structured data\n4. Review log generation process\n\n## Related Endpoints\n- `GET /{charge_point_id}/status` - Current commissioning status\n- `POST /{charge_point_id}/logs` - Add installer notes\n- `GET /{charge_point_id}/history` - Commissioning session history\n- `POST /{charge_point_id}/report-issue` - Report commissioning issues","operationId":"get_commissioning_logs_api_v1_installer_commissioning__charge_point_id__logs_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Page"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by log levels (comma-separated)","title":"Level"},"description":"Filter by log levels (comma-separated)"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by log sources (comma-separated)","title":"Source"},"description":"Filter by log sources (comma-separated)"},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by commissioning stages (comma-separated)","title":"Stage"},"description":"Filter by commissioning stages (comma-separated)"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Get logs since timestamp","title":"Since"},"description":"Get logs since timestamp"},{"name":"include_metadata","in":"query","required":false,"schema":{"type":"boolean","description":"Include detailed metadata","default":false,"title":"Include Metadata"},"description":"Include detailed metadata"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommissioningLogsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["commissioning"],"summary":"Add Commissioning Log","description":"Add installer notes to commissioning logs.","operationId":"add_commissioning_log_api_v1_installer_commissioning__charge_point_id__logs_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Commissioning Log Api V1 Installer Commissioning  Charge Point Id  Logs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/report-issue":{"post":{"tags":["commissioning"],"summary":"Report Commissioning Issue","description":"Report an issue during commissioning.","operationId":"report_commissioning_issue_api_v1_installer_commissioning__charge_point_id__report_issue_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportIssueRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Report Commissioning Issue Api V1 Installer Commissioning  Charge Point Id  Report Issue Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/issues":{"get":{"tags":["commissioning"],"summary":"Get Commissioning Issues","description":"Get commissioning issues for a charge point.","operationId":"get_commissioning_issues_api_v1_installer_commissioning__charge_point_id__issues_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Commissioning Issues Api V1 Installer Commissioning  Charge Point Id  Issues Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/templates":{"get":{"tags":["commissioning"],"summary":"Get Commissioning Templates","description":"Get available commissioning templates.","operationId":"get_commissioning_templates_api_v1_installer_commissioning_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Commissioning Templates Api V1 Installer Commissioning Templates Get"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/apply-template":{"post":{"tags":["commissioning"],"summary":"Apply Commissioning Template","description":"Apply a commissioning template to a charge point.","operationId":"apply_commissioning_template_api_v1_installer_commissioning__charge_point_id__apply_template_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyTemplateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Apply Commissioning Template Api V1 Installer Commissioning  Charge Point Id  Apply Template Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/diagnostics":{"get":{"tags":["commissioning"],"summary":"Get Commissioning Diagnostics","description":"Get diagnostic information during commissioning.","operationId":"get_commissioning_diagnostics_api_v1_installer_commissioning__charge_point_id__diagnostics_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Commissioning Diagnostics Api V1 Installer Commissioning  Charge Point Id  Diagnostics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/{charge_point_id}/history":{"get":{"tags":["commissioning"],"summary":"Get Commissioning History","description":"Get commissioning history for a charge point.","operationId":"get_commissioning_history_api_v1_installer_commissioning__charge_point_id__history_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Commissioning History Api V1 Installer Commissioning  Charge Point Id  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/analytics/summary":{"get":{"tags":["installer-analytics"],"summary":"Get Analytics Summary","description":"Get commissioning analytics summary for the org.\nReturns commissions_count, success_rate, avg_duration_minutes, period.","operationId":"get_analytics_summary_api_v1_installer_analytics_summary_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter from date","title":"Start Date"},"description":"Filter from date"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to date","title":"End Date"},"description":"Filter to date"},{"name":"site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by site/project ID","title":"Site Id"},"description":"Filter by site/project ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/analytics/team":{"get":{"tags":["installer-analytics"],"summary":"Get Team Breakdown","description":"Get per-installer commissioning stats.\nReturns installers: [{ name, commissions_count, success_rate, avg_duration_minutes }].\nSorted by commissions_count descending.","operationId":"get_team_breakdown_api_v1_installer_analytics_team_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter from date","title":"Start Date"},"description":"Filter from date"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to date","title":"End Date"},"description":"Filter to date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/analytics/failure-reasons":{"get":{"tags":["installer-analytics"],"summary":"Get Failure Reasons","description":"Get top commissioning failure reasons with count and percentage.\nSorted by count descending.","operationId":"get_failure_reasons_api_v1_installer_analytics_failure_reasons_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter from date","title":"Start Date"},"description":"Filter from date"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to date","title":"End Date"},"description":"Filter to date"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"description":"Top N failure reasons","default":10,"title":"Limit"},"description":"Top N failure reasons"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/analytics/timeline":{"get":{"tags":["installer-analytics"],"summary":"Get Commissioning Timeline","description":"Get commissioning timeline with date, commissions_count, success_count.\ngranularity: day, week, month.","operationId":"get_commissioning_timeline_api_v1_installer_analytics_timeline_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter from date","title":"Start Date"},"description":"Filter from date"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter to date","title":"End Date"},"description":"Filter to date"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","description":"day, week, or month","default":"day","title":"Granularity"},"description":"day, week, or month"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/settings":{"get":{"tags":["User Settings"],"summary":"Get Settings","description":"Get all user settings.","operationId":"get_settings_api_v1_installer_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettings"}}}}}},"put":{"tags":["User Settings"],"summary":"Update Settings","description":"Update user settings.","operationId":"update_settings_api_v1_installer_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update Settings Api V1 Installer Settings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/settings/profile-picture":{"put":{"tags":["User Settings"],"summary":"Upload Profile Picture","description":"Upload profile picture.","operationId":"upload_profile_picture_api_v1_installer_settings_profile_picture_put","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_profile_picture_api_v1_installer_settings_profile_picture_put"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Profile Picture Api V1 Installer Settings Profile Picture Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/settings/company-logo":{"put":{"tags":["User Settings"],"summary":"Upload Company Logo","description":"Upload company logo.","operationId":"upload_company_logo_api_v1_installer_settings_company_logo_put","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_company_logo_api_v1_installer_settings_company_logo_put"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Company Logo Api V1 Installer Settings Company Logo Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/settings/two-factor/setup":{"post":{"tags":["User Settings"],"summary":"Setup Two Factor","description":"Setup two-factor authentication.","operationId":"setup_two_factor_api_v1_installer_settings_two_factor_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwoFactorSetupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Setup Two Factor Api V1 Installer Settings Two Factor Setup Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/settings/password/change":{"post":{"tags":["User Settings"],"summary":"Change Password","description":"Change user password.","operationId":"change_password_api_v1_installer_settings_password_change_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Change Password Api V1 Installer Settings Password Change Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/settings/sessions":{"get":{"tags":["User Settings"],"summary":"Get Active Sessions","description":"Get active user sessions.","operationId":"get_active_sessions_api_v1_installer_settings_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SessionInfo"},"type":"array","title":"Response Get Active Sessions Api V1 Installer Settings Sessions Get"}}}}}}},"/api/v1/installer/projects/{project_id}/invite-site-owner":{"post":{"tags":["handover"],"summary":"Invite Site Owner","description":"Story 5.1: Invite Site Owner\nAllows installer to invite a site owner to take control of a project.","operationId":"invite_site_owner_api_v1_installer_projects__project_id__invite_site_owner_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteSiteOwnerRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/invitations":{"get":{"tags":["handover"],"summary":"Get Project Invitations","description":"Story 5.1: Track Invitation Status\nReturns all invitations for a project with their current status.","operationId":"get_project_invitations_api_v1_installer_projects__project_id__invitations_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/resend-invitation/{invitation_id}":{"post":{"tags":["handover"],"summary":"Resend Invitation","description":"Story 5.1: Resend Invitation\nGenerates a new invitation link with fresh expiry and resends email.","operationId":"resend_invitation_api_v1_installer_projects__project_id__resend_invitation__invitation_id__post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","title":"Invitation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/complete-handover":{"post":{"tags":["handover"],"summary":"Complete Handover","description":"Story 5.2: Complete Handover\nCompletes the handover process and transfers project ownership.","operationId":"complete_handover_api_v1_installer_projects__project_id__complete_handover_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandoverCompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandoverCompleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/handover-status":{"get":{"tags":["handover"],"summary":"Get Handover Status","description":"Get the current handover status for a project.","operationId":"get_handover_status_api_v1_installer_projects__project_id__handover_status_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandoverStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/audit-trail":{"get":{"tags":["handover"],"summary":"Get Handover Audit Trail","description":"Get the audit trail for handover events on a project.","operationId":"get_handover_audit_trail_api_v1_installer_projects__project_id__audit_trail_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/handover/status":{"get":{"tags":["handover"],"summary":"Get Handover Status","description":"Get comprehensive handover status for a project.\n\nReturns detailed information about the handover process including\ninvitation status, site owner onboarding, and project handover progress.","operationId":"get_handover_status_api_v1_installer_projects__project_id__handover_status_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/accept-invitation":{"get":{"tags":["public-handover"],"summary":"Public Accept Invitation","description":"Public endpoint for site owners to accept invitations.\nThis endpoint doesn't require authentication.","operationId":"public_accept_invitation_api_v1_public_accept_invitation_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__handover_api__AcceptInvitationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations":{"post":{"tags":["organizations"],"summary":"Create Organization","description":"Create an organization and set the caller as org_admin.\n\nAny authenticated user can create an organization. The creator becomes\nthe org_admin of the new organization.","operationId":"create_organization_api_v1_organizations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__organization_api__CreateOrganizationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_id}":{"get":{"tags":["organizations"],"summary":"Get Organization Profile","description":"Get organization profile. Requires org membership or system_admin.","operationId":"get_organization_profile_api_v1_organizations__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["organizations"],"summary":"Update Organization Profile","description":"Update organization profile. Requires org_admin of this org or system_admin.","operationId":"update_organization_profile_api_v1_organizations__org_id__put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrganizationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_id}/invitations":{"post":{"tags":["organizations"],"summary":"Send Organization Invitation","description":"Send an invitation to join the organization.\n\nRequires org_admin of this org or system_admin.","operationId":"send_organization_invitation_api_v1_organizations__org_id__invitations_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteOrganizationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/invitations/accept":{"post":{"tags":["organizations"],"summary":"Accept Organization Invitation","description":"Accept an organization invitation (no auth required).\n\nVerifies the token, marks the invitation as accepted, and returns next steps.","operationId":"accept_organization_invitation_api_v1_organizations_invitations_accept_post","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Invitation token from email","title":"Token"},"description":"Invitation token from email"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_id}/invitations/{invitation_id}":{"delete":{"tags":["organizations"],"summary":"Revoke Organization Invitation","description":"Revoke (delete) an organization invitation.\n\nRequires org_admin of this org or system_admin.","operationId":"revoke_organization_invitation_api_v1_organizations__org_id__invitations__invitation_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","title":"Invitation Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_id}/members":{"get":{"tags":["organizations"],"summary":"List Organization Members","description":"List organization members.\n\nRequires org membership or system_admin.","operationId":"list_organization_members_api_v1_organizations__org_id__members_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_id}/members/{user_id}/role":{"put":{"tags":["organizations"],"summary":"Update Member Role","description":"Update a member's role.\n\nRequires org_admin. Cannot demote the last org_admin.","operationId":"update_member_role_api_v1_organizations__org_id__members__user_id__role_put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberRoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_id}/members/{user_id}":{"delete":{"tags":["organizations"],"summary":"Remove Organization Member","description":"Remove a member from the organization.\n\nRequires org_admin. Cannot remove yourself.","operationId":"remove_organization_member_api_v1_organizations__org_id__members__user_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_id}/settings":{"get":{"tags":["organizations"],"summary":"Get Organization Settings","description":"Get organization settings.\n\nRequires org membership or system_admin. Returns default_tariff_id,\nalert_preferences, and timezone from the settings JSONB.","operationId":"get_organization_settings_api_v1_organizations__org_id__settings_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["organizations"],"summary":"Update Organization Settings","description":"Update organization settings.\n\nRequires org_admin. Partial update; only supplied fields are changed.\nSettings schema: default_tariff_id, alert_preferences, timezone.","operationId":"update_organization_settings_api_v1_organizations__org_id__settings_put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationSettingsUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/site-owner/accept-invitation/{token}":{"post":{"tags":["site-owner"],"summary":"Accept Invitation","description":"Accept site owner invitation and create account.\n\nThis endpoint allows a site owner to accept an invitation using a secure token\nand create their account with pre-verified email.","operationId":"accept_invitation_api_v1_site_owner_accept_invitation__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInvitationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__site_owner_api__AcceptInvitationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/site-owner/onboarding/status":{"get":{"tags":["site-owner"],"summary":"Get Onboarding Status","description":"Get onboarding completion status for the current site owner","operationId":"get_onboarding_status_api_v1_site_owner_onboarding_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingStatusResponse"}}}}}}},"/api/v1/site-owner/onboarding/complete":{"post":{"tags":["site-owner"],"summary":"Complete Onboarding","description":"Mark onboarding as complete for the current site owner","operationId":"complete_onboarding_api_v1_site_owner_onboarding_complete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/site-owner/profile":{"get":{"tags":["site-owner"],"summary":"Get Site Owner Profile","description":"Get the current site owner's profile and associated projects","operationId":"get_site_owner_profile_api_v1_site_owner_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOwnerProfileResponse"}}}}}}},"/api/v1/site-owner/projects":{"get":{"tags":["site-owner"],"summary":"Get Site Owner Projects","description":"Get all projects associated with the current site owner","operationId":"get_site_owner_projects_api_v1_site_owner_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ProjectSummary"},"type":"array","title":"Response Get Site Owner Projects Api V1 Site Owner Projects Get"}}}}}}},"/api/v1/sites":{"post":{"tags":["sites"],"summary":"Create Site","description":"Create a site. Org from auth.","operationId":"create_site_api_v1_sites_post","parameters":[{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSiteRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["sites"],"summary":"List Sites","description":"List sites for the authenticated org.","operationId":"list_sites_api_v1_sites_get","parameters":[{"name":"is_active","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Is Active"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}":{"get":{"tags":["sites"],"summary":"Get Site","description":"Get site detail with energy_assets and chargers arrays.","operationId":"get_site_api_v1_sites__site_id__get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["sites"],"summary":"Update Site","description":"Partial update of a site.","operationId":"update_site_api_v1_sites__site_id__patch","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSiteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sites"],"summary":"Delete Site","description":"Soft-delete site (set is_active=false).","operationId":"delete_site_api_v1_sites__site_id__delete","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/energy-assets":{"post":{"tags":["sites"],"summary":"Add Energy Asset","description":"Add an energy asset to a site.","operationId":"add_energy_asset_api_v1_sites__site_id__energy_assets_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssetRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["sites"],"summary":"List Energy Assets","description":"List energy assets for a site.","operationId":"list_energy_assets_api_v1_sites__site_id__energy_assets_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/energy-assets/{asset_id}":{"put":{"tags":["sites"],"summary":"Update Energy Asset","description":"Update an energy asset.","operationId":"update_energy_asset_api_v1_sites__site_id__energy_assets__asset_id__put","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sites"],"summary":"Remove Energy Asset","description":"Remove an energy asset.","operationId":"remove_energy_asset_api_v1_sites__site_id__energy_assets__asset_id__delete","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/chargers/{charge_point_id}/link":{"post":{"tags":["sites"],"summary":"Link Charger","description":"Link a charger to this site.","operationId":"link_charger_api_v1_sites__site_id__chargers__charge_point_id__link_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/chargers/{charge_point_id}":{"delete":{"tags":["sites"],"summary":"Unlink Charger","description":"Unlink a charger from this site.","operationId":"unlink_charger_api_v1_sites__site_id__chargers__charge_point_id__delete","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/summary":{"get":{"tags":["sites"],"summary":"Get Site Summary","description":"Get computed summary (grid capacity, headroom, asset inventory).","operationId":"get_site_summary_api_v1_sites__site_id__summary_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/smart-charging/sites/{site_id}/config":{"put":{"tags":["smart-charging"],"summary":"Put Site Load Config","operationId":"put_site_load_config_api_v1_smart_charging_sites__site_id__config_put","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["smart-charging"],"summary":"Get Site Load Config","operationId":"get_site_load_config_api_v1_smart_charging_sites__site_id__config_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/smart-charging/sites/{site_id}/allocation":{"get":{"tags":["smart-charging"],"summary":"Get Site Current Allocation","operationId":"get_site_current_allocation_api_v1_smart_charging_sites__site_id__allocation_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/smart-charging/sites/{site_id}/allocation/history":{"get":{"tags":["smart-charging"],"summary":"Get Site Allocation History","operationId":"get_site_allocation_history_api_v1_smart_charging_sites__site_id__allocation_history_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/smart-charging/sites/{site_id}/rebalance":{"post":{"tags":["smart-charging"],"summary":"Post Manual Rebalance","operationId":"post_manual_rebalance_api_v1_smart_charging_sites__site_id__rebalance_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","title":"Site Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/energy/by-charge-point":{"get":{"tags":["analytics"],"summary":"Get Energy By Charge Point","description":"Get energy analytics by charge point\n\nReturns kWh per charge point for the specified period.\nAccessible to installers and site owners for their own charge points.","operationId":"get_energy_by_charge_point_api_v1_analytics_energy_by_charge_point_get","parameters":[{"name":"charge_point_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by charge point ID","title":"Charge Point Id"},"description":"Filter by charge point ID"},{"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":"period","in":"query","required":false,"schema":{"type":"string","description":"Aggregation period: day, week, month","default":"day","title":"Period"},"description":"Aggregation period: day, week, month"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EnergyAnalyticsResponse"},"title":"Response Get Energy By Charge Point Api V1 Analytics Energy By Charge Point Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/energy/by-project":{"get":{"tags":["analytics"],"summary":"Get Energy By Project","description":"Get energy analytics by project/site\n\nReturns aggregated kWh per project.\nAccessible to installers and site owners for their own projects.","operationId":"get_energy_by_project_api_v1_analytics_energy_by_project_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project ID","title":"Project Id"},"description":"Filter by project ID"},{"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)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EnergyByProjectResponse"},"title":"Response Get Energy By Project Api V1 Analytics Energy By Project Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/energy/by-time-of-day":{"get":{"tags":["analytics"],"summary":"Get Energy By Time Of Day","description":"Get energy usage by time of day (heatmap data)\n\nReturns hour-by-hour energy usage to identify peak hours.\nAccessible to installers and site owners for their own charge points.","operationId":"get_energy_by_time_of_day_api_v1_analytics_energy_by_time_of_day_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project ID","title":"Project Id"},"description":"Filter by project ID"},{"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)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnergyByTimeOfDayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/energy/trends":{"get":{"tags":["analytics"],"summary":"Get Energy Trends","description":"Get energy trends (week-over-week, month-over-month)\n\nReturns growth trends for energy consumption and revenue.\nAccessible to installers and site owners for their own charge points.","operationId":"get_energy_trends_api_v1_analytics_energy_trends_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project ID","title":"Project Id"},"description":"Filter by project ID"},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Trend period: week, month","default":"week","title":"Period"},"description":"Trend period: week, month"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnergyTrendsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/revenue/summary":{"get":{"tags":["analytics"],"summary":"Get Revenue Summary","description":"Get revenue summary with breakdown\n\nReturns total revenue, revenue per kWh, revenue per session, and tariff breakdown.\nAccessible to installers and site owners for their own charge points.","operationId":"get_revenue_summary_api_v1_analytics_revenue_summary_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project ID","title":"Project Id"},"description":"Filter by project ID"},{"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)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/revenue/by-charge-point":{"get":{"tags":["analytics"],"summary":"Get Revenue By Charge Point","description":"Get revenue by charge point\n\nReturns revenue per charger, sorted by highest revenue.\nAccessible to installers and site owners for their own charge points.","operationId":"get_revenue_by_charge_point_api_v1_analytics_revenue_by_charge_point_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project ID","title":"Project Id"},"description":"Filter by project ID"},{"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)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RevenueByChargePointResponse"},"title":"Response Get Revenue By Charge Point Api V1 Analytics Revenue By Charge Point Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/revenue/by-tariff":{"get":{"tags":["analytics"],"summary":"Get Revenue By Tariff","description":"Get revenue by tariff\n\nReturns which tariffs generate the most revenue.\nAccessible to installers and site owners for their own charge points.","operationId":"get_revenue_by_tariff_api_v1_analytics_revenue_by_tariff_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project ID","title":"Project Id"},"description":"Filter by project ID"},{"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)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RevenueByTariffResponse"},"title":"Response Get Revenue By Tariff Api V1 Analytics Revenue By Tariff Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/revenue/forecasts":{"get":{"tags":["analytics"],"summary":"Get Revenue Forecasts","description":"Get revenue forecasts based on trends\n\nReturns projected revenue based on historical trends.\nAccessible to installers and site owners for their own charge points.","operationId":"get_revenue_forecasts_api_v1_analytics_revenue_forecasts_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project ID","title":"Project Id"},"description":"Filter by project ID"},{"name":"forecast_days","in":"query","required":false,"schema":{"type":"integer","description":"Number of days to forecast","default":30,"title":"Forecast Days"},"description":"Number of days to forecast"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueForecastResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/issues":{"get":{"tags":["analytics"],"summary":"Get Issues","description":"List operational issues\n\nReturns list of detected issues with optional filters.\nAccessible to installers and site owners for their own charge points.","operationId":"get_issues_api_v1_analytics_issues_get","parameters":[{"name":"charge_point_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by charge point ID","title":"Charge Point Id"},"description":"Filter by charge point ID"},{"name":"issue_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by issue type","title":"Issue Type"},"description":"Filter by issue type"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by severity","title":"Severity"},"description":"Filter by severity"},{"name":"resolved","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by resolved status","title":"Resolved"},"description":"Filter by resolved status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OperationalIssueResponse"},"title":"Response Get Issues Api V1 Analytics Issues Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/issues/summary":{"get":{"tags":["analytics"],"summary":"Get Issues Summary","description":"Get issues summary with counts by type and severity\n\nReturns summary statistics of operational issues.\nAccessible to installers and site owners for their own charge points.","operationId":"get_issues_summary_api_v1_analytics_issues_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuesSummaryResponse"}}}}}}},"/api/v1/analytics/issues/{issue_id}/acknowledge":{"post":{"tags":["analytics"],"summary":"Acknowledge Issue","description":"Acknowledge an issue\n\nMarks an issue as acknowledged by the current user.\nAccessible to installers and site owners for their own charge points.","operationId":"acknowledge_issue_api_v1_analytics_issues__issue_id__acknowledge_post","parameters":[{"name":"issue_id","in":"path","required":true,"schema":{"type":"string","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/health-score":{"get":{"tags":["analytics"],"summary":"Get Health Score","description":"Get overall fleet health score (0-100)\n\nReturns health score based on operational issues.\nAccessible to installers and site owners for their own charge points.","operationId":"get_health_score_api_v1_analytics_health_score_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthScoreResponse"}}}}}}},"/api/v1/analytics/customers/health":{"get":{"tags":["analytics"],"summary":"Get Customer Health","description":"Get customer health scores\n\nReturns health scores for all customers/projects.\nAccessible to installers and site owners for their own projects.","operationId":"get_customer_health_api_v1_analytics_customers_health_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project ID","title":"Project Id"},"description":"Filter by project ID"},{"name":"health_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by health status","title":"Health Status"},"description":"Filter by health status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerHealthResponse"},"title":"Response Get Customer Health Api V1 Analytics Customers Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/customers/thriving":{"get":{"tags":["analytics"],"summary":"Get Thriving Customers","description":"Get thriving customers (ready to expand)\n\nReturns customers with health status 'thriving' (score >80, growth >10%).\nAccessible to installers and site owners for their own projects.","operationId":"get_thriving_customers_api_v1_analytics_customers_thriving_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CustomerHealthResponse"},"type":"array","title":"Response Get Thriving Customers Api V1 Analytics Customers Thriving Get"}}}}}}},"/api/v1/analytics/customers/at-risk":{"get":{"tags":["analytics"],"summary":"Get At Risk Customers","description":"Get at-risk customers (needing help)\n\nReturns customers with health status 'at_risk' or 'critical'.\nAccessible to installers and site owners for their own projects.","operationId":"get_at_risk_customers_api_v1_analytics_customers_at_risk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CustomerHealthResponse"},"type":"array","title":"Response Get At Risk Customers Api V1 Analytics Customers At Risk Get"}}}}}}},"/api/v1/analytics/customers/{project_id}/recommendations":{"get":{"tags":["analytics"],"summary":"Get Customer Recommendations","description":"Get AI-generated recommendations for a customer\n\nReturns recommendations based on health score analysis.\nAccessible to installers and site owners for their own projects.","operationId":"get_customer_recommendations_api_v1_analytics_customers__project_id__recommendations_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Get Customer Recommendations Api V1 Analytics Customers  Project Id  Recommendations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/customers/leaderboard":{"get":{"tags":["analytics"],"summary":"Get Customer Leaderboard","description":"Get top performing customers (leaderboard)\n\nReturns customers sorted by overall health score.\nAccessible to installers and site owners for their own projects.","operationId":"get_customer_leaderboard_api_v1_analytics_customers_leaderboard_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Number of top customers to return","default":10,"title":"Limit"},"description":"Number of top customers to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerHealthResponse"},"title":"Response Get Customer Leaderboard Api V1 Analytics Customers Leaderboard Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/sessions/lookup":{"get":{"tags":["support-billing"],"summary":"Lookup Sessions","description":"Lookup charging sessions by various criteria.\n\nFind sessions by transaction_id, user_email, charge_point, or date range.\nNon-system-admin users only see sessions from their organization.","operationId":"lookup_sessions_api_v1_support_billing_sessions_lookup_get","parameters":[{"name":"transaction_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by transaction ID","title":"Transaction Id"},"description":"Filter by transaction ID"},{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by user email","title":"User Email"},"description":"Filter by user email"},{"name":"charge_point_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by charge point ID","title":"Charge Point Id"},"description":"Filter by charge point ID"},{"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":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization (required for non-system-admin)","title":"Organization Id"},"description":"Filter by organization (required for non-system-admin)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionLookupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/reconciliation/orphaned-transactions":{"get":{"tags":["support-billing"],"summary":"Get Orphaned Firebase Transactions","description":"Get Firebase active transactions older than X hours (DYN-73).\nOrphaned transactions may indicate charger disconnect without proper TransactionEvent(Ended).\nNon-system-admin users only see transactions from their organization.","operationId":"get_orphaned_firebase_transactions_api_v1_support_billing_reconciliation_orphaned_transactions_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","description":"Transactions older than this many hours","default":24,"title":"Hours"},"description":"Transactions older than this many hours"},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization (required for non-system-admin)","title":"Organization Id"},"description":"Filter by organization (required for non-system-admin)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/sessions/{session_id}/full-audit":{"get":{"tags":["support-billing"],"summary":"Get Session Full Audit","description":"Return full billing audit for a session (CostBreakdownResponse).\nNon-system-admin users only see sessions from their organization.","operationId":"get_session_full_audit_api_v1_support_billing_sessions__session_id__full_audit_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostBreakdownResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/sessions/{session_id}/recalculate":{"get":{"tags":["support-billing"],"summary":"Recalculate Session","description":"Dry-run recalculation of session cost.\nNon-system-admin users only see sessions from their organization.","operationId":"recalculate_session_api_v1_support_billing_sessions__session_id__recalculate_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecalculateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/users/{user_id}/history":{"get":{"tags":["support-billing"],"summary":"Get User Billing History","description":"Get user's complete billing history.\nNon-system-admin users only see sessions from their organization.","operationId":"get_user_billing_history_api_v1_support_billing_users__user_id__history_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"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":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization (required for non-system-admin)","title":"Organization Id"},"description":"Filter by organization (required for non-system-admin)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/disputes":{"post":{"tags":["support-billing"],"summary":"Create Dispute","description":"Create a billing dispute.\nNon-system-admin users can only create disputes for sessions in their organization.","operationId":"create_dispute_api_v1_support_billing_disputes_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["support-billing"],"summary":"List Disputes","description":"List billing disputes.\nNon-system-admin users only see disputes for sessions in their organization.","operationId":"list_disputes_api_v1_support_billing_disputes_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":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by session ID","title":"Session Id"},"description":"Filter by session ID"},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization (required for non-system-admin)","title":"Organization Id"},"description":"Filter by organization (required for non-system-admin)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DisputeResponse"},"title":"Response List Disputes Api V1 Support Billing Disputes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/disputes/{dispute_id}/resolve":{"post":{"tags":["support-billing"],"summary":"Resolve Dispute","description":"Resolve a billing dispute.\nNon-system-admin users can only resolve disputes for sessions in their organization.","operationId":"resolve_dispute_api_v1_support_billing_disputes__dispute_id__resolve_post","parameters":[{"name":"dispute_id","in":"path","required":true,"schema":{"type":"string","title":"Dispute Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeResolveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/adjustments":{"post":{"tags":["support-billing"],"summary":"Create Adjustment","description":"Create a billing adjustment (credit/refund).\nNon-system-admin users can only create adjustments for sessions in their organization.","operationId":"create_adjustment_api_v1_support_billing_adjustments_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustmentCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["support-billing"],"summary":"List Adjustments","description":"List billing adjustments.\nNon-system-admin users only see adjustments for sessions in their organization.","operationId":"list_adjustments_api_v1_support_billing_adjustments_get","parameters":[{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by session ID","title":"Session Id"},"description":"Filter by session ID"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization (required for non-system-admin)","title":"Organization Id"},"description":"Filter by organization (required for non-system-admin)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdjustmentResponse"},"title":"Response List Adjustments Api V1 Support Billing Adjustments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/billing/adjustments/{adjustment_id}/approve":{"post":{"tags":["support-billing"],"summary":"Approve Adjustment","description":"Approve or reject an adjustment.\nNon-system-admin users can only approve adjustments for sessions in their organization.","operationId":"approve_adjustment_api_v1_support_billing_adjustments__adjustment_id__approve_post","parameters":[{"name":"adjustment_id","in":"path","required":true,"schema":{"type":"string","title":"Adjustment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustmentApproveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/sessions/{session_id}/cost-breakdown":{"get":{"tags":["driver-portal"],"summary":"Get Session Cost Breakdown","description":"Return cost breakdown for a session owned by the current user.","operationId":"get_session_cost_breakdown_api_v1_portal_sessions__session_id__cost_breakdown_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostBreakdownResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/sessions":{"get":{"tags":["driver-portal"],"summary":"Get My Sessions","description":"Get my charging history\n\nReturns charging sessions for the authenticated user.","operationId":"get_my_sessions_api_v1_portal_sessions_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":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Number of sessions to return","default":50,"title":"Limit"},"description":"Number of sessions to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/sessions/{session_id}/receipt":{"get":{"tags":["driver-portal"],"summary":"Get Session Receipt","description":"Get downloadable receipt for a session\n\nReturns receipt data (could be formatted as PDF in future).","operationId":"get_session_receipt_api_v1_portal_sessions__session_id__receipt_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/v1/portal/sessions/{session_id}/dispute":{"post":{"tags":["driver-portal"],"summary":"Submit Dispute","description":"Submit a billing dispute\n\nAllows drivers to submit disputes for charging sessions.","operationId":"submit_dispute_api_v1_portal_sessions__session_id__dispute_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeSubmitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/portal/summary":{"get":{"tags":["driver-portal"],"summary":"Get Monthly Summary","description":"Get monthly dashboard summary\n\nReturns monthly summary with sessions, costs, and energy usage.","operationId":"get_monthly_summary_api_v1_portal_summary_get","parameters":[{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Month in YYYY-MM format","title":"Month"},"description":"Month in YYYY-MM format"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthlySummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/support/tickets":{"get":{"tags":["support"],"summary":"List Support Tickets","description":"Story 6.1: List Support Tickets\nReturns all support tickets for the installer.","operationId":"list_support_tickets_api_v1_installer_support_tickets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportTicketListResponse"}}}}}},"post":{"tags":["support"],"summary":"Create Support Ticket","description":"Story 6.1: Create Support Ticket\nAllows installer to create a support ticket for issues.\n\nEnhanced to handle:\n- Charger setup issues (even when charger not in system)\n- General support requests\n- EVSE-specific issues","operationId":"create_support_ticket_api_v1_installer_support_tickets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSupportTicketRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportTicketResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/support/charger-setup":{"post":{"tags":["support"],"summary":"Create Charger Setup Ticket","description":"Specialized endpoint for charger setup issues\nThis endpoint is specifically designed for installers who are struggling\nto add or configure chargers in the system.","operationId":"create_charger_setup_ticket_api_v1_installer_support_charger_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSupportTicketRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportTicketResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/support/tickets/{ticket_id}":{"get":{"tags":["support"],"summary":"Get Support Ticket","description":"Story 6.1: Get Support Ticket Details\nReturns detailed information about a specific support ticket.","operationId":"get_support_ticket_api_v1_installer_support_tickets__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportTicketResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["support"],"summary":"Update Support Ticket","description":"Story 6.1: Update Support Ticket\nUpdates the status and notes of a support ticket.","operationId":"update_support_ticket_api_v1_installer_support_tickets__ticket_id__patch","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSupportTicketRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportTicketResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/support/metrics":{"get":{"tags":["support"],"summary":"Get Support Metrics","description":"Story 6.1: Get Support Metrics\nReturns metrics and analytics for support tickets.","operationId":"get_support_metrics_api_v1_installer_support_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMetricsResponse"}}}}}}},"/api/v1/installer/support/check-charger/{charger_identifier}":{"get":{"tags":["support"],"summary":"Check Charger Status","description":"Helper endpoint to check if a charger exists and its status\nThis helps installers understand what they're working with before\ncreating support tickets.","operationId":"check_charger_status_api_v1_installer_support_check_charger__charger_identifier__get","parameters":[{"name":"charger_identifier","in":"path","required":true,"schema":{"type":"string","title":"Charger Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Charger Status Api V1 Installer Support Check Charger  Charger Identifier  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/charge-points/{charge_point_id}/logs":{"get":{"tags":["support"],"summary":"Get Charge Point Logs","description":"Story 6.2: Get Charge Point Logs\nReturns logs for a specific charge point with filtering options.","operationId":"get_charge_point_logs_api_v1_installer_charge_points__charge_point_id__logs_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"log_level","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LogLevel"},{"type":"null"}],"title":"Log Level"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LogCategory"},{"type":"null"}],"title":"Category"}},{"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":1000,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/projects/{project_id}/logs":{"get":{"tags":["support"],"summary":"Get Project Logs","description":"Story 6.2: Get Project Logs\nReturns logs for all charge points in a project.","operationId":"get_project_logs_api_v1_installer_projects__project_id__logs_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"log_level","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LogLevel"},{"type":"null"}],"title":"Log Level"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LogCategory"},{"type":"null"}],"title":"Category"}},{"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":1000,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/logs":{"get":{"tags":["support"],"summary":"Get Installer Logs","description":"Story 6.2: Get All Installer Logs\nReturns all logs for the installer across all projects and charge points.","operationId":"get_installer_logs_api_v1_installer_logs_get","parameters":[{"name":"log_level","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LogLevel"},{"type":"null"}],"title":"Log Level"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LogCategory"},{"type":"null"}],"title":"Category"}},{"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":1000,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/support/tickets/{ticket_id}/attachments":{"post":{"tags":["support"],"summary":"Upload Ticket Attachment","description":"Upload file attachment to support ticket.","operationId":"upload_ticket_attachment_api_v1_installer_support_tickets__ticket_id__attachments_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_ticket_attachment_api_v1_installer_support_tickets__ticket_id__attachments_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Ticket Attachment Api V1 Installer Support Tickets  Ticket Id  Attachments Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["support"],"summary":"Get Ticket Attachments","description":"Get list of attachments for a support ticket.","operationId":"get_ticket_attachments_api_v1_installer_support_tickets__ticket_id__attachments_get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Attachments Api V1 Installer Support Tickets  Ticket Id  Attachments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/support/tickets/{ticket_id}/attachments/{attachment_id}/download":{"get":{"tags":["support"],"summary":"Download Attachment","description":"Download a specific attachment.","operationId":"download_attachment_api_v1_installer_support_tickets__ticket_id__attachments__attachment_id__download_get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}},{"name":"attachment_id","in":"path","required":true,"schema":{"type":"string","title":"Attachment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Download Attachment Api V1 Installer Support Tickets  Ticket Id  Attachments  Attachment Id  Download Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/dashboard/stats":{"get":{"tags":["Dashboard"],"summary":"Get Dashboard Stats","operationId":"get_dashboard_stats_api_v1_installer_dashboard_stats_get","parameters":[{"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":"include_archived","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/dashboard/comprehensive-stats":{"get":{"tags":["Dashboard"],"summary":"Get Comprehensive Stats","operationId":"get_comprehensive_stats_api_v1_installer_dashboard_comprehensive_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/dashboard/charge-point-stats":{"get":{"tags":["Dashboard"],"summary":"Get Charge Point Stats","operationId":"get_charge_point_stats_api_v1_installer_dashboard_charge_point_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/dashboard/recent-activity":{"get":{"tags":["Dashboard"],"summary":"Get Recent Activity","operationId":"get_recent_activity_api_v1_installer_dashboard_recent_activity_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/dashboard/performance-metrics":{"get":{"tags":["Dashboard"],"summary":"Get Performance Metrics","operationId":"get_performance_metrics_api_v1_installer_dashboard_performance_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","description":"Enhanced health check endpoint providing comprehensive system status.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ready":{"get":{"tags":["developer-experience"],"summary":"Readiness Check","description":"Readiness check endpoint - validates all services","operationId":"readiness_check_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadinessResponse"}}}}}}},"/metrics":{"get":{"tags":["developer-experience"],"summary":"Get System Metrics","description":"Get comprehensive system metrics","operationId":"get_system_metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemMetricsResponse"}}}}}}},"/api/v1/debug/log-charge-point-error":{"post":{"tags":["developer-experience"],"summary":"Log Charge Point Error","description":"Log a charge point error for debugging","operationId":"log_charge_point_error_api_v1_debug_log_charge_point_error_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargePointErrorResponse"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/charge-points/{charge_point_id}/errors":{"get":{"tags":["developer-experience"],"summary":"Get Charge Point Errors","description":"Get errors for a specific charge point","operationId":"get_charge_point_errors_api_v1_debug_charge_points__charge_point_id__errors_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/charge-points/{charge_point_id}/status":{"get":{"tags":["developer-experience"],"summary":"Get Charge Point Debug Status","description":"Get comprehensive debug status for a charge point","operationId":"get_charge_point_debug_status_api_v1_debug_charge_points__charge_point_id__status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargePointStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/charge-points/{charge_point_id}/connection-history":{"get":{"tags":["developer-experience"],"summary":"Get Connection History","description":"Get connection history and success rate for a charge point","operationId":"get_connection_history_api_v1_debug_charge_points__charge_point_id__connection_history_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/endpoints":{"post":{"tags":["webhooks"],"summary":"Create Webhook Endpoint","description":"Create webhook endpoint. Returns 201 with endpoint (no secret).","operationId":"create_webhook_endpoint_api_v1_webhooks_endpoints_post","parameters":[{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Webhook Endpoint Api V1 Webhooks Endpoints Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["webhooks"],"summary":"List Webhook Endpoints","description":"List webhook endpoints for authenticated org.","operationId":"list_webhook_endpoints_api_v1_webhooks_endpoints_get","parameters":[{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by is_active","title":"Is Active"},"description":"Filter by is_active"},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Webhook Endpoints Api V1 Webhooks Endpoints Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/endpoints/{endpoint_id}":{"get":{"tags":["webhooks"],"summary":"Get Webhook Endpoint","description":"Get single webhook endpoint. 404 if not found or wrong org.","operationId":"get_webhook_endpoint_api_v1_webhooks_endpoints__endpoint_id__get","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Webhook Endpoint Api V1 Webhooks Endpoints  Endpoint Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["webhooks"],"summary":"Update Webhook Endpoint","description":"Update webhook endpoint (url, event_types, is_active, description).","operationId":"update_webhook_endpoint_api_v1_webhooks_endpoints__endpoint_id__patch","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Webhook Endpoint Api V1 Webhooks Endpoints  Endpoint Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhooks"],"summary":"Delete Webhook Endpoint","description":"Delete webhook endpoint.","operationId":"delete_webhook_endpoint_api_v1_webhooks_endpoints__endpoint_id__delete","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/endpoints/{endpoint_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List Webhook Deliveries","description":"List delivery logs for endpoint. Org-scoped.","operationId":"list_webhook_deliveries_api_v1_webhooks_endpoints__endpoint_id__deliveries_get","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max delivery logs to return","default":50,"title":"Limit"},"description":"Max delivery logs to return"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for pagination","title":"Cursor"},"description":"Cursor for pagination"},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Webhook Deliveries Api V1 Webhooks Endpoints  Endpoint Id  Deliveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/integration-requests":{"post":{"tags":["integration-requests"],"summary":"Create Integration Request","description":"Submit a new integration request for system enhancement\n\nThis endpoint allows users to request new integrations with external services,\nAPIs, or systems that would enhance the CSMS functionality. Integration requests\nare reviewed by administrators and prioritized based on business value and\ntechnical feasibility.\n\n## Integration Request Lifecycle\n\nThe complete lifecycle of an integration request follows these stages:\n\n1. **Submission** (`pending`)\n   - User submits integration request\n   - Basic validation performed\n   - Request assigned medium priority\n   - Auto-generated request ID\n\n2. **Review** (`in_review`)\n   - Admin reviews technical feasibility\n   - Business value assessment\n   - Resource requirement analysis\n   - Priority adjustment if needed\n\n3. **Decision** (`approved` | `rejected`)\n   - Admin makes final decision\n   - Detailed feedback provided\n   - Implementation timeline (if approved)\n   - Rejection reason (if rejected)\n\n4. **Implementation** (`implemented`)\n   - Development team implements integration\n   - Testing and validation\n   - Documentation creation\n   - User notification of completion\n\n## Request Requirements\n\n### Integration Name\n- **Length**: 1-255 characters\n- **Format**: Descriptive name of the integration\n- **Examples**: \"Stripe Payment Gateway\", \"Google Maps API\", \"Weather Service\"\n\n### Integration URL/Identifier\n- **Format**: URL, API endpoint, or service identifier\n- **Examples**: \n  - `https://api.stripe.com/v1`\n  - `https://maps.googleapis.com/maps/api`\n  - `weather-service-v2`\n\n### Reason (Detailed Justification)\n- **Length**: 10-2000 characters\n- **Content**: Business case and technical requirements\n- **Include**: Use cases, expected benefits, user impact\n\n## Request Format\n```json\n{\n    \"integration_name\": \"Stripe Payment Gateway\",\n    \"integration_url\": \"https://api.stripe.com/v1\",\n    \"reason\": \"We need to integrate Stripe payment processing to enable automated billing for charging sessions. This will allow users to pay for charging services directly through the platform, reducing manual payment processing and improving user experience. The integration should support credit card payments, subscription billing, and refund processing.\"\n}\n```\n\n## Response Format\n```json\n{\n    \"id\": \"req_550e8400-e29b-41d4-a716-446655440000\",\n    \"user_id\": \"user_12345\",\n    \"integration_name\": \"Stripe Payment Gateway\",\n    \"integration_url\": \"https://api.stripe.com/v1\",\n    \"reason\": \"We need to integrate Stripe payment processing...\",\n    \"status\": \"pending\",\n    \"priority\": \"medium\",\n    \"admin_notes\": null,\n    \"reviewed_by\": null,\n    \"reviewed_at\": null,\n    \"created_at\": \"2024-01-15T10:30:00Z\",\n    \"updated_at\": \"2024-01-15T10:30:00Z\"\n}\n```\n\n## Priority Levels\n\n### Low Priority\n- Nice-to-have features\n- Limited user impact\n- Non-critical functionality\n- **Timeline**: 3-6 months\n\n### Medium Priority (Default)\n- Standard business requests\n- Moderate user impact\n- Important but not urgent\n- **Timeline**: 1-3 months\n\n### High Priority\n- Critical business needs\n- High user impact\n- Urgent requirements\n- **Timeline**: 2-4 weeks\n\n### Critical Priority\n- System-critical integrations\n- Security or compliance requirements\n- Emergency situations\n- **Timeline**: 1-2 weeks\n\n## Status Values\n\n### `pending`\n- Request submitted and awaiting review\n- Default status for new requests\n- Can be updated by user\n\n### `in_review`\n- Under administrative review\n- Technical feasibility assessment\n- Cannot be updated by user\n\n### `approved`\n- Request approved for implementation\n- Development team assigned\n- Implementation timeline provided\n\n### `rejected`\n- Request rejected with reason\n- Cannot be resubmitted as-is\n- User can submit new request\n\n### `implemented`\n- Integration completed and deployed\n- Available for use\n- Documentation provided\n\n## Error Scenarios\n\n### 400 - Invalid Request Data\n```json\n{\n    \"detail\": \"Integration URL or identifier must be at least 3 characters long\"\n}\n```\n\n### 400 - Insufficient Reason\n```json\n{\n    \"detail\": \"Reason must be at least 10 characters long\"\n}\n```\n\n### 500 - Request Creation Failed\n```json\n{\n    \"detail\": \"Failed to create integration request\"\n}\n```\n\n## Usage Examples\n\n### Basic Integration Request\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/integration-requests\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -H \"Content-Type: application/json\"          -d '{\n       \"integration_name\": \"Weather Service API\",\n       \"integration_url\": \"https://api.openweathermap.org/data/2.5\",\n       \"reason\": \"We need weather data integration to provide users with real-time weather information at charging locations. This will help users plan their charging sessions based on weather conditions and provide safety alerts for severe weather.\"\n     }'\n```\n\n### Payment Gateway Request\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/integration-requests\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -H \"Content-Type: application/json\"          -d '{\n       \"integration_name\": \"PayPal Payment Gateway\",\n       \"integration_url\": \"https://api.paypal.com/v1\",\n       \"reason\": \"Integration with PayPal is required to offer alternative payment methods for charging services. This will increase user adoption by providing familiar payment options and reduce payment processing fees through competitive rates.\"\n     }'\n```\n\n### Mapping Service Request\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/integration-requests\"          -H \"Authorization: Bearer YOUR_TOKEN\"          -H \"Content-Type: application/json\"          -d '{\n       \"integration_name\": \"Google Maps Integration\",\n       \"integration_url\": \"https://maps.googleapis.com/maps/api\",\n       \"reason\": \"We need Google Maps integration to provide accurate location services, route planning for EV charging stations, and real-time traffic information. This will significantly improve the user experience for finding and navigating to charging locations.\"\n     }'\n```\n\n## Review Process\n\n### Administrative Review\n- **Timeline**: 2-5 business days\n- **Reviewers**: Technical team and product managers\n- **Criteria**: Feasibility, business value, resource requirements\n\n### Review Factors\n- **Technical Complexity**: Implementation difficulty\n- **Business Value**: User impact and revenue potential\n- **Resource Requirements**: Development time and cost\n- **Security Considerations**: Data protection and compliance\n- **Maintenance Overhead**: Ongoing support requirements\n\n## Best Practices\n\n### Writing Effective Requests\n1. **Clear Integration Name**: Be specific about the service\n2. **Detailed Reason**: Explain business value and use cases\n3. **Valid URL**: Provide working API endpoint or service identifier\n4. **User Impact**: Describe how it benefits users\n5. **Technical Details**: Include any specific requirements\n\n### Common Integration Types\n- **Payment Gateways**: Stripe, PayPal, Square\n- **Mapping Services**: Google Maps, Mapbox, HERE\n- **Weather APIs**: OpenWeatherMap, WeatherAPI\n- **Communication**: Twilio, SendGrid, Slack\n- **Analytics**: Google Analytics, Mixpanel\n- **Authentication**: Auth0, Firebase Auth\n\n## Tracking and Updates\n\n### Request Tracking\n- Monitor status changes via email notifications\n- Check request status through API endpoints\n- Receive updates on implementation progress\n- Get notified when integration is available\n\n### Status Updates\n- Automatic notifications for status changes\n- Detailed feedback from administrators\n- Implementation timeline updates\n- Completion notifications with documentation\n\n## Troubleshooting\n\n### Request Not Submitted\n1. Verify all required fields are provided\n2. Check field length requirements\n3. Ensure valid URL format\n4. Review reason content quality\n\n### No Response to Request\n1. Check request status in user dashboard\n2. Verify email notifications are enabled\n3. Contact support for status updates\n4. Review request for completeness\n\n### Request Rejected\n1. Review rejection reason carefully\n2. Address specific concerns raised\n3. Submit new request with improvements\n4. Consider alternative integration approaches\n\n## Related Endpoints\n- `GET /integration-requests` - View your requests\n- `GET /integration-requests/{request_id}` - Get specific request details\n- `PATCH /integration-requests/{request_id}` - Update pending request\n- `GET /admin/integration-requests` - Admin view (admin only)","operationId":"create_integration_request_api_v1_integration_requests_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntegrationRequestRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["integration-requests"],"summary":"Get User Integration Requests","description":"Get the current user's integration requests.\n\nSupports pagination and filtering by status.","operationId":"get_user_integration_requests_api_v1_integration_requests_get","parameters":[{"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":100,"minimum":1,"description":"Number of items per page","default":20,"title":"Page Size"},"description":"Number of items per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/RequestStatus"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/integration-requests/{request_id}":{"get":{"tags":["integration-requests"],"summary":"Get Integration Request","description":"Get details of a specific integration request.\n\nUsers can only view their own requests.","operationId":"get_integration_request_api_v1_integration_requests__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["integration-requests"],"summary":"Update Integration Request","description":"Update an integration request.\n\nUsers can only update their own pending requests.","operationId":"update_integration_request_api_v1_integration_requests__request_id__patch","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIntegrationRequestRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/integration-requests":{"get":{"tags":["integration-requests"],"summary":"Get All Integration Requests","description":"Get all integration requests (admin only).\n\nSupports pagination and filtering by status and priority.","operationId":"get_all_integration_requests_api_v1_admin_integration_requests_get","parameters":[{"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":100,"minimum":1,"description":"Number of items per page","default":20,"title":"Page Size"},"description":"Number of items per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/RequestStatus"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PriorityLevel"},{"type":"null"}],"description":"Filter by priority","title":"Priority"},"description":"Filter by priority"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/integration-requests/{request_id}":{"patch":{"tags":["integration-requests"],"summary":"Admin Update Integration Request","description":"Update an integration request (admin only).\n\nAdmins can update status, priority, and add notes.","operationId":"admin_update_integration_request_api_v1_admin_integration_requests__request_id__patch","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIntegrationRequestRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/integration-requests/stats":{"get":{"tags":["integration-requests"],"summary":"Get Integration Request Stats","description":"Get statistics about integration requests (admin only).","operationId":"get_integration_request_stats_api_v1_admin_integration_requests_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationRequestStatsResponse"}}}}}}},"/websocket-test":{"get":{"summary":"Test Endpoint","description":"Simple test HTTP endpoint to verify routing works","operationId":"test_endpoint_websocket_test_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/debug_token.txt":{"get":{"summary":"Get Debug Token","description":"Serve the debug token file for the debug page","operationId":"get_debug_token_debug_token_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/commissioning/streaming/start":{"post":{"tags":["commissioning-streaming"],"summary":"Start Ocpp Message Streaming","description":"Start real-time OCPP message streaming for a charge point during commissioning.\n\nThis creates a streaming session that allows the frontend to receive live OCPP \nmessages via WebSocket connection. The session tracks which installer is monitoring\nwhich charge point.","operationId":"start_ocpp_message_streaming_api_v1_installer_commissioning_streaming_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartStreamingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/streaming/stop":{"post":{"tags":["commissioning-streaming"],"summary":"Stop Ocpp Message Streaming","description":"Stop an active OCPP message streaming session.","operationId":"stop_ocpp_message_streaming_api_v1_installer_commissioning_streaming_stop_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopStreamingRequest"}}},"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/installer/commissioning/streaming/sessions":{"get":{"tags":["commissioning-streaming"],"summary":"List Streaming Sessions","description":"List all streaming sessions for the current installer.","operationId":"list_streaming_sessions_api_v1_installer_commissioning_streaming_sessions_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StreamingSessionResponse"},"title":"Response List Streaming Sessions Api V1 Installer Commissioning Streaming Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/streaming/sessions/{session_id}":{"get":{"tags":["commissioning-streaming"],"summary":"Get Streaming Session","description":"Get details of a specific streaming session.","operationId":"get_streaming_session_api_v1_installer_commissioning_streaming_sessions__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":{"$ref":"#/components/schemas/StreamingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/commissioning/streaming/charge-points/{charge_point_id}/status":{"get":{"tags":["commissioning-streaming"],"summary":"Get Charge Point Streaming Status","description":"Get the current streaming status for a charge point.","operationId":"get_charge_point_streaming_status_api_v1_installer_commissioning_streaming_charge_points__charge_point_id__status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/fault-codes":{"get":{"tags":["debug"],"summary":"List Fault Codes","description":"List all OCPP fault codes with descriptions and installer actions.\n\nFrontend clients can cache this on startup. No authentication required.","operationId":"list_fault_codes_api_v1_debug_fault_codes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/debug/fault-codes/{error_code}":{"get":{"tags":["debug"],"summary":"Get Fault Code","description":"Get fault explanation for a specific OCPP error code.\n\nReturns 404 if the code is not in the dictionary.\nNo authentication required.","operationId":"get_fault_code_api_v1_debug_fault_codes__error_code__get","parameters":[{"name":"error_code","in":"path","required":true,"schema":{"type":"string","title":"Error Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/charge-points/{charge_point_id}/messages":{"get":{"tags":["debug"],"summary":"Get Charge Point Messages","description":"Get historical OCPP messages for a charge point.","operationId":"get_charge_point_messages_api_v1_debug_charge_points__charge_point_id__messages_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"message_types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Types"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/charge-points/{charge_point_id}/diagnostics":{"get":{"tags":["debug"],"summary":"Get Charge Point Diagnostics","description":"Get connection diagnostics and detected issues for a charge point.","operationId":"get_charge_point_diagnostics_api_v1_debug_charge_points__charge_point_id__diagnostics_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/charge-points/{charge_point_id}/export":{"get":{"tags":["debug"],"summary":"Export Charge Point Logs","description":"Export OCPP logs as JSON or CSV. Max 7-day range.","operationId":"export_charge_point_logs_api_v1_debug_charge_points__charge_point_id__export_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"since","in":"query","required":true,"schema":{"type":"string","description":"Start datetime ISO format","title":"Since"},"description":"Start datetime ISO format"},{"name":"until","in":"query","required":true,"schema":{"type":"string","description":"End datetime ISO format","title":"Until"},"description":"End datetime ISO format"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Format"}},{"name":"message_types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Types"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/sessions/me":{"get":{"tags":["billing"],"summary":"Get My Sessions","operationId":"get_my_sessions_api_v1_billing_sessions_me_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start date filter","title":"Start Date"},"description":"Start date filter"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"End date filter","title":"End Date"},"description":"End date filter"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Maximum number of sessions to return","default":100,"title":"Limit"},"description":"Maximum number of sessions to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/sessions/organization":{"get":{"tags":["billing"],"summary":"Get Organization Billing","operationId":"get_organization_billing_api_v1_billing_sessions_organization_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start date filter","title":"Start Date"},"description":"Start date filter"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"End date filter","title":"End Date"},"description":"End date filter"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Maximum number of sessions to return","default":100,"title":"Limit"},"description":"Maximum number of sessions to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationBillingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/sessions/active/{transaction_id}":{"get":{"tags":["billing"],"summary":"Get Active Session Cost Estimate","description":"Get current energy and estimated cost for an active charging session (DYN-77).\nPublic endpoint for drivers to see live cost during charging.\nReturns 404 if session is already completed or not found.","operationId":"get_active_session_cost_estimate_api_v1_billing_sessions_active__transaction_id__get","parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveSessionEstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/active-sessions/{transaction_id}/cost-estimate":{"get":{"tags":["billing"],"summary":"Get Active Session Cost Estimate","description":"Get current energy and estimated cost for an active charging session (DYN-77).\nPublic endpoint for drivers to see live cost during charging.\nReturns 404 if session is already completed or not found.","operationId":"get_active_session_cost_estimate_api_v1_billing_active_sessions__transaction_id__cost_estimate_get","parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveSessionEstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/receipts/send-email":{"post":{"tags":["billing"],"summary":"Send Receipt Email Endpoint","description":"Send receipt PDF to driver by email (DYN-36).\nGenerates PDF and sends via SendGrid. No auth required for guest flow.","operationId":"send_receipt_email_endpoint_api_v1_billing_receipts_send_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendReceiptRequest"}}},"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/billing/receipts/by-transaction/{transaction_id}":{"get":{"tags":["billing"],"summary":"Get Receipt Pdf","description":"Get receipt PDF for a completed session by transaction ID (DYN-35).\nPublic endpoint for drivers to download their receipt.","operationId":"get_receipt_pdf_api_v1_billing_receipts_by_transaction__transaction_id__get","parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/sessions/by-transaction/{transaction_id}":{"get":{"tags":["billing"],"summary":"Get Session By Transaction","description":"Get cost breakdown for a session by transaction ID (DYN-37).\nPublic endpoint for guests to retrieve session cost and payment status.\nNo authentication required - transaction_id acts as the lookup key.\n\nSecurity: transaction_id is treated as an unguessable identifier (UUID).\nRate limited to 10 requests per 60 seconds per client IP to reduce abuse.\nFor production, consider short-lived tokens or email verification (see Linear DYN-37).","operationId":"get_session_by_transaction_api_v1_billing_sessions_by_transaction__transaction_id__get","parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCostBreakdownResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/reconciliation/orphaned-transactions":{"get":{"tags":["billing"],"summary":"Get Orphaned Transactions","description":"List Firebase active transactions older than X hours (DYN-73).\nAdmin-only. Use for manual cleanup of orphaned/stuck transactions.","operationId":"get_orphaned_transactions_api_v1_billing_reconciliation_orphaned_transactions_get","parameters":[{"name":"older_than_hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"description":"Return active transactions older than this many hours","default":24,"title":"Older Than Hours"},"description":"Return active transactions older than this many hours"},{"name":"exclude_completed_in_supabase","in":"query","required":false,"schema":{"type":"boolean","description":"Exclude transactions that have a completed session in Supabase","default":true,"title":"Exclude Completed In Supabase"},"description":"Exclude transactions that have a completed session in Supabase"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrphanedTransactionResponse"},"title":"Response Get Orphaned Transactions Api V1 Billing Reconciliation Orphaned Transactions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/tariffs":{"get":{"tags":["billing"],"summary":"Get Tariffs","operationId":"get_tariffs_api_v1_billing_tariffs_get","parameters":[{"name":"station_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by station ID","title":"Station Id"},"description":"Filter by station ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TariffResponse"},"title":"Response Get Tariffs Api V1 Billing Tariffs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["billing"],"summary":"Create Tariff","operationId":"create_tariff_api_v1_billing_tariffs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTariffRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TariffResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/organizations":{"post":{"tags":["billing"],"summary":"Create Organization","operationId":"create_organization_api_v1_billing_organizations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__billing_api__CreateOrganizationRequest"}}},"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/billing/organizations/{org_id}/invite":{"post":{"tags":["billing"],"summary":"Invite User To Organization","operationId":"invite_user_to_organization_api_v1_billing_organizations__org_id__invite_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteUserRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/organizations/{org_id}/users":{"get":{"tags":["billing"],"summary":"Get Organization Users","operationId":"get_organization_users_api_v1_billing_organizations__org_id__users_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/health":{"get":{"tags":["billing"],"summary":"Billing Health Check","operationId":"billing_health_check_api_v1_billing_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/billing/metrics":{"get":{"tags":["billing"],"summary":"Get Billing Metrics","description":"Get billing system metrics (admin only)","operationId":"get_billing_metrics_api_v1_billing_metrics_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start date filter","title":"Start Date"},"description":"Start date filter"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"End date filter","title":"End Date"},"description":"End date filter"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/sessions":{"get":{"tags":["billing"],"summary":"List Sessions","description":"List charging sessions with filters (admin sees all, users see own)","operationId":"list_sessions_api_v1_billing_sessions_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (active, completed)","title":"Status"},"description":"Filter by status (active, completed)"},{"name":"station_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by station ID","title":"Station Id"},"description":"Filter by station ID"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start date filter","title":"Start Date"},"description":"Start date filter"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"End date filter","title":"End Date"},"description":"End date filter"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum results","default":100,"title":"Limit"},"description":"Maximum results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Result offset for pagination","default":0,"title":"Offset"},"description":"Result offset for pagination"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionResponse"},"title":"Response List Sessions Api V1 Billing Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/sessions/{session_id}":{"get":{"tags":["billing"],"summary":"Get Session Details","description":"Get detailed information about a specific charging session","operationId":"get_session_details_api_v1_billing_sessions__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/v1/billing/tariffs/{tariff_id}":{"put":{"tags":["billing"],"summary":"Update Tariff","description":"Update an existing tariff (admin only)","operationId":"update_tariff_api_v1_billing_tariffs__tariff_id__put","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTariffRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TariffResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["billing"],"summary":"Delete Tariff","description":"Delete a tariff (admin only) - soft delete by deactivating","operationId":"delete_tariff_api_v1_billing_tariffs__tariff_id__delete","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/sessions/{session_id}/breakdown":{"get":{"tags":["billing"],"summary":"Get Session Cost Breakdown","description":"Get detailed cost breakdown for a session","operationId":"get_session_cost_breakdown_api_v1_billing_sessions__session_id__breakdown_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/v1/billing/sessions/{session_id}/exemptions":{"post":{"tags":["billing"],"summary":"Request Session Exemption","description":"Request an exemption for a charging session","operationId":"request_session_exemption_api_v1_billing_sessions__session_id__exemptions_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"reason","in":"query","required":true,"schema":{"type":"string","description":"Reason for exemption","title":"Reason"},"description":"Reason for exemption"},{"name":"approver_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Approver user ID","title":"Approver Id"},"description":"Approver user ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/exemptions/pending":{"get":{"tags":["exemptions"],"summary":"List Pending Exemptions","description":"List pending exemption requests (for approvers)","operationId":"list_pending_exemptions_api_v1_billing_exemptions_pending_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExemptionResponse"},"title":"Response List Pending Exemptions Api V1 Billing Exemptions Pending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/exemptions/{exemption_id}/approve":{"post":{"tags":["exemptions"],"summary":"Approve Exemption","description":"Approve an exemption request","operationId":"approve_exemption_api_v1_billing_exemptions__exemption_id__approve_post","parameters":[{"name":"exemption_id","in":"path","required":true,"schema":{"type":"string","title":"Exemption Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ApproveExemptionRequest"},{"type":"null"}],"title":"Approve Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExemptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/exemptions/{exemption_id}/reject":{"post":{"tags":["exemptions"],"summary":"Reject Exemption","description":"Reject an exemption request","operationId":"reject_exemption_api_v1_billing_exemptions__exemption_id__reject_post","parameters":[{"name":"exemption_id","in":"path","required":true,"schema":{"type":"string","title":"Exemption Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectExemptionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExemptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/reports/revenue-by-user-type":{"get":{"tags":["billing-reports"],"summary":"Get Revenue By User Type","description":"Get revenue breakdown by user type (US-023).\nShows sessions count, energy, costs, and revenue per user type.","operationId":"get_revenue_by_user_type_api_v1_billing_reports_revenue_by_user_type_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period start date","title":"Start Date"},"description":"Period start date"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period end date","title":"End Date"},"description":"Period end date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueByUserTypeReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/reports/cost-allocation":{"get":{"tags":["billing-reports"],"summary":"Get Cost Allocation","description":"Get cost allocation report for accounting (US-024).\nShows base cost, markup revenue, discounts, and net revenue.","operationId":"get_cost_allocation_api_v1_billing_reports_cost_allocation_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period start date","title":"Start Date"},"description":"Period start date"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period end date","title":"End Date"},"description":"Period end date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostAllocationReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/reports/rule-effectiveness":{"get":{"tags":["billing-reports"],"summary":"Get Rule Effectiveness","description":"Get rule effectiveness analytics.\nShows which billing rules are being applied most and their impact.","operationId":"get_rule_effectiveness_api_v1_billing_reports_rule_effectiveness_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period start date","title":"Start Date"},"description":"Period start date"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period end date","title":"End Date"},"description":"Period end date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEffectivenessReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/invoices/{bill_id}/mark-paid":{"patch":{"tags":["billing"],"summary":"Mark Invoice Paid","description":"Mark an invoice as paid. Only valid from 'sent' or 'overdue' status.","operationId":"mark_invoice_paid_api_v1_billing_invoices__bill_id__mark_paid_patch","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"string","title":"Bill Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkPaidRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/organizations/{org_id}/invoices":{"get":{"tags":["billing"],"summary":"List Organization Invoices","description":"List invoices (bills) for an organization. User must have access to the org.","operationId":"list_organization_invoices_api_v1_billing_organizations__org_id__invoices_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Period start (ISO date)","title":"Period Start"},"description":"Period start (ISO date)"},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Period end (ISO date)","title":"Period End"},"description":"Period end (ISO date)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/organizations/{org_id}/exceptions":{"get":{"tags":["billing"],"summary":"Get Billing Exceptions","description":"Returns billing exceptions for an org: failed sessions, orphaned transactions.","operationId":"get_billing_exceptions_api_v1_billing_organizations__org_id__exceptions_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"period_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Period start (ISO date)","title":"Period Start"},"description":"Period start (ISO date)"},{"name":"period_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Period end (ISO date)","title":"Period End"},"description":"Period end (ISO date)"},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/invoices/{bill_id}/download":{"get":{"tags":["billing"],"summary":"Download Invoice","description":"Download invoice PDF. User must have access to the bill's organization.","operationId":"download_invoice_api_v1_billing_invoices__bill_id__download_get","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"string","title":"Bill Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/rules":{"post":{"tags":["billing-rules"],"summary":"Create a new billing rule","description":"Create a new billing rule that automatically applies pricing actions based on conditions.\n    \n    ## How Billing Rules Work\n    \n    Billing rules use a **condition-action** pattern:\n    1. **Condition**: Evaluates session/user/organization data (e.g., user type, energy consumed, time of day)\n    2. **Action**: Applies pricing changes when condition is met (e.g., discount, exemption, markup override)\n    \n    ## Rule Priority\n    \n    Rules are evaluated by priority (lower number = higher priority). When multiple rules match:\n    - **Discounts**: Highest discount is applied (discount stacking: highest only)\n    - **Exemptions**: Any exemption rule makes the session free\n    - **Overrides**: Higher priority overrides take precedence\n    \n    ## Condition Types\n    \n    - **user_type**: Match user billing classification (guest, member, staff, etc.)\n    - **energy_threshold**: Match energy consumed (e.g., > 50 kWh)\n    - **time_of_day**: Match time range (e.g., 21:00-06:00 for off-peak)\n    - **session_duration**: Match session length (e.g., > 60 minutes)\n    - **monthly_energy**: Match monthly energy consumption\n    - **date_range**: Match date range (e.g., promotional period)\n    - **metadata_field**: Match custom user/session metadata\n    \n    ## Action Types\n    \n    - **discount_percentage**: Apply percentage discount (e.g., 10%)\n    - **discount_fixed**: Apply fixed amount discount (e.g., £5.00)\n    - **exemption**: Make session free\n    - **markup_override**: Override markup percentage\n    - **retail_price_override**: Override retail price per kWh\n    - **base_cost_override**: Override base cost per kWh\n    \n    ## Organization-Specific Rules\n    \n    Set `organization_id` to create rules that only apply to specific organizations.\n    Leave `null` for global rules that apply to all organizations.\n    \n    ## Example Use Cases\n    \n    - **Member Discount**: 10% discount for users with billing type \"member\"\n    - **Off-Peak Pricing**: 30% discount for sessions between 21:00-06:00\n    - **High Energy Discount**: 15% discount for sessions over 50 kWh\n    - **Staff Exemption**: Free charging for staff members\n    \n    ## Authentication\n    \n    Requires **system_admin** role.","operationId":"create_billing_rule_api_v1_billing_rules_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBillingRuleRequest"}}}},"responses":{"201":{"description":"Billing rule created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingRuleResponse"},"example":{"id":"rule_550e8400-e29b-41d4-a716-446655440000","name":"Member 10% Discount","description":"10% discount for member users","priority":10,"is_active":true,"condition":{"condition_type":"user_type","condition_value":{"user_type":"member"}},"action":{"action_type":"discount_percentage","action_value":{"discount_percentage":10.0}},"valid_from":"2024-01-01T00:00:00Z","valid_to":"2024-12-31T23:59:59Z","created_at":"2024-01-01T00:00:00Z","updated_at":"2024-01-01T00:00:00Z"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - System admin role required"},"404":{"description":"Not Found - Resource not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"},"400":{"description":"Invalid request data"}}},"get":{"tags":["billing-rules"],"summary":"List Billing Rules","description":"List billing rules","operationId":"list_billing_rules_api_v1_billing_rules_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Is Active"},"description":"Filter by active status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BillingRuleResponse"},"title":"Response List Billing Rules Api V1 Billing Rules Get"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Resource not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}}},"/api/v1/billing/rules/{rule_id}":{"get":{"tags":["billing-rules"],"summary":"Get Billing Rule","description":"Get a billing rule by ID","operationId":"get_billing_rule_api_v1_billing_rules__rule_id__get","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingRuleResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Resource not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}},"put":{"tags":["billing-rules"],"summary":"Update Billing Rule","description":"Update a billing rule","operationId":"update_billing_rule_api_v1_billing_rules__rule_id__put","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBillingRuleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingRuleResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Resource not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}},"delete":{"tags":["billing-rules"],"summary":"Delete Billing Rule","description":"Delete a billing rule","operationId":"delete_billing_rule_api_v1_billing_rules__rule_id__delete","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Resource not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}}},"/api/v1/billing/rules/{rule_id}/test":{"post":{"tags":["billing-rules"],"summary":"Test Billing Rule","description":"Test a billing rule against a sample session","operationId":"test_billing_rule_api_v1_billing_rules__rule_id__test_post","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Test Session"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Resource not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}}},"/api/v1/billing/promotional-codes":{"post":{"tags":["promotional-codes"],"summary":"Create a promotional code","description":"Create a new promotional code for discounts on charging sessions.\n    \n    ## Promotional Code Features\n    \n    Promotional codes provide flexible discount options:\n    - **Percentage discounts**: e.g., 10% off\n    - **Fixed discounts**: e.g., £5.00 off\n    - **Usage limits**: Limit total uses or uses per user\n    - **Validity periods**: Set start and end dates\n    - **User type restrictions**: Limit to specific user types\n    - **Minimum purchase**: Require minimum purchase amount\n    - **Maximum discount**: Cap discount amount (for percentage codes)\n    \n    ## Discount Stacking\n    \n    Promotional codes stack with billing rules, but only the **highest discount** is applied.\n    If a user has both a billing rule discount (15%) and a promo code (10%), the 15% discount applies.\n    \n    ## Code Format\n    \n    - Codes are automatically converted to uppercase\n    - Must be 3-50 characters\n    - Alphanumeric characters and hyphens allowed\n    - Must be unique within the organization (or globally)\n    \n    ## Organization-Specific Codes\n    \n    Set `organization_id` to create codes that only work for specific organizations.\n    Leave `null` for global codes that work across all organizations.\n    \n    ## Usage Limits\n    \n    - **Total limit**: Set `usage_limit` to cap total uses (e.g., 100 uses)\n    - **Unlimited**: Set `usage_limit` to `null` for unlimited uses\n    - **Per-user limit**: Currently one use per user (future enhancement)\n    \n    ## Validation Rules\n    \n    - Code must be unique\n    - Discount value must be positive\n    - For percentage: 0 < value <= 100\n    - For fixed: value > 0\n    - `valid_to` must be after `valid_from` (if both provided)\n    - `max_discount_amount` only applies to percentage discounts\n    \n    ## Authentication\n    \n    Requires **system_admin** role.","operationId":"create_promotional_code_api_v1_billing_promotional_codes_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePromotionalCodeRequest"}}}},"responses":{"201":{"description":"Promotional code created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromotionalCodeResponse"},"example":{"id":"code_550e8400-e29b-41d4-a716-446655440000","code":"SUMMER2024","discount_type":"percentage","discount_value":10.0,"valid_from":"2024-06-01T00:00:00Z","valid_to":"2024-08-31T23:59:59Z","usage_limit":100,"times_used":0,"applicable_user_types":["guest","member"],"min_purchase_amount":20.0,"max_discount_amount":50.0,"description":"Summer 2024 promotion - 10% off","is_active":true,"created_at":"2024-06-01T00:00:00Z","updated_at":"2024-06-01T00:00:00Z"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden - System admin role required"},"404":{"description":"Not Found - Promotional code not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"},"400":{"description":"Invalid request data or code already exists"}}},"get":{"tags":["promotional-codes"],"summary":"List Promotional Codes","description":"List promotional codes","operationId":"list_promotional_codes_api_v1_billing_promotional_codes_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Is Active"},"description":"Filter by active status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PromotionalCodeResponse"},"title":"Response List Promotional Codes Api V1 Billing Promotional Codes Get"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Promotional code not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}}},"/api/v1/billing/promotional-codes/{code_id}":{"get":{"tags":["promotional-codes"],"summary":"Get Promotional Code","description":"Get a promotional code by ID","operationId":"get_promotional_code_api_v1_billing_promotional_codes__code_id__get","parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","title":"Code Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromotionalCodeResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Promotional code not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}}},"/api/v1/billing/promotional-codes/sessions/{session_id}/apply-code":{"post":{"tags":["promotional-codes"],"summary":"Apply Code To Session","description":"Apply a promotional code to a session","operationId":"apply_code_to_session_api_v1_billing_promotional_codes_sessions__session_id__apply_code_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyCodeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyCodeResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Promotional code not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}}},"/api/v1/billing/promotional-codes/{code_id}/usage":{"get":{"tags":["promotional-codes"],"summary":"Get Code Usage Stats","description":"Get usage statistics for a promotional code","operationId":"get_code_usage_stats_api_v1_billing_promotional_codes__code_id__usage_get","parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","title":"Code Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - Insufficient permissions"},"404":{"description":"Not Found - Promotional code not found"},"422":{"description":"Validation Error - Invalid request data"},"500":{"description":"Internal Server Error"}}}},"/api/v1/tariffs/{tariff_id}/rates":{"get":{"tags":["tariffs"],"summary":"Get Tariff Rates","description":"Get variable rates for a tariff.\n\nReturns all rates if no time range specified, or rates within the specified range.","operationId":"get_tariff_rates_api_v1_tariffs__tariff_id__rates_get","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter rates starting from this time","title":"Start"},"description":"Filter rates starting from this time"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter rates ending before this time","title":"End"},"description":"Filter rates ending before this time"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"description":"Maximum number of rates to return","default":100,"title":"Limit"},"description":"Maximum number of rates to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VariableRateResponse"},"title":"Response Get Tariff Rates Api V1 Tariffs  Tariff Id  Rates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tariffs"],"summary":"Upload Tariff Rates","description":"Upload rates manually for a tariff.\n\nUse this for manual rate entry or bulk importing rates.","operationId":"upload_tariff_rates_api_v1_tariffs__tariff_id__rates_post","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRateUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Tariff Rates Api V1 Tariffs  Tariff Id  Rates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tariffs"],"summary":"Delete Tariff Rates","description":"Delete variable rates for a tariff.\n\nIf 'before' is specified, only deletes rates that ended before that time.\nOtherwise deletes all rates for the tariff.","operationId":"delete_tariff_rates_api_v1_tariffs__tariff_id__rates_delete","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Delete rates with valid_to before this time","title":"Before"},"description":"Delete rates with valid_to before this time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tariffs/{tariff_id}/fetch-rates":{"post":{"tags":["tariffs"],"summary":"Trigger Rate Fetch","description":"Manually trigger rate fetch for a tariff.\n\nFetches rates from the configured source (SFTP, API, etc.).","operationId":"trigger_rate_fetch_api_v1_tariffs__tariff_id__fetch_rates_post","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchRatesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tariffs/{tariff_id}/rate-source":{"put":{"tags":["tariffs"],"summary":"Update Rate Source","description":"Configure the rate source for a tariff.\n\nSets up the tariff to use variable rates from SFTP, API, or static source.","operationId":"update_rate_source_api_v1_tariffs__tariff_id__rate_source_put","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTariffRateSourceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tariffs"],"summary":"Get Rate Source","description":"Get the rate source configuration for a tariff.","operationId":"get_rate_source_api_v1_tariffs__tariff_id__rate_source_get","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tariffs/fetch-all-rates":{"post":{"tags":["tariffs"],"summary":"Fetch All Rates","description":"Trigger rate fetch for all variable-rate tariffs.\n\nThis is the same as the daily scheduled task but triggered manually.","operationId":"fetch_all_rates_api_v1_tariffs_fetch_all_rates_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateFetchAllResponse"}}}}}}},"/api/v1/tariffs/cleanup-rates":{"post":{"tags":["tariffs"],"summary":"Cleanup Old Rates","description":"Clean up old variable rates from the database.\n\nDeletes rates that ended more than 'days_to_keep' ago.","operationId":"cleanup_old_rates_api_v1_tariffs_cleanup_rates_post","parameters":[{"name":"days_to_keep","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Number of days to retain","default":30,"title":"Days To Keep"},"description":"Number of days to retain"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tariffs/{tariff_id}/preview-rates":{"post":{"tags":["tariffs"],"summary":"Preview Rate Fetch","description":"Preview rate fetch without storing.\n\nUse this to test SFTP/API configurations before committing.\nNote: This does not store the rates, only previews them.","operationId":"preview_rate_fetch_api_v1_tariffs__tariff_id__preview_rates_post","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"description":"Number of sample rates to preview","default":10,"title":"Limit"},"description":"Number of sample rates to preview"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tariffs/{tariff_id}/schedule":{"put":{"tags":["Scheduled Tariffs"],"summary":"Create Or Update Tariff Schedule","description":"Create or replace tariff schedule.\nAccepts array of schedule entries for different days/times.","operationId":"create_or_update_tariff_schedule_api_v1_tariffs__tariff_id__schedule_put","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TariffScheduleCreate"},"title":"Schedules"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Scheduled Tariffs"],"summary":"Get Tariff Schedule","description":"Get current schedule for a tariff.","operationId":"get_tariff_schedule_api_v1_tariffs__tariff_id__schedule_get","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Scheduled Tariffs"],"summary":"Delete Tariff Schedule","description":"Delete all schedules for a tariff. Falls back to default rate.","operationId":"delete_tariff_schedule_api_v1_tariffs__tariff_id__schedule_delete","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"string","title":"Tariff Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tariffs/chargers/{charge_point_id}/current-rate":{"get":{"tags":["Scheduled Tariffs"],"summary":"Get Current Rate For Charger","description":"Get the rate that would apply if a session started now.\nUseful for displaying current pricing to drivers.","operationId":"get_current_rate_for_charger_api_v1_tariffs_chargers__charge_point_id__current_rate_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/user-types":{"post":{"tags":["user-types"],"summary":"Create User Type","description":"Create a new user type classification","operationId":"create_user_type_api_v1_billing_user_types_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserTypeRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["user-types"],"summary":"List User Types","description":"List user types","operationId":"list_user_types_api_v1_billing_user_types_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"include_system","in":"query","required":false,"schema":{"type":"boolean","description":"Include system-wide user types","default":true,"title":"Include System"},"description":"Include system-wide user types"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserTypeResponse"},"title":"Response List User Types Api V1 Billing User Types Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/user-types/{type_id}":{"get":{"tags":["user-types"],"summary":"Get User Type","description":"Get a user type by ID","operationId":"get_user_type_api_v1_billing_user_types__type_id__get","parameters":[{"name":"type_id","in":"path","required":true,"schema":{"type":"string","title":"Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["user-types"],"summary":"Update User Type","description":"Update a user type","operationId":"update_user_type_api_v1_billing_user_types__type_id__put","parameters":[{"name":"type_id","in":"path","required":true,"schema":{"type":"string","title":"Type Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserTypeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["user-types"],"summary":"Delete User Type","description":"Delete a user type","operationId":"delete_user_type_api_v1_billing_user_types__type_id__delete","parameters":[{"name":"type_id","in":"path","required":true,"schema":{"type":"string","title":"Type Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/user-types/users/{user_id}/user-type":{"put":{"tags":["user-types"],"summary":"Assign User Type","description":"Assign a user type to a user","operationId":"assign_user_type_api_v1_billing_user_types_users__user_id__user_type_put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignUserTypeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["user-types"],"summary":"Get User User Type","description":"Get the user type for a specific user","operationId":"get_user_user_type_api_v1_billing_user_types_users__user_id__user_type_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/exemptions/sessions/{session_id}/exemptions":{"post":{"tags":["exemptions"],"summary":"Request Exemption","description":"Request an exemption for a charging session","operationId":"request_exemption_api_v1_billing_exemptions_sessions__session_id__exemptions_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestExemptionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExemptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["exemptions"],"summary":"Get Session Exemptions","description":"Get all exemption requests for a session","operationId":"get_session_exemptions_api_v1_billing_exemptions_sessions__session_id__exemptions_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExemptionResponse"},"title":"Response Get Session Exemptions Api V1 Billing Exemptions Sessions  Session Id  Exemptions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/exemptions/{exemption_id}":{"get":{"tags":["exemptions"],"summary":"Get Exemption","description":"Get an exemption request by ID","operationId":"get_exemption_api_v1_billing_exemptions__exemption_id__get","parameters":[{"name":"exemption_id","in":"path","required":true,"schema":{"type":"string","title":"Exemption Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExemptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feature-flags":{"post":{"tags":["feature-flags"],"summary":"Create Feature Flag","description":"Create a new feature flag","operationId":"create_feature_flag_api_v1_feature_flags_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureFlagRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["feature-flags"],"summary":"List Feature Flags","description":"List feature flags","operationId":"list_feature_flags_api_v1_feature_flags_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"include_global","in":"query","required":false,"schema":{"type":"boolean","description":"Include global flags","default":true,"title":"Include Global"},"description":"Include global flags"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeatureFlagResponse"},"title":"Response List Feature Flags Api V1 Feature Flags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feature-flags/status":{"get":{"tags":["feature-flags"],"summary":"Get Feature Flag Status","description":"Get the enabled/disabled status of all feature flags","operationId":"get_feature_flag_status_api_v1_feature_flags_status_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Organization ID for org-specific flags","title":"Organization Id"},"description":"Organization ID for org-specific flags"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlagStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feature-flags/{flag_name}/status":{"get":{"tags":["feature-flags"],"summary":"Check Feature Flag","description":"Check if a specific feature flag is enabled","operationId":"check_feature_flag_api_v1_feature_flags__flag_name__status_get","parameters":[{"name":"flag_name","in":"path","required":true,"schema":{"type":"string","title":"Flag Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Organization ID for org-specific check","title":"Organization Id"},"description":"Organization ID for org-specific check"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feature-flags/{flag_id}":{"get":{"tags":["feature-flags"],"summary":"Get Feature Flag","description":"Get a feature flag by ID","operationId":"get_feature_flag_api_v1_feature_flags__flag_id__get","parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["feature-flags"],"summary":"Update Feature Flag","description":"Update a feature flag","operationId":"update_feature_flag_api_v1_feature_flags__flag_id__put","parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeatureFlagRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["feature-flags"],"summary":"Delete Feature Flag","description":"Delete a feature flag","operationId":"delete_feature_flag_api_v1_feature_flags__flag_id__delete","parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feature-flags/{flag_name}/enable":{"post":{"tags":["feature-flags"],"summary":"Enable Feature Flag","description":"Enable a feature flag","operationId":"enable_feature_flag_api_v1_feature_flags__flag_name__enable_post","parameters":[{"name":"flag_name","in":"path","required":true,"schema":{"type":"string","title":"Flag Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Organization ID for org-specific flag","title":"Organization Id"},"description":"Organization ID for org-specific flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feature-flags/{flag_name}/disable":{"post":{"tags":["feature-flags"],"summary":"Disable Feature Flag","description":"Disable a feature flag","operationId":"disable_feature_flag_api_v1_feature_flags__flag_name__disable_post","parameters":[{"name":"flag_name","in":"path","required":true,"schema":{"type":"string","title":"Flag Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Organization ID for org-specific flag","title":"Organization Id"},"description":"Organization ID for org-specific flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feature-flags/billing/status":{"get":{"tags":["feature-flags"],"summary":"Get Billing Flags Status","description":"Get the status of all billing-related feature flags","operationId":"get_billing_flags_status_api_v1_feature_flags_billing_status_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Organization ID","title":"Organization Id"},"description":"Organization ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/monthly-energy/users/{user_id}":{"get":{"tags":["monthly-energy"],"summary":"Get User Monthly Energy","description":"Get monthly energy tracking for a specific user","operationId":"get_user_monthly_energy_api_v1_billing_monthly_energy_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by year","title":"Year"},"description":"Filter by year"},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"description":"Filter by month","title":"Month"},"description":"Filter by month"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonthlyEnergyResponse"},"title":"Response Get User Monthly Energy Api V1 Billing Monthly Energy Users  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/monthly-energy/chargers/{charge_point_id}":{"get":{"tags":["monthly-energy"],"summary":"Get Charger Monthly Energy","description":"Get monthly energy tracking for a specific charge point","operationId":"get_charger_monthly_energy_api_v1_billing_monthly_energy_chargers__charge_point_id__get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by year","title":"Year"},"description":"Filter by year"},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"description":"Filter by month","title":"Month"},"description":"Filter by month"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonthlyEnergyResponse"},"title":"Response Get Charger Monthly Energy Api V1 Billing Monthly Energy Chargers  Charge Point Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/monthly-energy/organizations/{organization_id}":{"get":{"tags":["monthly-energy"],"summary":"Get Organization Monthly Energy","description":"Get monthly energy tracking for an organization","operationId":"get_organization_monthly_energy_api_v1_billing_monthly_energy_organizations__organization_id__get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by year","title":"Year"},"description":"Filter by year"},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"description":"Filter by month","title":"Month"},"description":"Filter by month"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonthlyEnergyResponse"},"title":"Response Get Organization Monthly Energy Api V1 Billing Monthly Energy Organizations  Organization Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/monthly-energy/users/{user_id}/current":{"get":{"tags":["monthly-energy"],"summary":"Get User Current Month Energy","description":"Get current month's energy tracking for a user","operationId":"get_user_current_month_energy_api_v1_billing_monthly_energy_users__user_id__current_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthlyEnergyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/monthly-energy/users/{user_id}/allowance":{"get":{"tags":["monthly-energy"],"summary":"Get User Monthly Allowance Status","description":"Get user's monthly allowance status (for free kWh features like US-020)","operationId":"get_user_monthly_allowance_status_api_v1_billing_monthly_energy_users__user_id__allowance_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"allowance_kwh","in":"query","required":false,"schema":{"type":"number","description":"Monthly allowance in kWh","default":100.0,"title":"Allowance Kwh"},"description":"Monthly allowance in kWh"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthlyAllowanceStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/monthly-energy/summary":{"get":{"tags":["monthly-energy"],"summary":"Get Monthly Energy Summary","description":"Get monthly energy summary by dimension","operationId":"get_monthly_energy_summary_api_v1_billing_monthly_energy_summary_get","parameters":[{"name":"dimension","in":"query","required":false,"schema":{"type":"string","description":"Dimension: user, charger, or organization","default":"organization","title":"Dimension"},"description":"Dimension: user, charger, or organization"},{"name":"year","in":"query","required":true,"schema":{"type":"integer","description":"Year","title":"Year"},"description":"Year"},{"name":"month","in":"query","required":true,"schema":{"type":"integer","maximum":12,"minimum":1,"description":"Month","title":"Month"},"description":"Month"},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonthlyEnergySummary"},"title":"Response Get Monthly Energy Summary Api V1 Billing Monthly Energy Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/monthly-energy/chargers/{charge_point_id}/owner-view":{"get":{"tags":["monthly-energy"],"summary":"Get Charger Owner Monthly View","description":"Get monthly energy view for a charger owner.\nShows energy consumption for the charger and helps owners understand usage.","operationId":"get_charger_owner_monthly_view_api_v1_billing_monthly_energy_chargers__charge_point_id__owner_view_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by year","title":"Year"},"description":"Filter by year"},{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"description":"Number of months to show","default":12,"title":"Months"},"description":"Number of months to show"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/reports/export/sessions":{"get":{"tags":["billing-reports"],"summary":"Export Sessions","description":"Export session data for accounting systems.\nSupports JSON and CSV formats.","operationId":"export_sessions_api_v1_billing_reports_export_sessions_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period start date","title":"Start Date"},"description":"Period start date"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period end date","title":"End Date"},"description":"Period end date"},{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"Export format: json or csv","default":"json","title":"Format"},"description":"Export format: json or csv"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/reports/promotional-codes-usage":{"get":{"tags":["billing-reports"],"summary":"Get Promotional Codes Usage","description":"Get promotional code usage analytics.\nShows which codes are being used and their total discount impact.","operationId":"get_promotional_codes_usage_api_v1_billing_reports_promotional_codes_usage_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by organization ID","title":"Organization Id"},"description":"Filter by organization ID"},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period start date","title":"Start Date"},"description":"Period start date"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Period end date","title":"End Date"},"description":"Period end date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/commands/bulk":{"post":{"tags":["cpo-operations"],"summary":"Send Bulk Command","description":"Send a command to multiple charge points (explicit list or by site_id).\nMax 100 chargers per request. All must belong to your organisation.\nIndividual failures do not abort the batch.","operationId":"send_bulk_command_api_v1_cpo_commands_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPOBulkCommandRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCommandResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/commands/{charge_point_id}":{"post":{"tags":["cpo-operations"],"summary":"Send Command","description":"Send a normalised command to a charge point.\nRequires org_admin or system_admin. Charge point must belong to your organisation\nand be currently connected.","operationId":"send_command_api_v1_cpo_commands__charge_point_id__post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPOCommandRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/commands/{charge_point_id}/history":{"get":{"tags":["cpo-operations"],"summary":"Get Charge Point Command History","description":"Get command audit log for a charge point.\nRequires authentication. Charge point must belong to your organisation.","operationId":"get_charge_point_command_history_api_v1_cpo_commands__charge_point_id__history_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/commands/history":{"get":{"tags":["cpo-operations"],"summary":"Get Org Command History","description":"Get command history for the organisation.\nRequires authentication. Results are scoped to your organisation.","operationId":"get_org_command_history_api_v1_cpo_commands_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"charge_point_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by charge point","title":"Charge Point Id"},"description":"Filter by charge point"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgCommandHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/fleet/firmware":{"get":{"tags":["firmware-management"],"summary":"Get Fleet Firmware","description":"GET /api/v1/cpo/fleet/firmware — Version inventory.","operationId":"get_fleet_firmware_api_v1_cpo_fleet_firmware_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetFirmwareResponse"}}}}}}},"/api/v1/cpo/firmware/rollout":{"post":{"tags":["firmware-management"],"summary":"Create Rollout","description":"POST /api/v1/cpo/firmware/rollout — Create staged rollout.","operationId":"create_rollout_api_v1_cpo_firmware_rollout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRolloutRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRolloutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/firmware/rollout/{rollout_id}":{"get":{"tags":["firmware-management"],"summary":"Get Rollout","description":"GET /api/v1/cpo/firmware/rollout/{id} — Rollout detail with progress.","operationId":"get_rollout_api_v1_cpo_firmware_rollout__rollout_id__get","parameters":[{"name":"rollout_id","in":"path","required":true,"schema":{"type":"string","title":"Rollout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/firmware/rollout/{rollout_id}/execute-stage":{"post":{"tags":["firmware-management"],"summary":"Execute Rollout Stage","description":"POST /api/v1/cpo/firmware/rollout/{id}/execute-stage — Send UpdateFirmware to chargers in stage.","operationId":"execute_rollout_stage_api_v1_cpo_firmware_rollout__rollout_id__execute_stage_post","parameters":[{"name":"rollout_id","in":"path","required":true,"schema":{"type":"string","title":"Rollout Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteStageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/firmware/rollout/{rollout_id}/pause":{"post":{"tags":["firmware-management"],"summary":"Pause Rollout","description":"POST /api/v1/cpo/firmware/rollout/{id}/pause — Pause rollout.","operationId":"pause_rollout_api_v1_cpo_firmware_rollout__rollout_id__pause_post","parameters":[{"name":"rollout_id","in":"path","required":true,"schema":{"type":"string","title":"Rollout Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chargepoints":{"post":{"tags":["chargepoints"],"summary":"Create Charger","description":"Create a charge point with optional coordinates. Org-scoped via site_id.","operationId":"create_charger_api_v1_chargepoints_post","parameters":[{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/csms__presentation__api__charger_geolocation_api__ChargePointCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chargepoints/{charge_point_id}":{"patch":{"tags":["chargepoints"],"summary":"Update Charger","description":"Update charger coordinates.","operationId":"update_charger_api_v1_chargepoints__charge_point_id__patch","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargePointUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chargepoints/search":{"get":{"tags":["chargepoints"],"summary":"Search Chargers By Proximity","description":"Search chargers within radius. Requires both lat and lng.","operationId":"search_chargers_by_proximity_api_v1_chargepoints_search_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude","title":"Lng"},"description":"Longitude"},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":50.0,"minimum":0.001,"description":"Search radius in km (max 50)","default":5.0,"title":"Radius Km"},"description":"Search radius in km (max 50)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Search Chargers By Proximity Api V1 Chargepoints Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/chargers":{"get":{"tags":["Public Chargers"],"summary":"Search public chargers","description":"Search chargers within radius (lat, lng). Optional filters: connector_type, available_only, min_power_kw.","operationId":"search_chargers_api_v1_public_chargers_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude","title":"Lng"},"description":"Longitude"},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":50,"minimum":0.1,"description":"Radius in km (max 50)","default":10.0,"title":"Radius Km"},"description":"Radius in km (max 50)"},{"name":"connector_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector type (e.g. CCS, Type 2)","title":"Connector Type"},"description":"Filter by connector type (e.g. CCS, Type 2)"},{"name":"available_only","in":"query","required":false,"schema":{"type":"boolean","description":"Exclude occupied/offline","default":false,"title":"Available Only"},"description":"Exclude occupied/offline"},{"name":"min_power_kw","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Minimum power kW","title":"Min Power Kw"},"description":"Minimum power kW"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargerSearchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/chargers/{charge_point_id}":{"get":{"tags":["Public Chargers"],"summary":"Get charger detail","description":"Full detail for one charge point: EVSEs, connectors, status, pricing.","operationId":"get_charger_detail_api_v1_public_chargers__charge_point_id__get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/org/api-keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","operationId":"list_api_keys_api_v1_org_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-keys"],"summary":"Create Api Key","operationId":"create_api_key_api_v1_org_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"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/org/api-keys/{key_id}":{"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","operationId":"revoke_api_key_api_v1_org_api_keys__key_id__delete","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/v1/sessions/guest/authorize":{"post":{"tags":["guest-sessions"],"summary":"Authorize Guest Session","operationId":"authorize_guest_session_api_v1_sessions_guest_authorize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuestAuthorizeRequest"}}},"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/sessions/guest/{session_token}/status":{"get":{"tags":["guest-sessions"],"summary":"Get Guest Session Status","operationId":"get_guest_session_status_api_v1_sessions_guest__session_token__status_get","parameters":[{"name":"session_token","in":"path","required":true,"schema":{"type":"string","title":"Session Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/guest/{session_token}/stop":{"post":{"tags":["guest-sessions"],"summary":"Stop Guest Session","operationId":"stop_guest_session_api_v1_sessions_guest__session_token__stop_post","parameters":[{"name":"session_token","in":"path","required":true,"schema":{"type":"string","title":"Session Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/guest/{session_token}/receipt":{"get":{"tags":["guest-sessions"],"summary":"Get Guest Session Receipt","operationId":"get_guest_session_receipt_api_v1_sessions_guest__session_token__receipt_get","parameters":[{"name":"session_token","in":"path","required":true,"schema":{"type":"string","title":"Session Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reservations":{"post":{"tags":["reservations"],"summary":"Create Reservation","description":"Create a reservation. Returns 201 with reservation, 409 on conflict, 404 if charge point not found or wrong org.","operationId":"create_reservation_api_v1_reservations_post","parameters":[{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReservationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Reservation Api V1 Reservations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["reservations"],"summary":"List Reservations","description":"List active (non-expired, non-cancelled) reservations for the authenticated org. Optional filter by charge_point_id.","operationId":"list_reservations_api_v1_reservations_get","parameters":[{"name":"charge_point_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Point Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Reservations Api V1 Reservations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reservations/{reservation_id}":{"delete":{"tags":["reservations"],"summary":"Cancel Reservation","description":"Cancel a reservation. Returns 200 on success, 404 if not found or wrong org.","operationId":"cancel_reservation_api_v1_reservations__reservation_id__delete","parameters":[{"name":"reservation_id","in":"path","required":true,"schema":{"type":"string","title":"Reservation Id"}},{"name":"request","in":"query","required":true,"schema":{"title":"Request"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/fleet/summary":{"get":{"tags":["fleet-dashboard"],"summary":"Get Fleet Summary","description":"Fleet summary: total chargers, online/offline/faulted counts, availability, active sessions.\nOptional site_id filter. Returns 200 with zero-value fields for empty fleet (not 404).","operationId":"get_fleet_summary_api_v1_cpo_fleet_summary_get","parameters":[{"name":"site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by project/site ID","title":"Site Id"},"description":"Filter by project/site ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/fleet/uptime":{"get":{"tags":["fleet-dashboard"],"summary":"Get Fleet Uptime","description":"Fleet uptime for period: per-charger and per-site uptime, fleet weighted average, longest_outage_hours.","operationId":"get_fleet_uptime_api_v1_cpo_fleet_uptime_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"day | week | month","default":"month","title":"Period"},"description":"day | week | month"},{"name":"site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetUptimeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/fleet/utilisation":{"get":{"tags":["fleet-dashboard"],"summary":"Get Fleet Utilisation","description":"Fleet utilisation: charging hours / available hours (capped 100%). Per-charger and per-site; zero sessions → 0%.","operationId":"get_fleet_utilisation_api_v1_cpo_fleet_utilisation_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"day | week | month","default":"month","title":"Period"},"description":"day | week | month"},{"name":"site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetUtilisationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/fleet/errors":{"get":{"tags":["fleet-dashboard"],"summary":"Get Fleet Errors","description":"Error trends: normalised across OCPP versions, original_codes breakout, by_site. Empty errors array for zero events.","operationId":"get_fleet_errors_api_v1_cpo_fleet_errors_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"day | week | month","default":"month","title":"Period"},"description":"day | week | month"},{"name":"site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: critical | warning | info","title":"Severity"},"description":"Filter: critical | warning | info"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max errors to return","default":20,"title":"Limit"},"description":"Max errors to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetErrorsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/fleet/chargers":{"get":{"tags":["fleet-dashboard"],"summary":"Get Fleet Chargers","description":"Paginated charger list; filter by status/site. Offline chargers include offline_since and offline_duration_hours. Sort: last_heartbeat ascending.","operationId":"get_fleet_chargers_api_v1_cpo_fleet_chargers_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: online | offline | faulted","title":"Status"},"description":"Filter: online | offline | faulted"},{"name":"site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetChargersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/chargers/{charge_point_id}/diagnostics":{"get":{"tags":["charger-diagnostics"],"summary":"Get Diagnostics Summary","operationId":"get_diagnostics_summary_api_v1_cpo_chargers__charge_point_id__diagnostics_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"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/v1/cpo/chargers/{charge_point_id}/connectivity":{"get":{"tags":["charger-diagnostics"],"summary":"Get Connectivity Timeline","operationId":"get_connectivity_timeline_api_v1_cpo_chargers__charge_point_id__connectivity_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"ISO-8601 start datetime","title":"Start Date"},"description":"ISO-8601 start datetime"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"ISO-8601 end datetime","title":"End Date"},"description":"ISO-8601 end datetime"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/chargers/{charge_point_id}/error-history":{"get":{"tags":["charger-diagnostics"],"summary":"Get Error History","operationId":"get_error_history_api_v1_cpo_chargers__charge_point_id__error_history_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"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/v1/cpo/chargers/{charge_point_id}/maintenance":{"get":{"tags":["charger-diagnostics"],"summary":"Get Maintenance Events","operationId":"get_maintenance_events_api_v1_cpo_chargers__charge_point_id__maintenance_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"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"}}}}}},"post":{"tags":["charger-diagnostics"],"summary":"Create Maintenance Event","operationId":"create_maintenance_event_api_v1_cpo_chargers__charge_point_id__maintenance_post","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceEventCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ocpi/versions":{"get":{"tags":["ocpi-versions"],"summary":"Get Versions","description":"List supported OCPI versions.\nAuth: TOKEN_A or TOKEN_C. Returns [{version, url}, ...].","operationId":"get_versions_ocpi_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ocpi/versions/{version}":{"get":{"tags":["ocpi-versions"],"summary":"Get Version Detail","description":"Version detail with module endpoints (identifier, role, url).\nAuth: TOKEN_A or TOKEN_C. 404 for unsupported version.","operationId":"get_version_detail_ocpi_versions__version__get","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ocpi/cpo/2.2.1/credentials":{"get":{"tags":["ocpi-credentials"],"summary":"Get Credentials","description":"Return our CPO credentials to the authenticated partner.\nAuth: TOKEN_C. Returns Credentials (token, url, roles with CPO, country_code, party_id from org).","operationId":"get_credentials_ocpi_cpo_2_2_1_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["ocpi-credentials"],"summary":"Put Credentials","description":"Update credentials: partner sends updated Credentials; we generate new TOKEN_C and update stored data.\nAuth: TOKEN_C. Returns our updated Credentials.","operationId":"put_credentials_ocpi_cpo_2_2_1_credentials_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ocpi-credentials"],"summary":"Post Credentials","description":"OCPI registration handshake: partner sends their Credentials (TOKEN_B, url, roles).\nAuth: TOKEN_A. We store TOKEN_B, generate TOKEN_C, invalidate TOKEN_A, return our Credentials.","operationId":"post_credentials_ocpi_cpo_2_2_1_credentials_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ocpi-credentials"],"summary":"Delete Credentials","description":"Unregister the partner: set status to SUSPENDED and invalidate token_b, token_c.\nAuth: TOKEN_C. Returns empty OCPI success.","operationId":"delete_credentials_ocpi_cpo_2_2_1_credentials_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ocpi/cpo/2.2.1/locations":{"get":{"tags":["ocpi-locations"],"summary":"Get Locations","description":"Paginated list of locations (published charge points) for partner's org.\nQuery: date_from (inclusive), date_to (exclusive), offset, limit.\nHeaders: X-Total-Count, X-Limit, Link (next page when applicable).","operationId":"get_locations_ocpi_cpo_2_2_1_locations_get","parameters":[{"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":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"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"}}}}}}},"/ocpi/cpo/2.2.1/locations/{location_id}":{"get":{"tags":["ocpi-locations"],"summary":"Get Location","description":"Single location by id (charge point serial_number).","operationId":"get_location_ocpi_cpo_2_2_1_locations__location_id__get","parameters":[{"name":"location_id","in":"path","required":true,"schema":{"type":"string","title":"Location Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ocpi/cpo/2.2.1/locations/{location_id}/{evse_uid}":{"get":{"tags":["ocpi-locations"],"summary":"Get Evse","description":"Single EVSE by location_id and evse_uid.","operationId":"get_evse_ocpi_cpo_2_2_1_locations__location_id___evse_uid__get","parameters":[{"name":"location_id","in":"path","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"evse_uid","in":"path","required":true,"schema":{"type":"string","title":"Evse Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ocpi/cpo/2.2.1/locations/{location_id}/{evse_uid}/{connector_id}":{"get":{"tags":["ocpi-locations"],"summary":"Get Connector","description":"Single Connector by location_id, evse_uid, connector_id.","operationId":"get_connector_ocpi_cpo_2_2_1_locations__location_id___evse_uid___connector_id__get","parameters":[{"name":"location_id","in":"path","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"evse_uid","in":"path","required":true,"schema":{"type":"string","title":"Evse Uid"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ocpi/cpo/2.2.1/sessions":{"get":{"tags":["ocpi-sessions"],"summary":"Get Sessions","description":"Paginated list of roaming sessions (sessions with an OCPI CDR) for partner's org.\nQuery: date_from (inclusive), date_to (exclusive), offset, limit.\nHeaders: X-Total-Count, X-Limit, Link (next page when applicable).","operationId":"get_sessions_ocpi_cpo_2_2_1_sessions_get","parameters":[{"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":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"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"}}}}}}},"/ocpi/cpo/2.2.1/cdrs":{"get":{"tags":["ocpi-cdrs"],"summary":"Get Cdrs","description":"Paginated list of CDRs for partner's org.\nQuery: date_from (inclusive), date_to (exclusive), offset, limit.\nHeaders: X-Total-Count, X-Limit, Link (next page when applicable).\nCDR objects include all required fields; charging_periods required; total_cost as Price (Decimal).","operationId":"get_cdrs_ocpi_cpo_2_2_1_cdrs_get","parameters":[{"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":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"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"}}}}}}},"/ocpi/cpo/2.2.1/tariffs":{"get":{"tags":["ocpi-tariffs"],"summary":"Get Tariffs","description":"Paginated list of tariffs for partner's org.\nQuery: date_from, date_to (validity overlap), offset, limit.\nHeaders: X-Total-Count, X-Limit, Link (next page when applicable).\nTariff objects include country_code, party_id, id, currency, elements, last_updated.","operationId":"get_tariffs_ocpi_cpo_2_2_1_tariffs_get","parameters":[{"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":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"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"}}}}}}},"/ocpi/cpo/2.2.1/commands/{command}":{"post":{"tags":["ocpi-commands"],"summary":"Receive Command","description":"Receive command from eMSP. Return immediate CommandResponse (ACCEPTED, REJECTED,\nNOT_SUPPORTED, UNKNOWN_SESSION). When ACCEPTED, process async and POST CommandResult\nto body.response_url with partner's TOKEN_B.","operationId":"receive_command_ocpi_cpo_2_2_1_commands__command__post","parameters":[{"name":"command","in":"path","required":true,"schema":{"type":"string","title":"Command"}}],"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"}}}}}}},"/ocpi/cpo/2.2.1/tokens/{country_code}/{party_id}/{token_uid}":{"get":{"tags":["ocpi-tokens"],"summary":"Get Token","description":"Retrieve token by country_code, party_id, token_uid.\nOptional ?type= to require token type match. OCPI auth required.","operationId":"get_token_ocpi_cpo_2_2_1_tokens__country_code___party_id___token_uid__get","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}},{"name":"party_id","in":"path","required":true,"schema":{"type":"string","title":"Party Id"}},{"name":"token_uid","in":"path","required":true,"schema":{"type":"string","title":"Token Uid"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["ocpi-tokens"],"summary":"Put Token","description":"Create or replace token (Client Owned Object). Full token object in body.\nPath country_code, party_id, token_uid identify the token.","operationId":"put_token_ocpi_cpo_2_2_1_tokens__country_code___party_id___token_uid__put","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}},{"name":"party_id","in":"path","required":true,"schema":{"type":"string","title":"Party Id"}},{"name":"token_uid","in":"path","required":true,"schema":{"type":"string","title":"Token Uid"}}],"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"}}}}}},"patch":{"tags":["ocpi-tokens"],"summary":"Patch Token","description":"Partial update: only fields present in body are updated.","operationId":"patch_token_ocpi_cpo_2_2_1_tokens__country_code___party_id___token_uid__patch","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}},{"name":"party_id","in":"path","required":true,"schema":{"type":"string","title":"Party Id"}},{"name":"token_uid","in":"path","required":true,"schema":{"type":"string","title":"Token Uid"}}],"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"}}}}}}},"/ocpi/cpo/2.2.1/tokens/{token_uid}/authorize":{"post":{"tags":["ocpi-tokens"],"summary":"Authorize Token","description":"Real-time authorization: can this driver charge here now?\nOptional body: LocationReferences (location_id, evse_uid) to check token at location.\nReturns AuthorizationInfo (allowed/blocked/expired/not_allowed).","operationId":"authorize_token_ocpi_cpo_2_2_1_tokens__token_uid__authorize_post","parameters":[{"name":"token_uid","in":"path","required":true,"schema":{"type":"string","title":"Token Uid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/signed-meter-values":{"get":{"tags":["Signed Meter Values"],"summary":"Get Signed Meter Values For Session","description":"Get all signed meter values for a session. Calibration law audit endpoint.","operationId":"get_signed_meter_values_for_session_api_v1_sessions__session_id__signed_meter_values_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/v1/chargepoints/{charge_point_id}/signed-meter-values":{"get":{"tags":["Signed Meter Values"],"summary":"Get Signed Meter Values For Charger","description":"Get recent signed meter values for a charger.","operationId":"get_signed_meter_values_for_charger_api_v1_chargepoints__charge_point_id__signed_meter_values_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"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/v1/sessions/{session_id}/signed-meter-values/export":{"get":{"tags":["Signed Meter Values"],"summary":"Export Signed Meter Values Csv","description":"Export signed meter values as CSV for audit.","operationId":"export_signed_meter_values_csv_api_v1_sessions__session_id__signed_meter_values_export_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/v1/signed-meter-values/{id}/verify":{"post":{"tags":["Signed Meter Values"],"summary":"Verify Signed Meter Value","description":"Verify signature of signed meter value.\nReturns: {id, valid: true|false|null, error: \"reason\"}\nnull = no public key available for verification","operationId":"verify_signed_meter_value_api_v1_signed_meter_values__id__verify_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/VerifyRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/payment/connect/onboard":{"post":{"tags":["Payment"],"summary":"Post Connect Onboard","description":"Create Stripe Connect Express account and return onboarding URL.","operationId":"post_connect_onboard_api_v1_cpo_payment_connect_onboard_post","parameters":[{"name":"stripe_client","in":"query","required":false,"schema":{"anyOf":[{},{"type":"null"}],"title":"Stripe Client"}},{"name":"platform_fee_percent","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Platform Fee Percent"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/payment/connect/status":{"get":{"tags":["Payment"],"summary":"Get Connect Status","description":"Get Connect account status for current org.","operationId":"get_connect_status_api_v1_cpo_payment_connect_status_get","parameters":[{"name":"stripe_client","in":"query","required":false,"schema":{"anyOf":[{},{"type":"null"}],"title":"Stripe Client"}},{"name":"platform_fee_percent","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Platform Fee Percent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cpo/payment/intents":{"get":{"tags":["Payment"],"summary":"Get Payment Intents","description":"List payment intents for current org.","operationId":"get_payment_intents_api_v1_cpo_payment_intents_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":100,"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/v1/cpo/payment/sessions/{session_id}":{"get":{"tags":["Payment"],"summary":"Get Session Payment Status","description":"Get payment status for a charging session (CPO dashboard).","operationId":"get_session_payment_status_api_v1_cpo_payment_sessions__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/v1/cpo/payment/refund":{"post":{"tags":["Payment"],"summary":"Post Refund","description":"Refund a captured payment.","operationId":"post_refund_api_v1_cpo_payment_refund_post","parameters":[{"name":"stripe_client","in":"query","required":false,"schema":{"anyOf":[{},{"type":"null"}],"title":"Stripe Client"}},{"name":"platform_fee_percent","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Platform Fee Percent"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/stripe":{"post":{"tags":["Stripe Webhooks"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events. Idempotent.","operationId":"stripe_webhook_api_v1_webhooks_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/debug/validate-charge-point/{identifier}":{"get":{"summary":"Debug Validate Charge Point","operationId":"debug_validate_charge_point_api_v1_debug_validate_charge_point__identifier__get","parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string","title":"Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin":{"get":{"summary":"Admin Dashboard","operationId":"admin_dashboard_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/quickstart":{"get":{"summary":"Quickstart","operationId":"quickstart_quickstart_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/developer":{"get":{"summary":"Developer Portal","operationId":"developer_portal_developer_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/user-management":{"get":{"summary":"Get User Management","operationId":"get_user_management_user_management_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/send_command/":{"post":{"summary":"Send Command","operationId":"send_command_api_send_command__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/get_active_transaction_id":{"get":{"summary":"Get Transaction Id","description":"Returns the active transactions on a connector. If no connector_id param is specified then connector_id=1","operationId":"get_transaction_id_api_get_active_transaction_id_get","parameters":[{"name":"charge_point_id","in":"query","required":true,"schema":{"title":"Charge Point Id"}},{"name":"connector_id","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/active_transactions":{"get":{"summary":"Get All Active Transactions","description":"Fetch all active transaction IDs across all charge points, limited to 1000 results.","operationId":"get_all_active_transactions_api_active_transactions_get","parameters":[{"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/trigger_message/":{"post":{"summary":"Trigger Message Endpoint","description":"API endpoint to trigger a message on the charge point","operationId":"trigger_message_endpoint_api_trigger_message__post","parameters":[{"name":"charge_point_id","in":"query","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"requested_message","in":"query","required":true,"schema":{"type":"string","title":"Requested Message"}},{"name":"evse_id","in":"query","required":false,"schema":{"type":"integer","title":"Evse Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/debug/config":{"post":{"summary":"Set Debug Config","description":"Set debug configuration for a specific charge point.","operationId":"set_debug_config_api_debug_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DebugConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/debug/config/{charge_point_id}":{"get":{"summary":"Get Debug Config","description":"Fetch debug configuration for a specific charge point.","operationId":"get_debug_config_api_debug_config__charge_point_id__get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/debug/config/enabled":{"get":{"summary":"Get All Debugging Charge Points","description":"Fetch all charge points with debugging enabled and their debug message types.","operationId":"get_all_debugging_charge_points_api_debug_config_enabled_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tokens":{"get":{"summary":"Get All Tokens","operationId":"get_all_tokens_api_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Token","operationId":"create_token_api_tokens_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tokens/{id_token}":{"get":{"summary":"Get Token Details","operationId":"get_token_details_api_tokens__id_token__get","parameters":[{"name":"id_token","in":"path","required":true,"schema":{"type":"string","title":"Id Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Token","operationId":"update_token_api_tokens__id_token__put","parameters":[{"name":"id_token","in":"path","required":true,"schema":{"type":"string","title":"Id Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTokenRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Token","operationId":"delete_token_api_tokens__id_token__delete","parameters":[{"name":"id_token","in":"path","required":true,"schema":{"type":"string","title":"Id Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transactions/{transaction_id}":{"get":{"summary":"Get Transaction","operationId":"get_transaction_api_transactions__transaction_id__get","parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transactions":{"get":{"summary":"Get Transactions","operationId":"get_transactions_api_transactions_get","parameters":[{"name":"charge_point_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Point Id"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tokens/{id_token}/add_charge_points":{"post":{"summary":"Add Charge Points To Token","operationId":"add_charge_points_to_token_api_tokens__id_token__add_charge_points_post","parameters":[{"name":"id_token","in":"path","required":true,"schema":{"type":"string","title":"Id Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChargePointsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tokens/remove_chargeposts":{"post":{"summary":"Remove Charge Points From Token","operationId":"remove_charge_points_from_token_api_tokens_remove_chargeposts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChargePointsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tokens/{id_token}/charge_points":{"get":{"summary":"List Charge Points For Token","operationId":"list_charge_points_for_token_api_tokens__id_token__charge_points_get","parameters":[{"name":"id_token","in":"path","required":true,"schema":{"type":"string","title":"Id Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/charge_points/{charge_point_id}/tokens":{"get":{"summary":"List Tokens For Charge Point","operationId":"list_tokens_for_charge_point_api_charge_points__charge_point_id__tokens_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/charging-profiles":{"post":{"summary":"Create Charging Profile","operationId":"create_charging_profile_api_charging_profiles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargingProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/charging-profiles/{profile_id}":{"get":{"summary":"Get Charging Profile","operationId":"get_charging_profile_api_charging_profiles__profile_id__get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"integer","title":"Profile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/charge-points/{charge_point_id}/charging-profiles":{"get":{"summary":"Get Charge Point Profiles","operationId":"get_charge_point_profiles_api_charge_points__charge_point_id__charging_profiles_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transactions/{transaction_id}/charging-profiles":{"get":{"summary":"Get Transaction Profiles","operationId":"get_transaction_profiles_api_transactions__transaction_id__charging_profiles_get","parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/charging-profiles/{profile_id}/status":{"put":{"summary":"Update Profile Status","operationId":"update_profile_status_api_charging_profiles__profile_id__status_put","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"integer","title":"Profile Id"}},{"name":"status","in":"query","required":true,"schema":{"type":"string","title":"Status"}},{"name":"charge_point_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/calculate":{"post":{"summary":"Calculate Transaction Bill","description":"Calculate and generate a bill for a completed transaction","operationId":"calculate_transaction_bill_api_v1_billing_calculate_post","parameters":[{"name":"transaction_id","in":"query","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/bills/{bill_id}":{"get":{"summary":"Get Bill","description":"Get a specific bill by ID","operationId":"get_bill_api_v1_billing_bills__bill_id__get","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"string","title":"Bill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/accounts/{account_id}/bills":{"get":{"summary":"Get Account Bills","description":"Get all bills for an account within a date range","operationId":"get_account_bills_api_v1_billing_accounts__account_id__bills_get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","title":"Start Date"}},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/bills/{bill_id}/finalize":{"post":{"summary":"Finalize Bill","description":"Finalize a bill","operationId":"finalize_bill_api_v1_billing_bills__bill_id__finalize_post","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"string","title":"Bill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/bills/{bill_id}/cancel":{"post":{"summary":"Cancel Bill","description":"Cancel a bill","operationId":"cancel_bill_api_v1_billing_bills__bill_id__cancel_post","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"string","title":"Bill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chargepoints/{charge_point_id}/config":{"get":{"summary":"Get Charge Point Config","description":"Get the current configuration of a charge point","operationId":"get_charge_point_config_api_v1_chargepoints__charge_point_id__config_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Charge Point Config","description":"Update the configuration of a charge point","operationId":"update_charge_point_config_api_v1_chargepoints__charge_point_id__config_put","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Config"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chargepoints/{charge_point_id}/tariff":{"get":{"summary":"Get Charge Point Tariff","description":"Get the current tariff configuration of a charge point","operationId":"get_charge_point_tariff_api_v1_chargepoints__charge_point_id__tariff_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Charge Point Tariff","description":"Update the tariff configuration of a charge point","operationId":"update_charge_point_tariff_api_v1_chargepoints__charge_point_id__tariff_put","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Tariff"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chargepoints/{charge_point_id}/status":{"get":{"summary":"Get Charge Point Status","description":"Get the current status of a charge point","operationId":"get_charge_point_status_api_v1_chargepoints__charge_point_id__status_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chargepoints/{charge_point_id}/connectors":{"get":{"summary":"Get Charge Point Connectors","description":"Get the status of all connectors for a charge point","operationId":"get_charge_point_connectors_api_v1_chargepoints__charge_point_id__connectors_get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chargepoints/{charge_point_id}/connectors/{connector_id}":{"get":{"summary":"Get Connector Status","description":"Get the status of a specific connector","operationId":"get_connector_status_api_v1_chargepoints__charge_point_id__connectors__connector_id__get","parameters":[{"name":"charge_point_id","in":"path","required":true,"schema":{"type":"string","title":"Charge Point Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcceptInvitationRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"full_name":{"type":"string","title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","required":["email","password","full_name"],"title":"AcceptInvitationRequest"},"ActiveSessionEstimateResponse":{"properties":{"transaction_id":{"type":"string","title":"Transaction Id"},"charge_point_id":{"type":"string","title":"Charge Point Id"},"energy_kwh":{"type":"number","title":"Energy Kwh"},"current_energy_kwh":{"type":"number","title":"Current Energy Kwh"},"duration_minutes":{"type":"number","title":"Duration Minutes"},"estimated_cost":{"type":"number","title":"Estimated Cost"},"currency":{"type":"string","title":"Currency"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"}},"type":"object","required":["transaction_id","charge_point_id","energy_kwh","current_energy_kwh","duration_minutes","estimated_cost","currency"],"title":"ActiveSessionEstimateResponse","description":"Current energy and estimated cost during active charging (DYN-77)."},"AddChargePointRequest":{"properties":{"serial_number":{"type":"string","title":"Serial Number"},"model":{"type":"string","title":"Model"},"vendor":{"type":"string","title":"Vendor"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"},"max_power":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Power"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["serial_number","model","vendor"],"title":"AddChargePointRequest"},"AdjustmentApproveRequest":{"properties":{"approve":{"type":"boolean","title":"Approve"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["approve"],"title":"AdjustmentApproveRequest"},"AdjustmentCreateRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"dispute_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispute Id"},"adjustment_type":{"type":"string","title":"Adjustment Type"},"original_amount":{"type":"number","title":"Original Amount"},"adjusted_amount":{"type":"number","title":"Adjusted Amount"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["session_id","adjustment_type","original_amount","adjusted_amount","reason"],"title":"AdjustmentCreateRequest"},"AdjustmentResponse":{"properties":{"id":{"type":"string","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"dispute_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispute Id"},"adjustment_type":{"type":"string","title":"Adjustment Type"},"original_amount":{"type":"number","title":"Original Amount"},"adjusted_amount":{"type":"number","title":"Adjusted Amount"},"reason":{"type":"string","title":"Reason"},"created_by":{"type":"string","title":"Created By"},"created_by_type":{"type":"string","title":"Created By Type"},"approved_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approved By"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"applied_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applied At"}},"type":"object","required":["id","session_id","dispute_id","adjustment_type","original_amount","adjusted_amount","reason","created_by","created_by_type","approved_by","status","created_at","applied_at"],"title":"AdjustmentResponse"},"AppearanceSettings":{"properties":{"theme":{"type":"string","title":"Theme","default":"light"},"color_scheme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color Scheme"},"font_size":{"type":"string","title":"Font Size","default":"medium"},"compact_mode":{"type":"boolean","title":"Compact Mode","default":false}},"type":"object","title":"AppearanceSettings"},"ApplyCodeRequest":{"properties":{"code":{"type":"string","maxLength":50,"minLength":3,"title":"Code","description":"Promotional code to apply","example":"SUMMER2024"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Session ID to apply code to","example":"session_12345"}},"type":"object","required":["code"],"title":"ApplyCodeRequest","description":"Request model for applying a promotional code.","example":{"code":"SUMMER2024","session_id":"session_12345"}},"ApplyCodeResponse":{"properties":{"code_id":{"type":"string","title":"Code Id","description":"Code identifier","example":"code_550e8400-e29b-41d4-a716-446655440000"},"discount_type":{"type":"string","title":"Discount Type","description":"Type of discount applied","example":"percentage"},"discount_value":{"type":"number","title":"Discount Value","description":"Discount value","example":10.0},"discount_amount":{"type":"number","title":"Discount Amount","description":"Calculated discount amount","example":5.5},"original_cost":{"type":"number","title":"Original Cost","description":"Original cost before discount","example":55.0},"final_cost":{"type":"number","title":"Final Cost","description":"Final cost after discount","example":49.5}},"type":"object","required":["code_id","discount_type","discount_value","discount_amount","original_cost","final_cost"],"title":"ApplyCodeResponse","description":"Response model for code application result.","example":{"code_id":"code_550e8400-e29b-41d4-a716-446655440000","discount_amount":5.5,"discount_type":"percentage","discount_value":10.0,"final_cost":49.5,"original_cost":55.0}},"ApplyTemplateRequest":{"properties":{"template_id":{"type":"string","title":"Template Id"},"customizations":{"additionalProperties":true,"type":"object","title":"Customizations"}},"type":"object","required":["template_id"],"title":"ApplyTemplateRequest"},"ApproveExemptionRequest":{"properties":{"exemption_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Exemption Amount"}},"type":"object","title":"ApproveExemptionRequest"},"AssignUserTypeRequest":{"properties":{"user_type_id":{"type":"string","title":"User Type Id"}},"type":"object","required":["user_type_id"],"title":"AssignUserTypeRequest"},"AuthResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"user":{"$ref":"#/components/schemas/InstallerProfileResponse"}},"type":"object","required":["access_token","refresh_token","user"],"title":"AuthResponse"},"BillingRuleActionRequest":{"properties":{"action_type":{"type":"string","pattern":"^(discount_percentage|discount_fixed|exemption|markup_override|retail_price_override|base_cost_override)$","title":"Action Type","description":"Type of action to apply","example":"discount_percentage"},"action_value":{"additionalProperties":true,"type":"object","title":"Action Value","description":"Action-specific value configuration","example":{"discount_percentage":10.0}}},"type":"object","required":["action_type"],"title":"BillingRuleActionRequest","description":"Action to apply when condition is met.","example":{"action_type":"discount_percentage","action_value":{"discount_percentage":10.0}}},"BillingRuleConditionRequest":{"properties":{"condition_type":{"type":"string","pattern":"^(user_type|metadata_field|date_range|energy_threshold|time_of_day|session_duration|monthly_energy)$","title":"Condition Type","description":"Type of condition to evaluate","example":"user_type"},"condition_value":{"additionalProperties":true,"type":"object","title":"Condition Value","description":"Condition-specific value configuration","example":{"user_type":"member"}},"condition_logic":{"type":"string","title":"Condition Logic","description":"Logic operator for multiple conditions","default":"AND","example":"AND"}},"type":"object","required":["condition_type"],"title":"BillingRuleConditionRequest","description":"Condition specification for a billing rule.","example":{"condition_logic":"AND","condition_type":"user_type","condition_value":{"user_type":"member"}}},"BillingRuleResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Unique rule identifier","example":"rule_550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","title":"Name","description":"Rule name","example":"Member 10% Discount"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Rule description","example":"10% discount for member users"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id","description":"Organization ID (null for global rules)"},"priority":{"type":"integer","title":"Priority","description":"Rule priority","example":10},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the rule is active","example":true},"condition":{"additionalProperties":true,"type":"object","title":"Condition","description":"Condition configuration","example":{"condition_type":"user_type","condition_value":{"user_type":"member"}}},"action":{"additionalProperties":true,"type":"object","title":"Action","description":"Action configuration","example":{"action_type":"discount_percentage","action_value":{"discount_percentage":10.0}}},"valid_from":{"type":"string","format":"date-time","title":"Valid From","description":"Rule validity start date","example":"2024-01-01T00:00:00Z"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To","description":"Rule validity end date","example":"2024-12-31T23:59:59Z"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp","example":"2024-01-01T00:00:00Z"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp","example":"2024-01-15T10:30:00Z"}},"type":"object","required":["id","name","priority","is_active","condition","action","valid_from"],"title":"BillingRuleResponse","description":"Response model for billing rule data.","example":{"action":{"action_type":"discount_percentage","action_value":{"discount_percentage":10.0}},"condition":{"condition_logic":"AND","condition_type":"user_type","condition_value":{"user_type":"member"}},"created_at":"2024-01-01T00:00:00Z","description":"10% discount for member users","id":"rule_550e8400-e29b-41d4-a716-446655440000","is_active":true,"name":"Member 10% Discount","priority":10,"updated_at":"2024-01-15T10:30:00Z","valid_from":"2024-01-01T00:00:00Z","valid_to":"2024-12-31T23:59:59Z"}},"BillingSummaryResponse":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"total_sessions":{"type":"integer","title":"Total Sessions"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"total_cost":{"type":"number","title":"Total Cost"},"sessions":{"items":{"$ref":"#/components/schemas/SessionResponse"},"type":"array","title":"Sessions"}},"type":"object","required":["total_sessions","total_energy_kwh","total_cost","sessions"],"title":"BillingSummaryResponse"},"Body_update_installer_profile_api_v1_installer_profile_put":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","title":"Body_update_installer_profile_api_v1_installer_profile_put"},"Body_upload_company_logo_api_v1_installer_settings_company_logo_put":{"properties":{"company_logo":{"type":"string","format":"binary","title":"Company Logo"}},"type":"object","required":["company_logo"],"title":"Body_upload_company_logo_api_v1_installer_settings_company_logo_put"},"Body_upload_profile_picture_api_v1_installer_profile_picture_put":{"properties":{"profile_picture":{"type":"string","format":"binary","title":"Profile Picture"}},"type":"object","required":["profile_picture"],"title":"Body_upload_profile_picture_api_v1_installer_profile_picture_put"},"Body_upload_profile_picture_api_v1_installer_settings_profile_picture_put":{"properties":{"profile_picture":{"type":"string","format":"binary","title":"Profile Picture"}},"type":"object","required":["profile_picture"],"title":"Body_upload_profile_picture_api_v1_installer_settings_profile_picture_put"},"Body_upload_ticket_attachment_api_v1_installer_support_tickets__ticket_id__attachments_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_ticket_attachment_api_v1_installer_support_tickets__ticket_id__attachments_post"},"Body_verify_identity_api_v1_installer_verify_identity_post":{"properties":{"document_type":{"type":"string","title":"Document Type"},"document_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Number"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"document_file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Document File"}},"type":"object","required":["document_type"],"title":"Body_verify_identity_api_v1_installer_verify_identity_post"},"BulkCommandResponse":{"properties":{"bulk_id":{"type":"string","title":"Bulk Id"},"command":{"type":"string","title":"Command"},"total_chargers":{"type":"integer","title":"Total Chargers"},"results":{"items":{"$ref":"#/components/schemas/BulkCommandResultItem"},"type":"array","title":"Results"}},"type":"object","required":["bulk_id","command","total_chargers","results"],"title":"BulkCommandResponse","description":"Response for POST /api/v1/cpo/commands/bulk."},"BulkCommandResultItem":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"command_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command Id"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["charge_point_id","status"],"title":"BulkCommandResultItem","description":"Per-charger result in a bulk command response."},"BulkRateUploadRequest":{"properties":{"rates":{"items":{"$ref":"#/components/schemas/RateUploadRequest"},"type":"array","title":"Rates"},"interval_minutes":{"type":"integer","title":"Interval Minutes","description":"Default interval for rates without valid_to","default":30}},"type":"object","required":["rates"],"title":"BulkRateUploadRequest","description":"Request model for bulk uploading rates"},"BusinessDetails":{"properties":{"name":{"type":"string","title":"Name"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"logo":{"anyOf":[{"$ref":"#/components/schemas/Image"},{"type":"null"}]}},"type":"object","required":["name"],"title":"BusinessDetails","description":"Business details for credentials/locations."},"CPOBulkCommandRequest":{"properties":{"command":{"type":"string","title":"Command","description":"Normalised command name"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Command parameters"},"charge_point_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Charge Point Ids","description":"Explicit list of charge point IDs (serial numbers)"},"site_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id","description":"Filter by site (project_id) — charge points at this site"}},"type":"object","required":["command"],"title":"CPOBulkCommandRequest","description":"Request body for POST /api/v1/cpo/commands/bulk."},"CPOCommandRequest":{"properties":{"command":{"type":"string","title":"Command","description":"Normalised command name"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Command parameters"}},"type":"object","required":["command"],"title":"CPOCommandRequest","description":"Request body for POST /api/v1/cpo/commands/{charge_point_id}."},"CancelReservationRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"reservation_id":{"type":"integer","title":"Reservation Id"}},"type":"object","required":["charge_point_id","reservation_id"],"title":"CancelReservationRequest"},"CertificateResponse":{"properties":{"certificate_id":{"type":"string","title":"Certificate Id"},"certificate_pem":{"type":"string","title":"Certificate Pem"},"private_key_pem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Private Key Pem"},"serial_number":{"type":"string","title":"Serial Number"},"subject":{"type":"string","title":"Subject"},"issuer":{"type":"string","title":"Issuer"},"valid_from":{"type":"string","format":"date-time","title":"Valid From"},"valid_to":{"type":"string","format":"date-time","title":"Valid To"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["certificate_id","certificate_pem","private_key_pem","serial_number","subject","issuer","valid_from","valid_to","status","created_at"],"title":"CertificateResponse"},"ChangeAvailabilityRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"connector_id":{"type":"integer","title":"Connector Id"},"type":{"type":"string","title":"Type"}},"type":"object","required":["charge_point_id","connector_id","type"],"title":"ChangeAvailabilityRequest"},"ChargePointErrorResponse":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"error_type":{"type":"string","title":"Error Type"},"error_message":{"type":"string","title":"Error Message"},"timestamp":{"type":"string","title":"Timestamp"},"ocpp_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ocpp Version"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["charge_point_id","error_type","error_message","timestamp"],"title":"ChargePointErrorResponse"},"ChargePointStatusResponse":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"connection_status":{"type":"string","title":"Connection Status"},"last_heartbeat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Heartbeat"},"error_count":{"type":"integer","title":"Error Count"},"ocpp_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ocpp Version"},"active_transactions":{"items":{"type":"string"},"type":"array","title":"Active Transactions"},"recent_errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recent Errors"}},"type":"object","required":["charge_point_id","connection_status","last_heartbeat","error_count","ocpp_version","active_transactions","recent_errors"],"title":"ChargePointStatusResponse"},"ChargePointUpdateRequest":{"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"}},"type":"object","title":"ChargePointUpdateRequest"},"ChargerSearchResult":{"properties":{"chargers":{"items":{"$ref":"#/components/schemas/ChargerSummary"},"type":"array","title":"Chargers"},"total":{"type":"integer","title":"Total","default":0},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"type":"integer","title":"Limit","default":50}},"type":"object","title":"ChargerSearchResult","description":"Search response: chargers list + pagination."},"ChargerSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name","default":""},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"lat":{"type":"number","title":"Lat","default":0.0},"lng":{"type":"number","title":"Lng","default":0.0},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"evses":{"items":{"$ref":"#/components/schemas/EVSESummary"},"type":"array","title":"Evses"},"pricing":{"additionalProperties":true,"type":"object","title":"Pricing"}},"type":"object","required":["id"],"title":"ChargerSummary","description":"Summary of a charger for search results."},"ChargingProfileRequest":{"properties":{"id":{"type":"integer","title":"Id"},"stack_level":{"type":"integer","title":"Stack Level"},"charging_profile_purpose":{"type":"string","title":"Charging Profile Purpose"},"charging_profile_kind":{"type":"string","title":"Charging Profile Kind"},"charging_schedule":{"additionalProperties":true,"type":"object","title":"Charging Schedule"},"recurrency_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recurrency Kind"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To"},"transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Id"},"charge_point_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Point Id"}},"type":"object","required":["id","stack_level","charging_profile_purpose","charging_profile_kind","charging_schedule"],"title":"ChargingProfileRequest"},"ClearChargingProfileRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"connector_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connector Id"},"charging_profile_purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charging Profile Purpose"},"stack_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stack Level"}},"type":"object","required":["charge_point_id"],"title":"ClearChargingProfileRequest"},"CommandHistoryResponse":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"commands":{"items":{"$ref":"#/components/schemas/CommandResponse"},"type":"array","title":"Commands"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["charge_point_id","commands","total","limit","offset"],"title":"CommandHistoryResponse","description":"Paginated command history for a charge point."},"CommandRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"action":{"type":"string","title":"Action"},"message":{"additionalProperties":true,"type":"object","title":"Message"}},"type":"object","required":["charge_point_id","action","message"],"title":"CommandRequest"},"CommandResponse":{"properties":{"command_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command Id"},"charge_point_id":{"type":"string","title":"Charge Point Id"},"command":{"type":"string","title":"Command"},"status":{"type":"string","title":"Status"},"ocpp_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ocpp Action"},"ocpp_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ocpp Version"},"requested_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requested At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"response_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Response Payload"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["charge_point_id","command","status"],"title":"CommandResponse","description":"Response for a single command (submit or from history)."},"CommissioningLogEntry":{"properties":{"id":{"type":"string","title":"Id"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"level":{"type":"string","title":"Level"},"message":{"type":"string","title":"Message"},"source":{"type":"string","title":"Source"},"stage":{"type":"string","title":"Stage"},"step_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Id"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"installer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installer Id"},"installer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installer Name"}},"type":"object","required":["id","timestamp","level","message","source","stage","step_id","metadata","installer_id","installer_name"],"title":"CommissioningLogEntry"},"CommissioningLogsResponse":{"properties":{"logs":{"items":{"$ref":"#/components/schemas/CommissioningLogEntry"},"type":"array","title":"Logs"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"}},"type":"object","required":["logs","pagination","summary"],"title":"CommissioningLogsResponse"},"ConnectionHealthResponse":{"properties":{"connection_status":{"$ref":"#/components/schemas/ConnectionStatus","description":"Current connection status"},"last_heartbeat":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Heartbeat","description":"Last heartbeat timestamp"},"connection_quality":{"$ref":"#/components/schemas/ConnectionQuality","description":"Connection quality assessment"},"uptime_percentage":{"type":"number","title":"Uptime Percentage","description":"Uptime percentage (0-100)"},"health_score":{"type":"number","title":"Health Score","description":"Health score (0-100)"},"last_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen","description":"Last seen timestamp"}},"type":"object","required":["connection_status","connection_quality","uptime_percentage","health_score"],"title":"ConnectionHealthResponse"},"ConnectionHistoryResponse":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"connections":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Connections"},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors"},"success_rate":{"type":"number","title":"Success Rate"},"average_response_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Response Time"}},"type":"object","required":["charge_point_id","connections","errors","success_rate","average_response_time"],"title":"ConnectionHistoryResponse"},"ConnectionQuality":{"type":"string","enum":["excellent","good","fair","poor","unknown"],"title":"ConnectionQuality","description":"Connection quality assessment."},"ConnectionStatus":{"type":"string","enum":["connected","disconnected","connecting","disconnecting","never_connected","offline"],"title":"ConnectionStatus","description":"Charge point connection status."},"ConnectionTestResponse":{"properties":{"test_id":{"type":"string","title":"Test Id"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"test_type":{"type":"string","title":"Test Type"},"timeout_seconds":{"type":"integer","title":"Timeout Seconds"}},"type":"object","required":["test_id","status","started_at","test_type","timeout_seconds"],"title":"ConnectionTestResponse"},"ConnectorSummary":{"properties":{"connector_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connector Id"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"power_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Power Kw"},"max_power":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Power"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"ConnectorSummary","description":"Single connector: type, power, status."},"CostAllocationItem":{"properties":{"category":{"type":"string","title":"Category"},"amount":{"type":"number","title":"Amount"},"percentage":{"type":"number","title":"Percentage"}},"type":"object","required":["category","amount","percentage"],"title":"CostAllocationItem"},"CostAllocationReport":{"properties":{"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"currency":{"type":"string","title":"Currency"},"total_sessions":{"type":"integer","title":"Total Sessions"},"allocations":{"items":{"$ref":"#/components/schemas/CostAllocationItem"},"type":"array","title":"Allocations"},"summary":{"additionalProperties":{"type":"number"},"type":"object","title":"Summary"}},"type":"object","required":["organization_id","period_start","period_end","currency","total_sessions","allocations","summary"],"title":"CostAllocationReport"},"CostBreakdownResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"transaction_id":{"type":"string","title":"Transaction Id"},"station_id":{"type":"string","title":"Station Id"},"connector_id":{"type":"integer","title":"Connector Id"},"currency":{"type":"string","title":"Currency","default":"GBP"},"energy_kwh":{"type":"number","title":"Energy Kwh","default":0.0},"duration_minutes":{"type":"number","title":"Duration Minutes","default":0.0},"cost_per_kwh":{"type":"number","title":"Cost Per Kwh","default":0.0},"energy_cost":{"type":"number","title":"Energy Cost","default":0.0},"session_fee":{"type":"number","title":"Session Fee","default":0.0},"total_cost":{"type":"number","title":"Total Cost","default":0.0},"tariff_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Id"},"tariff_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Name"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"status":{"type":"string","title":"Status"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"}},"type":"object","required":["session_id","transaction_id","station_id","connector_id","started_at","status"],"title":"CostBreakdownResponse"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest","description":"Payload to create a client API key."},"CreateAssetRequest":{"properties":{"asset_type":{"type":"string","title":"Asset Type"},"capacity_kw":{"type":"number","minimum":0.0,"title":"Capacity Kw"},"capacity_kwh":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Capacity Kwh"},"manufacturer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manufacturer"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","required":["asset_type","capacity_kw"],"title":"CreateAssetRequest","description":"Request to add an energy asset."},"CreateBillingRuleRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Rule name","example":"Member 10% Discount"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Rule description","example":"10% discount for member users"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id","description":"Organization ID for org-specific rules (null for global)"},"priority":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Priority","description":"Rule priority (lower number = higher priority)","default":100,"example":10},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the rule is active","default":true},"condition":{"$ref":"#/components/schemas/BillingRuleConditionRequest","description":"Condition specification"},"action":{"$ref":"#/components/schemas/BillingRuleActionRequest","description":"Action to apply"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From","description":"Rule validity start date","example":"2024-01-01T00:00:00Z"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To","description":"Rule validity end date","example":"2024-12-31T23:59:59Z"}},"type":"object","required":["name","condition","action"],"title":"CreateBillingRuleRequest","description":"Request model for creating a new billing rule.","example":{"action":{"action_type":"discount_percentage","action_value":{"discount_percentage":10.0}},"condition":{"condition_logic":"AND","condition_type":"user_type","condition_value":{"user_type":"member"}},"description":"10% discount for member users","is_active":true,"name":"Member 10% Discount","priority":10,"valid_from":"2024-01-01T00:00:00Z","valid_to":"2024-12-31T23:59:59Z"}},"CreateFeatureFlagRequest":{"properties":{"name":{"type":"string","title":"Name"},"is_enabled":{"type":"boolean","title":"Is Enabled","default":false},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"CreateFeatureFlagRequest"},"CreateIntegrationRequestRequest":{"properties":{"integration_name":{"type":"string","maxLength":255,"minLength":1,"title":"Integration Name","description":"Name of the integration being requested"},"integration_url":{"type":"string","minLength":1,"title":"Integration Url","description":"URL or identifier for the integration service"},"reason":{"type":"string","maxLength":2000,"minLength":10,"title":"Reason","description":"Detailed reason for wanting this integration"}},"type":"object","required":["integration_name","integration_url","reason"],"title":"CreateIntegrationRequestRequest"},"CreateProjectRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"client_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Email"},"client_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Phone"},"expected_completion_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Expected Completion Date"}},"type":"object","required":["name"],"title":"CreateProjectRequest"},"CreatePromotionalCodeRequest":{"properties":{"code":{"type":"string","maxLength":50,"minLength":3,"title":"Code","description":"Promotional code (will be converted to uppercase)","example":"SUMMER2024"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id","description":"Organization ID for org-specific codes (null for global)"},"discount_type":{"type":"string","pattern":"^(percentage|fixed)$","title":"Discount Type","description":"Type of discount: 'percentage' or 'fixed'","example":"percentage"},"discount_value":{"type":"number","exclusiveMinimum":0.0,"title":"Discount Value","description":"Discount value (percentage 0-100 or fixed amount)","example":10.0},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From","description":"Code validity start date","example":"2024-06-01T00:00:00Z"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To","description":"Code validity end date","example":"2024-08-31T23:59:59Z"},"usage_limit":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Usage Limit","description":"Maximum number of times code can be used (null = unlimited)","example":100},"applicable_user_types":{"items":{"type":"string"},"type":"array","title":"Applicable User Types","description":"User types that can use this code (empty = all types)","example":["guest","member"]},"min_purchase_amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Min Purchase Amount","description":"Minimum purchase amount required to use code","example":20.0},"max_discount_amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Discount Amount","description":"Maximum discount amount (for percentage discounts)","example":50.0},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Code description","example":"Summer 2024 promotion - 10% off"}},"type":"object","required":["code","discount_type","discount_value"],"title":"CreatePromotionalCodeRequest","description":"Request model for creating a promotional code.","example":{"applicable_user_types":["guest","member"],"code":"SUMMER2024","description":"Summer 2024 promotion - 10% off","discount_type":"percentage","discount_value":10.0,"max_discount_amount":50.0,"min_purchase_amount":20.0,"usage_limit":100,"valid_from":"2024-06-01T00:00:00Z","valid_to":"2024-08-31T23:59:59Z"}},"CreateReservationRequest":{"properties":{"charge_point_id":{"type":"string","minLength":1,"title":"Charge Point Id"},"connector_id":{"type":"integer","minimum":0.0,"title":"Connector Id"},"duration_minutes":{"type":"integer","maximum":1440.0,"minimum":1.0,"title":"Duration Minutes"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["charge_point_id","connector_id","duration_minutes"],"title":"CreateReservationRequest","description":"Request body for POST /api/v1/reservations."},"CreateRolloutRequest":{"properties":{"firmware_url":{"type":"string","minLength":1,"title":"Firmware Url"},"target_version":{"type":"string","minLength":1,"title":"Target Version"},"strategy":{"type":"string","pattern":"^(staged|immediate)$","title":"Strategy"},"stages":{"items":{"$ref":"#/components/schemas/RolloutStage"},"type":"array","minItems":1,"title":"Stages"}},"type":"object","required":["firmware_url","target_version","strategy","stages"],"title":"CreateRolloutRequest"},"CreateRolloutResponse":{"properties":{"id":{"type":"string","title":"Id"},"firmware_url":{"type":"string","title":"Firmware Url"},"target_version":{"type":"string","title":"Target Version"},"strategy":{"type":"string","title":"Strategy"},"stages":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Stages"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","firmware_url","target_version","strategy","stages","status"],"title":"CreateRolloutResponse"},"CreateSiteRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"grid_capacity_amps":{"type":"integer","exclusiveMinimum":0.0,"title":"Grid Capacity Amps"},"supply_phases":{"type":"integer","title":"Supply Phases"},"supply_voltage":{"type":"integer","title":"Supply Voltage","default":230},"dno_export_limit_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dno Export Limit Kw"},"dno_import_limit_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dno Import Limit Kw"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"timezone":{"type":"string","title":"Timezone","default":"Europe/London"}},"type":"object","required":["name","grid_capacity_amps","supply_phases"],"title":"CreateSiteRequest","description":"Request to create a site. org_id is set by the service from auth context."},"CreateSupportTicketRequest":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"description":{"type":"string","maxLength":5000,"minLength":1,"title":"Description"},"urgency_level":{"$ref":"#/components/schemas/UrgencyLevel","default":"medium"},"evse_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evse Id"},"charger_serial_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charger Serial Number","description":"Charger serial number if known but not in system"},"issue_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issue Category","description":"Category of the issue for better routing"},"contact_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Preference","description":"Preferred contact method: email, phone, or both"}},"type":"object","required":["title","description"],"title":"CreateSupportTicketRequest"},"CreateTariffRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"currency":{"type":"string","title":"Currency","default":"USD"},"cost_per_kwh":{"type":"number","title":"Cost Per Kwh"},"session_fee":{"type":"number","title":"Session Fee","default":0.0},"station_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station Id"}},"type":"object","required":["name","cost_per_kwh"],"title":"CreateTariffRequest"},"CreateUserTypeRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"default_pricing_rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Pricing Rule Id"}},"type":"object","required":["name"],"title":"CreateUserTypeRequest"},"CreateWebhookEndpointRequest":{"properties":{"url":{"type":"string","title":"Url"},"secret":{"type":"string","title":"Secret"},"event_types":{"items":{"type":"string"},"type":"array","title":"Event Types"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["url","secret","event_types"],"title":"CreateWebhookEndpointRequest"},"Credentials":{"properties":{"token":{"type":"string","title":"Token"},"url":{"type":"string","title":"Url"},"roles":{"items":{"$ref":"#/components/schemas/CredentialsRole"},"type":"array","title":"Roles"}},"type":"object","required":["token","url","roles"],"title":"Credentials","description":"Credentials: token, url, roles list."},"CredentialsRole":{"properties":{"role":{"$ref":"#/components/schemas/Role"},"party_id":{"type":"string","title":"Party Id"},"country_code":{"type":"string","title":"Country Code"},"business_details":{"anyOf":[{"$ref":"#/components/schemas/BusinessDetails"},{"type":"null"}]}},"type":"object","required":["role","party_id","country_code"],"title":"CredentialsRole","description":"CredentialsRole: role enum, business_details optional, party_id (3-char), country_code (2-char)."},"CustomerHealthResponse":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"project_id":{"type":"string","title":"Project Id"},"installer_id":{"type":"string","title":"Installer Id"},"calculated_at":{"type":"string","title":"Calculated At"},"utilization_score":{"type":"integer","title":"Utilization Score"},"avg_sessions_per_day":{"type":"number","title":"Avg Sessions Per Day"},"peak_utilization_pct":{"type":"number","title":"Peak Utilization Pct"},"revenue_score":{"type":"integer","title":"Revenue Score"},"monthly_revenue":{"type":"number","title":"Monthly Revenue"},"revenue_per_charger":{"type":"number","title":"Revenue Per Charger"},"revenue_growth_pct":{"type":"number","title":"Revenue Growth Pct"},"reliability_score":{"type":"integer","title":"Reliability Score"},"uptime_pct":{"type":"number","title":"Uptime Pct"},"error_rate":{"type":"number","title":"Error Rate"},"avg_session_success_rate":{"type":"number","title":"Avg Session Success Rate"},"overall_score":{"type":"integer","title":"Overall Score"},"health_status":{"type":"string","title":"Health Status"},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations"},"expansion_score":{"type":"integer","title":"Expansion Score"},"capacity_headroom_pct":{"type":"number","title":"Capacity Headroom Pct"},"demand_trend":{"type":"string","title":"Demand Trend"}},"type":"object","required":["id","project_id","installer_id","calculated_at","utilization_score","avg_sessions_per_day","peak_utilization_pct","revenue_score","monthly_revenue","revenue_per_charger","revenue_growth_pct","reliability_score","uptime_pct","error_rate","avg_session_success_rate","overall_score","health_status","recommendations","expansion_score","capacity_headroom_pct","demand_trend"],"title":"CustomerHealthResponse"},"CustomizeConfigRequest":{"properties":{"csms_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csms Url"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol","default":"ocpp2.0.1"},"heartbeat_interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Heartbeat Interval","default":300},"reconnect_interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reconnect Interval","default":30},"custom_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Settings"}},"type":"object","title":"CustomizeConfigRequest"},"DailySessionData":{"properties":{"date":{"type":"string","title":"Date"},"session_count":{"type":"integer","title":"Session Count"},"total_cost":{"type":"number","title":"Total Cost"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"}},"type":"object","required":["date","session_count","total_cost","total_energy_kwh"],"title":"DailySessionData"},"DailySummary":{"properties":{"date":{"type":"string","title":"Date"},"total_calls":{"type":"integer","title":"Total Calls"},"endpoints":{"additionalProperties":{"type":"integer"},"type":"object","title":"Endpoints"},"summary_timestamp":{"type":"string","title":"Summary Timestamp"}},"type":"object","required":["date","total_calls","endpoints","summary_timestamp"],"title":"DailySummary"},"DashboardSettings":{"properties":{"default_view":{"type":"string","title":"Default View","default":"overview"},"widgets":{"items":{"type":"string"},"type":"array","title":"Widgets"},"refresh_interval":{"type":"integer","title":"Refresh Interval","default":30},"show_notifications":{"type":"boolean","title":"Show Notifications","default":true}},"type":"object","title":"DashboardSettings"},"DebugConfigRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"enabled_message_types":{"items":{"type":"string"},"type":"array","title":"Enabled Message Types"}},"type":"object","required":["charge_point_id"],"title":"DebugConfigRequest"},"DisputeCreateRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"dispute_reason":{"type":"string","title":"Dispute Reason"},"customer_claim_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Customer Claim Amount"}},"type":"object","required":["session_id","dispute_reason"],"title":"DisputeCreateRequest"},"DisputeResolveRequest":{"properties":{"resolution":{"type":"string","title":"Resolution"},"resolution_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resolution Amount"},"reject":{"type":"boolean","title":"Reject","default":false}},"type":"object","required":["resolution"],"title":"DisputeResolveRequest"},"DisputeResponse":{"properties":{"id":{"type":"string","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"user_id":{"type":"string","title":"User Id"},"status":{"type":"string","title":"Status"},"dispute_reason":{"type":"string","title":"Dispute Reason"},"customer_claim_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Customer Claim Amount"},"investigated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investigated By"},"investigator_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investigator Type"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"},"resolution_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resolution Amount"},"created_at":{"type":"string","title":"Created At"},"resolved_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["id","session_id","user_id","status","dispute_reason","customer_claim_amount","investigated_by","investigator_type","resolution","resolution_amount","created_at","resolved_at"],"title":"DisputeResponse"},"DisputeSubmitRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"dispute_reason":{"type":"string","title":"Dispute Reason"},"customer_claim_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Customer Claim Amount"}},"type":"object","required":["session_id","dispute_reason"],"title":"DisputeSubmitRequest"},"DisputeSubmitResponse":{"properties":{"message":{"type":"string","title":"Message"},"dispute_id":{"type":"string","title":"Dispute Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["message","dispute_id","status"],"title":"DisputeSubmitResponse"},"EVSESummary":{"properties":{"evse_id":{"type":"string","title":"Evse Id"},"connectors":{"items":{"$ref":"#/components/schemas/ConnectorSummary"},"type":"array","title":"Connectors"}},"type":"object","required":["evse_id"],"title":"EVSESummary","description":"EVSE with list of connectors."},"EmailVerificationStatusResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"},"email":{"type":"string","title":"Email"},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified At"}},"type":"object","required":["verified","email"],"title":"EmailVerificationStatusResponse"},"EndpointUsage":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"calls":{"type":"integer","title":"Calls"}},"type":"object","required":["endpoint","calls"],"title":"EndpointUsage"},"EnergyAnalyticsResponse":{"properties":{"charge_point_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Point Id"},"serial_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serial Number"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"installer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installer Id"},"date":{"type":"string","title":"Date"},"hour":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hour"},"session_count":{"type":"integer","title":"Session Count"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"avg_energy_per_session":{"type":"number","title":"Avg Energy Per Session"},"total_revenue":{"type":"number","title":"Total Revenue"},"avg_session_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Session Minutes"}},"type":"object","required":["charge_point_id","serial_number","project_id","installer_id","date","hour","session_count","total_energy_kwh","avg_energy_per_session","total_revenue","avg_session_minutes"],"title":"EnergyAnalyticsResponse"},"EnergyByProjectResponse":{"properties":{"project_id":{"type":"string","title":"Project Id"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"total_revenue":{"type":"number","title":"Total Revenue"},"session_count":{"type":"integer","title":"Session Count"},"charge_point_count":{"type":"integer","title":"Charge Point Count"},"charge_points":{"items":{"type":"string"},"type":"array","title":"Charge Points"}},"type":"object","required":["project_id","total_energy_kwh","total_revenue","session_count","charge_point_count","charge_points"],"title":"EnergyByProjectResponse"},"EnergyByTimeOfDayResponse":{"properties":{"by_hour":{"items":{"$ref":"#/components/schemas/HourlyData"},"type":"array","title":"By Hour"},"peak_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Peak Hour"}},"type":"object","required":["by_hour","peak_hour"],"title":"EnergyByTimeOfDayResponse"},"EnergyTrendsResponse":{"properties":{"period":{"type":"string","title":"Period"},"trends":{"items":{"$ref":"#/components/schemas/TrendData"},"type":"array","title":"Trends"},"current_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period"},"growth":{"$ref":"#/components/schemas/GrowthData"}},"type":"object","required":["period","trends","current_period","growth"],"title":"EnergyTrendsResponse"},"ErrorBySite":{"properties":{"site_id":{"type":"string","title":"Site Id","description":"Project/site ID"},"site_name":{"type":"string","title":"Site Name","description":"Site display name"},"error_count":{"type":"integer","title":"Error Count","description":"Total error events at site"},"top_error":{"type":"string","title":"Top Error","description":"Most frequent unified code at site"}},"type":"object","required":["site_id","site_name","error_count","top_error"],"title":"ErrorBySite","description":"Per-site error summary for GET /api/v1/cpo/fleet/errors."},"ErrorOriginalCode":{"properties":{"code":{"type":"string","title":"Code","description":"Original error code (e.g. GroundFailure)"},"ocpp_version":{"type":"string","title":"Ocpp Version","description":"OCPP version (e.g. 1.6)"},"count":{"type":"integer","title":"Count","description":"Occurrence count for this code/version"}},"type":"object","required":["code","ocpp_version","count"],"title":"ErrorOriginalCode","description":"Original OCPP code contribution to a unified error."},"ErrorTrendItem":{"properties":{"unified_code":{"type":"string","title":"Unified Code","description":"Unified error code"},"severity":{"type":"string","title":"Severity","description":"critical | warning | info"},"description":{"type":"string","title":"Description","description":"Human-readable from error_normalisation"},"occurrence_count":{"type":"integer","title":"Occurrence Count","description":"Total occurrences in period"},"affected_charger_count":{"type":"integer","title":"Affected Charger Count","description":"Number of chargers affected"},"affected_chargers":{"items":{"type":"string"},"type":"array","title":"Affected Chargers","description":"Charger IDs"},"first_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Seen","description":"First occurrence (ISO)"},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen","description":"Last occurrence (ISO)"},"original_codes":{"items":{"$ref":"#/components/schemas/ErrorOriginalCode"},"type":"array","title":"Original Codes","description":"Breakout by OCPP version"}},"type":"object","required":["unified_code","severity","description","occurrence_count","affected_charger_count"],"title":"ErrorTrendItem","description":"Single error trend for GET /api/v1/cpo/fleet/errors."},"ExecuteStageRequest":{"properties":{"stage_index":{"type":"integer","minimum":0.0,"title":"Stage Index"}},"type":"object","required":["stage_index"],"title":"ExecuteStageRequest"},"ExemptionResponse":{"properties":{"id":{"type":"string","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"requested_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requested By"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"reason":{"type":"string","title":"Reason"},"approver_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approver Id"},"status":{"type":"string","title":"Status"},"approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approved At"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"exemption_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Exemption Amount"},"applied_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Applied At"}},"type":"object","required":["id","session_id","requested_at","reason","status"],"title":"ExemptionResponse"},"FeatureFlagResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"is_enabled":{"type":"boolean","title":"Is Enabled"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","is_enabled"],"title":"FeatureFlagResponse"},"FeatureFlagStatusResponse":{"properties":{"flags":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Flags"}},"type":"object","required":["flags"],"title":"FeatureFlagStatusResponse"},"FetchRatesResponse":{"properties":{"tariff_id":{"type":"string","title":"Tariff Id"},"rates_fetched":{"type":"integer","title":"Rates Fetched"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"source":{"type":"string","title":"Source"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["tariff_id","rates_fetched","timestamp","source"],"title":"FetchRatesResponse","description":"Response model for rate fetch operations"},"FirebaseStatus":{"type":"string","enum":["connected","disconnected","error","unknown"],"title":"FirebaseStatus","description":"Firebase/Firestore connection status."},"FirmwareVersionItem":{"properties":{"version":{"type":"string","title":"Version"},"charger_count":{"type":"integer","title":"Charger Count"},"charger_ids":{"items":{"type":"string"},"type":"array","title":"Charger Ids"}},"type":"object","required":["version","charger_count","charger_ids"],"title":"FirmwareVersionItem"},"FleetChargerDetail":{"properties":{"charge_point_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Point Id","description":"Charger ID"},"is_online":{"type":"boolean","title":"Is Online","description":"Currently online"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"OCPP status e.g. Offline, Faulted"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Current fault code if faulted"},"last_heartbeat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Heartbeat","description":"Last heartbeat (ISO)"},"offline_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Offline Since","description":"When charger went offline (ISO); null if online"},"offline_duration_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Offline Duration Hours","description":"Hours since offline_since; null if online"},"site_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id","description":"Project/site ID"},"site_name":{"type":"string","title":"Site Name","description":"Site display name","default":""},"active_session":{"type":"boolean","title":"Active Session","description":"Has active charging session"}},"type":"object","required":["is_online","active_session"],"title":"FleetChargerDetail","description":"Single charger in GET /api/v1/cpo/fleet/chargers."},"FleetChargersResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Total matching count (filter)"},"returned":{"type":"integer","title":"Returned","description":"Number in this page"},"offset":{"type":"integer","title":"Offset","description":"Pagination offset"},"chargers":{"items":{"$ref":"#/components/schemas/FleetChargerDetail"},"type":"array","title":"Chargers","description":"Paginated charger list"},"generated_at":{"type":"string","title":"Generated At","description":"Timestamp when computed"}},"type":"object","required":["total","returned","offset","generated_at"],"title":"FleetChargersResponse","description":"Response for GET /api/v1/cpo/fleet/chargers."},"FleetErrorsResponse":{"properties":{"period":{"type":"string","title":"Period","description":"day | week | month"},"start_date":{"type":"string","title":"Start Date","description":"Period start (ISO)"},"end_date":{"type":"string","title":"End Date","description":"Period end (ISO)"},"total_error_events":{"type":"integer","title":"Total Error Events","description":"Total events in period"},"unique_error_codes":{"type":"integer","title":"Unique Error Codes","description":"Number of distinct unified codes"},"errors":{"items":{"$ref":"#/components/schemas/ErrorTrendItem"},"type":"array","title":"Errors","description":"Trends ranked by frequency"},"by_site":{"items":{"$ref":"#/components/schemas/ErrorBySite"},"type":"array","title":"By Site","description":"Per-site error counts and top error"},"generated_at":{"type":"string","title":"Generated At","description":"Timestamp when computed"}},"type":"object","required":["period","start_date","end_date","total_error_events","unique_error_codes","generated_at"],"title":"FleetErrorsResponse","description":"Response for GET /api/v1/cpo/fleet/errors."},"FleetFirmwareResponse":{"properties":{"versions":{"items":{"$ref":"#/components/schemas/FirmwareVersionItem"},"type":"array","title":"Versions"},"total_chargers":{"type":"integer","title":"Total Chargers"}},"type":"object","required":["versions","total_chargers"],"title":"FleetFirmwareResponse"},"FleetSummaryResponse":{"properties":{"total_chargers":{"type":"integer","title":"Total Chargers","description":"Total chargers in scope"},"online":{"type":"integer","title":"Online","description":"Chargers currently online"},"offline":{"type":"integer","title":"Offline","description":"Chargers currently offline"},"faulted":{"type":"integer","title":"Faulted","description":"Chargers in faulted status"},"availability_percent":{"type":"number","title":"Availability Percent","description":"(online / total_chargers) * 100"},"active_sessions":{"type":"integer","title":"Active Sessions","description":"Total active charging sessions"},"total_connectors":{"type":"integer","title":"Total Connectors","description":"Total connectors in scope"},"site_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id","description":"Filter site ID if requested"},"generated_at":{"type":"string","title":"Generated At","description":"Timestamp when summary was generated"}},"type":"object","required":["total_chargers","online","offline","faulted","availability_percent","active_sessions","total_connectors","generated_at"],"title":"FleetSummaryResponse","description":"Response for GET /api/v1/cpo/fleet/summary."},"FleetUptimeResponse":{"properties":{"period":{"type":"string","title":"Period","description":"day | week | month"},"start_date":{"type":"string","title":"Start Date","description":"Period start (ISO)"},"end_date":{"type":"string","title":"End Date","description":"Period end (ISO)"},"fleet_uptime_percent":{"type":"number","title":"Fleet Uptime Percent","description":"Weighted fleet uptime"},"sites":{"items":{"$ref":"#/components/schemas/UptimeSiteDetail"},"type":"array","title":"Sites","description":"Per-site uptime"},"chargers":{"items":{"$ref":"#/components/schemas/UptimeChargerDetail"},"type":"array","title":"Chargers","description":"Per-charger uptime"},"generated_at":{"type":"string","title":"Generated At","description":"Timestamp when computed"}},"type":"object","required":["period","start_date","end_date","fleet_uptime_percent","generated_at"],"title":"FleetUptimeResponse","description":"Response for GET /api/v1/cpo/fleet/uptime."},"FleetUtilisationResponse":{"properties":{"period":{"type":"string","title":"Period","description":"day | week | month"},"start_date":{"type":"string","title":"Start Date","description":"Period start (ISO)"},"end_date":{"type":"string","title":"End Date","description":"Period end (ISO)"},"fleet_utilisation_percent":{"type":"number","title":"Fleet Utilisation Percent","description":"Weighted fleet utilisation"},"sites":{"items":{"$ref":"#/components/schemas/UtilisationSiteDetail"},"type":"array","title":"Sites","description":"Per-site utilisation"},"chargers":{"items":{"$ref":"#/components/schemas/UtilisationChargerDetail"},"type":"array","title":"Chargers","description":"Per-charger utilisation"},"generated_at":{"type":"string","title":"Generated At","description":"Timestamp when computed"}},"type":"object","required":["period","start_date","end_date","fleet_utilisation_percent","generated_at"],"title":"FleetUtilisationResponse","description":"Response for GET /api/v1/cpo/fleet/utilisation."},"GenerateCertificateRequest":{"properties":{"certificate_type":{"type":"string","title":"Certificate Type","default":"client"},"validity_days":{"type":"integer","title":"Validity Days","default":365},"key_size":{"type":"integer","title":"Key Size","default":2048},"organization":{"type":"string","title":"Organization"},"common_name":{"type":"string","title":"Common Name"}},"type":"object","required":["organization","common_name"],"title":"GenerateCertificateRequest"},"GrowthData":{"properties":{"energy_growth_pct":{"type":"number","title":"Energy Growth Pct","default":0.0},"revenue_growth_pct":{"type":"number","title":"Revenue Growth Pct","default":0.0}},"type":"object","title":"GrowthData"},"GuestAuthorizeRequest":{"properties":{"charge_point_id":{"type":"string","minLength":1,"title":"Charge Point Id"},"connector_id":{"type":"integer","minimum":1.0,"title":"Connector Id"},"payment_intent_id":{"type":"string","minLength":1,"title":"Payment Intent Id"},"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["charge_point_id","connector_id","payment_intent_id","email"],"title":"GuestAuthorizeRequest","description":"API payload for guest session authorization."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HandoverCompleteRequest":{"properties":{"invitation_id":{"type":"string","title":"Invitation Id"},"installer_retained_access":{"type":"boolean","title":"Installer Retained Access","default":true},"handover_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handover Notes"}},"type":"object","required":["invitation_id"],"title":"HandoverCompleteRequest"},"HandoverCompleteResponse":{"properties":{"handover_completed":{"type":"boolean","title":"Handover Completed"},"site_owner_account":{"additionalProperties":true,"type":"object","title":"Site Owner Account"},"installer_retained_access":{"type":"boolean","title":"Installer Retained Access"},"support_access_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Support Access Expires At"}},"type":"object","required":["handover_completed","site_owner_account","installer_retained_access"],"title":"HandoverCompleteResponse"},"HandoverStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"handed_over_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handed Over To"},"handover_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Handover Completed At"},"installer_support_access":{"type":"boolean","title":"Installer Support Access"},"support_access_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Support Access Expires At"}},"type":"object","required":["status","installer_support_access"],"title":"HandoverStatusResponse"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"timestamp":{"type":"string","title":"Timestamp"},"version":{"type":"string","title":"Version"},"uptime":{"type":"number","title":"Uptime"}},"type":"object","required":["status","timestamp","version","uptime"],"title":"HealthResponse"},"HealthScoreResponse":{"properties":{"overall_score":{"type":"integer","title":"Overall Score"},"by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Category","default":{}},"total_charge_points":{"type":"integer","title":"Total Charge Points"},"healthy_charge_points":{"type":"integer","title":"Healthy Charge Points"},"issues_count":{"type":"integer","title":"Issues Count"}},"type":"object","required":["overall_score","total_charge_points","healthy_charge_points","issues_count"],"title":"HealthScoreResponse"},"HeartbeatStatusResponse":{"properties":{"last_heartbeat":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Heartbeat","description":"Last heartbeat timestamp"},"heartbeat_interval":{"type":"integer","title":"Heartbeat Interval","description":"Heartbeat interval in seconds"},"missed_heartbeats":{"type":"integer","title":"Missed Heartbeats","description":"Number of missed heartbeats"},"next_expected_heartbeat":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Expected Heartbeat","description":"Next expected heartbeat timestamp"}},"type":"object","required":["heartbeat_interval","missed_heartbeats"],"title":"HeartbeatStatusResponse"},"HourlyData":{"properties":{"hour":{"type":"integer","title":"Hour"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"session_count":{"type":"integer","title":"Session Count"},"total_revenue":{"type":"number","title":"Total Revenue"}},"type":"object","required":["hour","total_energy_kwh","session_count","total_revenue"],"title":"HourlyData"},"Image":{"properties":{"url":{"type":"string","title":"Url"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"}},"type":"object","required":["url"],"title":"Image","description":"Image reference: url, thumbnail, category, type, width, height."},"InstallationDefaults":{"properties":{"preferred_charger_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Charger Brand"},"default_voltage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Voltage"},"default_amperage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Amperage"},"preferred_connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Connector Type"}},"type":"object","title":"InstallationDefaults"},"InstallationSettings":{"properties":{"defaults":{"$ref":"#/components/schemas/InstallationDefaults"},"templates":{"$ref":"#/components/schemas/InstallationTemplates"},"documentation":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Documentation"}},"type":"object","title":"InstallationSettings"},"InstallationTemplates":{"properties":{"residential":{"additionalProperties":true,"type":"object","title":"Residential"},"commercial":{"additionalProperties":true,"type":"object","title":"Commercial"},"public":{"additionalProperties":true,"type":"object","title":"Public"}},"type":"object","title":"InstallationTemplates"},"InstallerLoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"InstallerLoginRequest","description":"Request model for installer login"},"InstallerProfileResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"verification_status":{"type":"string","title":"Verification Status"},"terms_accepted":{"type":"boolean","title":"Terms Accepted"},"terms_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms Version"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","email","full_name","company_name","phone","verification_status","terms_accepted","terms_version","created_at","updated_at"],"title":"InstallerProfileResponse"},"InstallerSignupRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","minLength":8,"title":"Password","description":"Password must be at least 8 characters"},"full_name":{"type":"string","maxLength":255,"minLength":1,"title":"Full Name"},"company_name":{"type":"string","maxLength":255,"minLength":1,"title":"Company Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","required":["email","password","full_name","company_name"],"title":"InstallerSignupRequest","description":"Request model for installer signup"},"IntegrationRequestListResponse":{"properties":{"requests":{"items":{"$ref":"#/components/schemas/IntegrationRequestResponse"},"type":"array","title":"Requests"},"total_count":{"type":"integer","title":"Total Count"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["requests","total_count","page","page_size"],"title":"IntegrationRequestListResponse"},"IntegrationRequestResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"integration_name":{"type":"string","title":"Integration Name"},"integration_url":{"type":"string","title":"Integration Url"},"reason":{"type":"string","title":"Reason"},"status":{"type":"string","title":"Status"},"priority":{"type":"string","title":"Priority"},"admin_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Notes"},"reviewed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewed By"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","integration_name","integration_url","reason","status","priority","created_at","updated_at"],"title":"IntegrationRequestResponse"},"IntegrationRequestStatsResponse":{"properties":{"total_requests":{"type":"integer","title":"Total Requests"},"pending_requests":{"type":"integer","title":"Pending Requests"},"in_review_requests":{"type":"integer","title":"In Review Requests"},"approved_requests":{"type":"integer","title":"Approved Requests"},"rejected_requests":{"type":"integer","title":"Rejected Requests"},"implemented_requests":{"type":"integer","title":"Implemented Requests"},"requests_by_priority":{"additionalProperties":{"type":"integer"},"type":"object","title":"Requests By Priority"}},"type":"object","required":["total_requests","pending_requests","in_review_requests","approved_requests","rejected_requests","implemented_requests","requests_by_priority"],"title":"IntegrationRequestStatsResponse"},"InvitationResponse":{"properties":{"invitation_id":{"type":"string","title":"Invitation Id"},"email":{"type":"string","title":"Email"},"permissions":{"type":"string","title":"Permissions"},"status":{"type":"string","title":"Status"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"invitation_link":{"type":"string","title":"Invitation Link"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["invitation_id","email","permissions","status","expires_at","invitation_link"],"title":"InvitationResponse"},"InvitationStatusResponse":{"properties":{"invitations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Invitations"},"total_count":{"type":"integer","title":"Total Count"}},"type":"object","required":["invitations","total_count"],"title":"InvitationStatusResponse"},"InviteOrganizationRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Email to invite"},"role":{"type":"string","title":"Role","description":"Auth role: user, org_admin","default":"user"},"persona":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Persona","description":"Business persona: cpo, site_owner, ev_driver, fleet_manager"}},"type":"object","required":["email"],"title":"InviteOrganizationRequest","description":"Request body for inviting a user to an organization."},"InviteSiteOwnerRequest":{"properties":{"email":{"type":"string","title":"Email"},"permissions":{"type":"string","title":"Permissions","description":"Permission level for site owner","default":"full_access"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Optional message for invitation"}},"type":"object","required":["email"],"title":"InviteSiteOwnerRequest"},"InviteUserRequest":{"properties":{"email":{"type":"string","title":"Email"},"role":{"$ref":"#/components/schemas/UserRole","default":"user"}},"type":"object","required":["email"],"title":"InviteUserRequest"},"InvoiceListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/InvoiceSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"InvoiceListResponse"},"InvoiceSummary":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"billing_period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Period Start"},"billing_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Period End"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"total_cost":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Cost"}},"type":"object","required":["id","org_id"],"title":"InvoiceSummary"},"IssuesSummaryResponse":{"properties":{"total_issues":{"type":"integer","title":"Total Issues"},"by_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Type","default":{}},"by_severity":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Severity","default":{}},"unacknowledged_count":{"type":"integer","title":"Unacknowledged Count"},"unresolved_count":{"type":"integer","title":"Unresolved Count"}},"type":"object","required":["total_issues","unacknowledged_count","unresolved_count"],"title":"IssuesSummaryResponse"},"LiveStatusResponse":{"properties":{"firebase_status":{"$ref":"#/components/schemas/FirebaseStatus","description":"Firebase/Firestore connection status"},"last_firebase_update":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Firebase Update","description":"Last Firebase update timestamp"},"real_time_data":{"additionalProperties":true,"type":"object","title":"Real Time Data","description":"Real-time status data"}},"type":"object","required":["firebase_status","real_time_data"],"title":"LiveStatusResponse","description":"Response model for live status endpoint with proper enum types.","example":{"firebase_status":"disconnected","last_firebase_update":"2024-01-15T10:30:00Z","real_time_data":{"connection_status":"disconnected","connector_status":{}}}},"LoadConfigRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"ev_power_budget_kw":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Ev Power Budget Kw"}},"type":"object","required":["enabled"],"title":"LoadConfigRequest"},"LocalizationSettings":{"properties":{"language":{"type":"string","title":"Language","default":"en"},"timezone":{"type":"string","title":"Timezone","default":"UTC"},"date_format":{"type":"string","title":"Date Format","default":"MM/DD/YYYY"},"time_format":{"type":"string","title":"Time Format","default":"12h"},"currency":{"type":"string","title":"Currency","default":"USD"}},"type":"object","title":"LocalizationSettings"},"LogCategory":{"type":"string","enum":["commissioning","connection","error","system","security","billing","general"],"title":"LogCategory"},"LogLevel":{"type":"string","enum":["debug","info","warning","error","critical"],"title":"LogLevel","description":"Log level for system messages."},"LogListResponse":{"properties":{"logs":{"items":{"$ref":"#/components/schemas/LogResponse"},"type":"array","title":"Logs"},"total_count":{"type":"integer","title":"Total Count"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["logs","total_count","page","page_size"],"title":"LogListResponse"},"LogResponse":{"properties":{"id":{"type":"string","title":"Id"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"log_level":{"type":"string","title":"Log Level"},"message":{"type":"string","title":"Message"},"source":{"type":"string","title":"Source"},"evse_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evse Id"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"installer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installer Id"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["id","timestamp","log_level","message","source"],"title":"LogResponse"},"MaintenanceEventCreateRequest":{"properties":{"performed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Performed By","description":"Installer name or user ID"},"description":{"type":"string","minLength":1,"title":"Description","description":"Maintenance work performed"},"resolution":{"type":"string","minLength":1,"title":"Resolution","description":"Resolution/outcome"},"parts_replaced":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parts Replaced","description":"Optional parts replaced details"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Additional structured metadata"}},"type":"object","required":["description","resolution"],"title":"MaintenanceEventCreateRequest","description":"Payload for creating a maintenance event."},"MarkPaidRequest":{"properties":{"payment_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Reference"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"}},"type":"object","title":"MarkPaidRequest"},"MonthlyAllowanceStatus":{"properties":{"user_id":{"type":"string","title":"User Id"},"year":{"type":"integer","title":"Year"},"month":{"type":"integer","title":"Month"},"allowance_kwh":{"type":"number","title":"Allowance Kwh"},"used_kwh":{"type":"number","title":"Used Kwh"},"remaining_kwh":{"type":"number","title":"Remaining Kwh"},"session_count":{"type":"integer","title":"Session Count"}},"type":"object","required":["user_id","year","month","allowance_kwh","used_kwh","remaining_kwh","session_count"],"title":"MonthlyAllowanceStatus"},"MonthlyCloseResponse":{"properties":{"orgs_processed":{"type":"integer","title":"Orgs Processed"},"bills_created":{"type":"integer","title":"Bills Created"},"bills_updated":{"type":"integer","title":"Bills Updated"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["orgs_processed","bills_created","bills_updated","errors"],"title":"MonthlyCloseResponse"},"MonthlyEnergyResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"charge_point_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Point Id"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"year":{"type":"integer","title":"Year"},"month":{"type":"integer","title":"Month"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"session_count":{"type":"integer","title":"Session Count"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","year","month","total_energy_kwh","session_count"],"title":"MonthlyEnergyResponse"},"MonthlyEnergySummary":{"properties":{"year":{"type":"integer","title":"Year"},"month":{"type":"integer","title":"Month"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"total_sessions":{"type":"integer","title":"Total Sessions"},"average_energy_per_session":{"type":"number","title":"Average Energy Per Session"},"dimension":{"type":"string","title":"Dimension"},"dimension_id":{"type":"string","title":"Dimension Id"}},"type":"object","required":["year","month","total_energy_kwh","total_sessions","average_energy_per_session","dimension","dimension_id"],"title":"MonthlyEnergySummary"},"MonthlySummaryResponse":{"properties":{"month":{"type":"string","title":"Month"},"total_sessions":{"type":"integer","title":"Total Sessions"},"total_cost":{"type":"number","title":"Total Cost"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"avg_cost_per_session":{"type":"number","title":"Avg Cost Per Session"},"sessions_by_day":{"items":{"$ref":"#/components/schemas/DailySessionData"},"type":"array","title":"Sessions By Day"}},"type":"object","required":["month","total_sessions","total_cost","total_energy_kwh","avg_cost_per_session","sessions_by_day"],"title":"MonthlySummaryResponse"},"NotificationSettings":{"properties":{"email":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Email"},"push":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Push"},"sms":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Sms"},"frequency":{"type":"string","title":"Frequency","default":"daily"}},"type":"object","title":"NotificationSettings"},"OCPP16CommandRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"action":{"type":"string","title":"Action"},"message":{"additionalProperties":true,"type":"object","title":"Message"}},"type":"object","required":["charge_point_id","action","message"],"title":"OCPP16CommandRequest"},"OnboardRequest":{"properties":{"country":{"type":"string","title":"Country","default":"GB"}},"type":"object","title":"OnboardRequest","description":"Request for Connect onboarding."},"OnboardingStatusResponse":{"properties":{"onboarding_completed":{"type":"boolean","title":"Onboarding Completed"},"steps":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Steps"}},"type":"object","required":["onboarding_completed","steps"],"title":"OnboardingStatusResponse"},"OperationalIssueResponse":{"properties":{"id":{"type":"string","title":"Id"},"charge_point_id":{"type":"string","title":"Charge Point Id"},"issue_type":{"type":"string","title":"Issue Type"},"severity":{"type":"string","title":"Severity"},"detected_at":{"type":"string","title":"Detected At"},"resolved_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved At"},"auto_detected":{"type":"boolean","title":"Auto Detected"},"details":{"additionalProperties":true,"type":"object","title":"Details"},"acknowledged_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acknowledged By"},"acknowledged_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acknowledged At"}},"type":"object","required":["id","charge_point_id","issue_type","severity","detected_at","resolved_at","auto_detected","details","acknowledged_by","acknowledged_at"],"title":"OperationalIssueResponse"},"OrgCommandHistoryResponse":{"properties":{"commands":{"items":{"$ref":"#/components/schemas/CommandResponse"},"type":"array","title":"Commands"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["commands","total","limit","offset"],"title":"OrgCommandHistoryResponse","description":"Paginated command history for an organisation."},"OrganizationBillingResponse":{"properties":{"org_id":{"type":"string","title":"Org Id"},"organization_name":{"type":"string","title":"Organization Name"},"total_sessions":{"type":"integer","title":"Total Sessions"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"total_cost":{"type":"number","title":"Total Cost"},"user_summaries":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"User Summaries"},"sessions":{"items":{"$ref":"#/components/schemas/SessionResponse"},"type":"array","title":"Sessions"}},"type":"object","required":["org_id","organization_name","total_sessions","total_energy_kwh","total_cost","user_summaries","sessions"],"title":"OrganizationBillingResponse"},"OrganizationSettingsUpdateRequest":{"properties":{"default_tariff_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Tariff Id","description":"Default tariff UUID for this organization"},"alert_preferences":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Alert Preferences","description":"Alert config: offline_alert, notification_methods, alert_frequency"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"IANA timezone for the organization"}},"type":"object","title":"OrganizationSettingsUpdateRequest","description":"Request body for updating organization settings (DYN-248)."},"OrphanedTransactionResponse":{"properties":{"transaction_id":{"type":"string","title":"Transaction Id"},"charge_point_id":{"type":"string","title":"Charge Point Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"age_hours":{"type":"number","title":"Age Hours"}},"type":"object","required":["transaction_id","charge_point_id","age_hours"],"title":"OrphanedTransactionResponse","description":"Firebase active transaction older than threshold (DYN-73)."},"OverdueRemindersResponse":{"properties":{"overdue_bills":{"type":"integer","title":"Overdue Bills"},"reminders_sent":{"type":"integer","title":"Reminders Sent"},"failed":{"type":"integer","title":"Failed"}},"type":"object","required":["overdue_bills","reminders_sent","failed"],"title":"OverdueRemindersResponse"},"PasswordChangeRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"},"confirm_password":{"type":"string","title":"Confirm Password"}},"type":"object","required":["current_password","new_password","confirm_password"],"title":"PasswordChangeRequest"},"PasswordResetRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequest"},"PasswordUpdateRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"PasswordUpdateRequest"},"PriorityLevel":{"type":"string","enum":["low","medium","high","urgent"],"title":"PriorityLevel","description":"Priority level for requests."},"ProjectResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"client_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Email"},"client_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Phone"},"status":{"type":"string","title":"Status"},"expected_completion_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Expected Completion Date"},"actual_completion_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Actual Completion Date"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","description","location","client_name","client_email","client_phone","status","expected_completion_date","actual_completion_date","created_at","updated_at"],"title":"ProjectResponse"},"ProjectStatus":{"type":"string","enum":["active","in_progress","completed","cancelled","on_hold","planning"],"title":"ProjectStatus","description":"Project status."},"ProjectSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"status":{"type":"string","title":"Status"},"handed_over_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Handed Over At"},"charge_points_count":{"type":"integer","title":"Charge Points Count"}},"type":"object","required":["id","name","location","status","handed_over_at","charge_points_count"],"title":"ProjectSummary"},"ProjectSummaryResponse":{"properties":{"total_charge_points":{"type":"integer","title":"Total Charge Points"},"completed_charge_points":{"type":"integer","title":"Completed Charge Points"},"in_progress_charge_points":{"type":"integer","title":"In Progress Charge Points"},"pending_charge_points":{"type":"integer","title":"Pending Charge Points"},"total_milestones":{"type":"integer","title":"Total Milestones"},"completed_milestones":{"type":"integer","title":"Completed Milestones"},"overdue_milestones":{"type":"integer","title":"Overdue Milestones"}},"type":"object","required":["total_charge_points","completed_charge_points","in_progress_charge_points","pending_charge_points","total_milestones","completed_milestones","overdue_milestones"],"title":"ProjectSummaryResponse"},"PromotionalCodeResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Unique code identifier","example":"code_550e8400-e29b-41d4-a716-446655440000"},"code":{"type":"string","title":"Code","description":"Promotional code","example":"SUMMER2024"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id","description":"Organization ID (null for global codes)"},"discount_type":{"type":"string","title":"Discount Type","description":"Type of discount","example":"percentage"},"discount_value":{"type":"number","title":"Discount Value","description":"Discount value","example":10.0},"valid_from":{"type":"string","format":"date-time","title":"Valid From","description":"Validity start date","example":"2024-06-01T00:00:00Z"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To","description":"Validity end date","example":"2024-08-31T23:59:59Z"},"usage_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Usage Limit","description":"Maximum usage limit","example":100},"times_used":{"type":"integer","title":"Times Used","description":"Number of times code has been used","example":5},"applicable_user_types":{"items":{"type":"string"},"type":"array","title":"Applicable User Types","description":"Applicable user types","example":["guest","member"]},"min_purchase_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Purchase Amount","description":"Minimum purchase amount","example":20.0},"max_discount_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Discount Amount","description":"Maximum discount amount","example":50.0},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Code description","example":"Summer 2024 promotion"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether code is active","example":true},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp","example":"2024-06-01T00:00:00Z"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp","example":"2024-06-15T10:30:00Z"}},"type":"object","required":["id","code","discount_type","discount_value","valid_from","times_used","applicable_user_types","is_active"],"title":"PromotionalCodeResponse","description":"Response model for promotional code data.","example":{"applicable_user_types":["guest","member"],"code":"SUMMER2024","created_at":"2024-06-01T00:00:00Z","description":"Summer 2024 promotion - 10% off","discount_type":"percentage","discount_value":10.0,"id":"code_550e8400-e29b-41d4-a716-446655440000","is_active":true,"max_discount_amount":50.0,"min_purchase_amount":20.0,"times_used":5,"updated_at":"2024-06-15T10:30:00Z","usage_limit":100,"valid_from":"2024-06-01T00:00:00Z","valid_to":"2024-08-31T23:59:59Z"}},"RateFetchAllResponse":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"tariffs_processed":{"type":"integer","title":"Tariffs Processed"},"rates_fetched":{"type":"integer","title":"Rates Fetched"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"details":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Details"}},"type":"object","required":["timestamp","tariffs_processed","rates_fetched","errors","details"],"title":"RateFetchAllResponse","description":"Response model for fetching all variable rates"},"RateUploadRequest":{"properties":{"valid_from":{"type":"string","format":"date-time","title":"Valid From","description":"Start time for this rate"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To","description":"End time (calculated from interval if not provided)"},"energy_rate_per_kwh":{"type":"number","title":"Energy Rate Per Kwh","description":"Energy rate in currency per kWh"},"time_rate_per_hour":{"type":"number","title":"Time Rate Per Hour","description":"Optional time rate in currency per hour","default":0.0}},"type":"object","required":["valid_from","energy_rate_per_kwh"],"title":"RateUploadRequest","description":"Request model for uploading a single rate"},"ReadinessResponse":{"properties":{"status":{"type":"string","title":"Status"},"services":{"additionalProperties":{"type":"string"},"type":"object","title":"Services"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["status","services","timestamp"],"title":"ReadinessResponse"},"RecalculateResponse":{"properties":{"original_cost":{"type":"number","title":"Original Cost"},"recalculated_cost":{"type":"number","title":"Recalculated Cost"},"difference":{"type":"number","title":"Difference"},"breakdown":{"title":"Breakdown"}},"type":"object","required":["original_cost","recalculated_cost","difference","breakdown"],"title":"RecalculateResponse"},"RefundRequest":{"properties":{"payment_intent_id":{"type":"string","title":"Payment Intent Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["payment_intent_id"],"title":"RefundRequest","description":"Request for payment refund."},"RegisterChargePointRequest":{"properties":{"serial_number":{"type":"string","title":"Serial Number"},"model":{"type":"string","title":"Model"},"vendor":{"type":"string","title":"Vendor"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"},"max_power":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Power"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"installation_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installation Notes"}},"type":"object","required":["serial_number","model","vendor"],"title":"RegisterChargePointRequest"},"RejectExemptionRequest":{"properties":{"rejection_reason":{"type":"string","title":"Rejection Reason"}},"type":"object","required":["rejection_reason"],"title":"RejectExemptionRequest"},"RemoteStartTransactionRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"id_tag":{"type":"string","title":"Id Tag"},"connector_id":{"type":"integer","title":"Connector Id","default":1}},"type":"object","required":["charge_point_id","id_tag"],"title":"RemoteStartTransactionRequest"},"RemoteStopTransactionRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"transaction_id":{"type":"string","title":"Transaction Id"}},"type":"object","required":["charge_point_id","transaction_id"],"title":"RemoteStopTransactionRequest"},"ReportIssueRequest":{"properties":{"issue_type":{"type":"string","title":"Issue Type"},"severity":{"type":"string","title":"Severity"},"description":{"type":"string","title":"Description"},"step_failed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Failed"},"recommended_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended Action"},"attachments":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Attachments"},"environmental_factors":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Environmental Factors"},"immediate_action_taken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Immediate Action Taken"},"requires_immediate_support":{"type":"boolean","title":"Requires Immediate Support","default":false}},"type":"object","required":["issue_type","severity","description","step_failed"],"title":"ReportIssueRequest"},"RequestExemptionRequest":{"properties":{"reason":{"type":"string","title":"Reason"}},"type":"object","required":["reason"],"title":"RequestExemptionRequest"},"RequestStatus":{"type":"string","enum":["pending","in_review","approved","rejected","implemented"],"title":"RequestStatus","description":"Integration request status."},"ResendVerificationEmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ResendVerificationEmailRequest"},"ResendVerificationEmailResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"email":{"type":"string","title":"Email"},"retry_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After"},"timestamp":{"type":"string","title":"Timestamp"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["success","email","timestamp"],"title":"ResendVerificationEmailResponse"},"ReserveNowRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"connector_id":{"type":"integer","title":"Connector Id"},"expiry_date":{"type":"string","title":"Expiry Date"},"id_tag":{"type":"string","title":"Id Tag"},"reservation_id":{"type":"integer","title":"Reservation Id"}},"type":"object","required":["charge_point_id","connector_id","expiry_date","id_tag","reservation_id"],"title":"ReserveNowRequest"},"ResetRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"type":{"type":"string","title":"Type"}},"type":"object","required":["charge_point_id","type"],"title":"ResetRequest"},"RetryConnectionRequest":{"properties":{"retry_type":{"type":"string","title":"Retry Type","default":"full_reconnect"},"clear_cache":{"type":"boolean","title":"Clear Cache","default":false}},"type":"object","title":"RetryConnectionRequest"},"RevenueByChargePointResponse":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"serial_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serial Number"},"total_revenue":{"type":"number","title":"Total Revenue"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"session_count":{"type":"integer","title":"Session Count"},"revenue_per_kwh":{"type":"number","title":"Revenue Per Kwh"}},"type":"object","required":["charge_point_id","serial_number","total_revenue","total_energy_kwh","session_count","revenue_per_kwh"],"title":"RevenueByChargePointResponse"},"RevenueByTariffResponse":{"properties":{"tariff_id":{"type":"string","title":"Tariff Id"},"tariff_name":{"type":"string","title":"Tariff Name"},"total_revenue":{"type":"number","title":"Total Revenue"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"session_count":{"type":"integer","title":"Session Count"},"revenue_per_kwh":{"type":"number","title":"Revenue Per Kwh"}},"type":"object","required":["tariff_id","tariff_name","total_revenue","total_energy_kwh","session_count","revenue_per_kwh"],"title":"RevenueByTariffResponse"},"RevenueByUserTypeItem":{"properties":{"user_type":{"type":"string","title":"User Type"},"session_count":{"type":"integer","title":"Session Count"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"total_base_cost":{"type":"number","title":"Total Base Cost"},"total_markup":{"type":"number","title":"Total Markup"},"total_discount":{"type":"number","title":"Total Discount"},"total_exemption":{"type":"number","title":"Total Exemption"},"total_final_cost":{"type":"number","title":"Total Final Cost"},"net_revenue":{"type":"number","title":"Net Revenue"}},"type":"object","required":["user_type","session_count","total_energy_kwh","total_base_cost","total_markup","total_discount","total_exemption","total_final_cost","net_revenue"],"title":"RevenueByUserTypeItem"},"RevenueByUserTypeReport":{"properties":{"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"currency":{"type":"string","title":"Currency"},"breakdown":{"items":{"$ref":"#/components/schemas/RevenueByUserTypeItem"},"type":"array","title":"Breakdown"},"totals":{"additionalProperties":{"type":"number"},"type":"object","title":"Totals"}},"type":"object","required":["organization_id","period_start","period_end","currency","breakdown","totals"],"title":"RevenueByUserTypeReport"},"RevenueForecastResponse":{"properties":{"forecast_days":{"type":"integer","title":"Forecast Days"},"projected_revenue":{"type":"number","title":"Projected Revenue"},"daily_average":{"type":"number","title":"Daily Average"},"growth_rate":{"type":"number","title":"Growth Rate"},"projected_daily_average":{"type":"number","title":"Projected Daily Average"}},"type":"object","required":["forecast_days","projected_revenue","daily_average","growth_rate","projected_daily_average"],"title":"RevenueForecastResponse"},"RevenueSummaryResponse":{"properties":{"total_revenue":{"type":"number","title":"Total Revenue"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"session_count":{"type":"integer","title":"Session Count"},"revenue_per_kwh":{"type":"number","title":"Revenue Per Kwh"},"revenue_per_session":{"type":"number","title":"Revenue Per Session"},"tariff_breakdown":{"items":{"$ref":"#/components/schemas/TariffBreakdown"},"type":"array","title":"Tariff Breakdown"}},"type":"object","required":["total_revenue","total_energy_kwh","session_count","revenue_per_kwh","revenue_per_session","tariff_breakdown"],"title":"RevenueSummaryResponse"},"Role":{"type":"string","enum":["CPO","EMSP"],"title":"Role","description":"OCPI role: CPO or EMSP."},"RolloutStage":{"properties":{"percentage":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Percentage"}},"type":"object","required":["percentage"],"title":"RolloutStage"},"RuleEffectivenessItem":{"properties":{"rule_id":{"type":"string","title":"Rule Id"},"rule_name":{"type":"string","title":"Rule Name"},"times_applied":{"type":"integer","title":"Times Applied"},"total_discount_given":{"type":"number","title":"Total Discount Given"},"average_discount":{"type":"number","title":"Average Discount"},"sessions_affected":{"type":"integer","title":"Sessions Affected"}},"type":"object","required":["rule_id","rule_name","times_applied","total_discount_given","average_discount","sessions_affected"],"title":"RuleEffectivenessItem"},"RuleEffectivenessReport":{"properties":{"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"rules":{"items":{"$ref":"#/components/schemas/RuleEffectivenessItem"},"type":"array","title":"Rules"}},"type":"object","required":["organization_id","period_start","period_end","rules"],"title":"RuleEffectivenessReport"},"SecuritySettings":{"properties":{"two_factor_enabled":{"type":"boolean","title":"Two Factor Enabled","default":false},"session_timeout":{"type":"integer","title":"Session Timeout","default":3600},"require_password_change":{"type":"boolean","title":"Require Password Change","default":false},"last_password_change":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Password Change"}},"type":"object","title":"SecuritySettings"},"SendReceiptRequest":{"properties":{"transaction_id":{"type":"string","title":"Transaction Id"},"to_email":{"type":"string","title":"To Email"}},"type":"object","required":["transaction_id","to_email"],"title":"SendReceiptRequest"},"SessionCostBreakdownResponse":{"properties":{"transaction_id":{"type":"string","title":"Transaction Id"},"session_id":{"type":"string","title":"Session Id"},"station_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station Id"},"connector_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connector 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"},"energy_kwh":{"type":"number","title":"Energy Kwh"},"cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost"},"final_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Final Cost"},"base_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Base Cost"},"markup_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Markup Amount"},"discount_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Amount"},"exemption_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Exemption Amount"},"is_exempt":{"type":"boolean","title":"Is Exempt","default":false},"cost_breakdown":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cost Breakdown"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"receipt_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Url"}},"type":"object","required":["transaction_id","session_id","energy_kwh"],"title":"SessionCostBreakdownResponse","description":"Cost breakdown for guest sessions (DYN-37). No auth required."},"SessionHistoryResponse":{"properties":{"sessions":{"items":{},"type":"array","title":"Sessions"},"total":{"type":"integer","title":"Total"},"total_cost":{"type":"number","title":"Total Cost"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"}},"type":"object","required":["sessions","total","total_cost","total_energy_kwh"],"title":"SessionHistoryResponse"},"SessionInfo":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_activity":{"type":"string","format":"date-time","title":"Last Activity"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"is_current":{"type":"boolean","title":"Is Current","default":false}},"type":"object","required":["id","created_at","last_activity"],"title":"SessionInfo"},"SessionLookupResponse":{"properties":{"sessions":{"items":{},"type":"array","title":"Sessions"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["sessions","total"],"title":"SessionLookupResponse"},"SessionResponse":{"properties":{"id":{"type":"string","title":"Id"},"transaction_id":{"type":"string","title":"Transaction Id"},"station_id":{"type":"string","title":"Station Id"},"connector_id":{"type":"integer","title":"Connector Id"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"energy_kwh":{"type":"number","title":"Energy Kwh"},"cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","transaction_id","station_id","connector_id","started_at","energy_kwh","status"],"title":"SessionResponse"},"SetChargingProfileRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"connector_id":{"type":"integer","title":"Connector Id"},"charging_profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Charging Profile"}},"type":"object","required":["charge_point_id","connector_id"],"title":"SetChargingProfileRequest"},"SettingsUpdateRequest":{"properties":{"notifications":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Notifications"},"installation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Installation"},"appearance":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Appearance"},"localization":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Localization"},"dashboard":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Dashboard"},"security":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Security"}},"type":"object","title":"SettingsUpdateRequest"},"SiteOwnerProfileResponse":{"properties":{"site_owner_id":{"type":"string","title":"Site Owner Id"},"full_name":{"type":"string","title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"onboarding_completed":{"type":"boolean","title":"Onboarding Completed"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"projects":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Projects"}},"type":"object","required":["site_owner_id","full_name","company_name","phone","onboarding_completed","created_at","projects"],"title":"SiteOwnerProfileResponse"},"StartCommissioningRequest":{"properties":{"installer_id":{"type":"string","title":"Installer Id","description":"UUID of the installer starting the process"},"commissioning_type":{"type":"string","title":"Commissioning Type","description":"Type of commissioning: full, quick, maintenance","default":"full"},"options":{"additionalProperties":true,"type":"object","title":"Options","description":"Commissioning options and customizations"}},"type":"object","required":["installer_id"],"title":"StartCommissioningRequest"},"StartStreamingRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"session_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Name"},"auto_stop_after_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Stop After Minutes","default":60}},"type":"object","required":["charge_point_id"],"title":"StartStreamingRequest"},"StatusOverviewResponse":{"properties":{"total_charge_points":{"type":"integer","title":"Total Charge Points","description":"Total number of charge points"},"commissioning_summary":{"additionalProperties":{"type":"integer"},"type":"object","title":"Commissioning Summary","description":"Summary of commissioning statuses"},"connection_summary":{"additionalProperties":{"type":"integer"},"type":"object","title":"Connection Summary","description":"Summary of connection statuses"},"health_overview":{"additionalProperties":{"type":"number"},"type":"object","title":"Health Overview","description":"Health metrics overview"}},"type":"object","required":["total_charge_points","commissioning_summary","connection_summary","health_overview"],"title":"StatusOverviewResponse"},"StopStreamingRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["session_id"],"title":"StopStreamingRequest"},"StreamingSessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"charge_point_id":{"type":"string","title":"Charge Point Id"},"installer_id":{"type":"string","title":"Installer Id"},"status":{"type":"string","title":"Status"},"websocket_url":{"type":"string","title":"Websocket Url"},"started_at":{"type":"string","title":"Started At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"message_count":{"type":"integer","title":"Message Count","default":0}},"type":"object","required":["session_id","charge_point_id","installer_id","status","websocket_url","started_at"],"title":"StreamingSessionResponse"},"SupportMetricsResponse":{"properties":{"total_tickets":{"type":"integer","title":"Total Tickets"},"open_tickets":{"type":"integer","title":"Open Tickets"},"resolved_tickets":{"type":"integer","title":"Resolved Tickets"},"tickets_by_urgency":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tickets By Urgency"},"tickets_by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tickets By Category"}},"type":"object","required":["total_tickets","open_tickets","resolved_tickets","tickets_by_urgency","tickets_by_category"],"title":"SupportMetricsResponse"},"SupportTicketListResponse":{"properties":{"tickets":{"items":{"$ref":"#/components/schemas/SupportTicketResponse"},"type":"array","title":"Tickets"},"total_count":{"type":"integer","title":"Total Count"}},"type":"object","required":["tickets","total_count"],"title":"SupportTicketListResponse"},"SupportTicketResponse":{"properties":{"ticket_id":{"type":"string","title":"Ticket Id"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"urgency_level":{"type":"string","title":"Urgency Level"},"status":{"type":"string","title":"Status"},"evse_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evse Id"},"installer_id":{"type":"string","title":"Installer Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["ticket_id","title","description","urgency_level","status","installer_id","created_at","updated_at"],"title":"SupportTicketResponse"},"SystemMetricsResponse":{"properties":{"system":{"additionalProperties":true,"type":"object","title":"System"},"charge_points":{"additionalProperties":true,"type":"object","title":"Charge Points"},"api":{"additionalProperties":true,"type":"object","title":"Api"}},"type":"object","required":["system","charge_points","api"],"title":"SystemMetricsResponse"},"TariffBreakdown":{"properties":{"tariff_id":{"type":"string","title":"Tariff Id"},"tariff_name":{"type":"string","title":"Tariff Name"},"revenue":{"type":"number","title":"Revenue"},"energy_kwh":{"type":"number","title":"Energy Kwh"},"session_count":{"type":"integer","title":"Session Count"}},"type":"object","required":["tariff_id","tariff_name","revenue","energy_kwh","session_count"],"title":"TariffBreakdown"},"TariffRateSourceConfig":{"properties":{"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"type":"integer","title":"Port","default":22},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"key_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Path"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"csv_format":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Csv Format"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"product_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Code"},"tariff_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff Code"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"rate_mapping":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rate Mapping"}},"type":"object","title":"TariffRateSourceConfig","description":"Configuration for rate source"},"TariffResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"currency":{"type":"string","title":"Currency"},"cost_per_kwh":{"type":"number","title":"Cost Per Kwh"},"session_fee":{"type":"number","title":"Session Fee"},"station_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station Id"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["id","name","currency","cost_per_kwh","session_fee","is_active"],"title":"TariffResponse"},"TariffScheduleCreate":{"properties":{"day_of_week":{"type":"integer","title":"Day Of Week"},"start_time":{"type":"string","title":"Start Time"},"end_time":{"type":"string","title":"End Time"},"price_per_kwh":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Price Per Kwh"},"session_fee":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Session Fee","default":"0.00"},"time_component_per_minute":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Time Component Per Minute","default":"0.0000"},"priority":{"type":"integer","title":"Priority","default":0},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["day_of_week","start_time","end_time","price_per_kwh"],"title":"TariffScheduleCreate","description":"Request model for creating a schedule entry."},"TermsAcceptanceRequest":{"properties":{"version":{"type":"string","title":"Version"},"accepted":{"type":"boolean","title":"Accepted"}},"type":"object","required":["version","accepted"],"title":"TermsAcceptanceRequest","description":"Request model for terms acceptance"},"TestConnectionRequest":{"properties":{"test_type":{"type":"string","title":"Test Type","default":"basic"},"timeout_seconds":{"type":"integer","title":"Timeout Seconds","default":30},"include_certificate_validation":{"type":"boolean","title":"Include Certificate Validation","default":false}},"type":"object","title":"TestConnectionRequest"},"TicketStatus":{"type":"string","enum":["open","in_progress","resolved","closed"],"title":"TicketStatus","description":"Support ticket status."},"TokenRequest":{"properties":{"id_token":{"type":"string","title":"Id Token"},"type":{"type":"string","title":"Type"},"charge_points":{"items":{"type":"string"},"type":"array","title":"Charge Points"}},"type":"object","required":["id_token","type","charge_points"],"title":"TokenRequest"},"TrendData":{"properties":{"period":{"type":"string","title":"Period"},"total_energy_kwh":{"type":"number","title":"Total Energy Kwh"},"session_count":{"type":"integer","title":"Session Count"},"total_revenue":{"type":"number","title":"Total Revenue"},"energy_growth_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Energy Growth Pct"},"revenue_growth_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue Growth Pct"}},"type":"object","required":["period","total_energy_kwh","session_count","total_revenue"],"title":"TrendData"},"TriggerMessageRequest":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id"},"requested_message":{"type":"string","title":"Requested Message"},"connector_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connector Id"}},"type":"object","required":["charge_point_id","requested_message"],"title":"TriggerMessageRequest"},"TwoFactorSetupRequest":{"properties":{"method":{"type":"string","title":"Method","default":"totp"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"TwoFactorSetupRequest"},"UpdateAssetRequest":{"properties":{"capacity_kw":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Capacity Kw"},"capacity_kwh":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Capacity Kwh"},"manufacturer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manufacturer"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UpdateAssetRequest","description":"Partial update for an energy asset."},"UpdateBillingRuleRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name","description":"Rule name","example":"Member 15% Discount"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Rule description","example":"Updated discount for member users"},"priority":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Priority","description":"Rule priority (lower number = higher priority)","example":5},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether the rule is active"},"condition":{"anyOf":[{"$ref":"#/components/schemas/BillingRuleConditionRequest"},{"type":"null"}],"description":"Condition specification"},"action":{"anyOf":[{"$ref":"#/components/schemas/BillingRuleActionRequest"},{"type":"null"}],"description":"Action to apply"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From","description":"Rule validity start date","example":"2024-01-01T00:00:00Z"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To","description":"Rule validity end date","example":"2024-12-31T23:59:59Z"}},"type":"object","title":"UpdateBillingRuleRequest","description":"Request model for updating an existing billing rule."},"UpdateChargePointRequest":{"properties":{"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"},"max_power":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Power"},"installation_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installation Notes"}},"type":"object","title":"UpdateChargePointRequest"},"UpdateChargePointsRequest":{"properties":{"id_token":{"type":"string","title":"Id Token"},"charge_points":{"items":{},"type":"array","title":"Charge Points"}},"type":"object","required":["id_token","charge_points"],"title":"UpdateChargePointsRequest"},"UpdateFeatureFlagRequest":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"UpdateFeatureFlagRequest"},"UpdateIntegrationRequestRequest":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/RequestStatus"},{"type":"null"}]},"priority":{"anyOf":[{"$ref":"#/components/schemas/PriorityLevel"},{"type":"null"}]},"admin_notes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Admin Notes","description":"Admin notes about this request"}},"type":"object","title":"UpdateIntegrationRequestRequest"},"UpdateMemberRoleRequest":{"properties":{"role":{"type":"string","title":"Role","description":"New role: user, org_admin"}},"type":"object","required":["role"],"title":"UpdateMemberRoleRequest","description":"Request body for updating a member's role."},"UpdateOrganizationRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"business_registration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Registration"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings"}},"type":"object","title":"UpdateOrganizationRequest","description":"Request body for updating an organization profile."},"UpdateProjectRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"client_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Email"},"client_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Phone"},"expected_completion_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Expected Completion Date"}},"type":"object","title":"UpdateProjectRequest"},"UpdateProjectStatusRequest":{"properties":{"status":{"$ref":"#/components/schemas/ProjectStatus","description":"Project status"}},"type":"object","required":["status"],"title":"UpdateProjectStatusRequest"},"UpdateSiteRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"grid_capacity_amps":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Grid Capacity Amps"},"supply_phases":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Supply Phases"},"supply_voltage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Supply Voltage"},"dno_export_limit_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dno Export Limit Kw"},"dno_import_limit_kw":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dno Import Limit Kw"},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UpdateSiteRequest","description":"Partial update for a site."},"UpdateSupportTicketRequest":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/TicketStatus"},{"type":"null"}]},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"UpdateSupportTicketRequest"},"UpdateTariffRateSourceRequest":{"properties":{"rate_source":{"type":"string","title":"Rate Source","description":"Rate source: static, sftp, octopus_agile, ovo_go, custom_api"},"rate_interval_minutes":{"type":"integer","title":"Rate Interval Minutes","description":"Rate interval in minutes: 5, 15, 30, or 60","default":30},"rate_source_config":{"anyOf":[{"$ref":"#/components/schemas/TariffRateSourceConfig"},{"type":"null"}]}},"type":"object","required":["rate_source"],"title":"UpdateTariffRateSourceRequest","description":"Request model for updating tariff rate source"},"UpdateTokenRequest":{"properties":{"charge_points":{"items":{"type":"string"},"type":"array","title":"Charge Points"}},"type":"object","required":["charge_points"],"title":"UpdateTokenRequest"},"UpdateUserTypeRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"default_pricing_rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Pricing Rule Id"}},"type":"object","title":"UpdateUserTypeRequest"},"UpdateWebhookEndpointRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"event_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Event Types"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"UpdateWebhookEndpointRequest"},"UptimeChargerDetail":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id","description":"Charger ID"},"site_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id","description":"Project/site ID"},"uptime_percent":{"type":"number","title":"Uptime Percent","description":"Uptime percentage in period"},"total_online_hours":{"type":"number","title":"Total Online Hours","description":"Total hours online in period"},"total_offline_hours":{"type":"number","title":"Total Offline Hours","description":"Total hours offline in period"},"longest_outage_hours":{"type":"number","title":"Longest Outage Hours","description":"Longest continuous offline period (hours)"}},"type":"object","required":["charge_point_id","uptime_percent","total_online_hours","total_offline_hours","longest_outage_hours"],"title":"UptimeChargerDetail","description":"Per-charger uptime for GET /api/v1/cpo/fleet/uptime."},"UptimeSiteDetail":{"properties":{"site_id":{"type":"string","title":"Site Id","description":"Project/site ID"},"site_name":{"type":"string","title":"Site Name","description":"Site display name"},"uptime_percent":{"type":"number","title":"Uptime Percent","description":"Average uptime of chargers at site"},"charger_count":{"type":"integer","title":"Charger Count","description":"Number of chargers at site"}},"type":"object","required":["site_id","site_name","uptime_percent","charger_count"],"title":"UptimeSiteDetail","description":"Per-site uptime for GET /api/v1/cpo/fleet/uptime."},"UrgencyLevel":{"type":"string","enum":["low","medium","high","critical","urgent"],"title":"UrgencyLevel","description":"Urgency level for tickets and requests."},"UsageAnalytics":{"properties":{"date_range":{"type":"string","title":"Date Range"},"total_calls":{"type":"integer","title":"Total Calls"},"daily_summaries":{"items":{"$ref":"#/components/schemas/DailySummary"},"type":"array","title":"Daily Summaries"},"top_endpoints":{"items":{"$ref":"#/components/schemas/EndpointUsage"},"type":"array","title":"Top Endpoints"}},"type":"object","required":["date_range","total_calls","daily_summaries","top_endpoints"],"title":"UsageAnalytics"},"UserRole":{"type":"string","enum":["user","org_admin","system_admin","developer"],"title":"UserRole"},"UserSettings":{"properties":{"account":{"additionalProperties":true,"type":"object","title":"Account"},"notifications":{"$ref":"#/components/schemas/NotificationSettings"},"installation":{"$ref":"#/components/schemas/InstallationSettings"},"appearance":{"$ref":"#/components/schemas/AppearanceSettings"},"localization":{"$ref":"#/components/schemas/LocalizationSettings"},"dashboard":{"$ref":"#/components/schemas/DashboardSettings"},"security":{"$ref":"#/components/schemas/SecuritySettings"}},"type":"object","title":"UserSettings"},"UserTypeResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"default_pricing_rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Pricing Rule Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name"],"title":"UserTypeResponse"},"UtilisationChargerDetail":{"properties":{"charge_point_id":{"type":"string","title":"Charge Point Id","description":"Charger ID"},"site_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Id","description":"Project/site ID"},"utilisation_percent":{"type":"number","title":"Utilisation Percent","description":"Charging hours / available hours * 100, capped 100%"},"charging_hours":{"type":"number","title":"Charging Hours","description":"Total charging hours in period"},"available_hours":{"type":"number","title":"Available Hours","description":"Total period hours (available)"},"session_count":{"type":"integer","title":"Session Count","description":"Number of sessions in period"},"avg_session_duration_minutes":{"type":"number","title":"Avg Session Duration Minutes","description":"Average session length (minutes)"}},"type":"object","required":["charge_point_id","utilisation_percent","charging_hours","available_hours","session_count","avg_session_duration_minutes"],"title":"UtilisationChargerDetail","description":"Per-charger utilisation for GET /api/v1/cpo/fleet/utilisation."},"UtilisationSiteDetail":{"properties":{"site_id":{"type":"string","title":"Site Id","description":"Project/site ID"},"site_name":{"type":"string","title":"Site Name","description":"Site display name"},"utilisation_percent":{"type":"number","title":"Utilisation Percent","description":"Average of charger utilisations at site"},"total_charging_hours":{"type":"number","title":"Total Charging Hours","description":"Sum of charging hours at site"},"total_available_hours":{"type":"number","title":"Total Available Hours","description":"Sum of available hours at site"},"charger_count":{"type":"integer","title":"Charger Count","description":"Number of chargers at site"}},"type":"object","required":["site_id","site_name","utilisation_percent","total_charging_hours","total_available_hours","charger_count"],"title":"UtilisationSiteDetail","description":"Per-site utilisation for GET /api/v1/cpo/fleet/utilisation."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariableRateResponse":{"properties":{"id":{"type":"string","title":"Id"},"tariff_id":{"type":"string","title":"Tariff Id"},"valid_from":{"type":"string","format":"date-time","title":"Valid From"},"valid_to":{"type":"string","format":"date-time","title":"Valid To"},"energy_rate_per_kwh":{"type":"number","title":"Energy Rate Per Kwh"},"time_rate_per_hour":{"type":"number","title":"Time Rate Per Hour","default":0.0},"source":{"type":"string","title":"Source"},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"}},"type":"object","required":["id","tariff_id","valid_from","valid_to","energy_rate_per_kwh","source"],"title":"VariableRateResponse","description":"Response model for a variable rate"},"VerifyRequest":{"properties":{"public_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Key"}},"type":"object","title":"VerifyRequest","description":"Optional public_key for verification."},"csms__presentation__api__billing_api__CreateOrganizationRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"CreateOrganizationRequest"},"csms__presentation__api__charge_point_commissioning_api__ChargePointResponse":{"properties":{"id":{"type":"string","title":"Id"},"serial_number":{"type":"string","title":"Serial Number"},"model":{"type":"string","title":"Model"},"vendor":{"type":"string","title":"Vendor"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"},"max_power":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Power"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"commissioning_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commissioning Status"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"installation_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installation Notes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"commissioned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Commissioned At"},"last_heartbeat":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Heartbeat"},"connection_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Quality"}},"type":"object","required":["id","serial_number","model","vendor","location","connector_type","max_power","project_id","installation_notes","created_at","updated_at"],"title":"ChargePointResponse"},"csms__presentation__api__charger_geolocation_api__ChargePointCreateRequest":{"properties":{"serial_number":{"type":"string","title":"Serial Number"},"model":{"type":"string","title":"Model"},"vendor":{"type":"string","title":"Vendor"},"site_id":{"type":"string","title":"Site Id"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"}},"type":"object","required":["serial_number","model","vendor","site_id"],"title":"ChargePointCreateRequest"},"csms__presentation__api__handover_api__AcceptInvitationResponse":{"properties":{"invitation_details":{"additionalProperties":true,"type":"object","title":"Invitation Details"},"next_steps":{"type":"string","title":"Next Steps"}},"type":"object","required":["invitation_details","next_steps"],"title":"AcceptInvitationResponse"},"csms__presentation__api__installer_onboarding_api__ChargePointCreateRequest":{"properties":{"serial_number":{"type":"string","title":"Serial Number"},"model":{"type":"string","title":"Model"},"vendor":{"type":"string","title":"Vendor"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"},"max_power":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Power"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"installation_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installation Notes"}},"type":"object","required":["serial_number","model","vendor"],"title":"ChargePointCreateRequest"},"csms__presentation__api__installer_onboarding_api__ChargePointResponse":{"properties":{"id":{"type":"string","title":"Id"},"serial_number":{"type":"string","title":"Serial Number"},"model":{"type":"string","title":"Model"},"vendor":{"type":"string","title":"Vendor"},"location":{"type":"string","title":"Location"},"connector_type":{"type":"string","title":"Connector Type"},"max_power":{"type":"number","title":"Max Power"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"installation_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installation Notes"},"commissioning_status":{"type":"string","title":"Commissioning Status"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","serial_number","model","vendor","location","connector_type","max_power","commissioning_status","created_at","updated_at"],"title":"ChargePointResponse"},"csms__presentation__api__organization_api__CreateOrganizationRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Organization name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email","description":"Primary contact email"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone","description":"Primary contact phone"},"timezone":{"type":"string","title":"Timezone","description":"IANA timezone","default":"UTC"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Organization website"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Business address"}},"type":"object","required":["name"],"title":"CreateOrganizationRequest","description":"Request body for creating an organization."},"csms__presentation__api__project_management_api__ChargePointResponse":{"properties":{"id":{"type":"string","title":"Id"},"serial_number":{"type":"string","title":"Serial Number"},"model":{"type":"string","title":"Model"},"vendor":{"type":"string","title":"Vendor"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"connector_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Type"},"max_power":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Power"},"status":{"type":"string","title":"Status","default":"pending"},"added_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added At"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"project_id":{"type":"string","title":"Project Id"}},"type":"object","required":["id","serial_number","model","vendor","location","connector_type","max_power","project_id"],"title":"ChargePointResponse"},"csms__presentation__api__site_owner_api__AcceptInvitationResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"user":{"additionalProperties":true,"type":"object","title":"User"},"project":{"additionalProperties":true,"type":"object","title":"Project"},"next_steps":{"type":"string","title":"Next Steps"}},"type":"object","required":["access_token","refresh_token","user","project","next_steps"],"title":"AcceptInvitationResponse"}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Use your API key. In Swagger, click **Authorize** and paste your key (e.g. csms_live_...)."},"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Alternative: API key in X-API-Key header. Same key from Developer Portal."}}},"security":[{"BearerAuth":[]}]}