{"openapi":"3.1.0","info":{"title":"Worker API","summary":"Lambda, S3, and SFTP management services","version":"0.1.0"},"paths":{"/lambda/upload":{"post":{"tags":["lambda"],"summary":"Upload Lambda","description":"Upload a lambda zip file. Creates a folder named after the file (without extension).\n\nIf ``folder`` is provided, the file is placed into that existing folder\ninstead of deriving the folder name from the filename.","operationId":"upload_lambda_lambda_upload_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_lambda_lambda_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lambda/list":{"get":{"tags":["lambda"],"summary":"List Lambdas","description":"List all lambda folders.","operationId":"list_lambdas_lambda_list_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lambda/list/{folder_name}":{"get":{"tags":["lambda"],"summary":"List Lambda Contents","description":"List the contents of a specific lambda folder.","operationId":"list_lambda_contents_lambda_list__folder_name__get","parameters":[{"name":"folder_name","in":"path","required":true,"schema":{"type":"string","title":"Folder Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lambda/{folder_name}/payload":{"get":{"tags":["lambda"],"summary":"Get Lambda Payload","description":"Read the .payload.json file for a lambda, if it exists.","operationId":"get_lambda_payload_lambda__folder_name__payload_get","parameters":[{"name":"folder_name","in":"path","required":true,"schema":{"type":"string","title":"Folder Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["lambda"],"summary":"Save Lambda Payload","description":"Save a .payload.json file for a lambda.","operationId":"save_lambda_payload_lambda__folder_name__payload_put","parameters":[{"name":"folder_name","in":"path","required":true,"schema":{"type":"string","title":"Folder Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lambda/{folder_name}":{"delete":{"tags":["lambda"],"summary":"Delete Lambda","description":"Delete a lambda folder and all its contents from disk.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Lambda deleted',\n    'folder': 'my_lambda'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"delete_lambda_lambda__folder_name__delete","parameters":[{"name":"folder_name","in":"path","required":true,"schema":{"type":"string","title":"Folder Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipeline/csv/preview":{"post":{"tags":["pipeline"],"summary":"Preview Csv","description":"Upload a CSV, store it if pipeline_name provided, return preview data.","operationId":"preview_csv_pipeline_csv_preview_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_csv_pipeline_csv_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CSV"}},"/pipeline/csv/upload":{"post":{"tags":["pipeline"],"summary":"Upload Csv","description":"Store a CSV file for a pipeline.","operationId":"upload_csv_pipeline_csv_upload_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_csv_pipeline_csv_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CSV"}},"/pipeline/csv/{pipeline_name}":{"get":{"tags":["pipeline"],"summary":"Download Csv","description":"Download the stored CSV.","operationId":"download_csv_pipeline_csv__pipeline_name__get","parameters":[{"name":"pipeline_name","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CSV"},"delete":{"tags":["pipeline"],"summary":"Delete Csv","description":"Delete stored CSV.","operationId":"delete_csv_pipeline_csv__pipeline_name__delete","parameters":[{"name":"pipeline_name","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CSV"}},"/pipeline/csv/{pipeline_name}/preview":{"get":{"tags":["pipeline"],"summary":"Get Csv Preview","description":"Read stored CSV and return preview data.","operationId":"get_csv_preview_pipeline_csv__pipeline_name__preview_get","parameters":[{"name":"pipeline_name","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Name"}},{"name":"delimiter","in":"query","required":false,"schema":{"type":"string","default":",","title":"Delimiter"}},{"name":"encoding","in":"query","required":false,"schema":{"type":"string","default":"utf-8","title":"Encoding"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CSV"}},"/pipeline/":{"post":{"tags":["pipeline"],"summary":"Create Pipeline","description":"Create a new CSV pipeline definition.","operationId":"create_pipeline_pipeline__post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"get":{"tags":["pipeline"],"summary":"List Pipelines","description":"List all pipelines.","operationId":"list_pipelines_pipeline__get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"}},"/pipeline/{pipeline_id}":{"get":{"tags":["pipeline"],"summary":"Get Pipeline","description":"Get a single pipeline.","operationId":"get_pipeline_pipeline__pipeline_id__get","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"put":{"tags":["pipeline"],"summary":"Update Pipeline","description":"Update a pipeline. Only non-null fields are changed.","operationId":"update_pipeline_pipeline__pipeline_id__put","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"delete":{"tags":["pipeline"],"summary":"Delete Pipeline","description":"Delete a pipeline, its lambda, and stored CSV.","operationId":"delete_pipeline_pipeline__pipeline_id__delete","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"}},"/pipeline/{pipeline_id}/generate-code":{"post":{"tags":["pipeline"],"summary":"Generate Code","description":"Generate handler.py from pipeline definition.","operationId":"generate_code_pipeline__pipeline_id__generate_code_post","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Code"}},"/pipeline/{pipeline_id}/code":{"put":{"tags":["pipeline"],"summary":"Save Code","description":"Save fully edited handler.py as the pipeline's custom_code.","operationId":"save_code_pipeline__pipeline_id__code_put","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineCodeUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Code"}},"/pipeline/{pipeline_id}/build":{"post":{"tags":["pipeline"],"summary":"Build Pipeline","description":"Generate handler code and send to build service (non-streaming).","operationId":"build_pipeline_pipeline__pipeline_id__build_post","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Build"}},"/pipeline/{pipeline_id}/build-stream":{"get":{"tags":["pipeline"],"summary":"Build Pipeline Stream","description":"Generate handler code and stream build progress as SSE events.","operationId":"build_pipeline_stream_pipeline__pipeline_id__build_stream_get","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"api_key","in":"query","required":false,"schema":{"type":"string","description":"API key (for SSE/EventSource which cannot send headers)","title":"Api Key"},"description":"API key (for SSE/EventSource which cannot send headers)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Build"}},"/pipeline/{pipeline_id}/link-trigger":{"post":{"tags":["pipeline"],"summary":"Link Trigger","description":"Link a pipeline to an SFTP trigger.","operationId":"link_trigger_pipeline__pipeline_id__link_trigger_post","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkTriggerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/pipeline/{pipeline_id}/run":{"post":{"tags":["pipeline"],"summary":"Run Pipeline","description":"Upload a CSV and run the pipeline by creating a scheduled job.","operationId":"run_pipeline_pipeline__pipeline_id__run_post","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_run_pipeline_pipeline__pipeline_id__run_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/workflow":{"post":{"tags":["workflows"],"summary":"Create Workflow","description":"Create a new workflow with its steps.","operationId":"create_workflow_workflow_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"get":{"tags":["workflows"],"summary":"List Workflows","description":"List all workflows.","operationId":"list_workflows_workflow_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":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"}},"/workflow/{workflow_id}":{"get":{"tags":["workflows"],"summary":"Get Workflow","description":"Get a workflow with its steps.","operationId":"get_workflow_workflow__workflow_id__get","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"integer","title":"Workflow Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"put":{"tags":["workflows"],"summary":"Update Workflow","description":"Update workflow metadata.","operationId":"update_workflow_workflow__workflow_id__put","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"integer","title":"Workflow Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"delete":{"tags":["workflows"],"summary":"Delete Workflow","description":"Delete a workflow and its steps (cascades).","operationId":"delete_workflow_workflow__workflow_id__delete","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"integer","title":"Workflow Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"}},"/workflow/{workflow_id}/trigger":{"post":{"tags":["workflows"],"summary":"Trigger Workflow","description":"Trigger a workflow — creates a run and schedules the first step(s).","operationId":"trigger_workflow_workflow__workflow_id__trigger_post","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"integer","title":"Workflow Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Trigger"}},"/workflow/{workflow_id}/runs":{"get":{"tags":["workflows"],"summary":"List Workflow Runs","description":"List all runs for a workflow.","operationId":"list_workflow_runs_workflow__workflow_id__runs_get","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"integer","title":"Workflow Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Runs"}},"/workflow/runs/{run_id}":{"get":{"tags":["workflows"],"summary":"Get Workflow Run","description":"Get a workflow run with all step runs.","operationId":"get_workflow_run_workflow_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Runs"}},"/s3/upload":{"post":{"tags":["s3"],"summary":"Upload S3","description":"Upload a file. Creates a folder named after the file (without extension).","operationId":"upload_s3_s3_upload_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_s3_s3_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/s3/list":{"get":{"tags":["s3"],"summary":"List S3 Folders","description":"List all s3 folders.","operationId":"list_s3_folders_s3_list_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/s3/list/{folder_name}":{"get":{"tags":["s3"],"summary":"List S3 Contents","description":"List the contents of a specific s3 folder.","operationId":"list_s3_contents_s3_list__folder_name__get","parameters":[{"name":"folder_name","in":"path","required":true,"schema":{"type":"string","title":"Folder Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sftp/users/check/{username}":{"get":{"tags":["sftp"],"summary":"Check Username","description":"Check if a username is available for creation.\n\nReturns availability status and whether cleanup is needed.","operationId":"check_username_sftp_users_check__username__get","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","title":"Username"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"}},"/sftp/users/cleanup/{username}":{"post":{"tags":["sftp"],"summary":"Cleanup Orphaned User","description":"Remove an orphaned Linux user that has no matching DB record.\n\nUse this when a previous create failed and left behind a Linux user.","operationId":"cleanup_orphaned_user_sftp_users_cleanup__username__post","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","title":"Username"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"}},"/sftp/users":{"post":{"tags":["sftp"],"summary":"Create Sftp User","description":"Create an SFTP user (key or password auth).","operationId":"create_sftp_user_sftp_users_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"},"get":{"tags":["sftp"],"summary":"List Sftp Users","description":"List SFTP users with optional filters.","operationId":"list_sftp_users_sftp_users_get","parameters":[{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"auth_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Type"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"}},"/sftp/users/{user_id}":{"get":{"tags":["sftp"],"summary":"Get Sftp User","description":"Get a single SFTP user with key summary.","operationId":"get_sftp_user_sftp_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"},"patch":{"tags":["sftp"],"summary":"Update Sftp User","description":"Update display_name and/or notes for an SFTP user.","operationId":"update_sftp_user_sftp_users__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"},"delete":{"tags":["sftp"],"summary":"Delete Sftp User","description":"Delete an SFTP user. Default is soft-delete. Use ?hard=true for full removal.","operationId":"delete_sftp_user_sftp_users__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"hard","in":"query","required":false,"schema":{"type":"boolean","description":"Hard delete: remove Linux user, archive home, delete DB records","default":false,"title":"Hard"},"description":"Hard delete: remove Linux user, archive home, delete DB records"},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"}},"/sftp/users/{user_id}/disable":{"post":{"tags":["sftp"],"summary":"Disable Sftp User","description":"Disable an SFTP user (DB + lock Linux account).","operationId":"disable_sftp_user_sftp_users__user_id__disable_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"}},"/sftp/users/{user_id}/enable":{"post":{"tags":["sftp"],"summary":"Enable Sftp User","description":"Re-enable a disabled SFTP user.","operationId":"enable_sftp_user_sftp_users__user_id__enable_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"}},"/sftp/users/{user_id}/keys":{"post":{"tags":["sftp"],"summary":"Add Key","description":"Add a public key for an SFTP user.\n\nBody: {\"key_name\": \"Mike laptop\", \"public_key\": \"ssh-ed25519 AAAA...\"}","operationId":"add_key_sftp_users__user_id__keys_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Keys"},"get":{"tags":["sftp"],"summary":"List Keys","description":"List public keys for an SFTP user.","operationId":"list_keys_sftp_users__user_id__keys_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Keys"}},"/sftp/users/{user_id}/keys/{key_id}/disable":{"post":{"tags":["sftp"],"summary":"Disable Key","description":"Disable a public key and rebuild authorized_keys.","operationId":"disable_key_sftp_users__user_id__keys__key_id__disable_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Keys"}},"/sftp/users/{user_id}/keys/{key_id}/enable":{"post":{"tags":["sftp"],"summary":"Enable Key","description":"Re-enable a disabled public key and rebuild authorized_keys.","operationId":"enable_key_sftp_users__user_id__keys__key_id__enable_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Keys"}},"/sftp/users/{user_id}/keys/{key_id}":{"delete":{"tags":["sftp"],"summary":"Delete Key","description":"Permanently delete a public key and rebuild authorized_keys.","operationId":"delete_key_sftp_users__user_id__keys__key_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Keys"}},"/sftp/users/{user_id}/reset-password":{"post":{"tags":["sftp"],"summary":"Reset Password","description":"Generate and set a new password for a password-auth user. Returns the new password once.","operationId":"reset_password_sftp_users__user_id__reset_password_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Users"}},"/sftp/users/{user_id}/connection-info":{"get":{"tags":["sftp"],"summary":"Connection Info","description":"Return SFTP connection details for a user.","operationId":"connection_info_sftp_users__user_id__connection_info_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Connection"}},"/sftp/uploads":{"get":{"tags":["sftp"],"summary":"List Uploads","description":"List upload events with optional filters.","operationId":"list_uploads_sftp_uploads_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Uploads"}},"/sftp/users/{user_id}/uploads":{"get":{"tags":["sftp"],"summary":"User Uploads","description":"List upload events for a specific user.","operationId":"user_uploads_sftp_users__user_id__uploads_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Uploads"}},"/sftp/users/{user_id}/audit":{"get":{"tags":["sftp"],"summary":"User Audit","description":"View audit log for a specific SFTP user.","operationId":"user_audit_sftp_users__user_id__audit_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Audit"}},"/sftp/users/{user_id}/rebuild-keys":{"post":{"tags":["sftp"],"summary":"Rebuild Keys","description":"Force rebuild the authorized_keys file for a user from the database.","operationId":"rebuild_keys_sftp_users__user_id__rebuild_keys_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Diagnostics"}},"/sftp/users/{user_id}/repair-home":{"post":{"tags":["sftp"],"summary":"Repair Home Endpoint","description":"Repair ownership and permissions on a user's home directory.","operationId":"repair_home_endpoint_sftp_users__user_id__repair_home_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Diagnostics"}},"/sftp/users/{user_id}/health":{"get":{"tags":["sftp"],"summary":"User Health","description":"Run health checks for a specific SFTP user.","operationId":"user_health_sftp_users__user_id__health_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Diagnostics"}},"/sftp/triggers":{"post":{"tags":["sftp"],"summary":"Create Trigger","description":"Create a file trigger for an SFTP user.","operationId":"create_trigger_sftp_triggers_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"},"get":{"tags":["sftp"],"summary":"List Triggers","description":"List file triggers with optional filters.","operationId":"list_triggers_sftp_triggers_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"}},"/sftp/triggers/events":{"get":{"tags":["sftp"],"summary":"List All Trigger Events","description":"List all trigger events with optional filters.","operationId":"list_all_trigger_events_sftp_triggers_events_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"}},"/sftp/triggers/{trigger_id}":{"get":{"tags":["sftp"],"summary":"Get Trigger","description":"Get a single trigger with its user info.","operationId":"get_trigger_sftp_triggers__trigger_id__get","parameters":[{"name":"trigger_id","in":"path","required":true,"schema":{"type":"integer","title":"Trigger Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"},"patch":{"tags":["sftp"],"summary":"Update Trigger","description":"Update a trigger's configuration.","operationId":"update_trigger_sftp_triggers__trigger_id__patch","parameters":[{"name":"trigger_id","in":"path","required":true,"schema":{"type":"integer","title":"Trigger Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"},"delete":{"tags":["sftp"],"summary":"Delete Trigger","description":"Delete a trigger and its event history.","operationId":"delete_trigger_sftp_triggers__trigger_id__delete","parameters":[{"name":"trigger_id","in":"path","required":true,"schema":{"type":"integer","title":"Trigger Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"}},"/sftp/triggers/{trigger_id}/disable":{"post":{"tags":["sftp"],"summary":"Disable Trigger","description":"Disable a trigger.","operationId":"disable_trigger_sftp_triggers__trigger_id__disable_post","parameters":[{"name":"trigger_id","in":"path","required":true,"schema":{"type":"integer","title":"Trigger Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"}},"/sftp/triggers/{trigger_id}/enable":{"post":{"tags":["sftp"],"summary":"Enable Trigger","description":"Enable a trigger.","operationId":"enable_trigger_sftp_triggers__trigger_id__enable_post","parameters":[{"name":"trigger_id","in":"path","required":true,"schema":{"type":"integer","title":"Trigger Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"}},"/sftp/triggers/{trigger_id}/events":{"get":{"tags":["sftp"],"summary":"Trigger Events","description":"List events for a specific trigger.","operationId":"trigger_events_sftp_triggers__trigger_id__events_get","parameters":[{"name":"trigger_id","in":"path","required":true,"schema":{"type":"integer","title":"Trigger Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Triggers"}},"/sftp/users/{user_id}/lifespan":{"post":{"tags":["sftp"],"summary":"Create Lifespan Rule","description":"Create a lifespan rule for a user's folder.\n\nBody: {\"folder\": \"processed\", \"retention_days\": 7, \"is_active\": true, \"notes\": \"...\"}","operationId":"create_lifespan_rule_sftp_users__user_id__lifespan_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Lifespan"},"get":{"tags":["sftp"],"summary":"List Lifespan Rules","description":"List lifespan rules for a user.","operationId":"list_lifespan_rules_sftp_users__user_id__lifespan_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Lifespan"}},"/sftp/users/{user_id}/lifespan/defaults":{"post":{"tags":["sftp"],"summary":"Create Default Lifespan Rules","description":"Create default lifespan rules: processed (7d), failed (7d), inbox (7d disabled).","operationId":"create_default_lifespan_rules_sftp_users__user_id__lifespan_defaults_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Lifespan"}},"/sftp/lifespan/{rule_id}":{"patch":{"tags":["sftp"],"summary":"Update Lifespan Rule","description":"Update a lifespan rule.","operationId":"update_lifespan_rule_sftp_lifespan__rule_id__patch","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Lifespan"},"delete":{"tags":["sftp"],"summary":"Delete Lifespan Rule","description":"Delete a lifespan rule and its event history.","operationId":"delete_lifespan_rule_sftp_lifespan__rule_id__delete","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Lifespan"}},"/sftp/lifespan/{rule_id}/events":{"get":{"tags":["sftp"],"summary":"Lifespan Events","description":"View deletion history for a lifespan rule.","operationId":"lifespan_events_sftp_lifespan__rule_id__events_get","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","title":"Rule Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Lifespan"}},"/scheduler/jobs":{"post":{"tags":["scheduler"],"summary":"Create Scheduled Job","description":"Create a new scheduled job.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Job created',\n    'job': { id, name, job_type, schedule_type, status, ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"create_scheduled_job_scheduler_jobs_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledJobCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Jobs"},"get":{"tags":["scheduler"],"summary":"List Core Scheduled Jobs","description":"List scheduled jobs with optional filters.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'jobs': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"list_core_scheduled_jobs_scheduler_jobs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["pending","running","completed","failed","paused"],"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active flag","title":"Is Active"},"description":"Filter by active flag"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Limit number of rows","default":100,"title":"Limit"},"description":"Limit number of rows"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Jobs"}},"/scheduler/jobs/pending":{"get":{"tags":["scheduler"],"summary":"List Pending Jobs","description":"List all pending jobs, whether due or not.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'jobs': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"list_pending_jobs_scheduler_jobs_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"x-group":"Jobs"}},"/scheduler/jobs/running":{"get":{"tags":["scheduler"],"summary":"List Running Jobs","description":"List all currently running jobs with lock info.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'jobs': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"list_running_jobs_scheduler_jobs_running_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Jobs"}},"/scheduler/jobs/{job_id}":{"get":{"tags":["scheduler"],"summary":"Get Scheduled Job","description":"Get a single scheduled job by ID.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'job': { ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_scheduled_job_scheduler_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Jobs"},"put":{"tags":["scheduler"],"summary":"Update Scheduled Job","description":"Update a scheduled job. Only non-null fields are changed.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Job updated',\n    'job': { ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"update_scheduled_job_scheduler_jobs__job_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledJobUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Jobs"},"delete":{"tags":["scheduler"],"summary":"Delete Scheduled Job","description":"Delete a scheduled job (hard delete). Cascades to runs.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Job deleted'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"delete_scheduled_job_scheduler_jobs__job_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Jobs"}},"/scheduler/jobs/{job_id}/pause":{"post":{"tags":["scheduler"],"summary":"Pause Scheduled Job","description":"Pause a scheduled job.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Job paused'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"pause_scheduled_job_scheduler_jobs__job_id__pause_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/scheduler/jobs/{job_id}/resume":{"post":{"tags":["scheduler"],"summary":"Resume Scheduled Job","description":"Resume a paused scheduled job.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Job resumed'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"resume_scheduled_job_scheduler_jobs__job_id__resume_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/scheduler/jobs/{job_id}/trigger":{"post":{"tags":["scheduler"],"summary":"Trigger Scheduled Job","description":"Manually trigger a job by setting next_run_at to NOW.\nThe worker picks it up on its next cycle.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Job triggered'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"trigger_scheduled_job_scheduler_jobs__job_id__trigger_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/scheduler/jobs/{job_id}/recover":{"post":{"tags":["scheduler"],"summary":"Recover Stuck Job","description":"Recover a stuck job safely.\n    - Finds any running runs for this job and marks them as failed with recovery note\n    - Sets finished_at and computes duration\n    - Clears the lock on the parent job\n    - Resets the job to pending with next_run_at computed from schedule_type\n    - Leaves full audit trail\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Job recovered',\n    'recovered_runs': count,\n    'job': { status, next_run_at, locked_by, ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"recover_stuck_job_scheduler_jobs__job_id__recover_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/scheduler/jobs/{job_id}/runs":{"get":{"tags":["scheduler"],"summary":"List Job Runs","description":"List execution runs for a specific job.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'runs': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"list_job_runs_scheduler_jobs__job_id__runs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"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"}}}}},"x-group":"Runs"}},"/scheduler/runs/{run_id}":{"get":{"tags":["scheduler"],"summary":"Get Scheduled Job Run","description":"Get a single run by ID.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'run': { ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_scheduled_job_run_scheduler_runs__run_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Runs"},"delete":{"tags":["scheduler"],"summary":"Delete Scheduled Job Run","description":"Delete a single run by ID.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Run {run_id} deleted'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"delete_scheduled_job_run_scheduler_runs__run_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Runs"}},"/scheduler/workers":{"get":{"tags":["scheduler"],"summary":"List Scheduler Workers","description":"List scheduler workers and heartbeat data.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'workers': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"list_scheduler_workers_scheduler_workers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Infrastructure"}},"/scheduler/queue":{"get":{"tags":["scheduler"],"summary":"Get Queue Snapshot","description":"Show jobs that are due and ready to be claimed.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'queue': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_queue_snapshot_scheduler_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Infrastructure"}},"/scheduler/monitor/failures":{"get":{"tags":["scheduler"],"summary":"Get Failed Jobs","description":"Jobs that have failed or are retrying.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'jobs': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_failed_jobs_scheduler_monitor_failures_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Monitoring"}},"/scheduler/monitor/missed":{"get":{"tags":["scheduler"],"summary":"Get Missed Schedules","description":"Jobs that should have run but haven't been claimed (overdue > 5 min).\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'jobs': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_missed_schedules_scheduler_monitor_missed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Monitoring"}},"/scheduler/monitor/stuck":{"get":{"tags":["scheduler"],"summary":"Get Stuck Jobs","description":"Jobs stuck in running state for over 10 minutes (possible ghost locks).\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'jobs': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_stuck_jobs_scheduler_monitor_stuck_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Monitoring"}},"/scheduler/monitor/backlog":{"get":{"tags":["scheduler"],"summary":"Get Queue Backlog","description":"Queue backlog summary: pending count, due count, oldest age.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'backlog': { pending_total, due_now, running, oldest_due_seconds }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_queue_backlog_scheduler_monitor_backlog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Monitoring"}},"/scheduler/monitor/workers":{"get":{"tags":["scheduler"],"summary":"Get Unhealthy Workers","description":"Workers with stale heartbeats (> 5 min) or stopped/dead status.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'workers': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_unhealthy_workers_scheduler_monitor_workers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Monitoring"}},"/scheduler/test_lifecycle":{"post":{"tags":["scheduler"],"summary":"Test Lifecycle","description":"End-to-end test of the scheduler lifecycle.\n    - Creates a test job due NOW\n    - Claims it atomically\n    - Creates a run record\n    - Simulates work (100ms)\n    - Marks run and job as success\n    - Returns full audit trail\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Lifecycle test passed',\n    'steps': { ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e),\n    'failed_at': step_name\n}","operationId":"test_lifecycle_scheduler_test_lifecycle_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}],"x-group":"Testing"}},"/workers/":{"get":{"tags":["workers"],"summary":"List Workers","description":"List all scheduler workers.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'workers': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"list_workers_workers__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["starting","running","stopped","dead"],"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"post":{"tags":["workers"],"summary":"Create Worker","description":"Register a new worker.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Worker created',\n    'worker': { id, worker_name, hostname, pid, status, ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"create_worker_workers__post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkerCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"}},"/workers/{worker_id}":{"get":{"tags":["workers"],"summary":"Get Worker","description":"Get a single worker by ID.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'worker': { ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_worker_workers__worker_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"integer","title":"Worker Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"put":{"tags":["workers"],"summary":"Update Worker","description":"Update a worker. Only non-null fields are changed.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Worker updated',\n    'worker': { ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"update_worker_workers__worker_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"integer","title":"Worker Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkerUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"},"delete":{"tags":["workers"],"summary":"Delete Worker","description":"Delete a worker (hard delete).\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Worker deleted'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"delete_worker_workers__worker_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"integer","title":"Worker Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"CRUD"}},"/workers/{worker_id}/heartbeat":{"post":{"tags":["workers"],"summary":"Worker Heartbeat","description":"Update a worker's heartbeat timestamp and set status to running.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Heartbeat recorded'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"worker_heartbeat_workers__worker_id__heartbeat_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"integer","title":"Worker Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/workers/{worker_id}/restart":{"post":{"tags":["workers"],"summary":"Restart Worker","description":"Request a worker restart via the supervisor.\nSets status to 'starting' so the supervisor kills and respawns the child.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Worker restart requested'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"restart_worker_workers__worker_id__restart_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"integer","title":"Worker Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/workers/{worker_id}/stop":{"post":{"tags":["workers"],"summary":"Stop Worker","description":"Mark a worker as stopped.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Worker stopped'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"stop_worker_workers__worker_id__stop_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"integer","title":"Worker Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Actions"}},"/supervisor/status":{"get":{"tags":["supervisor"],"summary":"Get Supervisor Status","description":"Get the current supervisor status.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'supervisor': { pid, hostname, status, started_at, last_poll_at, managed_workers }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_supervisor_status_supervisor_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/system/status":{"get":{"tags":["system_control"],"summary":"Get All Service Status","description":"Get status of all worker services.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'services': [ { service, state, uptime, pid, memory_mb, cpu_seconds, restarts } ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_all_service_status_system_status_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/system/status/{service}":{"get":{"tags":["system_control"],"summary":"Get Service Status","description":"Get detailed status of a specific worker service.\n    - goliath-scheduler\n    - goliath-scheduler-api\n    - goliath-sftp-lifespan\n    - goliath-sftp-watcher\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'service': { service, state, uptime, pid, memory_mb, cpu_seconds, restarts, ... }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_service_status_system_status__service__get","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","title":"Service"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/system/test_log/{level}":{"post":{"tags":["system_control"],"summary":"Test Log Event","description":"Trigger a log event at a specific level for testing.\n    - Allowed levels: debug, info, warning, error, critical\n    - The message appears in both console and api.log\n    - Use /logs/goliath-scheduler-api/stream to watch it arrive in real-time\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'Log event triggered',\n    'level': 'warning',\n    'message': 'Test log event from API'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"test_log_event_system_test_log__level__post","parameters":[{"name":"level","in":"path","required":true,"schema":{"type":"string","title":"Level"}},{"name":"message","in":"query","required":false,"schema":{"type":"string","default":"Test log event from API","title":"Message"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/system/{service}/{action}":{"post":{"tags":["system_control"],"summary":"Control Service","description":"Start, stop, or restart a worker service.\n    - Allowed services: goliath-scheduler, goliath-scheduler-api, goliath-sftp-lifespan, goliath-sftp-watcher\n    - Allowed actions: start, stop, restart\n    - Requires sudoers rule (see README)\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'msg': 'goliath-scheduler restarted',\n    'service': 'goliath-scheduler',\n    'action': 'restart',\n    'state': 'active',\n    'sub_state': 'running'\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"control_service_system__service___action__post","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","title":"Service"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs/nginx/access":{"get":{"tags":["logs"],"summary":"Get Nginx Access Logs","description":"Get the last N lines from the nginx access log.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'lines': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_nginx_access_logs_logs_nginx_access_get","parameters":[{"name":"lines","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Number of lines to return","default":50,"title":"Lines"},"description":"Number of lines to return"},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs/nginx/error":{"get":{"tags":["logs"],"summary":"Get Nginx Error Logs","description":"Get the last N lines from the nginx error log.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'total': count,\n    'lines': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_nginx_error_logs_logs_nginx_error_get","parameters":[{"name":"lines","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Number of lines to return","default":50,"title":"Lines"},"description":"Number of lines to return"},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs/nginx/access/stream":{"get":{"tags":["logs"],"summary":"Stream Nginx Access Logs","description":"SSE stream of real-time nginx access logs.\nConnect with EventSource in the browser.","operationId":"stream_nginx_access_logs_logs_nginx_access_stream_get","parameters":[{"name":"lines","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Initial lines to load","default":50,"title":"Lines"},"description":"Initial lines to load"},{"name":"api_key","in":"query","required":false,"schema":{"type":"string","description":"API key (for SSE/EventSource which cannot send headers)","title":"Api Key"},"description":"API key (for SSE/EventSource which cannot send headers)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs/nginx/error/stream":{"get":{"tags":["logs"],"summary":"Stream Nginx Error Logs","description":"SSE stream of real-time nginx error logs.\nConnect with EventSource in the browser.","operationId":"stream_nginx_error_logs_logs_nginx_error_stream_get","parameters":[{"name":"lines","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Initial lines to load","default":50,"title":"Lines"},"description":"Initial lines to load"},{"name":"api_key","in":"query","required":false,"schema":{"type":"string","description":"API key (for SSE/EventSource which cannot send headers)","title":"Api Key"},"description":"API key (for SSE/EventSource which cannot send headers)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs/{service}":{"get":{"tags":["logs"],"summary":"Get Service Logs","description":"Get the last N lines from a service's journal log.\n    - goliath-scheduler\n    - goliath-scheduler-api\n    - goliath-sftp-lifespan\n    - goliath-sftp-watcher\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'service': 'goliath-scheduler',\n    'total': count,\n    'lines': [ ... ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_service_logs_logs__service__get","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","title":"Service"}},{"name":"lines","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Number of lines to return","default":50,"title":"Lines"},"description":"Number of lines to return"},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs/{service}/stream":{"get":{"tags":["logs"],"summary":"Stream Service Logs","description":"SSE stream of real-time logs from a service journal.\n\nConnect with EventSource in the browser:\n\n    const es = new EventSource('/logs/goliath-scheduler/stream?lines=50&api_key=xxx');\n    es.onmessage = (e) => console.log(e.data);\n    es.onerror = () => console.log('reconnecting...');\n    // To stop: es.close();\n\nEvents are sent as:\n    data: 2026-04-02T10:00:00+0000 goliath-scheduler[1234]: message here\n\nKeepalive comments sent every 30s to prevent timeout.","operationId":"stream_service_logs_logs__service__stream_get","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","title":"Service"}},{"name":"lines","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Initial lines to load","default":50,"title":"Lines"},"description":"Initial lines to load"},{"name":"api_key","in":"query","required":false,"schema":{"type":"string","description":"API key (for SSE/EventSource which cannot send headers)","title":"Api Key"},"description":"API key (for SSE/EventSource which cannot send headers)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/diags/endpoint_list":{"get":{"tags":["diags"],"summary":"Specs","description":"See whats up. What can you do with this thing?\n    - see awesomeness\n    - find cool stuff\n    - maybe learn something\n\nsuccess response:\n{\n    \"error\": 0,\n    \"success\": True,\n    \"total_endpoints\": len(routes),\n    \"endpoints\": routes,\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"specs_diags_endpoint_list_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/diags/dependencies":{"get":{"tags":["diags"],"summary":"Get Dependencies","description":"Whats making me tick?\n\nsuccess response:\n{\n    \"error\": 0,\n    \"success\": True,\n    \"deps\": data\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_dependencies_diags_dependencies_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/diags/cpu":{"get":{"tags":["diags"],"summary":"Get Cpu Info","description":"CPU usage, load averages, and per-core breakdown.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'cpu': { cores, usage_percent, load_1m, load_5m, load_15m, per_cpu }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_cpu_info_diags_cpu_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/diags/memory":{"get":{"tags":["diags"],"summary":"Get Memory Info","description":"Memory and swap usage.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'memory': { total_mb, available_mb, used_mb, free_mb, usage_percent, buffers_mb, cached_mb, swap_total_mb, swap_used_mb }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_memory_info_diags_memory_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/diags/disk":{"get":{"tags":["diags"],"summary":"Get Disk Info","description":"Disk usage for all mounted filesystems.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'disks': [ { device, mount, filesystem, total_gb, used_gb, free_gb, usage_percent } ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_disk_info_diags_disk_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/diags/uptime":{"get":{"tags":["diags"],"summary":"Get System Uptime","description":"System uptime, boot time, hostname, and kernel info.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'system': { hostname, uptime, uptime_seconds, boot_time, kernel, arch }\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_system_uptime_diags_uptime_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/diags/network":{"get":{"tags":["diags"],"summary":"Get Network Info","description":"Network interfaces with IP addresses and traffic stats.\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'interfaces': [ { name, ip_addresses, rx_mb, tx_mb, rx_packets, tx_packets, rx_errors, tx_errors } ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_network_info_diags_network_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/alerts/setup":{"post":{"tags":["alerts"],"summary":"Setup Tables","description":"Create all alert tables and indexes idempotently.","operationId":"setup_tables_alerts_setup_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Setup"}},"/alerts/definitions":{"post":{"tags":["alerts"],"summary":"Create Definition","description":"Create a new alert definition, its scheduled evaluation job, and\nauto-subscribe the creator as escalation-level-1.","operationId":"create_definition_alerts_definitions_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertDefinitionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Definitions"},"get":{"tags":["alerts"],"summary":"List Definitions","description":"List alert definitions with optional filters.","operationId":"list_definitions_alerts_definitions_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"created_by","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Definitions"}},"/alerts/definitions/{def_id}":{"get":{"tags":["alerts"],"summary":"Get Definition","description":"Get a single definition with its subscribers.","operationId":"get_definition_alerts_definitions__def_id__get","parameters":[{"name":"def_id","in":"path","required":true,"schema":{"type":"integer","title":"Def Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Definitions"},"put":{"tags":["alerts"],"summary":"Update Definition","description":"Update an alert definition (partial).","operationId":"update_definition_alerts_definitions__def_id__put","parameters":[{"name":"def_id","in":"path","required":true,"schema":{"type":"integer","title":"Def Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertDefinitionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Definitions"},"delete":{"tags":["alerts"],"summary":"Delete Definition","description":"Soft-delete: deactivate the definition and its scheduled job.","operationId":"delete_definition_alerts_definitions__def_id__delete","parameters":[{"name":"def_id","in":"path","required":true,"schema":{"type":"integer","title":"Def Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Definitions"}},"/alerts/definitions/{def_id}/subscribers":{"post":{"tags":["alerts"],"summary":"Add Subscriber","description":"Add a subscriber to an alert definition.","operationId":"add_subscriber_alerts_definitions__def_id__subscribers_post","parameters":[{"name":"def_id","in":"path","required":true,"schema":{"type":"integer","title":"Def Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriberCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Subscribers"},"get":{"tags":["alerts"],"summary":"List Subscribers","description":"List subscribers for an alert definition.","operationId":"list_subscribers_alerts_definitions__def_id__subscribers_get","parameters":[{"name":"def_id","in":"path","required":true,"schema":{"type":"integer","title":"Def Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Subscribers"}},"/alerts/definitions/{def_id}/subscribers/{sub_id}":{"delete":{"tags":["alerts"],"summary":"Remove Subscriber","description":"Remove (soft-delete) a subscriber.","operationId":"remove_subscriber_alerts_definitions__def_id__subscribers__sub_id__delete","parameters":[{"name":"def_id","in":"path","required":true,"schema":{"type":"integer","title":"Def Id"}},{"name":"sub_id","in":"path","required":true,"schema":{"type":"integer","title":"Sub Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Subscribers"}},"/alerts/fire":{"post":{"tags":["alerts"],"summary":"Fire Alert","description":"Manually fire an alert — creates an instance and queues initial\nnotifications.  Also called internally by the alert evaluation handler.","operationId":"fire_alert_alerts_fire_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertInstanceCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Fire"}},"/alerts/instances":{"get":{"tags":["alerts"],"summary":"List Instances","description":"List alert instances with optional filters.","operationId":"list_instances_alerts_instances_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"definition_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Definition Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Instances"}},"/alerts/instances/{instance_id}":{"get":{"tags":["alerts"],"summary":"Get Instance","description":"Get an instance with its notification log.","operationId":"get_instance_alerts_instances__instance_id__get","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Instances"}},"/alerts/instances/{instance_id}/acknowledge":{"post":{"tags":["alerts"],"summary":"Acknowledge Instance","description":"Mark an instance as acknowledged — stops further escalation.","operationId":"acknowledge_instance_alerts_instances__instance_id__acknowledge_post","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertInstanceAcknowledge"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Instances"}},"/alerts/instances/{instance_id}/resolve":{"post":{"tags":["alerts"],"summary":"Resolve Instance","description":"Fully resolve an instance with a response.","operationId":"resolve_instance_alerts_instances__instance_id__resolve_post","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertInstanceResolve"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Instances"}},"/alerts/instances/{instance_id}/notifications":{"get":{"tags":["alerts"],"summary":"Instance Notifications","description":"Full notification history for an instance.","operationId":"instance_notifications_alerts_instances__instance_id__notifications_get","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Instances"}},"/alerts/inbound/email":{"post":{"tags":["alerts"],"summary":"Inbound Email","description":"Receive an inbound email (from SES webhook, IMAP poll, or manual test).\n\nExpected payload::\n\n    {\n        \"sender_email\": \"user@example.com\",\n        \"subject\": \"Re: [ALERT-42] WARNING: Refunds over $10\",\n        \"body_text\": \"Acknowledged, looking into it.\",\n        \"body_html\": null,\n        \"headers\": {\"In-Reply-To\": \"<abc@mail>\", ...}\n    }","operationId":"inbound_email_alerts_inbound_email_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Inbound"}},"/alerts/audit":{"get":{"tags":["alerts"],"summary":"Audit Log","description":"Query evaluation log entries.","operationId":"audit_log_alerts_audit_get","parameters":[{"name":"definition_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Definition Id"}},{"name":"result","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Audit"}},"/email/folders":{"get":{"tags":["email"],"summary":"List Folders","description":"List all mailbox folders (INBOX, Sent, Drafts, Spam, Trash, etc.).","operationId":"list_folders_email_folders_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Folders"}},"/email/folders/{folder}/stats":{"get":{"tags":["email"],"summary":"Folder Stats","description":"Get message counts for a folder (total, unseen, recent).","operationId":"folder_stats_email_folders__folder__stats_get","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string","title":"Folder"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Folders"}},"/email/folders/{folder}/messages":{"get":{"tags":["email"],"summary":"List Messages","description":"List messages in a folder (paginated, headers only, newest first).","operationId":"list_messages_email_folders__folder__messages_get","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string","title":"Folder"}},{"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":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Messages"}},"/email/folders/{folder}/messages/{uid}":{"get":{"tags":["email"],"summary":"Get Message","description":"Get full message content by UID (headers, bodies, attachment list).","operationId":"get_message_email_folders__folder__messages__uid__get","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string","title":"Folder"}},{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Messages"},"delete":{"tags":["email"],"summary":"Delete Message","description":"Delete a message (flag as deleted + expunge).","operationId":"delete_message_email_folders__folder__messages__uid__delete","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string","title":"Folder"}},{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Messages"}},"/email/folders/{folder}/messages/{uid}/move":{"post":{"tags":["email"],"summary":"Move Message","description":"Move a message to another folder.","operationId":"move_message_email_folders__folder__messages__uid__move_post","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string","title":"Folder"}},{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Messages"}},"/email/folders/{folder}/messages/{uid}/flag":{"post":{"tags":["email"],"summary":"Flag Message","description":"Set or remove flags on a message (e.g., \\\\Seen, \\\\Flagged).","operationId":"flag_message_email_folders__folder__messages__uid__flag_post","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string","title":"Folder"}},{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Messages"}},"/email/search":{"get":{"tags":["email"],"summary":"Search Messages","description":"Search messages across a folder.","operationId":"search_messages_email_search_get","parameters":[{"name":"folder","in":"query","required":false,"schema":{"type":"string","default":"INBOX","title":"Folder"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"DD-Mon-YYYY","title":"Since"},"description":"DD-Mon-YYYY"},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"DD-Mon-YYYY","title":"Before"},"description":"DD-Mon-YYYY"},{"name":"body","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"}},{"name":"unseen_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unseen Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-group":"Search"}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/db_health":{"get":{"summary":"Db Health","description":"Database connectivity check.","operationId":"db_health_db_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/login":{"post":{"summary":"Auth Login","description":"Login with user credentials. Returns user info and API key.","operationId":"auth_login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/services":{"get":{"summary":"Get Service Health","description":"Check the health and uptime of worker services.\n    - goliath-scheduler\n    - goliath-scheduler-api\n    - goliath-sftp-lifespan\n    - goliath-sftp-watcher\n\nsuccess response:\n{\n    'error': 0,\n    'success': True,\n    'services': [ { service, state, uptime, ... } ]\n}\n\nfailure response:\n{\n    'error': 1,\n    'success': False,\n    'msg': str(e)\n}","operationId":"get_service_health_services_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","description":"API key for authentication","title":"X-Api-Key"},"description":"API key for authentication"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AlertCondition":{"properties":{"metric":{"type":"string","minLength":1,"title":"Metric"},"operator":{"type":"string","enum":["gt","gte","lt","lte","eq","neq","between","pct_increase","pct_decrease"],"title":"Operator"},"threshold":{"anyOf":[{"type":"number"},{"items":{"type":"number"},"type":"array"}],"title":"Threshold","description":"Single value or [low, high] for 'between'"},"time_window":{"$ref":"#/components/schemas/TimeWindow"},"consecutive":{"type":"integer","minimum":1.0,"title":"Consecutive","default":1},"aggregation":{"type":"string","enum":["sum","avg","count","min","max","distinct_count"],"title":"Aggregation","default":"sum"},"group_by":{"items":{"type":"string"},"type":"array","title":"Group By"},"filters":{"additionalProperties":{"items":{},"type":"array"},"type":"object","title":"Filters"}},"type":"object","required":["metric","operator","threshold"],"title":"AlertCondition","description":"Generic condition protocol that lambdas/alert handlers parse.\n\nExample::\n\n    {\n        \"metric\": \"refund_total\",\n        \"operator\": \"gt\",\n        \"threshold\": 10.00,\n        \"time_window\": {\"unit\": \"day\", \"value\": 1},\n        \"consecutive\": 3,\n        \"aggregation\": \"sum\",\n        \"group_by\": [\"store_id\"],\n        \"filters\": {\"cashier_id\": [101, 102]}\n    }"},"AlertDefinitionCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"type":"string","title":"Category","description":"refunds, sales, inventory, cashier_anomaly, custom"},"condition":{"$ref":"#/components/schemas/AlertCondition"},"scope":{"$ref":"#/components/schemas/AlertScope"},"severity":{"type":"string","enum":["info","warning","critical"],"title":"Severity","default":"warning"},"is_active":{"type":"boolean","title":"Is Active","default":true},"requires_response":{"type":"boolean","title":"Requires Response","default":false},"response_timeout_minutes":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Response Timeout Minutes","description":"Ignored when requires_response is False"},"max_escalation_level":{"type":"integer","minimum":1.0,"title":"Max Escalation Level","default":1},"cooldown_minutes":{"type":"integer","minimum":0.0,"title":"Cooldown Minutes","default":60},"schedule_type":{"type":"string","enum":["once","hourly","daily","weekly","monthly"],"title":"Schedule Type","default":"daily"},"created_by":{"type":"integer","title":"Created By"}},"type":"object","required":["name","category","condition","scope","created_by"],"title":"AlertDefinitionCreate"},"AlertDefinitionUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"condition":{"anyOf":[{"$ref":"#/components/schemas/AlertCondition"},{"type":"null"}]},"scope":{"anyOf":[{"$ref":"#/components/schemas/AlertScope"},{"type":"null"}]},"severity":{"anyOf":[{"type":"string","enum":["info","warning","critical"]},{"type":"null"}],"title":"Severity"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"requires_response":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requires Response"},"response_timeout_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Timeout Minutes"},"max_escalation_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Escalation Level"},"cooldown_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cooldown Minutes"},"schedule_type":{"anyOf":[{"type":"string","enum":["once","hourly","daily","weekly","monthly"]},{"type":"null"}],"title":"Schedule Type"}},"type":"object","title":"AlertDefinitionUpdate"},"AlertInstanceAcknowledge":{"properties":{"acknowledged_by":{"type":"integer","title":"Acknowledged By"}},"type":"object","required":["acknowledged_by"],"title":"AlertInstanceAcknowledge"},"AlertInstanceCreate":{"properties":{"alert_definition_id":{"type":"integer","title":"Alert Definition Id"},"trigger_data":{"additionalProperties":true,"type":"object","title":"Trigger Data"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"}},"type":"object","required":["alert_definition_id"],"title":"AlertInstanceCreate","description":"Fired by a lambda / handler or manually via the API."},"AlertInstanceResolve":{"properties":{"resolved_by":{"type":"integer","title":"Resolved By"},"response_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Text"},"response_source":{"type":"string","title":"Response Source","default":"portal"}},"type":"object","required":["resolved_by"],"title":"AlertInstanceResolve"},"AlertScope":{"properties":{"type":{"type":"string","enum":["stores","cashiers","company"],"title":"Type","default":"stores"},"ids":{"items":{"type":"integer"},"type":"array","title":"Ids"},"group_ids":{"items":{"type":"integer"},"type":"array","title":"Group Ids"},"cashier_ids":{"items":{"type":"integer"},"type":"array","title":"Cashier Ids"},"company_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Company Id"}},"type":"object","title":"AlertScope","description":"Defines which stores / groups / cashiers the alert targets."},"Body_preview_csv_pipeline_csv_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"delimiter":{"type":"string","title":"Delimiter","default":","},"encoding":{"type":"string","title":"Encoding","default":"utf-8"},"skip_rows":{"type":"integer","title":"Skip Rows","default":0},"pipeline_name":{"type":"string","title":"Pipeline Name","default":""}},"type":"object","required":["file"],"title":"Body_preview_csv_pipeline_csv_preview_post"},"Body_run_pipeline_pipeline__pipeline_id__run_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"username":{"type":"string","title":"Username","default":"pipeline"}},"type":"object","required":["file"],"title":"Body_run_pipeline_pipeline__pipeline_id__run_post"},"Body_upload_csv_pipeline_csv_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"pipeline_name":{"type":"string","title":"Pipeline Name"}},"type":"object","required":["file","pipeline_name"],"title":"Body_upload_csv_pipeline_csv_upload_post"},"Body_upload_lambda_lambda_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"}},"type":"object","required":["file"],"title":"Body_upload_lambda_lambda_upload_post"},"Body_upload_s3_s3_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_s3_s3_upload_post"},"CalculatedColumn":{"properties":{"db_column":{"type":"string","title":"Db Column"},"db_type":{"type":"string","title":"Db Type","default":"TEXT"},"expression":{"type":"string","title":"Expression","default":""}},"type":"object","required":["db_column"],"title":"CalculatedColumn"},"ColumnMapping":{"properties":{"csv_column":{"type":"string","title":"Csv Column"},"db_column":{"type":"string","title":"Db Column"},"db_type":{"type":"string","title":"Db Type","default":"TEXT"},"transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transform"},"nullable":{"type":"boolean","title":"Nullable","default":true}},"additionalProperties":true,"type":"object","required":["csv_column","db_column"],"title":"ColumnMapping"},"CsvDialect":{"properties":{"delimiter":{"type":"string","title":"Delimiter","default":","},"quotechar":{"type":"string","title":"Quotechar","default":"\""},"encoding":{"type":"string","title":"Encoding","default":"utf-8"},"has_header":{"type":"boolean","title":"Has Header","default":true},"skip_rows":{"type":"integer","title":"Skip Rows","default":0}},"type":"object","title":"CsvDialect"},"FlagRequest":{"properties":{"flags":{"items":{"type":"string"},"type":"array","title":"Flags"},"remove":{"type":"boolean","title":"Remove","default":false}},"type":"object","required":["flags"],"title":"FlagRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LinkTriggerRequest":{"properties":{"sftp_trigger_id":{"type":"integer","title":"Sftp Trigger Id"}},"type":"object","required":["sftp_trigger_id"],"title":"LinkTriggerRequest"},"MoveRequest":{"properties":{"dest_folder":{"type":"string","title":"Dest Folder"}},"type":"object","required":["dest_folder"],"title":"MoveRequest"},"PipelineCodeUpdateRequest":{"properties":{"handler_code":{"type":"string","title":"Handler Code"}},"type":"object","required":["handler_code"],"title":"PipelineCodeUpdateRequest"},"PipelineCreateRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"target_table":{"type":"string","title":"Target Table"},"target_schema":{"type":"string","title":"Target Schema","default":"public"},"column_mappings":{"items":{"$ref":"#/components/schemas/ColumnMapping"},"type":"array","title":"Column Mappings"},"calculated_columns":{"items":{"$ref":"#/components/schemas/CalculatedColumn"},"type":"array","title":"Calculated Columns"},"custom_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Code"},"csv_dialect":{"$ref":"#/components/schemas/CsvDialect"},"sftp_trigger_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sftp Trigger Id"},"drop_table":{"type":"boolean","title":"Drop Table","default":false},"created_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By"}},"type":"object","required":["name","target_table"],"title":"PipelineCreateRequest"},"PipelineUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"target_table":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Table"},"target_schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Schema"},"column_mappings":{"anyOf":[{"items":{"$ref":"#/components/schemas/ColumnMapping"},"type":"array"},{"type":"null"}],"title":"Column Mappings"},"calculated_columns":{"anyOf":[{"items":{"$ref":"#/components/schemas/CalculatedColumn"},"type":"array"},{"type":"null"}],"title":"Calculated Columns"},"custom_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Code"},"csv_dialect":{"anyOf":[{"$ref":"#/components/schemas/CsvDialect"},{"type":"null"}]},"sftp_trigger_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sftp Trigger Id"},"drop_table":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Drop Table"},"created_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By"}},"type":"object","title":"PipelineUpdateRequest"},"ScheduledJobCreateRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Enter the job name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Enter the job description"},"job_type":{"type":"string","title":"Job Type","description":"Enter the job type"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Enter the job payload as JSON"},"schedule_type":{"type":"string","enum":["once","hourly","daily","weekly","monthly"],"title":"Schedule Type","description":"Enter the schedule type"},"next_run_at":{"type":"string","format":"date-time","title":"Next Run At","description":"Enter the next run datetime"},"max_retries":{"type":"integer","minimum":0.0,"title":"Max Retries","description":"Enter the max retries","default":0},"retry_timeout":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Retry Timeout","description":"Seconds to wait before retrying a failed job"},"timeout_seconds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Timeout Seconds","description":"Max seconds a job is allowed to run before being timed out"},"sns_topic_arn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sns Topic Arn","description":"SNS topic ARN for failure notifications"},"created_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By","description":"Enter the user id that created the job"},"rate_limit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Limit","description":"Rate limit e.g. '10/m', '100/h', '5/s'"}},"type":"object","required":["name","job_type","schedule_type","next_run_at"],"title":"ScheduledJobCreateRequest"},"ScheduledJobUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Enter the job name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Enter the job description"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload","description":"Enter the job payload as JSON"},"schedule_type":{"anyOf":[{"type":"string","enum":["once","hourly","daily","weekly","monthly"]},{"type":"null"}],"title":"Schedule Type","description":"Enter the schedule type"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At","description":"Enter the next run datetime"},"max_retries":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Retries","description":"Enter the max retries"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Set whether the job is active"},"sns_topic_arn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sns Topic Arn","description":"SNS topic ARN for failure notifications"},"rate_limit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Limit","description":"Rate limit e.g. '10/m', '100/h', '5/s'"}},"type":"object","title":"ScheduledJobUpdateRequest"},"SubscriberCreate":{"properties":{"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"email":{"type":"string","minLength":1,"title":"Email"},"channel":{"type":"string","enum":["email","sms","phone","webhook"],"title":"Channel","default":"email"},"escalation_level":{"type":"integer","minimum":1.0,"title":"Escalation Level","default":1},"notify_attempts":{"type":"integer","minimum":1.0,"title":"Notify Attempts","default":3},"notify_interval_minutes":{"type":"integer","minimum":1.0,"title":"Notify Interval Minutes","default":10}},"type":"object","required":["email"],"title":"SubscriberCreate"},"TimeWindow":{"properties":{"unit":{"type":"string","enum":["minute","hour","day","week","month"],"title":"Unit","default":"day"},"value":{"type":"integer","minimum":1.0,"title":"Value","default":1}},"type":"object","title":"TimeWindow"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkerCreateRequest":{"properties":{"worker_name":{"type":"string","title":"Worker Name","description":"Unique worker name"},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname","description":"Hostname where the worker runs"},"pid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pid","description":"Process ID"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Worker metadata as JSON"}},"type":"object","required":["worker_name"],"title":"WorkerCreateRequest"},"WorkerUpdateRequest":{"properties":{"worker_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worker Name","description":"Worker name"},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname","description":"Hostname"},"pid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pid","description":"Process ID"},"status":{"anyOf":[{"type":"string","enum":["starting","running","stopped","dead"]},{"type":"null"}],"title":"Status","description":"Worker status: starting, running, stopped, dead"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Worker metadata as JSON"}},"type":"object","title":"WorkerUpdateRequest"},"WorkflowCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"steps":{"items":{"$ref":"#/components/schemas/WorkflowStepCreate"},"type":"array","minItems":1,"title":"Steps"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"}},"type":"object","required":["name","steps"],"title":"WorkflowCreate"},"WorkflowStepCreate":{"properties":{"step_order":{"type":"integer","minimum":1.0,"title":"Step Order"},"step_type":{"type":"string","enum":["task","group","chord"],"title":"Step Type","default":"task"},"job_type":{"type":"string","title":"Job Type"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"depends_on":{"items":{"type":"integer"},"type":"array","title":"Depends On"},"on_failure":{"type":"string","enum":["stop","skip","retry"],"title":"On Failure","default":"stop"}},"type":"object","required":["step_order","job_type"],"title":"WorkflowStepCreate"},"WorkflowUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string","enum":["active","paused","archived"]},{"type":"null"}],"title":"Status"}},"type":"object","title":"WorkflowUpdate"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"auth/token"}}}}}}