{"components":{"schemas":{"ApkeepSelectRequestDTO":{"properties":{"appName":{"maxLength":255,"title":"Appname","type":"string"},"appVersion":{"anyOf":[{"maxLength":50,"type":"string"},{"type":"null"}],"default":null,"title":"Appversion"},"packageId":{"maxLength":255,"title":"Packageid","type":"string"},"source":{"default":"apk-pure","maxLength":30,"title":"Source","type":"string"}},"required":["packageId","appName"],"title":"ApkeepSelectRequestDTO","type":"object"},"AppStatusDTO":{"properties":{"appInstalled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Appinstalled"},"appPid":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Apppid"},"appRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Apprunning"},"fuzzerRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Fuzzerrunning"},"instrumentationRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Instrumentationrunning"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"title":"AppStatusDTO","type":"object"},"ByokProviderKeyDTO":{"description":"API key configuration for a single BYOK provider.","properties":{"baseUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Custom API base URL (for OpenAI-compatible endpoints)","title":"Baseurl"},"contextLength":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Model context window size in tokens","title":"Contextlength"},"key":{"description":"API key for the provider","minLength":1,"title":"Key","type":"string"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Preferred model override for this provider","title":"Model"},"provider":{"description":"Provider name (e.g. anthropic, openai, google)","title":"Provider","type":"string"}},"required":["provider","key"],"title":"ByokProviderKeyDTO","type":"object"},"ByokProviderStatusDTO":{"description":"Status of a stored BYOK provider key (never returns the actual key).","properties":{"baseUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Baseurl"},"contextLength":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Contextlength"},"hasKey":{"title":"Haskey","type":"boolean"},"maskedKey":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Masked preview e.g. sk-ant-api03-vjN...gAA","title":"Maskedkey"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"provider":{"title":"Provider","type":"string"}},"required":["provider","hasKey"],"title":"ByokProviderStatusDTO","type":"object"},"ChainGenerationStatusDTO":{"description":"Status of ongoing chain generation.","properties":{"chains":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExploitChainDTO"},"type":"array"},{"type":"null"}],"default":null,"title":"Chains"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"status":{"description":"'pending', 'generating', 'done', or 'error'","title":"Status","type":"string"}},"required":["status"],"title":"ChainGenerationStatusDTO","type":"object"},"ChainListDTO":{"description":"List of exploit chains.","properties":{"chains":{"items":{"$ref":"#/components/schemas/ExploitChainDTO"},"title":"Chains","type":"array"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Status"}},"required":["chains"],"title":"ChainListDTO","type":"object"},"ClineApiKeyStatusDTO":{"properties":{"has_key":{"title":"Has Key","type":"boolean"},"masked_key":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Masked Key"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Model"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Provider"}},"required":["has_key"],"title":"ClineApiKeyStatusDTO","type":"object"},"ClineStatusDTO":{"properties":{"cline_enabled":{"default":true,"title":"Cline Enabled","type":"boolean"},"cline_ready":{"default":false,"title":"Cline Ready","type":"boolean"},"container_running":{"title":"Container Running","type":"boolean"},"device_ready":{"default":false,"title":"Device Ready","type":"boolean"},"device_state":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Device State"},"has_terminal_history":{"default":false,"title":"Has Terminal History","type":"boolean"},"token_budget":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Token Budget"},"tokens_remaining":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Tokens Remaining"},"tokens_used":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Tokens Used"}},"required":["container_running"],"title":"ClineStatusDTO","type":"object"},"CreateProxyServerRequestDTO":{"properties":{"auth":{"anyOf":[{"$ref":"#/components/schemas/ProxyAuthDTO"},{"type":"null"}],"default":null},"host":{"maxLength":255,"minLength":1,"title":"Host","type":"string"},"name":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"port":{"maximum":65535,"minimum":1.0,"title":"Port","type":"integer"},"type":{"pattern":"^(http|socks5)$","title":"Type","type":"string"}},"required":["type","host","port"],"title":"CreateProxyServerRequestDTO","type":"object"},"CreateVpnProfileRequestDTO":{"properties":{"configText":{"maxLength":65536,"minLength":10,"title":"Configtext","type":"string"},"name":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"type":{"pattern":"^(wireguard|openvpn)$","title":"Type","type":"string"}},"required":["type","configText"],"title":"CreateVpnProfileRequestDTO","type":"object"},"CreditPlanDTO":{"description":"A credit plan.","properties":{"code":{"title":"Code","type":"string"},"creditAmount":{"title":"Creditamount","type":"integer"},"id":{"title":"Id","type":"integer"},"interval":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Interval"},"name":{"title":"Name","type":"string"}},"required":["id","code","name","creditAmount"],"title":"CreditPlanDTO","type":"object"},"CreditsInfoDTO":{"description":"Credit information for a user.","properties":{"actualScanCount":{"title":"Actualscancount","type":"integer"},"canCreateProject":{"title":"Cancreateproject","type":"boolean"},"creditsAllowed":{"title":"Creditsallowed","type":"integer"},"creditsRemaining":{"title":"Creditsremaining","type":"integer"},"creditsUsed":{"title":"Creditsused","type":"integer"},"isExpired":{"default":false,"title":"Isexpired","type":"boolean"},"periodEnd":{"title":"Periodend","type":"string"},"planCode":{"title":"Plancode","type":"string"},"planName":{"title":"Planname","type":"string"},"sourceScanAllowed":{"default":0,"title":"Sourcescanallowed","type":"integer"},"sourceScanRemaining":{"default":0,"title":"Sourcescanremaining","type":"integer"},"upgradeSuggested":{"default":false,"title":"Upgradesuggested","type":"boolean"},"userId":{"title":"Userid","type":"string"}},"required":["userId","creditsAllowed","creditsUsed","creditsRemaining","canCreateProject","actualScanCount","periodEnd","planName","planCode"],"title":"CreditsInfoDTO","type":"object"},"DeleteByokKeyResponseDTO":{"description":"Response after deleting a provider key.","properties":{"deleted":{"title":"Deleted","type":"boolean"},"message":{"title":"Message","type":"string"},"provider":{"title":"Provider","type":"string"}},"required":["provider","deleted","message"],"title":"DeleteByokKeyResponseDTO","type":"object"},"DeviceListDTO":{"description":"List of paired devices for a user.","properties":{"devices":{"items":{"additionalProperties":true,"type":"object"},"title":"Devices","type":"array"}},"required":["devices"],"title":"DeviceListDTO","type":"object"},"DeviceResolutionDTO":{"properties":{"corelliumDeviceId":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Corelliumdeviceid"},"deviceType":{"$ref":"#/components/schemas/DeviceType"},"pairedDeviceId":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Paireddeviceid"},"targetChanged":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Targetchanged"}},"required":["deviceType"],"title":"DeviceResolutionDTO","type":"object"},"DeviceState":{"enum":["on","off","booting","deleting","creating","restoring","paused","rebooting","error","non_existent","unknown"],"title":"DeviceState","type":"string"},"DeviceStatusDTO":{"properties":{"deviceReady":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Deviceready"},"deviceState":{"$ref":"#/components/schemas/DeviceState"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"},"sandboxRunning":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Sandboxrunning"}},"required":["deviceState"],"title":"DeviceStatusDTO","type":"object"},"DeviceType":{"description":"Device provider type used by a project.","enum":["byod","corellium","device_lab"],"title":"DeviceType","type":"string"},"ExploitChainDTO":{"description":"An exploit chain.","properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Difficulty"},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source"},"steps":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Steps"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"}},"title":"ExploitChainDTO","type":"object"},"FileContentDTO":{"description":"File content response.","properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Path"}},"title":"FileContentDTO","type":"object"},"FileContentResponseDTO":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"},"is_binary":{"default":false,"title":"Is Binary","type":"boolean"},"path":{"title":"Path","type":"string"},"size":{"default":0,"title":"Size","type":"integer"},"too_large":{"default":false,"title":"Too Large","type":"boolean"}},"required":["path"],"title":"FileContentResponseDTO","type":"object"},"FileEntryDTO":{"properties":{"modified":{"default":0,"title":"Modified","type":"number"},"name":{"title":"Name","type":"string"},"path":{"title":"Path","type":"string"},"size":{"default":0,"title":"Size","type":"integer"},"type":{"title":"Type","type":"string"}},"required":["name","path","type"],"title":"FileEntryDTO","type":"object"},"FileListDTO":{"description":"File listing response.","properties":{"files":{"items":{"additionalProperties":true,"type":"object"},"title":"Files","type":"array"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Path"}},"required":["files"],"title":"FileListDTO","type":"object"},"FileListResponseDTO":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/FileEntryDTO"},"title":"Entries","type":"array"},"path":{"title":"Path","type":"string"}},"required":["path","entries"],"title":"FileListResponseDTO","type":"object"},"FileSearchDTO":{"description":"File search results.","properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Query"},"results":{"items":{"additionalProperties":true,"type":"object"},"title":"Results","type":"array"}},"required":["results"],"title":"FileSearchDTO","type":"object"},"FileSearchResponseDTO":{"properties":{"query":{"title":"Query","type":"string"},"results":{"items":{"$ref":"#/components/schemas/FileSearchResultDTO"},"title":"Results","type":"array"}},"required":["query","results"],"title":"FileSearchResponseDTO","type":"object"},"FileSearchResultDTO":{"properties":{"line":{"title":"Line","type":"integer"},"match":{"title":"Match","type":"string"},"name":{"title":"Name","type":"string"},"path":{"title":"Path","type":"string"}},"required":["path","name","line","match"],"title":"FileSearchResultDTO","type":"object"},"FirebaseAppDTO":{"description":"A Firebase app.","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Displayname"},"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Platform"}},"required":["id","name"],"title":"FirebaseAppDTO","type":"object"},"FirebaseAppsListDTO":{"description":"List of Firebase apps.","properties":{"apps":{"items":{"$ref":"#/components/schemas/FirebaseAppDTO"},"title":"Apps","type":"array"}},"required":["apps"],"title":"FirebaseAppsListDTO","type":"object"},"FirebaseDownloadResponseDTO":{"description":"Response for Firebase artifact download.","properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"},"projectName":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Projectname"},"success":{"title":"Success","type":"boolean"}},"required":["success"],"title":"FirebaseDownloadResponseDTO","type":"object"},"FirebaseReleaseDTO":{"description":"A Firebase App Distribution release.","properties":{"buildVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Buildversion"},"createdTime":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Createdtime"},"displayVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Displayversion"},"firebaseConsoleUri":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Firebaseconsoleuri"},"releaseId":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Releaseid"}},"title":"FirebaseReleaseDTO","type":"object"},"FirebaseReleasesListDTO":{"description":"List of Firebase releases.","properties":{"releases":{"items":{"$ref":"#/components/schemas/FirebaseReleaseDTO"},"title":"Releases","type":"array"}},"required":["releases"],"title":"FirebaseReleasesListDTO","type":"object"},"FirmwareSampleDTO":{"description":"Firmware sample information.","properties":{"firmware":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Firmware"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Platform"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Version"}},"title":"FirmwareSampleDTO","type":"object"},"FuzzingInputDTO":{"properties":{"functionName":{"title":"Functionname","type":"string"},"libraryName":{"title":"Libraryname","type":"string"},"methodology":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Methodology"}},"required":["libraryName","functionName"],"title":"FuzzingInputDTO","type":"object"},"GenerateUserApiKeyResponseDTO":{"description":"Response after generating a new user API key.","properties":{"apiKey":{"description":"The newly generated user API key (shown only once)","title":"Apikey","type":"string"},"message":{"default":"API key generated successfully","title":"Message","type":"string"}},"required":["apiKey"],"title":"GenerateUserApiKeyResponseDTO","type":"object"},"HardwareDevicesDTO":{"description":"List of available hardware devices from device-lab.","properties":{"devices":{"items":{"additionalProperties":true,"type":"object"},"title":"Devices","type":"array"}},"required":["devices"],"title":"HardwareDevicesDTO","type":"object"},"HopStoreSelectRequestDTO":{"properties":{"appName":{"maxLength":255,"title":"Appname","type":"string"},"appVersion":{"anyOf":[{"maxLength":50,"type":"string"},{"type":"null"}],"default":null,"title":"Appversion"},"bundleId":{"maxLength":255,"title":"Bundleid","type":"string"},"deviceId":{"maxLength":255,"title":"Deviceid","type":"string"},"versionId":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"title":"Versionid"}},"required":["bundleId","appName","deviceId"],"title":"HopStoreSelectRequestDTO","type":"object"},"MessageDTO":{"description":"Generic message response.","properties":{"message":{"title":"Message","type":"string"},"success":{"default":true,"title":"Success","type":"boolean"}},"required":["message"],"title":"MessageDTO","type":"object"},"MobileMessageDTO":{"description":"Generic message response.","properties":{"message":{"title":"Message","type":"string"},"success":{"default":true,"title":"Success","type":"boolean"}},"required":["message"],"title":"MobileMessageDTO","type":"object"},"ModelsEnumerateDTO":{"description":"Enumerated device models.","properties":{"models":{"items":{"additionalProperties":true,"type":"object"},"title":"Models","type":"array"}},"required":["models"],"title":"ModelsEnumerateDTO","type":"object"},"NetworkMessageDTO":{"properties":{"message":{"title":"Message","type":"string"},"success":{"default":true,"title":"Success","type":"boolean"}},"required":["message"],"title":"NetworkMessageDTO","type":"object"},"PairInitiateResponseDTO":{"description":"Response for pairing initiation.","properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Code"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"title":"PairInitiateResponseDTO","type":"object"},"PairStatusDTO":{"description":"Pairing status response.","properties":{"deviceId":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Deviceid"},"deviceName":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Devicename"},"paired":{"title":"Paired","type":"boolean"}},"required":["paired"],"title":"PairStatusDTO","type":"object"},"PlansListDTO":{"description":"List of available credit plans.","properties":{"plans":{"items":{"$ref":"#/components/schemas/CreditPlanDTO"},"title":"Plans","type":"array"}},"required":["plans"],"title":"PlansListDTO","type":"object"},"PlatformDevicesDTO":{"description":"List of devices for a platform.","properties":{"devices":{"items":{"additionalProperties":true,"type":"object"},"title":"Devices","type":"array"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Platform"}},"required":["devices"],"title":"PlatformDevicesDTO","type":"object"},"PlatformVersionsDTO":{"description":"List of OS versions for a platform.","properties":{"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Platform"},"versions":{"items":{"type":"string"},"title":"Versions","type":"array"}},"required":["versions"],"title":"PlatformVersionsDTO","type":"object"},"PocExecutionDTO":{"properties":{"evidence":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Evidence"},"evidencePath":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Evidencepath"},"message":{"title":"Message","type":"string"},"pocCode":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Poccode"}},"required":["message"],"title":"PocExecutionDTO","type":"object"},"PocInputDTO":{"properties":{"findingId":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Findingid"},"functionName":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Functionname"},"libraryName":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Libraryname"}},"title":"PocInputDTO","type":"object"},"ProcessScanRequestDTO":{"properties":{"appContext":{"anyOf":[{"maxLength":8000,"type":"string"},{"type":"null"}],"default":null,"title":"Appcontext"},"deepScan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Enable Deep Scan (0-day research)","title":"Deepscan"},"deepScanMode":{"anyOf":[{"maxLength":20,"type":"string"},{"type":"null"}],"default":null,"description":"Deep Scan selection mode: 'fast' | 'deep' | 'full'","title":"Deepscanmode"},"deviceLabHardwareDeviceId":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"description":"Explicit device-lab hardware device ID to scan on (Android or iOS), from GET /api/dashboard/devicelab/hardware-devices. Requires preferred_device_provider='device_lab'.","title":"Devicelabhardwaredeviceid"},"gitRepositoryUrl":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Gitrepositoryurl"},"gitRepositoryZip":{"anyOf":[{"maxLength":512,"type":"string"},{"type":"null"}],"default":null,"title":"Gitrepositoryzip"},"llmModel":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Override LLM model (provider:model format) for this scan","title":"Llmmodel"},"nativeScan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Enable Native Scan (Ghidra/JNI analysis)","title":"Nativescan"},"preferredDeviceProvider":{"anyOf":[{"maxLength":20,"type":"string"},{"type":"null"}],"default":null,"description":"Preferred device provider: 'corellium' or 'device_lab' (admin/MHL only)","title":"Preferreddeviceprovider"},"proxyServerId":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"title":"Proxyserverid"},"testCredentials":{"anyOf":[{"items":{"$ref":"#/components/schemas/TestCredentialsDTO"},"maxItems":5,"type":"array"},{"type":"null"}],"default":null,"title":"Testcredentials"},"useHopstoreDevice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Use the same hardware device from HopStore for scanning","title":"Usehopstoredevice"},"vpnProfileId":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"title":"Vpnprofileid"},"whitelistedDomains":{"anyOf":[{"items":{"type":"string"},"maxItems":50,"type":"array"},{"type":"null"}],"default":null,"description":"Domain whitelist for automated API pentesting (e.g., ['api.example.com', '*.example.com'])","title":"Whitelisteddomains"}},"title":"ProcessScanRequestDTO","type":"object"},"ProcessScanResponseDTO":{"properties":{"artifactType":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Artifacttype"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"title":"ProcessScanResponseDTO","type":"object"},"ProxyAuthDTO":{"properties":{"password":{"maxLength":256,"minLength":1,"title":"Password","type":"string"},"username":{"maxLength":128,"minLength":1,"title":"Username","type":"string"}},"required":["username","password"],"title":"ProxyAuthDTO","type":"object"},"ProxyServerListResponseDTO":{"properties":{"servers":{"items":{"$ref":"#/components/schemas/ProxyServerResponseDTO"},"title":"Servers","type":"array"}},"required":["servers"],"title":"ProxyServerListResponseDTO","type":"object"},"ProxyServerResponseDTO":{"properties":{"createdAt":{"title":"Createdat","type":"string"},"displayId":{"title":"Displayid","type":"string"},"hasAuth":{"title":"Hasauth","type":"boolean"},"host":{"title":"Host","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"port":{"title":"Port","type":"integer"},"proxyId":{"title":"Proxyid","type":"string"},"type":{"title":"Type","type":"string"},"updatedAt":{"title":"Updatedat","type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"}},"required":["proxyId","displayId","name","type","host","port","hasAuth","username","createdAt","updatedAt"],"title":"ProxyServerResponseDTO","type":"object"},"ProxyStatusDTO":{"properties":{"proxy":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Proxy"},"sandboxIp":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sandboxip"}},"title":"ProxyStatusDTO","type":"object"},"ScanConfigurationDTO":{"properties":{"appContext":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Appcontext"},"gitRepositoryUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Gitrepositoryurl"},"gitRepositoryZip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Gitrepositoryzip"},"inferredDomains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Inferreddomains"},"llmModel":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Llmmodel"},"projectName":{"title":"Projectname","type":"string"},"proxyServerId":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Proxyserverid"},"testCredentials":{"anyOf":[{"items":{"$ref":"#/components/schemas/TestCredentialsDTO"},"type":"array"},{"type":"null"}],"default":null,"title":"Testcredentials"},"vpnProfileId":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Vpnprofileid"},"whitelistedDomains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Whitelisteddomains"}},"required":["projectName"],"title":"ScanConfigurationDTO","type":"object"},"SessionListDTO":{"description":"List of exploit lab sessions.","properties":{"sessions":{"items":{"additionalProperties":true,"type":"object"},"title":"Sessions","type":"array"}},"required":["sessions"],"title":"SessionListDTO","type":"object"},"SessionStatusDTO":{"description":"Status of an exploit session.","properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"},"projectName":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Projectname"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Status"}},"title":"SessionStatusDTO","type":"object"},"SetProxyDTO":{"properties":{"host":{"title":"Host","type":"string"},"port":{"default":8080,"title":"Port","type":"integer"}},"required":["host"],"title":"SetProxyDTO","type":"object"},"SubscriptionDTO":{"description":"Active subscription details.","properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Id"},"isActive":{"title":"Isactive","type":"boolean"},"periodEnd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Periodend"},"periodStart":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Periodstart"},"planCode":{"title":"Plancode","type":"string"},"planName":{"title":"Planname","type":"string"},"userId":{"title":"Userid","type":"string"}},"required":["userId","planCode","planName","isActive"],"title":"SubscriptionDTO","type":"object"},"SuccessDTO":{"description":"Generic success/error response.","properties":{"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"},"success":{"title":"Success","type":"boolean"}},"required":["success"],"title":"SuccessDTO","type":"object"},"SuccessResponseDTO":{"properties":{"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"},"success":{"title":"Success","type":"boolean"}},"required":["success"],"title":"SuccessResponseDTO","type":"object"},"TestCredentialsDTO":{"properties":{"password":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"title":"Password"},"username":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"title":"Username"}},"title":"TestCredentialsDTO","type":"object"},"TrialInfoDTO":{"properties":{"agentCallsLimit":{"title":"Agentcallslimit","type":"integer"},"agentCallsRemaining":{"title":"Agentcallsremaining","type":"integer"},"agentCallsUsed":{"title":"Agentcallsused","type":"integer"},"canUseAgent":{"title":"Canuseagent","type":"boolean"},"canUseDevice":{"title":"Canusedevice","type":"boolean"},"deviceSecondsLimit":{"title":"Devicesecondslimit","type":"integer"},"deviceSecondsRemaining":{"title":"Devicesecondsremaining","type":"integer"},"deviceSecondsUsed":{"title":"Devicesecondsused","type":"integer"},"deviceUsageStarted":{"title":"Deviceusagestarted","type":"boolean"},"isTrial":{"title":"Istrial","type":"boolean"}},"required":["isTrial","agentCallsUsed","agentCallsLimit","agentCallsRemaining","canUseAgent","deviceSecondsUsed","deviceSecondsLimit","deviceSecondsRemaining","canUseDevice","deviceUsageStarted"],"title":"TrialInfoDTO","type":"object"},"UpdateByokRequestDTO":{"description":"Request body to update BYOK provider keys.","properties":{"providers":{"description":"List of provider keys to set or update","items":{"$ref":"#/components/schemas/ByokProviderKeyDTO"},"minItems":1,"title":"Providers","type":"array"}},"required":["providers"],"title":"UpdateByokRequestDTO","type":"object"},"UpdateProxyServerRequestDTO":{"properties":{"auth":{"anyOf":[{"$ref":"#/components/schemas/ProxyAuthDTO"},{"type":"null"}],"default":null},"clearAuth":{"default":false,"title":"Clearauth","type":"boolean"},"host":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"title":"Host"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"port":{"anyOf":[{"maximum":65535,"minimum":1.0,"type":"integer"},{"type":"null"}],"default":null,"title":"Port"}},"title":"UpdateProxyServerRequestDTO","type":"object"},"UpdateVpnProfileRequestDTO":{"properties":{"configText":{"anyOf":[{"maxLength":65536,"minLength":10,"type":"string"},{"type":"null"}],"default":null,"title":"Configtext"},"name":{"anyOf":[{"maxLength":128,"type":"string"},{"type":"null"}],"default":null,"title":"Name"}},"title":"UpdateVpnProfileRequestDTO","type":"object"},"UserSettingsResponseDTO":{"description":"Full user settings response.","properties":{"byokProviders":{"description":"List of configured BYOK provider keys (statuses only, not actual keys)","items":{"$ref":"#/components/schemas/ByokProviderStatusDTO"},"title":"Byokproviders","type":"array"},"globalDefaultModel":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Platform global default LLM as 'provider:model' (read-only, set by app config)","title":"Globaldefaultmodel"},"hasUserApiKey":{"description":"Whether the user has a user API key","title":"Hasuserapikey","type":"boolean"},"isTrial":{"default":false,"description":"True when user is on trial plan (model defaults to trial LLM)","title":"Istrial","type":"boolean"},"trialDefaultModel":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Trial default LLM as 'provider:model' (only set when is_trial is true)","title":"Trialdefaultmodel"},"userApiKey":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Masked preview e.g. sk-vjN...gAA (never the raw value)","title":"Userapikey"},"userId":{"title":"Userid","type":"string"}},"required":["userId","hasUserApiKey"],"title":"UserSettingsResponseDTO","type":"object"},"ValidationErrorModel":{"properties":{"ctx":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"an optional object which contains values required to render the error message.","title":"Error context"},"loc":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"the error's location as a list. ","title":"Location"},"msg":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"a computer-readable identifier of the error type.","title":"Message"},"type_":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"a human readable explanation of the error.","title":"Error Type"}},"title":"ValidationErrorModel","type":"object"},"VpnProfileListResponseDTO":{"properties":{"profiles":{"items":{"$ref":"#/components/schemas/VpnProfileResponseDTO"},"title":"Profiles","type":"array"}},"required":["profiles"],"title":"VpnProfileListResponseDTO","type":"object"},"VpnProfileResponseDTO":{"properties":{"createdAt":{"title":"Createdat","type":"string"},"displayId":{"title":"Displayid","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"profileId":{"title":"Profileid","type":"string"},"type":{"title":"Type","type":"string"},"updatedAt":{"title":"Updatedat","type":"string"}},"required":["profileId","displayId","name","type","createdAt","updatedAt"],"title":"VpnProfileResponseDTO","type":"object"},"WebPlayerDTO":{"properties":{"corelliumDomain":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Corelliumdomain"},"expiration":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Expiration"},"instanceId":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Instanceid"},"isHardware":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Ishardware"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Status"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Token"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"}},"title":"WebPlayerDTO","type":"object"}},"securitySchemes":{"BearerAuth":{"bearerFormat":"UserApiKey","description":"User API key. Generate one under Settings \u2192 API Access. Format: Bearer djini_<token>","scheme":"bearer","type":"http"},"SystemApiKey":{"description":"System-level API key for internal service access.","in":"header","name":"X-API-Key","type":"apiKey"}}},"info":{"title":"Djini.AI API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/a2a/agent-card":{"get":{"operationId":"a2a_api_extended_agent_card_agent_card_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Extended Agent Card \u2014 authenticated endpoint. Includes admin skills if user has access.","tags":["A2A"]}},"/api/a2a/ask":{"post":{"description":"</br>For general queries like managing research labs, listing projects, etc.</br>Only supports query mode (no sandbox SSH or file read tools).","operationId":"a2a_api_a2a_ask_general_ask_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Stream an agent response via SSE \u2014 no project context required.","tags":["A2A"]}},"/api/a2a/{project_name}/ask":{"post":{"description":"</br>Modes:</br>  - query: LangGraph ReAct agent with SSH + file read + search tools</br>  - task: Proxy to headless Cline in the sandbox container","operationId":"a2a_api_a2a_ask__project_name__ask_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Stream an agent response via SSE.","tags":["A2A"]}},"/api/a2a/{project_name}/status":{"get":{"operationId":"a2a_api_a2a_status__project_name__status_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Check if the sandbox container is running and reachable for A2A.","tags":["A2A"]}},"/api/cline/api-key":{"delete":{"operationId":"cline_api_remove_api_key_api_key_delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Delete the user's stored API key.","tags":["Cline"]},"get":{"operationId":"cline_api_get_api_key_status_api_key_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClineApiKeyStatusDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Check if the user has a stored API key (never returns the actual key).","tags":["Cline"]},"post":{"operationId":"cline_api_save_api_key_api_key_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Store an encrypted API key for the current user (BYOK).","tags":["Cline"]}},"/api/cline/{project_name}/files/content":{"get":{"operationId":"cline_api_read_file__project_name__files_content_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileContentResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Read file content from the container (restricted to /data).","tags":["Cline"]},"put":{"operationId":"cline_api_write_file__project_name__files_content_put","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Write file content inside the container (restricted to /data).","tags":["Cline"]}},"/api/cline/{project_name}/files/download":{"get":{"operationId":"cline_api_download_file__project_name__files_download_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Download a file from the container (attachment or inline for images).","tags":["Cline"]}},"/api/cline/{project_name}/files/list":{"get":{"operationId":"cline_api_list_files__project_name__files_list_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileListResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List directory contents inside the container (restricted to /data/project).","tags":["Cline"]}},"/api/cline/{project_name}/files/search":{"get":{"operationId":"cline_api_search_files__project_name__files_search_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileSearchResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Search file contents inside the container (restricted to /data/project).","tags":["Cline"]}},"/api/cline/{project_name}/start":{"post":{"operationId":"cline_api_start_cline_container__project_name__start_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Start a Cline sandbox container for the project.","tags":["Cline"]}},"/api/cline/{project_name}/status":{"get":{"operationId":"cline_api_cline_status__project_name__status_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClineStatusDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Check Cline container status.","tags":["Cline"]}},"/api/cline/{project_name}/stop":{"post":{"description":"</br>Removing ensures the next start creates a fresh container with</br>up-to-date env vars (DEVICE_IP, task, etc.). Project data lives</br>in mounted volumes so nothing is lost.","operationId":"cline_api_stop_cline_container__project_name__stop_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Stop and remove the Cline sandbox container.","tags":["Cline"]}},"/api/console/files/content":{"get":{"operationId":"console_api_read_file_files_content_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileContentResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"tags":["Console"]},"put":{"operationId":"console_api_write_file_files_content_put","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Save a file from the editor \u2014 only inside a project's notes/ (see _console_writable).","tags":["Console"]}},"/api/console/files/download":{"get":{"operationId":"console_api_download_file_files_download_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Download a file (inline for images, so the editor can preview screenshots).","tags":["Console"]}},"/api/console/files/list":{"get":{"operationId":"console_api_list_files_files_list_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileListResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"tags":["Console"]}},"/api/console/files/search":{"get":{"description":"mounted project at once is slow; the agent's console-search skill covers that).","operationId":"console_api_search_files_files_search_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileSearchResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Search file contents \u2014 in the focused project by default (searching every","tags":["Console"]}},"/api/console/start":{"post":{"operationId":"console_api_start_console_start_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Start (or reuse) the user's console container.","tags":["Console"]}},"/api/console/status":{"get":{"operationId":"console_api_console_status_status_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Console container status, in the same shape the cline frontend expects.","tags":["Console"]}},"/api/console/stop":{"post":{"operationId":"console_api_stop_console_stop_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Stop and remove the user's console container.","tags":["Console"]}},"/api/credits/bulk-update":{"post":{"description":"</br>Request body should contain:</br>{</br>    \"updates\": [</br>        {\"user_id\": \"user1@example.com\", \"amount\": 20},</br>        {\"user_id\": \"user2@example.com\", \"amount\": 15}</br>    ]</br>}</br></br>Returns:</br>    JSON response with results for each update","operationId":"credits_api_bulk_update_credits_bulk_update_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Bulk set available credit amount for multiple users (admin only).","tags":["Credits"]}},"/api/credits/info":{"get":{"description":"</br>Returns:</br>    JSON response with user's credit information","operationId":"credits_api_get_credits_info_info_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditsInfoDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get credit information for the current user.","tags":["Credits"]}},"/api/credits/info/{user_id}":{"get":{"description":"</br>Args:</br>    target_user_id: Email of the target user</br></br>Returns:</br>    JSON response with user's credit information","operationId":"credits_api_get_user_credits_info_admin_info__user_id__get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditsInfoDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get credit information for a specific user (admin only).","tags":["Credits"]}},"/api/credits/plans":{"get":{"description":"</br>Returns:</br>    JSON response with list of plans (id, code, name, interval)","operationId":"credits_api_list_plans_plans_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlansListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Return all available CreditPlan records (admin only).","tags":["Credits"]}},"/api/credits/subscription":{"post":{"description":"</br>Request body should contain:</br>{</br>    \"user_id\": \"user@example.com\",</br>    \"plan_code\": \"TIER_1\",</br>    \"period_start\": \"2024-01-01\"</br>}</br></br>Deactivates any existing active subscription and creates a new one.</br></br>Returns:</br>    JSON response confirming the new subscription details","operationId":"credits_api_set_subscription_subscription_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Create or replace the active subscription for a user (super admin only).","tags":["Credits"]}},"/api/credits/subscription/{user_id}":{"get":{"description":"</br>Returns:</br>    JSON response with plan details, period dates and active status","operationId":"credits_api_get_subscription_subscription__user_id__get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get the current active subscription for a user (admin only).","tags":["Credits"]}},"/api/credits/top-up":{"post":{"description":"</br>Request body should contain:</br>{</br>    \"user_id\": \"user@example.com\",</br>    \"additional_credits\": 10</br>}</br></br>Returns:</br>    JSON response with updated credit information","operationId":"credits_api_top_up_credits_top_up_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Add additional credits to a user's account (super admin only).","tags":["Credits"]}},"/api/credits/transfer":{"post":{"description":"</br>Request body should contain:</br>{</br>    \"from_user_id\": \"user1@example.com\",</br>    \"to_user_id\": \"user2@example.com\",</br>    \"credits_to_transfer\": 5</br>}</br></br>Returns:</br>    JSON response with transfer details","operationId":"credits_api_transfer_credits_transfer_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Transfer credits from one user to another (admin only).","tags":["Credits"]}},"/api/credits/update":{"post":{"description":"</br>Request body should contain:</br>{</br>    \"user_id\": \"user@example.com\",</br>    \"amount\": 20</br>}</br></br>Returns:</br>    JSON response with updated credit information","operationId":"credits_api_update_credits_update_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Update available credit amount for a user (super admin only).","tags":["Credits"]}},"/api/credits/upgrade-trial":{"post":{"description":"</br>Ends the trial period for the user's active subscription, causing Stripe to</br>generate an invoice and attempt payment immediately.","operationId":"credits_api_upgrade_trial_upgrade_trial_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Upgrade from trial to full subscription immediately.","tags":["Credits"]}},"/api/credits/webhook/stripe":{"post":{"description":"</br>Enrolls users in credit subscriptions based on matching CreditPlan.stripe_id.</br>Matches against either the Stripe Subscription ID or the Price/Plan ID.","operationId":"credits_api_stripe_webhook_webhook_stripe_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Stripe webhook for invoice.payment_succeeded events.","tags":["Credits"]}},"/api/dashboard/apkeep/search":{"get":{"operationId":"dashboard_api_apkeep_search_apkeep_search_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Search for Android apps by name via Google Play.","tags":["Dashboard"]}},"/api/dashboard/apkeep/select":{"post":{"operationId":"dashboard_api_apkeep_select_apkeep_select_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApkeepSelectRequestDTO"}}},"required":true},"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Create a project from an APKeep package selection (alternative to APK upload).","tags":["Dashboard"]}},"/api/dashboard/apkeep/versions":{"get":{"operationId":"dashboard_api_apkeep_versions_apkeep_versions_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"List available versions for an Android package.","tags":["Dashboard"]}},"/api/dashboard/app-scans":{"get":{"operationId":"dashboard_api_api_app_scans_app_scans_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Api app scans.","tags":["Dashboard"]}},"/api/dashboard/change-role":{"post":{"operationId":"dashboard_api_api_change_user_role_change_role_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Change a user's role.","tags":["Dashboard"]}},"/api/dashboard/chat/{project_name}":{"post":{"operationId":"dashboard_api_chat_with_findings_chat__project_name__post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Chat endpoint that provides context of all scan findings for the AI Security Assistant","tags":["Dashboard"]}},"/api/dashboard/chat/{project_name}/history":{"get":{"operationId":"dashboard_api_get_chat_history_chat__project_name__history_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get chat history for a specific project","tags":["Dashboard"]}},"/api/dashboard/devicelab/hardware-devices":{"get":{"description":"</br>Unlike /store/devices (HopStore, iOS-only), this covers both platforms \u2014</br>pass ?platform=android or ?platform=ios to filter. Devices already</br>claimed by another active scan or research-lab session are flagged</br>in_use so the picker can grey them out.","operationId":"dashboard_api_devicelab_hardware_devices_devicelab_hardware_devices_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List device-lab hardware devices available to scan on directly.","tags":["Dashboard"]}},"/api/dashboard/email-config/send-test":{"post":{"operationId":"dashboard_api_api_email_config_send_test_email_config_send_test_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Api email config send test.","tags":["Dashboard"]}},"/api/dashboard/hopstore/devices":{"get":{"operationId":"dashboard_api_hopstore_devices_hopstore_devices_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"List hardware iOS devices available for HopStore app selection.","tags":["Dashboard"]}},"/api/dashboard/hopstore/login":{"post":{"description":"</br>Accepts an optional ``authCode`` for Apple ID 2FA verification.</br>When 2FA is required, the upstream returns HTTP 202 with ``requires2FA: true``.","operationId":"dashboard_api_hopstore_login_hopstore_login_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Trigger Apple ID login on a hardware device (credentials injected server-side).","tags":["Dashboard"]}},"/api/dashboard/hopstore/search":{"get":{"operationId":"dashboard_api_hopstore_search_hopstore_search_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Search the App Store via HopStore on a hardware device.","tags":["Dashboard"]}},"/api/dashboard/hopstore/select":{"post":{"operationId":"dashboard_api_hopstore_select_hopstore_select_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HopStoreSelectRequestDTO"}}},"required":true},"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Create a project from a HopStore App Store selection (alternative to file upload).","tags":["Dashboard"]}},"/api/dashboard/hopstore/status":{"get":{"operationId":"dashboard_api_hopstore_status_hopstore_status_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Check HopStore availability and Apple ID login state on a hardware device.","tags":["Dashboard"]}},"/api/dashboard/hopstore/version-meta":{"get":{"operationId":"dashboard_api_hopstore_version_meta_hopstore_version_meta_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Get metadata for a specific app version via HopStore.","tags":["Dashboard"]}},"/api/dashboard/hopstore/versions":{"get":{"operationId":"dashboard_api_hopstore_versions_hopstore_versions_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Get all available versions for an app via HopStore.","tags":["Dashboard"]}},"/api/dashboard/invite":{"post":{"operationId":"dashboard_api_api_invite_user_invite_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Create a new user. Uses local DB for auth_mode=local, Entra ID otherwise.","tags":["Dashboard"]}},"/api/dashboard/platform-scans":{"get":{"operationId":"dashboard_api_api_platform_scans_platform_scans_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Api platform scans.","tags":["Dashboard"]}},"/api/dashboard/recent-scans":{"get":{"operationId":"dashboard_api_api_recent_scans_recent_scans_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Api recent scans.","tags":["Dashboard"]}},"/api/dashboard/reset-password":{"post":{"operationId":"dashboard_api_api_reset_local_password_reset_password_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Admin: email a local user a password-reset link (the user sets their own).","tags":["Dashboard"]}},"/api/dashboard/scans":{"get":{"operationId":"dashboard_api_api_scans_scans_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Paginated, filtered, sorted scan list.","tags":["Dashboard"]}},"/api/dashboard/scans/clone-source":{"post":{"description":"</br>The URL counterpart of /scans/upload-source and the CI entry point for whitebox</br>scans: no binary, no decompile \u2014 it clones the repo into input/git, detects</br>platform + package from the source, records the URL on the scan configuration</br>(which is what enables fix pull requests / issues) and returns the new</br>projectName. Body: {\"gitRepositoryUrl\": ..., \"gitRef\": \"<branch|tag|commit sha>\"}</br>\u2014 CI passes the commit that triggered the build. Public repos clone anonymously;</br>PRIVATE github.com repos work when the djini GitHub App is installed on them.</br>Follow with POST /scans/<projectName>/source-scan.","operationId":"dashboard_api_api_clone_source_scans_clone_source_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Create a source-only project by cloning a git repository.","tags":["Dashboard"]}},"/api/dashboard/scans/preparing":{"get":{"description":"</br>Lets the dashboard re-open the device-setup screen after a page reload \u2014 the</br>preparation runs server-side and survives the refresh, even though the modal does</br>not.","operationId":"dashboard_api_list_preparing_devices_scans_preparing_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List the current user's projects with an in-flight (or ready) device setup.","tags":["Dashboard"]}},"/api/dashboard/scans/upload-source":{"post":{"description":"</br>A fast alternative to /upload for the AI source scan (avoids the slow</br>decompile that can time out the gateway): extracts the source to input/git,</br>detects platform + package from it, records a placeholder artifact (same</br>pattern as the store flow), and returns the new projectName. Follow with</br>POST /scans/<projectName>/source-scan.","operationId":"dashboard_api_api_upload_source_scans_upload_source_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Create a project directly from a source zip \u2014 no binary upload/decompile.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}":{"delete":{"description":"</br>Rules:</br>- Only the project owner or an Admin/Analyst can delete.</br>- If a scan is in progress, deletion is blocked unless force=true query param is provided.</br>- Related rows are explicitly deleted before the project to avoid orphaned data.","operationId":"dashboard_api_api_delete_scan_scans__project_name__delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Delete a project and its associated data.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/artifact":{"get":{"operationId":"dashboard_api_download_artifact_scans__project_name__artifact_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Download the original input artifact (APK/IPA).","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/context-chat":{"post":{"description":"context is persisted onto the scan configuration (structured `collected_context`,</br>a human-readable summary into `app_context`, and any accounts into</br>`test_credentials`) so the scan uses it. Non-streaming JSON: the client sends the</br>full conversation each turn and gets back the assistant reply + collected state.","operationId":"dashboard_api_context_chat_scans__project_name__context_chat_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Pre-scan context-intake chat: the agent interviews the user and the collected","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/deep-scan":{"post":{"description":"</br>Costs 1 additional credit.  Requires the deep_scan plan feature.","operationId":"dashboard_api_api_trigger_deep_scan_scans__project_name__deep_scan_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Trigger a Deep Scan (0-day research) on an already-completed scan.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/findings":{"get":{"operationId":"dashboard_api_api_scan_findings_scans__project_name__findings_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get scan findings as JSON.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/git-clone":{"post":{"operationId":"dashboard_api_git_clone_scans__project_name__git_clone_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessScanResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Git clone.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/prepare-device":{"post":{"description":"</br>Fire-and-forget: kicks a background preparation and returns the current phase</br>immediately. The frontend polls ``prepare-device/status`` (this module) plus the</br>device ``/status`` + ``/web-player`` endpoints to render boot progress and the</br>live screen. The scan launched afterwards reuses this same device (see</br>djini.device.prepare / ensure_device_ready).","operationId":"dashboard_api_prepare_device_scans__project_name__prepare_device_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Boot a device-lab device, install the app, and open it for pre-scan setup.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/prepare-device/release":{"post":{"description":"</br>Stops the pinned device-lab VM (skips hardware) so it does not leak. If a scan</br>is later started for this project it simply re-boots the same pinned device.","operationId":"dashboard_api_release_prepared_device_scans__project_name__prepare_device_release_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Release a device booted for setup when the user backs out before scanning.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/prepare-device/status":{"get":{"operationId":"dashboard_api_prepare_device_status_scans__project_name__prepare_device_status_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Current pre-scan device-preparation phase (booting/installing/launching/ready/error).","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/process":{"post":{"operationId":"dashboard_api_process_scan_scans__project_name__process_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessScanRequestDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessScanResponseDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Process scan.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/sarif":{"get":{"description":"</br>Merges the ``runs`` of every ``*.sarif`` the scanners wrote under the</br>project's ``results/`` tree (AI-SAST, deep scan, native, HTTP active scan,</br>\u2026) into one document \u2014 the shape GitHub Code Scanning (``upload-sarif``)</br>expects. Duplicate findings (e.g. the legacy top-level ``report.sarif``</br>copy of the AI-SAST output) are collapsed by fingerprint, keeping the</br>first (canonical per-source) occurrence.</br></br>The static SARIFs are written before dynamic testing runs, so results are</br>reconciled with the DB: each finding's ``dynamic_verdict`` is tagged into</br>its ``properties``, and findings that dynamic testing confidently DISPROVED</br>(the dashboard's \"False Positives\" bucket) are SARIF-suppressed (``level:</br>none`` + a ``suppressions`` entry) so they don't surface as open Code</br>Scanning alerts. Pass ``?download=true`` for an attachment.","operationId":"dashboard_api_api_scan_sarif_scans__project_name__sarif_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Return a single merged, de-duplicated SARIF 2.1.0 report for the scan.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/source-scan":{"post":{"description":"/upload-source or /git-clone.</br></br>A fast, source-first alternative to the full AI-SAST binary scan: no</br>decompile, no device, no dynamic phase. Findings are mapped to MASVS/MASWE</br>and land in the dashboard + the /sarif endpoint. Every finding gets a proposed</br>fix; for github.com repository projects with the djini GitHub App installed, one</br>issue + one pull request per (group of related) finding(s) is opened automatically.</br>Optional JSON body: {\"pullRequests\": true|false, \"issues\": true|false} (default</br>true) \u2014 CI sets pullRequests=false on pull_request events so a feature-branch</br>scan doesn't open fix PRs against the default branch.","operationId":"dashboard_api_api_trigger_source_scan_scans__project_name__source_scan_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Run the AI source-code scan on source already loaded via /clone-source,","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/source-scan/fixes":{"get":{"description":"</br>``state``: none (no scan yet) | running | completed | error. ``edits`` carry a</br>per-edit unified diff and the finding ids they fix; ``by_finding`` maps a finding</br>(metadata id) to its edit ids; ``skipped`` explains findings without a safe fix.</br>``pr`` is the auto/manual pull-request outcome; ``capability`` says whether PRs</br>are possible for this project (github.com URL scan + djini GitHub App).","operationId":"dashboard_api_api_source_fixes_scans__project_name__source_scan_fixes_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Proposed AI SAST fixes for this project's current source findings.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/source-scan/fixes/patch":{"get":{"operationId":"dashboard_api_api_source_fixes_patch_scans__project_name__source_scan_fixes_patch_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Download the approved proposals (``?edits=1,2,3``, default all) as a unified diff.","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/source-scan/fixes/pr":{"post":{"description":"for all). Runs in the background; poll GET .../source-scan/fixes and read ``pr``.","operationId":"dashboard_api_api_source_fixes_pr_scans__project_name__source_scan_fixes_pr_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Open a pull request with the approved proposals. Body: {\"editIds\": [..]} (omit","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/source-scan/sbom":{"get":{"description":"vulnerabilities with CVSS/fixed versions, and the files importing each vulnerable</br>component), or with ``?download=true`` the CycloneDX 1.5 SBOM file.","operationId":"dashboard_api_api_source_scan_sbom_scans__project_name__source_scan_sbom_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Dependency scan of the source scan: the dashboard summary (components, OSV","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/status":{"get":{"operationId":"dashboard_api_api_scan_status_scans__project_name__status_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get the current status of a scan (designed for polling).","tags":["Dashboard"]}},"/api/dashboard/scans/{project_name}/stop":{"post":{"description":"</br>Rules:</br>- Only the project owner or an Admin/Analyst can cancel.</br>- If the project is already in a terminal state, returns 409.</br>- Sets overall status to Cancelled and emits a notification via ThreadTracker.","operationId":"dashboard_api_api_stop_scan_scans__project_name__stop_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Stop/cancel an ongoing scan for the given project.","tags":["Dashboard"]}},"/api/dashboard/set-active":{"post":{"operationId":"dashboard_api_api_set_local_active_set_active_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Admin: enable/disable a local user.","tags":["Dashboard"]}},"/api/dashboard/settings/proxy-servers":{"get":{"operationId":"dashboard_api_get_proxy_servers_settings_proxy_servers_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyServerListResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List all proxy servers for the current user.","tags":["Dashboard"]},"post":{"operationId":"dashboard_api_create_proxy_server_route_settings_proxy_servers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProxyServerRequestDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyServerResponseDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Create a new proxy server.","tags":["Dashboard"]}},"/api/dashboard/settings/proxy-servers/{proxy_id}":{"delete":{"operationId":"dashboard_api_delete_proxy_server_route_settings_proxy_servers__proxy_id__delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkMessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Delete a proxy server.","tags":["Dashboard"]},"put":{"operationId":"dashboard_api_update_proxy_server_route_settings_proxy_servers__proxy_id__put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProxyServerRequestDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyServerResponseDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Update an existing proxy server.","tags":["Dashboard"]}},"/api/dashboard/settings/vpn-profiles":{"get":{"operationId":"dashboard_api_get_vpn_profiles_settings_vpn_profiles_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VpnProfileListResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List all VPN profiles for the current user.","tags":["Dashboard"]},"post":{"operationId":"dashboard_api_create_vpn_profile_route_settings_vpn_profiles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVpnProfileRequestDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VpnProfileResponseDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Create a new VPN profile.","tags":["Dashboard"]}},"/api/dashboard/settings/vpn-profiles/{profile_id}":{"delete":{"operationId":"dashboard_api_delete_vpn_profile_route_settings_vpn_profiles__profile_id__delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkMessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Delete a VPN profile.","tags":["Dashboard"]},"put":{"operationId":"dashboard_api_update_vpn_profile_route_settings_vpn_profiles__profile_id__put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVpnProfileRequestDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VpnProfileResponseDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Update an existing VPN profile.","tags":["Dashboard"]}},"/api/dashboard/signup":{"post":{"description":"</br>The self-service counterpart of /invite (no admin auth). Gated by</br>[app] self_signup_enabled (off by default). Creates the account the same way</br>invite does (local user or Entra via Graph), provisions FREE, and emails a</br>set-up / sign-in link. Entra's own hosted self-service sign-up is the preferred</br>path; this endpoint is the alternative for a branded signup form.","operationId":"dashboard_api_api_signup_signup_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Public self-service signup: create a user and grant the FREE plan.","tags":["Dashboard"]}},"/api/dashboard/store/devices":{"get":{"operationId":"dashboard_api_store_devices_store_devices_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List hardware iOS devices usable for HopStore (App Store) scanning.","tags":["Dashboard"]}},"/api/dashboard/store/scan":{"post":{"description":"scan it (deep scan + SAST). The app stays installed for later dynamic testing.","operationId":"dashboard_api_store_scan_store_scan_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Install an App Store app on a HopStore device, decrypt + pull the IPA, and","tags":["Dashboard"]}},"/api/dashboard/store/search":{"get":{"description":"HopStore login state plus the search results.","operationId":"dashboard_api_store_search_store_search_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Search the App Store via HopStore on a selected device. Returns the device's","tags":["Dashboard"]}},"/api/dashboard/todays-activity":{"get":{"operationId":"dashboard_api_api_todays_activity_todays_activity_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Api todays activity.","tags":["Dashboard"]}},"/api/dashboard/token-usage":{"get":{"operationId":"dashboard_api_api_token_usage_token_usage_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Return aggregated token usage data for the admin overview.","tags":["Dashboard"]}},"/api/dashboard/trial-info":{"get":{"operationId":"dashboard_api_get_trial_info_trial_info_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialInfoDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get trial info.","tags":["Dashboard"]}},"/api/dashboard/unfaird/scan":{"post":{"operationId":"dashboard_api_unfaird_scan_unfaird_scan_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Download a decrypted IPA (any offered version) from the decrypt store and scan it.","tags":["Dashboard"]}},"/api/dashboard/unfaird/search":{"get":{"operationId":"dashboard_api_unfaird_search_unfaird_search_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Search the decrypt store for iOS apps.","tags":["Dashboard"]}},"/api/dashboard/unfaird/versions":{"get":{"operationId":"dashboard_api_unfaird_versions_unfaird_versions_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"List every offered version for an app on the decrypt store.","tags":["Dashboard"]}},"/api/dashboard/upload":{"post":{"operationId":"dashboard_api_upload_scan_upload_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessScanResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Upload scan.","tags":["Dashboard"]}},"/api/dashboard/users":{"get":{"operationId":"dashboard_api_api_users_users_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get users with credit information (admin only).","tags":["Dashboard"]}},"/api/dashboard/users/by-email":{"get":{"operationId":"dashboard_api_api_user_by_email_users_by_email_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get a single user's full data by email, used for targeted table-row refresh.","tags":["Dashboard"]}},"/api/dashboard/users/refresh-cache":{"post":{"operationId":"dashboard_api_api_refresh_users_cache_users_refresh_cache_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Trigger an immediate full refresh of the Entra users and groups cache (admin only).","tags":["Dashboard"]}},"/api/dashboard/users/resend-welcome":{"post":{"operationId":"dashboard_api_api_resend_welcome_users_resend_welcome_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Api resend welcome.","tags":["Dashboard"]}},"/api/dashboard/users/summary":{"get":{"operationId":"dashboard_api_api_users_summary_users_summary_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Lightweight user list (no credits) for dropdowns.","tags":["Dashboard"]}},"/api/dashboard/vulnerabilities":{"get":{"operationId":"dashboard_api_api_vulnerabilities_vulnerabilities_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Api vulnerabilities.","tags":["Dashboard"]}},"/api/dashboard/vulnerability-trends":{"get":{"operationId":"dashboard_api_api_vulnerability_trends_vulnerability_trends_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Api vulnerability trends.","tags":["Dashboard"]}},"/api/dashboard/{project_name}/configuration":{"get":{"operationId":"dashboard_api_get_scan_configuration__project_name__configuration_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanConfigurationDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get the scan configuration for a project.","tags":["Dashboard"]}},"/api/dashboard/{project_name}/file-content":{"get":{"operationId":"dashboard_api_project_file_content__project_name__file_content_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Project file content.","tags":["Dashboard"]}},"/api/device/internal/device-state/{project_name}":{"get":{"description":"</br>No auth \u2014 restricted by caller IP validation. Only the sandbox container(s)</br>for the given project can call this endpoint.","operationId":"device_api_internal_device_state_internal_device_state__project_name__get","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}}],"responses":{"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Return Corellium device state for VPN wrapper diagnostics.","tags":["Device"]}},"/api/device/{project_name}/resolve":{"post":{"operationId":"device_api_resolve_device_target__project_name__resolve_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceResolutionDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Resolve device target.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/app-status":{"get":{"operationId":"device_api_app_status__project_name___device_type__app_status_get","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppStatusDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"App status.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/fuzzing/start":{"post":{"operationId":"device_api_start_fuzzing__project_name___device_type__fuzzing_start_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FuzzingInputDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Start fuzzing.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/fuzzing/stop":{"post":{"operationId":"device_api_stop_fuzzing__project_name___device_type__fuzzing_stop_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Stop fuzzing.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/install-app":{"post":{"operationId":"device_api_install_app__project_name___device_type__install_app_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Install app.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/instrumentation/start":{"post":{"operationId":"device_api_start_instrumentation__project_name___device_type__instrumentation_start_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}},{"description":"Start instrumentation in lite mode","in":"query","name":"lite","required":false,"schema":{"default":false,"description":"Start instrumentation in lite mode","title":"Lite","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Start instrumentation.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/instrumentation/stop":{"post":{"operationId":"device_api_stop_instrumentation__project_name___device_type__instrumentation_stop_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Stop instrumentation.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/poc/details":{"get":{"operationId":"device_api_poc_details__project_name___device_type__poc_details_get","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}},{"in":"query","name":"libraryName","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Libraryname"}},{"in":"query","name":"functionName","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Functionname"}},{"in":"query","name":"findingId","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Findingid"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PocExecutionDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Get PoC execution details/evidence.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/poc/start":{"post":{"operationId":"device_api_start_poc__project_name___device_type__poc_start_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PocInputDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PocExecutionDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Start PoC exploit execution.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/poc/stop":{"post":{"operationId":"device_api_stop_poc__project_name___device_type__poc_stop_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Stop PoC execution.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/proxy":{"delete":{"operationId":"device_api_clear_proxy__project_name___device_type__proxy_delete","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Clear device proxy.","tags":["Device"]},"get":{"operationId":"device_api_get_proxy__project_name___device_type__proxy_get","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyStatusDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Get current device proxy configuration.","tags":["Device"]},"post":{"operationId":"device_api_set_proxy__project_name___device_type__proxy_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetProxyDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Set device proxy.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/sandbox/restart":{"post":{"operationId":"device_api_restart_sandbox__project_name___device_type__sandbox_restart_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceStatusDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Restart sandbox.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/sandbox/start":{"post":{"operationId":"device_api_start_sandbox__project_name___device_type__sandbox_start_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceStatusDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Start sandbox.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/sandbox/stop":{"post":{"operationId":"device_api_stop_sandbox__project_name___device_type__sandbox_stop_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceStatusDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Stop sandbox.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/start":{"post":{"operationId":"device_api_start_device__project_name___device_type__start_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceStatusDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Start device.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/status":{"get":{"operationId":"device_api_status__project_name___device_type__status_get","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceStatusDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Status.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/stop":{"post":{"operationId":"device_api_stop_device__project_name___device_type__stop_post","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Stop device.","tags":["Device"]}},"/api/device/{project_name}/{device_type}/web-player":{"get":{"operationId":"device_api_web_player__project_name___device_type__web_player_get","parameters":[{"in":"path","name":"project_name","required":true,"schema":{"title":"Project Name","type":"string"}},{"in":"path","name":"device_type","required":true,"schema":{"$ref":"#/components/schemas/DeviceType"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebPlayerDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Web player.","tags":["Device"]}},"/api/firebase/apps":{"get":{"operationId":"firebase_list_apps_apps_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirebaseAppsListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List all Firebase apps for the configured project.","tags":["Firebase"]}},"/api/firebase/apps/{app_id}/releases":{"get":{"operationId":"firebase_list_releases_apps__app_id__releases_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirebaseReleasesListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List releases for a specific Firebase app.","tags":["Firebase"]}},"/api/firebase/auth/credentials":{"delete":{"operationId":"firebase_clear_firebase_credentials_auth_credentials_delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Clear Firebase credentials from session.","tags":["Firebase"]},"post":{"operationId":"firebase_set_firebase_credentials_auth_credentials_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Set Firebase credentials (app ID and optionally access token) in session.","tags":["Firebase"]}},"/api/firebase/auth/status":{"get":{"operationId":"firebase_get_auth_status_auth_status_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get current Firebase authentication status.","tags":["Firebase"]}},"/api/firebase/auth/token":{"delete":{"operationId":"firebase_clear_access_token_auth_token_delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Clear Firebase access token and project number from the current session.","tags":["Firebase"]},"post":{"operationId":"firebase_set_access_token_auth_token_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Set Firebase access token and project number for the current session.","tags":["Firebase"]}},"/api/firebase/availability":{"get":{"operationId":"firebase_firebase_availability_availability_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Check if Firebase App Distribution is available (no authentication required).","tags":["Firebase"]}},"/api/firebase/download":{"post":{"operationId":"firebase_download_and_create_project_download_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirebaseDownloadResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Download a Firebase release and create a new project.","tags":["Firebase"]}},"/api/firebase/status":{"get":{"operationId":"firebase_firebase_status_status_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Check Firebase App Distribution configuration status.","tags":["Firebase"]}},"/api/mobile/connect":{"post":{"description":"</br>Provision or retrieve a WireGuard client configuration for the paired device.</br>- Checks if a pair already exists upstream; if not, creates it.</br>- When created, returns the device client.conf content for WireGuard.</br>- If already exists, returns metadata without config (upstream lacks fetch API).","operationId":"mobile_api_connect_device_connect_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileMessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Connect to a paired mobile device.","tags":["Mobile"]}},"/api/mobile/devtools":{"get":{"description":"</br>Devices can fetch this during connect to set up DevTools before using them.</br>Returns device-specific ADB and SSH keys.","operationId":"mobile_api_get_device_devtools_config_devtools_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileMessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Serve the preferred/required configuration for DevTools on this device.","tags":["Mobile"]}},"/api/mobile/disconnect":{"post":{"description":"</br>Remove the upstream WireGuard pair for this device if present,</br>and clear the stored WireGuard IP address.","operationId":"mobile_api_disconnect_device_disconnect_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileMessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Disconnect from a mobile device.","tags":["Mobile"]}},"/api/mobile/generate/download-token":{"post":{"operationId":"mobile_api_generate_download_token_generate_download_token_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileMessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Generate a one-time download token for the Android and iOS mobile apps.","tags":["Mobile"]}},"/api/mobile/generate/pairing-pin":{"post":{"operationId":"mobile_api_generate_pairing_pin_generate_pairing_pin_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairInitiateResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Generate a new pairing PIN for the current user.","tags":["Mobile"]}},"/api/mobile/handshakes":{"get":{"description":"</br>Access paths:</br>- Device API key: injects `paired_device`.</br>- Logged-in user: injects `user_session`; will include their paired device if present.","operationId":"mobile_api_device_handshakes_handshakes_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get latest WireGuard handshakes for the current user's paired device.","tags":["Mobile"]}},"/api/mobile/info":{"get":{"description":"</br>Access paths:</br>- Device API key: injects `paired_device`.</br>- Logged-in user: injects `user_session`; will include their paired device if present.","operationId":"mobile_api_device_info_info_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Return helpful information about the current device and user.","tags":["Mobile"]}},"/api/mobile/pair":{"post":{"description":"</br>Accepts a JSON payload with:</br>- `pin`: The pairing PIN code.</br>- `platform`: The device platform (android|ios).","operationId":"mobile_api_pair_device_pair_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairStatusDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Pair a mobile device.","tags":["Mobile"]}},"/api/mobile/unpair":{"post":{"description":"</br>Accepts either:</br>- Paired device API key (injects `paired_device`), or</br>- Logged-in user (injects `user_session`).","operationId":"mobile_api_unpair_device_unpair_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileMessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Unpair a mobile device.","tags":["Mobile"]}},"/api/projects/apps/{app_id}/versions":{"get":{"operationId":"projects_api_list_project_versions_apps__int_app_id__versions_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"List all versions for an app","tags":["Projects"]},"post":{"operationId":"projects_api_create_project_version_apps__int_app_id__versions_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Create a new version for an app","tags":["Projects"]}},"/api/projects/clone":{"post":{"operationId":"projects_api_clone_project_endpoint_clone_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Clone an existing project (DB + Filesystem)","tags":["Projects"]}},"/api/projects/groups":{"get":{"operationId":"projects_api_list_project_groups_groups_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"List all project groups accessible to the user","tags":["Projects"]},"post":{"operationId":"projects_api_create_project_group_groups_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Create a new project group","tags":["Projects"]}},"/api/projects/groups/{group_id}":{"delete":{"operationId":"projects_api_delete_project_group_groups__int_group_id__delete","responses":{},"security":[{"BearerAuth":[]}],"summary":"Delete a project group and all nested apps/versions/members (cascade).","tags":["Projects"]},"get":{"operationId":"projects_api_get_project_group_groups__int_group_id__get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Get details of a specific project group.","tags":["Projects"]}},"/api/projects/groups/{group_id}/apps":{"get":{"operationId":"projects_api_list_project_apps_groups__int_group_id__apps_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"List all apps in a project group","tags":["Projects"]},"post":{"operationId":"projects_api_create_project_app_groups__int_group_id__apps_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Create a new app within a project group","tags":["Projects"]}},"/api/projects/groups/{group_id}/apps/import":{"post":{"description":"</br>Grouping is determined by `group_by`: 'application_name' or 'package_name'.","operationId":"projects_api_import_existing_project_groups__int_group_id__apps_import_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Attach an existing legacy scan (Project) to this group as an app/version.","tags":["Projects"]}},"/api/projects/groups/{group_id}/members":{"get":{"operationId":"projects_api_list_project_members_groups__int_group_id__members_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"List all members of a project group","tags":["Projects"]},"post":{"operationId":"projects_api_add_project_member_groups__int_group_id__members_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Add a member to a project group","tags":["Projects"]}},"/api/projects/groups/{group_id}/members/{member_id}":{"delete":{"operationId":"projects_api_remove_project_member_groups__int_group_id__members__int_member_id__delete","responses":{},"security":[{"BearerAuth":[]}],"summary":"Remove a member from a project group","tags":["Projects"]}},"/api/research/hardware-devices":{"get":{"description":"</br>Optionally filter by platform via ?platform=ios or ?platform=android.</br>Returns devices with their current status, model, and OS info.","operationId":"research_api_list_hardware_devices_hardware_devices_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HardwareDevicesDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List available hardware devices from device-lab.","tags":["Research"]}},"/api/research/library":{"get":{"operationId":"research_api_list_library_chains_library_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List globally-shared exploit chains, optionally filtered by platform/os_version.","tags":["Research"]}},"/api/research/models/enumerate":{"get":{"operationId":"research_api_enumerate_models_models_enumerate_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelsEnumerateDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Diagnostic: list all Corellium models and check which have software listings.","tags":["Research"]}},"/api/research/platforms/{platform}/devices":{"get":{"description":"</br>Returns ALL models available on the Corellium plan for the platform,</br>with preferred models listed first.","operationId":"research_api_list_platform_devices_platforms__platform__devices_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformDevicesDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List available device models for a platform (android/ios).","tags":["Research"]}},"/api/research/platforms/{platform}/firmware-sample":{"get":{"operationId":"research_api_firmware_sample_platforms__platform__firmware_sample_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirmwareSampleDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Diagnostic: return the first 3 raw firmware entries for a platform+device to inspect field names.","tags":["Research"]}},"/api/research/platforms/{platform}/versions":{"get":{"description":"</br>Accepts ?device=<flavor> query param (defaults to first preferred device).","operationId":"research_api_list_platform_versions_platforms__platform__versions_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformVersionsDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List available OS versions for a device on a platform.","tags":["Research"]}},"/api/research/sessions":{"get":{"operationId":"research_api_list_exploit_sessions_sessions_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List the user's exploit lab sessions (excludes deleted).","tags":["Research"]}},"/api/research/start":{"post":{"description":"</br>If the user already has an active exploit project for the same platform + OS version,</br>return the existing one instead of creating a new device.","operationId":"research_api_start_exploit_session_start_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatusDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Create an exploit project + Corellium device + Cline container.","tags":["Research"]}},"/api/research/start-hardware":{"post":{"description":"</br>Unlike Corellium sessions, hardware devices already exist \u2014 this endpoint</br>connects to the selected device and creates the research project.","operationId":"research_api_start_hardware_session_start_hardware_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatusDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Start a research lab session using a hardware device from device-lab.","tags":["Research"]}},"/api/research/{project_name}/chains":{"get":{"operationId":"research_api_list_chains__project_name__chains_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List saved exploit chains for a project.","tags":["Research"]}},"/api/research/{project_name}/chains/generate":{"post":{"operationId":"research_api_generate_chains__project_name__chains_generate_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainGenerationStatusDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Trigger chain generation (or re-generation) and return current state.","tags":["Research"]}},"/api/research/{project_name}/chains/save":{"post":{"operationId":"research_api_save_chain__project_name__chains_save_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExploitChainDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Persist a generated chain to the database.","tags":["Research"]}},"/api/research/{project_name}/chains/status":{"get":{"operationId":"research_api_chain_generation_status__project_name__chains_status_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainGenerationStatusDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Poll the background chain generation status.","tags":["Research"]}},"/api/research/{project_name}/chains/{chain_id}":{"delete":{"operationId":"research_api_delete_chain__project_name__chains__int_chain_id__delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Delete a saved chain.","tags":["Research"]},"put":{"operationId":"research_api_update_chain__project_name__chains__int_chain_id__put","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Update chain status, notes, or script path.","tags":["Research"]}},"/api/research/{project_name}/chains/{chain_id}/library":{"post":{"operationId":"research_api_add_chain_to_library__project_name__chains__int_chain_id__library_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Mark a chain as part of the global exploit library (reusable across sessions).","tags":["Research"]}},"/api/research/{project_name}/container/start":{"post":{"operationId":"research_api_start_research_container__project_name__container_start_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Start the Cline container for a research project (after device is ready).","tags":["Research"]}},"/api/research/{project_name}/delete":{"post":{"operationId":"research_api_delete_exploit_session__project_name__delete_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Delete an exploit session: container, Corellium device, Corellium project, and DB records.","tags":["Research"]}},"/api/research/{project_name}/files/content":{"get":{"operationId":"research_api_read_file__project_name__files_content_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileContentDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Read file content from the research container.","tags":["Research"]},"put":{"operationId":"research_api_write_file__project_name__files_content_put","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Write file content inside the research container.","tags":["Research"]}},"/api/research/{project_name}/files/download":{"get":{"operationId":"research_api_download_file__project_name__files_download_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Download a file from the research container.","tags":["Research"]}},"/api/research/{project_name}/files/list":{"get":{"operationId":"research_api_list_files__project_name__files_list_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileListDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"List directory contents inside the research container.","tags":["Research"]}},"/api/research/{project_name}/files/search":{"get":{"operationId":"research_api_search_files__project_name__files_search_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileSearchDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Search file contents inside the research container.","tags":["Research"]}},"/api/research/{project_name}/status":{"get":{"operationId":"research_api_exploit_status__project_name__status_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatusDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Check exploit session status (device + container).","tags":["Research"]}},"/api/research/{project_name}/stop":{"post":{"operationId":"research_api_stop_exploit_session__project_name__stop_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Stop the Cline container and Corellium device (preserves device for later resume).","tags":["Research"]}},"/api/user-settings":{"get":{"operationId":"user_settings_api_get_user_settings_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Get current user's settings (API key status and BYOK provider key statuses).","tags":["User Settings"]}},"/api/user-settings/byok":{"put":{"operationId":"user_settings_api_update_byok_provider_keys_byok_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateByokRequestDTO"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsResponseDTO"}}},"description":"OK"},"422":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ValidationErrorModel"},"type":"array"}}},"description":"Unprocessable Content"}},"security":[{"BearerAuth":[]}],"summary":"Update BYOK provider API keys. Merges with existing keys (does not delete unlisted providers).","tags":["User Settings"]}},"/api/user-settings/byok/{provider}":{"delete":{"operationId":"user_settings_api_delete_byok_provider_key_byok__provider__delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteByokKeyResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Delete the stored API key for a specific BYOK provider.","tags":["User Settings"]}},"/api/user-settings/pipeline-script":{"get":{"operationId":"user_settings_api_download_pipeline_script_pipeline_script_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Download the example pipeline shell script from resources.","tags":["User Settings"]}},"/api/user-settings/user-api-key":{"delete":{"operationId":"user_settings_api_revoke_api_key_user_api_key_delete","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Revoke the user's API key.","tags":["User Settings"]},"post":{"description":"</br>The generated key is returned only once. Store it securely.","operationId":"user_settings_api_generate_api_key_user_api_key_post","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateUserApiKeyResponseDTO"}}},"description":"OK"}},"security":[{"BearerAuth":[]}],"summary":"Generate or regenerate the user's API key.","tags":["User Settings"]}},"/api/workspace/{project_name}/android-deep-scan/screen":{"get":{"description":"AFL++-style terminal dashboard (HTML) \u2014 the in-app equivalent of a live</br>``--screen`` view. The Android workflow runs out-of-process (host orchestrator</br>+ Docker), so there is no in-process emitter: this reads the checkpoint the</br>orchestrator writes on disk. Gated on the project's ``deep_scan`` scan config \u2014</br>returns ``exists:false`` (block stays hidden) when deep scan is off or no 0day</br>checkpoint exists yet. Same JSON contract as the iOS ``deep-scan/screen``.","operationId":"workspace_api_android_deep_scan_screen__project_name__android_deep_scan_screen_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Polling endpoint serving the Android 0day (\"deep scan\") progress as an","tags":["Workspace"]}},"/api/workspace/{project_name}/appsec/ai-powered-findings":{"get":{"description":"Query Params:</br>    triage: str (optional)</br>        - 'true': true positives</br>        - 'false': false positives</br>        - 'not_set': not set (default)</br>        - 'all': all results</br>    name_query: str (optional) - case-insensitive substring match on finding title/name</br>    description_query: str (optional) - case-insensitive substring match on description</br>    page: int (optional) - default 1</br>    per_page: int (optional) - default 20","operationId":"workspace_api_project_appsec_ai_findings__project_name__appsec_ai_powered_findings_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Get AI AppSec findings.","tags":["Workspace"]}},"/api/workspace/{project_name}/appsec/ai-powered-findings/status":{"post":{"operationId":"workspace_api_project_appsec_ai_findings_status__project_name__appsec_ai_powered_findings_status_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Update the triage status of an AI AppSec finding.","tags":["Workspace"]}},"/api/workspace/{project_name}/appsec/static-tool-findings":{"get":{"description":"Query Params:</br>    triage: str (optional)</br>        - 'true': true positives</br>        - 'false': false positives</br>        - 'not_set': not set (default)</br>        - 'all': all results</br>    name_query: str (optional) - case-insensitive substring match on finding title/name</br>    description_query: str (optional) - case-insensitive substring match on description</br>    page: int (optional) - default 1</br>    per_page: int (optional) - default 20","operationId":"workspace_api_project_appsec_static_findings__project_name__appsec_static_tool_findings_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Get Static Tool findings.","tags":["Workspace"]}},"/api/workspace/{project_name}/appsec/static-tool-findings/status":{"post":{"operationId":"workspace_api_project_appsec_static_findings_status__project_name__appsec_static_tool_findings_status_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Update the triage status of a static AppSec finding.","tags":["Workspace"]}},"/api/workspace/{project_name}/chat/code":{"post":{"operationId":"workspace_api_workspace_function_chat__project_name__chat_code_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Stream an LLM chat response about a native code function.","tags":["Workspace"]}},"/api/workspace/{project_name}/chat/finding":{"post":{"operationId":"workspace_api_workspace_finding_chat__project_name__chat_finding_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Stream an LLM chat response about a specific finding.","tags":["Workspace"]}},"/api/workspace/{project_name}/deep-scan/progress":{"get":{"operationId":"workspace_api_deep_scan_progress_stream__project_name__deep_scan_progress_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"SSE stream for live deep scan progress \u2014 poll until 'complete' or 'error' event.","tags":["Workspace"]}},"/api/workspace/{project_name}/deep-scan/screen":{"get":{"description":"in-app equivalent of the CLI `deep_scan_run.py --screen` terminal. Rendered from</br>the live emitter snapshot (or the last persisted progress.json when finished).","operationId":"workspace_api_deep_scan_screen__project_name__deep_scan_screen_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Polling endpoint serving the AFL++-style deep-scan dashboard as HTML \u2014 the","tags":["Workspace"]}},"/api/workspace/{project_name}/deep-scan/snapshot":{"get":{"operationId":"workspace_api_deep_scan_snapshot__project_name__deep_scan_snapshot_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Polling endpoint \u2014 returns current deep scan state as JSON.","tags":["Workspace"]}},"/api/workspace/{project_name}/file-content":{"get":{"operationId":"workspace_api_project_file_content__project_name__file_content_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Retrieve the content of a file within a project.","tags":["Workspace"]}},"/api/workspace/{project_name}/findings/{finding_type}/{finding_id}/notes":{"post":{"operationId":"workspace_api_finding_notes_create__project_name__findings__finding_type___finding_id__notes_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Append a new note to a finding.","tags":["Workspace"]}},"/api/workspace/{project_name}/findings/{finding_type}/{finding_id}/notes/{note_id}":{"delete":{"operationId":"workspace_api_finding_notes_delete__project_name__findings__finding_type___finding_id__notes__note_id__delete","responses":{},"security":[{"BearerAuth":[]}],"summary":"Delete a note. Admins can delete any note; others only their own.","tags":["Workspace"]},"put":{"operationId":"workspace_api_finding_notes_update__project_name__findings__finding_type___finding_id__notes__note_id__put","responses":{},"security":[{"BearerAuth":[]}],"summary":"Update an existing note. Only the note author may update it.","tags":["Workspace"]}},"/api/workspace/{project_name}/findings/{finding_type}/{finding_id}/severity-override":{"patch":{"operationId":"workspace_api_finding_severity_override__project_name__findings__finding_type___finding_id__severity_override_patch","responses":{},"security":[{"BearerAuth":[]}],"summary":"Set or clear the severity override for any finding type.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/app-config":{"get":{"description":"</br>Re-inspects rather than parsing `app.toml` back: the TOML is the artefact for</br>a human and for snapfuzz, and round-tripping it would make the UI depend on</br>its comment layout. The inspection is a few file reads.","operationId":"workspace_api_fuzzing_app_config__project_name__fuzzing_app_config_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"This app's fuzzing requirements, as the scan recorded them.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/console":{"get":{"description":"</br>The same renderer `scripts/live.sh` serves standalone and the fuzzer's web</br>front end embeds per upload. It is handed a `base` so its two data fetches</br>land on this project's API and carry this request's auth, rather than on the</br>standalone server's root paths.","operationId":"workspace_api_fuzzing_console__project_name__fuzzing_console_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"The live block map, as a page.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/crashes":{"get":{"description":"</br>Read out of the fuzzing SARIF rather than recomputed, so this is cheap and</br>always agrees with the finding that was ingested. The one exception is the</br>taint path: a SARIF written before that stage existed has no `taint_*`</br>properties, and the walk is a disk read with no device or container</br>involved, so it is filled in here rather than left blank.","operationId":"workspace_api_fuzzing_crashes__project_name__fuzzing_crashes_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Triaged crashes: what the detector found, and how input reaches the sink.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/progress":{"get":{"description":"</br>Same contract as the deep-scan stream, so the frontend's event handling is</br>shared: live emitter when a run is in this process, otherwise a one-shot</br>snapshot of the last persisted state.","operationId":"workspace_api_fuzzing_progress_stream__project_name__fuzzing_progress_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"SSE stream of live fuzz-campaign progress.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/screen":{"get":{"description":"</br>Same contract as `/deep-scan/screen` ({exists, html, phase, done}) so the</br>scan page can mount it with the existing `mountTerminal` helper rather than a</br>second live-view mechanism.","operationId":"workspace_api_fuzzing_screen__project_name__fuzzing_screen_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Polling endpoint serving the fuzz campaign dashboard as HTML.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/snapshot":{"get":{"operationId":"workspace_api_fuzzing_snapshot__project_name__fuzzing_snapshot_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Polling endpoint \u2014 current fuzz-campaign state as JSON.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/start":{"post":{"description":"</br>With `functionName`, exactly that symbol is fuzzed and nothing else: a</br>request for one function is not a search. Without it, this runs the same</br>selection the scan runs automatically \u2014 the deep scan's judged findings</br>first, topped up with parser entry points found in the binary \u2014 which is</br>what a user wants after a scan whose fuzz component was skipped or errored.</br></br>Deliberately NOT on the device blueprint. `unicorn` emulates the function in</br>a container and never touches a device, so routing it through the device page</br>would make the one methodology with no device dependency wait on a VM boot.","operationId":"workspace_api_fuzzing_start__project_name__fuzzing_start_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Start a campaign, against one symbol or against whatever the app offers.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/stop":{"post":{"description":"</br>Containers are stopped, not killed, so snapfuzz writes its summary and</br>flushes the corpus \u2014 a kill loses both.","operationId":"workspace_api_fuzzing_stop__project_name__fuzzing_stop_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Ask the running campaign to stop.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/stream":{"get":{"description":"</br>Reads the file rather than the in-process emitter on purpose: a campaign</br>started by the scan's own thread, by `POST /fuzzing/start`, or by</br>`scripts/run_fuzz_project.py` all write the same JSONL, so the map follows</br>any of them.","operationId":"workspace_api_fuzzing_stream__project_name__fuzzing_stream_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Tail the running campaign's telemetry as SSE, one record per event.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/structure":{"get":{"description":"</br>Built once per binary and cached. A 404 here means \"no map yet\", which the</br>page shows as such \u2014 distinct from a map with nothing lit, which would mean</br>the campaign reached nothing.","operationId":"workspace_api_fuzzing_structure__project_name__fuzzing_structure_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Every basic block in the app binary, grouped by module.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/targets":{"get":{"description":"</br>Each row carries why it was chosen \u2014 the primitive, the CWE, the confidence</br>and the controller-rooted call path \u2014 so the user can see the reasoning and</br>deselect rather than being handed an opaque list.</br></br>Two sources, and `origin` says which: the deep scan's judged findings, and</br>whatever static discovery wrote to disk on its last run. Discovery is read</br>from its cached JSON, never re-run \u2014 this endpoint is polled every three</br>seconds and discovery walks hundreds of call graphs in a container.","operationId":"workspace_api_fuzzing_targets__project_name__fuzzing_targets_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"The fuzzable targets, for the target picker.","tags":["Workspace"]}},"/api/workspace/{project_name}/fuzzing/triage-report":{"get":{"description":"</br>Served as text so it can be read in the browser, piped to a file, or pasted</br>into a ticket. `?download=1` forces a save with a sensible filename.","operationId":"workspace_api_fuzzing_triage_report__project_name__fuzzing_triage_report_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"The shareable Markdown triage report for this scan.","tags":["Workspace"]}},"/api/workspace/{project_name}/infra/findings":{"get":{"description":"Query Params:</br>    triage: str (optional)</br>        - 'true': true positives</br>        - 'false': false positives</br>        - 'not_set': not set (default)</br>        - 'all': all results</br>    name_query: str (optional) - case-insensitive substring match on finding rule name</br>    description_query: str (optional) - case-insensitive substring match on message</br>    severity: str (optional) - comma-separated severity values</br>    page: int (optional) - default 1</br>    per_page: int (optional) - default 20","operationId":"workspace_api_project_infra_findings__project_name__infra_findings_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Get Infra findings.","tags":["Workspace"]}},"/api/workspace/{project_name}/ios-dynamic-verify/screen":{"get":{"description":"AFL++-style terminal dashboard (HTML) \u2014 a second tab alongside the deep-scan</br>terminal. The verification runs out-of-process (Docker), so this reads the</br>files the container writes into ``poc/dynamic/`` (progress.json + verdicts.json).</br>Returns ``exists:false`` (tab stays hidden) until the dynamic-verify component</br>has produced anything. Same JSON contract as the deep-scan screen; ``done`` flips</br>true when the component is terminal so the client stops polling.","operationId":"workspace_api_ios_dynamic_verify_screen__project_name__ios_dynamic_verify_screen_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Polling endpoint serving the iOS dynamic-verification progress as an","tags":["Workspace"]}},"/api/workspace/{project_name}/llm-sast/terminal":{"get":{"description":"run.log \u2014 the dashboard equivalent of the CLI `--screen` output.</br></br>Query param `offset` (int): the JSONL line index already consumed; only newer</br>rows are returned. The raw run.log is never served directly (it embeds prompts);</br>this returns curated activity rows only.","operationId":"workspace_api_llm_sast_terminal__project_name__llm_sast_terminal_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Polling endpoint serving a sanitized terminal view of the regular SAST's","tags":["Workspace"]}},"/api/workspace/{project_name}/native/ai-powered-findings":{"get":{"description":"Query Params:</br>    triage: str (optional)</br>        - 'true': true positives</br>        - 'false': false positives</br>        - 'not_set': not set (default)</br>        - 'all': all results</br>    name_query: str (optional) - case-insensitive substring match on finding title/name</br>    description_query: str (optional) - case-insensitive substring match on description</br>    page: int (optional) - default 1</br>    per_page: int (optional) - default 20","operationId":"workspace_api_project_native_ai_findings__project_name__native_ai_powered_findings_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Get AI Native findings.","tags":["Workspace"]}},"/api/workspace/{project_name}/native/ai-powered-findings/status":{"post":{"operationId":"workspace_api_project_native_ai_findings_status__project_name__native_ai_powered_findings_status_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Update the triage status of a native AI finding.","tags":["Workspace"]}},"/api/workspace/{project_name}/native/functions/status":{"post":{"operationId":"workspace_api_project_native_function_status__project_name__native_functions_status_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Update the marked/traced status of a native function.","tags":["Workspace"]}},"/api/workspace/{project_name}/native/libraries-and-functions":{"get":{"description":"Query Params:</br>    marked: str (optional) - 'true', 'false', 'all' (default)</br>    traced: str (optional) - 'true', 'false', 'all' (default)</br>    library_query: str (optional) - case-insensitive substring match on library name</br>    function_query: str (optional) - case-insensitive substring match on function name</br>    page: int (optional) - default 1</br>    per_page: int (optional) - default 20","operationId":"workspace_api_project_native_libraries_and_functions__project_name__native_libraries_and_functions_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Get all native functions grouped by library.","tags":["Workspace"]}},"/api/workspace/{project_name}/native/llm-analysis":{"post":{"operationId":"workspace_api_project_native_llm_analysis__project_name__native_llm_analysis_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Trigger LLM analysis on a native function.","tags":["Workspace"]}},"/api/workspace/{project_name}/native/poc-download":{"get":{"description":"</br>Query params:</br>  lib: library name (e.g. libnative-lib.so)</br>  func: function name (e.g. overFlow)</br>  type: 'ondevice' | 'poc' (default: poc)","operationId":"workspace_api_project_native_poc_download__project_name__native_poc_download_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Download PoC validation harness or on-device JNI fuzzer as a zip archive.","tags":["Workspace"]}},"/api/workspace/{project_name}/native/reverse-engineer":{"post":{"operationId":"workspace_api_project_native_reverse_engineer__project_name__native_reverse_engineer_post","responses":{},"security":[{"BearerAuth":[]}],"summary":"Trigger reverse engineering on a native function using LLM.","tags":["Workspace"]}},"/api/workspace/{project_name}/source-scan/screen":{"get":{"description":"live terminal. Reads results/ai-source-scan/progress.json, which the scan writes</br>as each category/chunk completes. Returns ``exists:false`` (panel stays hidden)</br>until a source scan has started. Same JSON contract as the other screens.","operationId":"workspace_api_source_scan_screen__project_name__source_scan_screen_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Polling endpoint serving the AI SAST (source-code scan) progress as a compact","tags":["Workspace"]}},"/api/workspace/{project_name}/ssh-key":{"get":{"operationId":"workspace_api_project_download_ssh_key__project_name__ssh_key_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Download the SSH private key for the project.","tags":["Workspace"]}},"/api/workspace/{project_name}/ssh-setup-script":{"get":{"operationId":"workspace_api_project_download_ssh_setup_script__project_name__ssh_setup_script_get","responses":{},"security":[{"BearerAuth":[]}],"summary":"Download the SSH setup script for the project.","tags":["Workspace"]}}},"tags":[{"description":"Cline AI coding agent integration and session management","name":"Cline"},{"description":"Credits, subscription plans, and billing","name":"Credits"},{"description":"Dashboard data, analytics, and administration","name":"Dashboard"},{"description":"Device and scan management","name":"Device"},{"description":"Firebase app discovery and download","name":"Firebase"},{"description":"General utility endpoints","name":"General"},{"description":"Mobile device pairing and management","name":"Mobile"},{"description":"Project CRUD and grouping","name":"Projects"},{"description":"Research lab, exploit chains, and session management","name":"Research"},{"description":"User API key and BYOK provider key management","name":"User Settings"},{"description":"Workspace management, scan uploads, and AI analysis","name":"Workspace"},{"name":"Cline"},{"name":"Console"},{"name":"Research"},{"name":"Credits"},{"name":"Dashboard"},{"name":"Device"},{"name":"Firebase"},{"name":"Mobile"},{"name":"Projects"},{"name":"Workspace"},{"name":"User Settings"},{"description":"Agent-to-agent communication","name":"A2A"}]}
