{"openapi":"3.1.0","info":{"title":"FreyaEmulatorManager — Cluster Orchestrator & Unified Automation API","description":"Main API entry and Web Control Panel for managing DigitalOcean Android Emulator droplets and executing Snapchat UI automation actions.","version":"1.0.0"},"paths":{"/api/meta":{"get":{"summary":"Get Meta","operationId":"get_meta_api_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/docs-catalog":{"get":{"summary":"Get Docs Catalog","operationId":"get_docs_catalog_api_docs_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/actions":{"get":{"summary":"Get Supported Actions","operationId":"get_supported_actions_api_actions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/actions/{action_id}":{"get":{"summary":"Get Action Status Global","operationId":"get_action_status_global_api_actions__action_id__get","parameters":[{"name":"action_id","in":"path","required":true,"schema":{"type":"string","title":"Action Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cluster/workers":{"get":{"summary":"List Cluster Workers","operationId":"list_cluster_workers_api_cluster_workers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/cluster/workers/sync":{"post":{"summary":"Sync Cluster Workers","operationId":"sync_cluster_workers_api_cluster_workers_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/cluster/workers/provision":{"post":{"summary":"Provision Cluster Worker","operationId":"provision_cluster_worker_api_cluster_workers_provision_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionWorkerRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cluster/workers/register":{"post":{"summary":"Register Cluster Worker","operationId":"register_cluster_worker_api_cluster_workers_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterWorkerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cluster/workers/{worker_id}/drain":{"post":{"summary":"Drain Cluster Worker","operationId":"drain_cluster_worker_api_cluster_workers__worker_id__drain_post","parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"string","title":"Worker Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cluster/workers/{worker_id}/max-emulators":{"post":{"summary":"Update Worker Max Emulators","operationId":"update_worker_max_emulators_api_cluster_workers__worker_id__max_emulators_post","parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"string","title":"Worker Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMaxEmulatorsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logs":{"get":{"summary":"Get Database Action Logs","operationId":"get_database_action_logs_api_logs_get","parameters":[{"name":"emulator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emulator Id"}},{"name":"action_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Id"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unknown-pages":{"get":{"summary":"Get Database Unknown Pages","operationId":"get_database_unknown_pages_api_unknown_pages_get","parameters":[{"name":"emulator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emulator Id"}},{"name":"action_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Id"}},{"name":"include_xml","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Xml"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unknown-pages/{unknown_id}":{"get":{"summary":"Get Database Unknown Page Detail","operationId":"get_database_unknown_page_detail_api_unknown_pages__unknown_id__get","parameters":[{"name":"unknown_id","in":"path","required":true,"schema":{"type":"integer","title":"Unknown Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cluster/workers/{worker_id}":{"delete":{"summary":"Delete Cluster Worker","operationId":"delete_cluster_worker_api_cluster_workers__worker_id__delete","parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"string","title":"Worker Id"}},{"name":"destroy_droplet","in":"query","required":false,"schema":{"type":"boolean","description":"Destroy the underlying DigitalOcean droplet","default":true,"title":"Destroy Droplet"},"description":"Destroy the underlying DigitalOcean droplet"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cluster/update-workers":{"post":{"summary":"Update All Cluster Workers","operationId":"update_all_cluster_workers_api_cluster_update_workers_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/UpdateWorkersRequest"},{"type":"null"}],"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cluster/update-manager":{"post":{"summary":"Update Manager Self","operationId":"update_manager_self_api_cluster_update_manager_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/emulators":{"get":{"summary":"List Emulators","operationId":"list_emulators_api_emulators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Emulator","operationId":"create_emulator_api_emulators_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEmulatorRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/emulators/{emu_id}":{"get":{"summary":"Get Emulator","operationId":"get_emulator_api_emulators__emu_id__get","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Emulator","operationId":"delete_emulator_api_emulators__emu_id__delete","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/emulators/{emu_id}/message":{"get":{"summary":"Get Emulator Message","operationId":"get_emulator_message_api_emulators__emu_id__message_get","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/emulators/{emu_id}/delete":{"post":{"summary":"Delete Emulator Post","operationId":"delete_emulator_post_api_emulators__emu_id__delete_post","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/emulators/{emu_id}/shell":{"post":{"summary":"Run Shell Command","operationId":"run_shell_command_api_emulators__emu_id__shell_post","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShellCommandRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/emulators/{emu_id}/screenshot":{"get":{"summary":"Get Emulator Screenshot","operationId":"get_emulator_screenshot_api_emulators__emu_id__screenshot_get","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/emulators/{emu_id}/input":{"post":{"summary":"Send Emulator Input","operationId":"send_emulator_input_api_emulators__emu_id__input_post","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceInputRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/emulators/{emu_id}/actions":{"post":{"summary":"Execute Emulator Action","operationId":"execute_emulator_action_api_emulators__emu_id__actions_post","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteActionRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Emulator Actions","operationId":"list_emulator_actions_api_emulators__emu_id__actions_get","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/emulators/{emu_id}/actions/{action_id}":{"get":{"summary":"Get Emulator Action Status","operationId":"get_emulator_action_status_api_emulators__emu_id__actions__action_id__get","parameters":[{"name":"emu_id","in":"path","required":true,"schema":{"type":"string","title":"Emu Id"}},{"name":"action_id","in":"path","required":true,"schema":{"type":"string","title":"Action Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Index Page","operationId":"index_page__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs-page":{"get":{"summary":"Docs Ui Page","operationId":"docs_ui_page_docs_page_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"CreateEmulatorRequest":{"properties":{"apk":{"type":"string","minLength":1,"title":"Apk","description":"Direct download URL (or local path) for the APK","default":"http://89.34.17.131/Files/1430unpinned.apk"},"username":{"type":"string","minLength":1,"title":"Username","description":"Snapchat username whose session to load"},"android":{"type":"integer","title":"Android","description":"Android version: 14, 15, or 16","default":16},"profile":{"type":"string","minLength":1,"title":"Profile","description":"Saved device profile name (e.g. a52s)","default":"a52s"},"proxy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proxy","description":"Optional proxy host:port or host:port:user:pass","default":"68.183.65.77:37219:geelark:67016a3f075ce9d73f"},"headless":{"type":"boolean","title":"Headless","description":"Run without an emulator window (always true on Linux workers)","default":true},"worker_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worker Id","description":"Optional target worker ID (auto-selected if omitted)"}},"type":"object","required":["username"],"title":"CreateEmulatorRequest"},"DeviceInputRequest":{"properties":{"type":{"type":"string","title":"Type","description":"Input type: tap, swipe, text, key, or restart_app"},"x":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X","description":"X coordinate (0..1080) for tap"},"y":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Y","description":"Y coordinate (0..2400) for tap"},"x1":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X1","description":"Start X coordinate for swipe"},"y1":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Y1","description":"Start Y coordinate for swipe"},"x2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X2","description":"End X coordinate for swipe"},"y2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Y2","description":"End Y coordinate for swipe"},"duration_ms":{"type":"integer","maximum":5000.0,"minimum":50.0,"title":"Duration Ms","description":"Swipe duration in ms","default":300},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Text string to type"},"keycode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Keycode","description":"Android keycode (4=BACK, 3=HOME, 187=RECENTS, 66=ENTER, 67=BACKSPACE)"}},"type":"object","required":["type"],"title":"DeviceInputRequest"},"ExecuteActionRequest":{"properties":{"action":{"type":"string","minLength":1,"title":"Action","description":"Action name (e.g. ADD_FRIEND, WATCH_REELS, ...)"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Action parameters"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"},"nr_of_reels":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nr Of Reels"},"min_wait":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Wait"},"max_wait":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Wait"},"wait_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wait Time"}},"type":"object","required":["action"],"title":"ExecuteActionRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ProvisionWorkerRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Droplet hostname (auto-generated if omitted)"},"region":{"type":"string","title":"Region","description":"US DigitalOcean region (nyc1, nyc2, nyc3, sfo2, sfo3, atl1)","default":"nyc1"},"size":{"type":"string","title":"Size","description":"DigitalOcean droplet size slug","default":"s-8vcpu-32gb-amd"},"max_emulators":{"type":"integer","maximum":24.0,"minimum":1.0,"title":"Max Emulators","description":"Max concurrent emulators to schedule on this worker","default":7}},"type":"object","title":"ProvisionWorkerRequest"},"RegisterWorkerRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Human-readable worker name"},"url":{"type":"string","minLength":1,"title":"Url","description":"Base URL of worker (e.g. http://1.2.3.4:8000)"},"region":{"type":"string","title":"Region","description":"Region label","default":"nyc1"},"droplet_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Droplet Id","description":"Optional DigitalOcean Droplet ID"},"max_emulators":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Max Emulators","description":"Max concurrent emulators","default":2}},"type":"object","required":["name","url"],"title":"RegisterWorkerRequest"},"SetMaxEmulatorsRequest":{"properties":{"max_emulators":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Max Emulators","description":"Max concurrent emulators allowed on this worker"}},"type":"object","required":["max_emulators"],"title":"SetMaxEmulatorsRequest"},"ShellCommandRequest":{"properties":{"command":{"type":"string","minLength":1,"title":"Command","description":"adb shell command to execute"},"timeout":{"type":"integer","maximum":600.0,"minimum":1.0,"title":"Timeout","description":"Timeout in seconds","default":60}},"type":"object","required":["command"],"title":"ShellCommandRequest"},"UpdateWorkersRequest":{"properties":{"restart_service":{"type":"boolean","title":"Restart Service","description":"Whether to restart freya-worker systemd service after git pull (default false = hot-reload automation only)","default":false}},"type":"object","title":"UpdateWorkersRequest"},"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"}}}}