{"openapi":"3.1.0","info":{"title":"GoWave API","version":"3.4.15","description":"GoWave implements the Remnawave backend API, contract `@remnawave/backend-contract` 3.4.15. Requests go to your panel: `https://<panel domain>/api/...` with `Authorization: Bearer <token>`.\n\nEndpoints GoWave adds on top of the contract are under **GoWave extensions**."},"paths":{"/api/auth/login":{"post":{"operationId":"Login","summary":"Login as superadmin","tags":["auth"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"accessToken":{"type":"string"}},"required":["accessToken"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","description":"Username of the user"},"password":{"type":"string","description":"Password of the user"}},"required":["username","password"]}}}}}},"/api/auth/oauth2/authorize":{"post":{"operationId":"OAuth2Authorize","summary":"Initiate OAuth2 authorization","tags":["auth"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"authorizationUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["authorizationUrl"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["telegram","github","pocketid","yandex","keycloak","generic"],"description":"`yandex` is not supported by GoWave."}},"required":["provider"]}}}}}},"/api/auth/oauth2/callback":{"post":{"operationId":"OAuth2Callback","summary":"Callback from OAuth2","tags":["auth"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"accessToken":{"type":"string"}},"required":["accessToken"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["telegram","github","pocketid","yandex","keycloak","generic"],"description":"`yandex` is not supported by GoWave."},"code":{"type":"string"},"state":{"type":"string"}},"required":["provider","code","state"]}}}}}},"/api/auth/passkey/authentication/options":{"get":{"operationId":"GetPasskeyAuthenticationOptions","summary":"Get the authentication options for passkey","tags":["auth"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{}},"required":["response"],"additionalProperties":false}}}}}}},"/api/auth/passkey/authentication/verify":{"post":{"operationId":"VerifyPasskeyAuthentication","summary":"Verify the authentication for passkey","tags":["auth"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"accessToken":{"type":"string"}},"required":["accessToken"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"response":{}},"required":["response"]}}}}}},"/api/auth/register":{"post":{"operationId":"Register","summary":"Register as superadmin","tags":["auth"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"accessToken":{"type":"string"}},"required":["accessToken"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","description":"Username of the user"},"password":{"type":"string","minLength":24,"pattern":"^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{24,}$"}},"required":["username","password"]}}}}}},"/api/auth/status":{"get":{"operationId":"GetStatus","summary":"Get the status of the authentication","tags":["auth"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isLoginAllowed":{"type":"boolean"},"isRegisterAllowed":{"type":"boolean"},"authentication":{"anyOf":[{"type":"object","properties":{"passkey":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"additionalProperties":false},"oauth2":{"type":"object","properties":{"providers":{"type":"object","propertyNames":{"type":"string","enum":["telegram","github","pocketid","yandex","keycloak","generic"]},"additionalProperties":{"type":"boolean"},"required":["telegram","github","pocketid","yandex","keycloak","generic"]}},"required":["providers"],"additionalProperties":false},"password":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"additionalProperties":false}},"required":["passkey","oauth2","password"],"additionalProperties":false},{"type":"null"}]},"branding":{"type":"object","properties":{"title":{"type":["string","null"]},"logoUrl":{"type":["string","null"]}},"required":["title","logoUrl"],"additionalProperties":false}},"required":["isLoginAllowed","isRegisterAllowed","authentication","branding"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/bandwidth-stats/internal-squads/{squadUuid}/users/{userId}/usage":{"get":{"operationId":"GetInternalSquadUserUsage","summary":"Get a single user daily traffic usage on the internal squad nodes for a period","tags":["bandwidth-stats"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"squadUuid","in":"path","required":true,"schema":{"type":"string"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Start date (YYYY-MM-DD)"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"End date (YYYY-MM-DD)"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Day (YYYY-MM-DD)"},"nodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"totalBytes":{"type":"number","description":"Used bytes on this node that day (raw bytes)"}},"required":["uuid","totalBytes"],"additionalProperties":false}}},"required":["date","nodes"],"additionalProperties":false}}},"required":["days"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Returns users whose total usage over the period on the given nodes is >= minTotalBytes, scoped to the nodes reachable via the Internal Squad inbounds. Every day in the range is present (zero-filled). Underlying usage data is flushed to the database roughly every 2 minutes."}},"/api/bandwidth-stats/internal-squads/{uuid}/usage":{"get":{"operationId":"GetInternalSquadUsage","summary":"Get internal squad users traffic usage for a period","tags":["bandwidth-stats"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Start date (YYYY-MM-DD)"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"End date (YYYY-MM-DD)"}},{"name":"minTotalBytes","in":"query","required":false,"schema":{"default":0,"description":"Only include users whose total usage over the period is >= this (bytes)","type":"number","minimum":0}},{"name":"limit","in":"query","required":false,"schema":{"default":250,"description":"Number of users to return, no more than 1000","type":"number","minimum":1,"maximum":1000}},{"name":"cursor","in":"query","required":false,"schema":{"description":"Pass the nextCursor from the previous response. Omit on the first request.","type":"number"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"squadUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"totalBytes":{"type":"number","description":"Total used bytes over the period (raw bytes)"}},"required":["id","totalBytes"],"additionalProperties":false}},"nextCursor":{"description":"Cursor to fetch the next page, or null if there are no more results","type":["string","null"]},"hasMore":{"type":"boolean","description":"Whether there are more results to fetch"}},"required":["squadUuid","users","nextCursor","hasMore"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Returns users whose total usage over the period on the given nodes is >= minTotalBytes, scoped to the nodes reachable via the internal squad inbounds. Underlying usage data is flushed to the database roughly every 2 minutes."}},"/api/bandwidth-stats/nodes/{uuid}/users":{"get":{"operationId":"GetStatsNodeUsersUsage","summary":"Get Node Users Usage by Node UUID","tags":["bandwidth-stats"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Start date (YYYY-MM-DD)"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"End date (YYYY-MM-DD)"}},{"name":"topUsersLimit","in":"query","required":false,"schema":{"default":100,"type":"number","minimum":1}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"string"}},"sparklineData":{"type":"array","items":{"type":"number"}},"topUsers":{"type":"array","items":{"type":"object","properties":{"color":{"type":"string"},"username":{"type":"string"},"total":{"type":"number"}},"required":["color","username","total"],"additionalProperties":false}}},"required":["categories","sparklineData","topUsers"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/bandwidth-stats/nodes/usage":{"post":{"operationId":"GetNodeUsage","summary":"Get users exceeding a traffic threshold on the given nodes for a period","tags":["bandwidth-stats"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Start date (YYYY-MM-DD)"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"End date (YYYY-MM-DD)"}},{"name":"minTotalBytes","in":"query","required":false,"schema":{"default":0,"description":"Only include users whose total usage over the period is >= this (bytes)","type":"number","minimum":0}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"nodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"totalBytes":{"type":"number","description":"Total used bytes over the period (raw bytes)"}},"required":["id","totalBytes"],"additionalProperties":false}}},"required":["uuid","users"],"additionalProperties":false}}},"required":["nodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Returns users whose total usage over the period on the given nodes is >= minTotalBytes. Underlying usage data is flushed to the database roughly every 2 minutes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nodesUuids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Node UUIDs to include"}},"required":["nodesUuids"]}}}}}},"/api/bandwidth-stats/nodes/users":{"post":{"operationId":"GetStatsNodesUsersUsage","summary":"Get Nodes Users Usage by Nodes UUIDs","tags":["bandwidth-stats"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Start date (YYYY-MM-DD)"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"End date (YYYY-MM-DD)"}},{"name":"topUsersLimit","in":"query","required":false,"schema":{"default":100,"type":"number","minimum":1}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"string"}},"sparklineData":{"type":"array","items":{"type":"number"}},"topUsers":{"type":"array","items":{"type":"object","properties":{"color":{"type":"string"},"username":{"type":"string"},"total":{"type":"number"}},"required":["color","username","total"],"additionalProperties":false}}},"required":["categories","sparklineData","topUsers"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nodesUuids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["nodesUuids"]}}}}}},"/api/bandwidth-stats/nodes":{"get":{"operationId":"GetStatsNodesUsage","summary":"Get Nodes Usage by Range","tags":["bandwidth-stats"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Start date (YYYY-MM-DD)"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"End date (YYYY-MM-DD)"}},{"name":"topNodesLimit","in":"query","required":false,"schema":{"default":20,"description":"Limit of top nodes to return","type":"number","minimum":1}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"string"}},"sparklineData":{"type":"array","items":{"type":"number"}},"topNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"color":{"type":"string"},"name":{"type":"string"},"countryCode":{"type":"string"},"total":{"type":"number"}},"required":["uuid","color","name","countryCode","total"],"additionalProperties":false}},"series":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"color":{"type":"string"},"countryCode":{"type":"string"},"total":{"type":"number"},"data":{"type":"array","items":{"type":"number"}}},"required":["uuid","name","color","countryCode","total","data"],"additionalProperties":false}}},"required":["categories","sparklineData","topNodes","series"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/bandwidth-stats/users/{userId}":{"get":{"operationId":"GetStatsUserUsage","summary":"Get User Usage by Range","tags":["bandwidth-stats"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Start date (YYYY-MM-DD)"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"End date (YYYY-MM-DD)"}},{"name":"topNodesLimit","in":"query","required":false,"schema":{"default":20,"type":"number","minimum":1}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"string"}},"sparklineData":{"type":"array","items":{"type":"number"}},"topNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"color":{"type":"string"},"name":{"type":"string"},"countryCode":{"type":"string"},"total":{"type":"number"}},"required":["uuid","color","name","countryCode","total"],"additionalProperties":false}},"series":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"color":{"type":"string"},"countryCode":{"type":"string"},"total":{"type":"number"},"data":{"type":"array","items":{"type":"number"}}},"required":["uuid","name","color","countryCode","total","data"],"additionalProperties":false}}},"required":["categories","sparklineData","topNodes","series"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/config-profiles/{uuid}/computed-config":{"get":{"operationId":"GetComputedConfigProfileByUuid","summary":"Get computed config profile by uuid","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"nodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","config","inbounds","nodes","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/config-profiles/{uuid}/inbounds":{"get":{"operationId":"GetInboundsByProfileUuid","summary":"Get inbounds by profile uuid","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]},"activeSquads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound","activeSquads"],"additionalProperties":false}}},"required":["total","inbounds"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/config-profiles/{uuid}":{"delete":{"operationId":"DeleteConfigProfile","summary":"Delete config profile","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetConfigProfileByUuid","summary":"Get config profile by uuid","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"nodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","config","inbounds","nodes","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/config-profiles/actions/reorder":{"post":{"operationId":"ReorderConfigProfile","summary":"Reorder config profiles","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"configProfiles":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"nodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","config","inbounds","nodes","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","configProfiles"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["viewPosition","uuid"]}}},"required":["items"]}}}}}},"/api/config-profiles/inbounds":{"get":{"operationId":"GetAllInbounds","summary":"Get all inbounds from all config profiles","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]},"activeSquads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound","activeSquads"],"additionalProperties":false}}},"required":["total","inbounds"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/config-profiles/tags":{"get":{"operationId":"GetConfigProfilesTags","summary":"Get tags of Config Profiles","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"SetConfigProfileTags","summary":"Set tags of Config Profile","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"type":"array","items":{"type":"string"}}},"required":["uuid","tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}}},"required":["uuid","tags"]}}}}}},"/api/config-profiles":{"get":{"operationId":"GetConfigProfiles","summary":"Get config profiles","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"configProfiles":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"nodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","config","inbounds","nodes","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","configProfiles"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateConfigProfile","summary":"Update Core Config in specific config profile","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"nodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","config","inbounds","nodes","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"},"config":{"type":"object","properties":{},"additionalProperties":{}}},"required":["uuid"]}}}}},"post":{"operationId":"CreateConfigProfile","summary":"Create config profile","tags":["config-profiles"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"nodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","config","inbounds","nodes","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"},"config":{"type":"object","properties":{},"additionalProperties":{}}},"required":["name","config"]}}}}}},"/api/connections/by-node/{jobId}":{"get":{"operationId":"ConnectionsByNodeResult","summary":"Get Connections for Node by Job ID","tags":["connections"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isCompleted":{"type":"boolean"},"isFailed":{"type":"boolean"},"result":{"anyOf":[{"type":"object","properties":{"success":{"type":"boolean"},"nodeUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"users":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"number"},"ips":{"type":"array","items":{"type":"object","properties":{"ip":{"type":"string"},"lastSeen":{}},"required":["ip","lastSeen"],"additionalProperties":false}}},"required":["userId","ips"],"additionalProperties":false}}},"required":["success","nodeUuid","users"],"additionalProperties":false},{"type":"null"}]}},"required":["isCompleted","isFailed","result"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/connections/by-node/{nodeUuid}":{"post":{"operationId":"ConnectionsByNode","summary":"Request Connections for Node","tags":["connections"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"nodeUuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"jobId":{"type":"string"}},"required":["jobId"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/connections/by-user/{jobId}":{"get":{"operationId":"ConnectionsByUserResult","summary":"Get Connections for User by Job ID","tags":["connections"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isCompleted":{"type":"boolean"},"isFailed":{"type":"boolean"},"progress":{"type":"object","properties":{"total":{"type":"number"},"completed":{"type":"number"},"percent":{"type":"number"}},"required":["total","completed","percent"],"additionalProperties":false},"result":{"anyOf":[{"type":"object","properties":{"success":{"type":"boolean"},"userId":{"type":"number"},"nodes":{"type":"array","items":{"type":"object","properties":{"nodeUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeName":{"type":"string"},"countryCode":{"type":"string"},"ips":{"type":"array","items":{"type":"object","properties":{"ip":{"type":"string"},"lastSeen":{}},"required":["ip","lastSeen"],"additionalProperties":false}}},"required":["nodeUuid","nodeName","countryCode","ips"],"additionalProperties":false}}},"required":["success","userId","nodes"],"additionalProperties":false},{"type":"null"}]}},"required":["isCompleted","isFailed","progress","result"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/connections/by-user/{userId}":{"post":{"operationId":"ConnectionsByUser","summary":"Request Connections for User","tags":["connections"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"jobId":{"type":"string"}},"required":["jobId"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/connections/drop":{"post":{"operationId":"DropConnections","summary":"Drop Connections for Users or IPs","tags":["connections"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"dropBy":{"oneOf":[{"type":"object","properties":{"by":{"type":"string","const":"userIds"},"userIds":{"minItems":1,"type":"array","items":{"type":"number"}}},"required":["by","userIds"],"description":"Drop by user IDs"},{"type":"object","properties":{"by":{"type":"string","const":"ipAddresses"},"ipAddresses":{"minItems":1,"type":"array","items":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]}}},"required":["by","ipAddresses"],"description":"Drop by IP addresses"}]},"targetNodes":{"oneOf":[{"type":"object","properties":{"target":{"type":"string","const":"allNodes"}},"required":["target"],"description":"Target all connected nodes"},{"type":"object","properties":{"target":{"type":"string","const":"specificNodes"},"nodeUuids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["target","nodeUuids"],"description":"Target specific nodes"}]}},"required":["dropBy","targetNodes"]}}}}}},"/api/connections/geocheck/{jobId}":{"get":{"operationId":"GeocheckByNodeResult","summary":"Get Geocheck for Node by Job ID","tags":["connections"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isCompleted":{"type":"boolean"},"isFailed":{"type":"boolean"},"result":{"anyOf":[{"type":"object","properties":{"success":{"type":"boolean"},"nodeUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"image":{"anyOf":[{"type":"object","properties":{"format":{"type":"string","const":"svg"},"media_type":{"type":"string","const":"image/svg+xml"},"encoding":{"type":"string","const":"base64"},"data":{"type":"string","description":"Base64-encoded image, ready for a data: URL"}},"required":["format","media_type","encoding","data"],"additionalProperties":false},{"type":"null"}]},"rawReport":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}],"description":"The full node report with the image object stripped out"},"message":{"type":["string","null"]}},"required":["success","nodeUuid","image","rawReport","message"],"additionalProperties":false},{"type":"null"}]}},"required":["isCompleted","isFailed","result"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/connections/geocheck/{nodeUuid}":{"post":{"operationId":"GeocheckByNode","summary":"Request Geocheck for Node","tags":["connections"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"nodeUuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"jobId":{"type":"string"}},"required":["jobId"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Queues a geocheck on the node and returns a job ID. Poll \"Get Geocheck for Node by Job ID\" for the result, the node may take up to a minute to answer.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ip":{"description":"Check from this IP address","type":"string"},"interface":{"description":"Check from this network interface","type":"string"}}}}}}}},"/api/external-squads/{uuid}/bulk-actions/add-users":{"post":{"operationId":"AddUsersToExternalSquad","summary":"Add all users to external squad","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}}},"/api/external-squads/{uuid}/bulk-actions/remove-users":{"delete":{"operationId":"DeleteUsersFromExternalSquad","summary":"Delete users from external squad","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}}},"/api/external-squads/{uuid}":{"delete":{"operationId":"DeleteExternalSquad","summary":"Delete external squad","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetExternalSquadByUuid","summary":"Get external squad by uuid","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"}},"required":["membersCount"],"additionalProperties":false},"templates":{"type":"array","items":{"type":"object","properties":{"templateUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"required":["templateUuid","templateType"],"additionalProperties":false}},"subscriptionSettings":{"anyOf":[{"type":"object","properties":{"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"randomizeHosts":{"type":"boolean"}},"additionalProperties":false},{"type":"null"}]},"hostOverrides":{"anyOf":[{"type":"object","properties":{"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]}},"additionalProperties":false},{"type":"null"}]},"responseHeadersAdd":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"responseHeadersRemove":{"type":"array","items":{"type":"string"}},"hwidSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"],"additionalProperties":false},{"type":"null"}]},"customRemarks":{"anyOf":[{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"],"additionalProperties":false},{"type":"null"}]},"subpageConfigUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","templates","subscriptionSettings","hostOverrides","responseHeadersAdd","responseHeadersRemove","hwidSettings","customRemarks","subpageConfigUuid","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/external-squads/actions/reorder":{"post":{"operationId":"ReorderExternalSquad","summary":"Reorder external squads","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"externalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"}},"required":["membersCount"],"additionalProperties":false},"templates":{"type":"array","items":{"type":"object","properties":{"templateUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"required":["templateUuid","templateType"],"additionalProperties":false}},"subscriptionSettings":{"anyOf":[{"type":"object","properties":{"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"randomizeHosts":{"type":"boolean"}},"additionalProperties":false},{"type":"null"}]},"hostOverrides":{"anyOf":[{"type":"object","properties":{"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]}},"additionalProperties":false},{"type":"null"}]},"responseHeadersAdd":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"responseHeadersRemove":{"type":"array","items":{"type":"string"}},"hwidSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"],"additionalProperties":false},{"type":"null"}]},"customRemarks":{"anyOf":[{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"],"additionalProperties":false},{"type":"null"}]},"subpageConfigUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","templates","subscriptionSettings","hostOverrides","responseHeadersAdd","responseHeadersRemove","hwidSettings","customRemarks","subpageConfigUuid","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","externalSquads"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["viewPosition","uuid"]}}},"required":["items"]}}}}}},"/api/external-squads/tags":{"get":{"operationId":"GetExternalSquadsTags","summary":"Get tags of External Squads","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"SetExternalSquadTags","summary":"Set tags of External Squad","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"type":"array","items":{"type":"string"}}},"required":["uuid","tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}}},"required":["uuid","tags"]}}}}}},"/api/external-squads":{"get":{"operationId":"GetExternalSquads","summary":"Get all external squads","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"externalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"}},"required":["membersCount"],"additionalProperties":false},"templates":{"type":"array","items":{"type":"object","properties":{"templateUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"required":["templateUuid","templateType"],"additionalProperties":false}},"subscriptionSettings":{"anyOf":[{"type":"object","properties":{"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"randomizeHosts":{"type":"boolean"}},"additionalProperties":false},{"type":"null"}]},"hostOverrides":{"anyOf":[{"type":"object","properties":{"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]}},"additionalProperties":false},{"type":"null"}]},"responseHeadersAdd":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"responseHeadersRemove":{"type":"array","items":{"type":"string"}},"hwidSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"],"additionalProperties":false},{"type":"null"}]},"customRemarks":{"anyOf":[{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"],"additionalProperties":false},{"type":"null"}]},"subpageConfigUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","templates","subscriptionSettings","hostOverrides","responseHeadersAdd","responseHeadersRemove","hwidSettings","customRemarks","subpageConfigUuid","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","externalSquads"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateExternalSquad","summary":"Update external squad","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"}},"required":["membersCount"],"additionalProperties":false},"templates":{"type":"array","items":{"type":"object","properties":{"templateUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"required":["templateUuid","templateType"],"additionalProperties":false}},"subscriptionSettings":{"anyOf":[{"type":"object","properties":{"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"randomizeHosts":{"type":"boolean"}},"additionalProperties":false},{"type":"null"}]},"hostOverrides":{"anyOf":[{"type":"object","properties":{"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]}},"additionalProperties":false},{"type":"null"}]},"responseHeadersAdd":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"responseHeadersRemove":{"type":"array","items":{"type":"string"}},"hwidSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"],"additionalProperties":false},{"type":"null"}]},"customRemarks":{"anyOf":[{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"],"additionalProperties":false},{"type":"null"}]},"subpageConfigUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","templates","subscriptionSettings","hostOverrides","responseHeadersAdd","responseHeadersRemove","hwidSettings","customRemarks","subpageConfigUuid","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the external squad"},"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"},"templates":{"type":"array","items":{"type":"object","properties":{"templateUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"UUID of the subscription template"},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"],"description":"Type of the subscription template"}},"required":["templateUuid","templateType"]}},"subscriptionSettings":{"type":"object","properties":{"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"randomizeHosts":{"type":"boolean"}}},"hostOverrides":{"type":"object","properties":{"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]}}},"responseHeadersAdd":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"responseHeadersRemove":{"type":"array","items":{"type":"string"}},"hwidSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"]},{"type":"null"}]},"customRemarks":{"anyOf":[{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"]},{"type":"null"}]},"subpageConfigUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["uuid"]}}}}},"post":{"operationId":"CreateExternalSquad","summary":"Create external squad","tags":["external-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"}},"required":["membersCount"],"additionalProperties":false},"templates":{"type":"array","items":{"type":"object","properties":{"templateUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"required":["templateUuid","templateType"],"additionalProperties":false}},"subscriptionSettings":{"anyOf":[{"type":"object","properties":{"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"randomizeHosts":{"type":"boolean"}},"additionalProperties":false},{"type":"null"}]},"hostOverrides":{"anyOf":[{"type":"object","properties":{"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]}},"additionalProperties":false},{"type":"null"}]},"responseHeadersAdd":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"responseHeadersRemove":{"type":"array","items":{"type":"string"}},"hwidSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"],"additionalProperties":false},{"type":"null"}]},"customRemarks":{"anyOf":[{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"],"additionalProperties":false},{"type":"null"}]},"subpageConfigUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","templates","subscriptionSettings","hostOverrides","responseHeadersAdd","responseHeadersRemove","hwidSettings","customRemarks","subpageConfigUuid","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"}},"required":["name"]}}}}}},"/api/hosts/{uuid}":{"delete":{"operationId":"DeleteHost","summary":"Delete a host by UUID","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetHost","summary":"Get a host by UUID","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remark":{"type":"string"},"address":{"type":"string"},"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"path":{"type":["string","null"]},"sni":{"type":["string","null"]},"host":{"type":["string","null"]},"alpn":{"anyOf":[{"type":"string","enum":["h3","h2","http/1.1","h2,http/1.1","h3,h2,http/1.1","h3,h2"]},{"type":"null"}]},"fingerprint":{"type":["string","null"]},"isDisabled":{"type":"boolean"},"securityLayer":{"default":"DEFAULT","type":"string","enum":["DEFAULT","TLS","NONE"]},"xhttpExtraParams":{"anyOf":[{},{"type":"null"}]},"muxParams":{"anyOf":[{},{"type":"null"}]},"sockoptParams":{"anyOf":[{},{"type":"null"}]},"finalMask":{"anyOf":[{},{"type":"null"}]},"inbound":{"type":"object","properties":{"configProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"configProfileInboundUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["configProfileUuid","configProfileInboundUuid"],"additionalProperties":false},"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"tags":{"default":[],"type":"array","items":{"type":"string"}},"isHidden":{"default":false,"type":"boolean"},"overrideSniFromAddress":{"default":false,"type":"boolean"},"keepSniBlank":{"default":false,"type":"boolean"},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]},"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"shuffleHost":{"type":"boolean"},"mihomoX25519":{"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"nodes":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"xrayJsonTemplateUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"excludeFromSubscriptionTypes":{"type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"additionalProperties":false,"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."},"internalSquads":{"type":"object","properties":{"mode":{"type":"string","enum":["EXCLUDE","ALLOW_ONLY"]},"squads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mode","squads"],"additionalProperties":false}},"required":["uuid","viewPosition","remark","address","port","path","sni","host","alpn","fingerprint","isDisabled","securityLayer","xhttpExtraParams","muxParams","sockoptParams","finalMask","inbound","serverDescription","tags","isHidden","overrideSniFromAddress","keepSniBlank","vlessRouteId","pinnedPeerCertSha256","verifyPeerCertByName","shuffleHost","mihomoX25519","mihomoIpVersion","nodes","xrayJsonTemplateUuid","excludeFromSubscriptionTypes","mapper","internalSquads"],"additionalProperties":false}},"required":["response"],"additionalProperties":false,"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}}}},"/api/hosts/actions/clone":{"post":{"operationId":"CloneHost","summary":"Clone host","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remark":{"type":"string"},"address":{"type":"string"},"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"path":{"type":["string","null"]},"sni":{"type":["string","null"]},"host":{"type":["string","null"]},"alpn":{"anyOf":[{"type":"string","enum":["h3","h2","http/1.1","h2,http/1.1","h3,h2,http/1.1","h3,h2"]},{"type":"null"}]},"fingerprint":{"type":["string","null"]},"isDisabled":{"type":"boolean"},"securityLayer":{"default":"DEFAULT","type":"string","enum":["DEFAULT","TLS","NONE"]},"xhttpExtraParams":{"anyOf":[{},{"type":"null"}]},"muxParams":{"anyOf":[{},{"type":"null"}]},"sockoptParams":{"anyOf":[{},{"type":"null"}]},"finalMask":{"anyOf":[{},{"type":"null"}]},"inbound":{"type":"object","properties":{"configProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"configProfileInboundUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["configProfileUuid","configProfileInboundUuid"],"additionalProperties":false},"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"tags":{"default":[],"type":"array","items":{"type":"string"}},"isHidden":{"default":false,"type":"boolean"},"overrideSniFromAddress":{"default":false,"type":"boolean"},"keepSniBlank":{"default":false,"type":"boolean"},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]},"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"shuffleHost":{"type":"boolean"},"mihomoX25519":{"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"nodes":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"xrayJsonTemplateUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"excludeFromSubscriptionTypes":{"type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"additionalProperties":false,"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."},"internalSquads":{"type":"object","properties":{"mode":{"type":"string","enum":["EXCLUDE","ALLOW_ONLY"]},"squads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mode","squads"],"additionalProperties":false}},"required":["uuid","viewPosition","remark","address","port","path","sni","host","alpn","fingerprint","isDisabled","securityLayer","xhttpExtraParams","muxParams","sockoptParams","finalMask","inbound","serverDescription","tags","isHidden","overrideSniFromAddress","keepSniBlank","vlessRouteId","pinnedPeerCertSha256","verifyPeerCertByName","shuffleHost","mihomoX25519","mihomoIpVersion","nodes","xrayJsonTemplateUuid","excludeFromSubscriptionTypes","mapper","internalSquads"],"additionalProperties":false}},"required":["response"],"additionalProperties":false,"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cloneFromUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["cloneFromUuid"]}}}}}},"/api/hosts/actions/reorder":{"post":{"operationId":"ReorderHosts","summary":"Reorder hosts","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isUpdated":{"type":"boolean"}},"required":["isUpdated"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hosts":{"type":"array","items":{"type":"object","properties":{"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["viewPosition","uuid"]}}},"required":["hosts"]}}}}}},"/api/hosts/bulk/delete":{"post":{"operationId":"BulkDeleteHosts","summary":"Delete hosts by UUIDs","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["uuids"]}}}}}},"/api/hosts/bulk/disable":{"post":{"operationId":"BulkDisableHosts","summary":"Disable hosts by UUIDs","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["uuids"]}}}}}},"/api/hosts/bulk/enable":{"post":{"operationId":"BulkEnableHosts","summary":"Enable hosts by UUIDs","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["uuids"]}}}}}},"/api/hosts/bulk/update":{"patch":{"operationId":"UpdateManyHosts","summary":"Update many hosts","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"inbound":{"type":"object","properties":{"configProfileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"configProfileInboundUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["configProfileUuid","configProfileInboundUuid"]},"remark":{"type":"string","minLength":1,"maxLength":100},"address":{"type":"string"},"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"path":{"type":["string","null"]},"sni":{"type":["string","null"]},"host":{"type":["string","null"]},"alpn":{"anyOf":[{"type":"string","enum":["h3","h2","http/1.1","h2,http/1.1","h3,h2,http/1.1","h3,h2"]},{"type":"null"}]},"fingerprint":{"type":["string","null"]},"isDisabled":{"type":"boolean"},"securityLayer":{"type":"string","enum":["DEFAULT","TLS","NONE"]},"xhttpExtraParams":{"anyOf":[{},{"type":"null"}]},"muxParams":{"anyOf":[{},{"type":"null"}]},"sockoptParams":{"anyOf":[{},{"type":"null"}]},"finalMask":{"anyOf":[{},{"type":"null"}]},"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"isHidden":{"type":"boolean"},"overrideSniFromAddress":{"type":"boolean"},"keepSniBlank":{"type":"boolean"},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]},"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"shuffleHost":{"type":"boolean"},"mihomoX25519":{"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"nodes":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"xrayJsonTemplateUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"excludeFromSubscriptionTypes":{"description":"Optional. Subscription types from which the host will be excluded from.","type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."},"internalSquads":{"type":"object","properties":{"mode":{"type":"string","enum":["EXCLUDE","ALLOW_ONLY"]},"squads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mode","squads"]},"uuids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["uuids"],"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}}},"/api/hosts/tags":{"get":{"operationId":"GetHostsTags","summary":"Get tags of hosts","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/hosts":{"get":{"operationId":"GetHosts","summary":"Get hosts","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remark":{"type":"string"},"address":{"type":"string"},"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"path":{"type":["string","null"]},"sni":{"type":["string","null"]},"host":{"type":["string","null"]},"alpn":{"anyOf":[{"type":"string","enum":["h3","h2","http/1.1","h2,http/1.1","h3,h2,http/1.1","h3,h2"]},{"type":"null"}]},"fingerprint":{"type":["string","null"]},"isDisabled":{"type":"boolean"},"securityLayer":{"default":"DEFAULT","type":"string","enum":["DEFAULT","TLS","NONE"]},"xhttpExtraParams":{"anyOf":[{},{"type":"null"}]},"muxParams":{"anyOf":[{},{"type":"null"}]},"sockoptParams":{"anyOf":[{},{"type":"null"}]},"finalMask":{"anyOf":[{},{"type":"null"}]},"inbound":{"type":"object","properties":{"configProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"configProfileInboundUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["configProfileUuid","configProfileInboundUuid"],"additionalProperties":false},"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"tags":{"default":[],"type":"array","items":{"type":"string"}},"isHidden":{"default":false,"type":"boolean"},"overrideSniFromAddress":{"default":false,"type":"boolean"},"keepSniBlank":{"default":false,"type":"boolean"},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]},"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"shuffleHost":{"type":"boolean"},"mihomoX25519":{"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"nodes":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"xrayJsonTemplateUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"excludeFromSubscriptionTypes":{"type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"additionalProperties":false,"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."},"internalSquads":{"type":"object","properties":{"mode":{"type":"string","enum":["EXCLUDE","ALLOW_ONLY"]},"squads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mode","squads"],"additionalProperties":false}},"required":["uuid","viewPosition","remark","address","port","path","sni","host","alpn","fingerprint","isDisabled","securityLayer","xhttpExtraParams","muxParams","sockoptParams","finalMask","inbound","serverDescription","tags","isHidden","overrideSniFromAddress","keepSniBlank","vlessRouteId","pinnedPeerCertSha256","verifyPeerCertByName","shuffleHost","mihomoX25519","mihomoIpVersion","nodes","xrayJsonTemplateUuid","excludeFromSubscriptionTypes","mapper","internalSquads"],"additionalProperties":false}}},"required":["response"],"additionalProperties":false,"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}}},"patch":{"operationId":"UpdateHost","summary":"Update a host","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remark":{"type":"string"},"address":{"type":"string"},"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"path":{"type":["string","null"]},"sni":{"type":["string","null"]},"host":{"type":["string","null"]},"alpn":{"anyOf":[{"type":"string","enum":["h3","h2","http/1.1","h2,http/1.1","h3,h2,http/1.1","h3,h2"]},{"type":"null"}]},"fingerprint":{"type":["string","null"]},"isDisabled":{"type":"boolean"},"securityLayer":{"default":"DEFAULT","type":"string","enum":["DEFAULT","TLS","NONE"]},"xhttpExtraParams":{"anyOf":[{},{"type":"null"}]},"muxParams":{"anyOf":[{},{"type":"null"}]},"sockoptParams":{"anyOf":[{},{"type":"null"}]},"finalMask":{"anyOf":[{},{"type":"null"}]},"inbound":{"type":"object","properties":{"configProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"configProfileInboundUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["configProfileUuid","configProfileInboundUuid"],"additionalProperties":false},"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"tags":{"default":[],"type":"array","items":{"type":"string"}},"isHidden":{"default":false,"type":"boolean"},"overrideSniFromAddress":{"default":false,"type":"boolean"},"keepSniBlank":{"default":false,"type":"boolean"},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]},"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"shuffleHost":{"type":"boolean"},"mihomoX25519":{"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"nodes":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"xrayJsonTemplateUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"excludeFromSubscriptionTypes":{"type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"additionalProperties":false,"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."},"internalSquads":{"type":"object","properties":{"mode":{"type":"string","enum":["EXCLUDE","ALLOW_ONLY"]},"squads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mode","squads"],"additionalProperties":false}},"required":["uuid","viewPosition","remark","address","port","path","sni","host","alpn","fingerprint","isDisabled","securityLayer","xhttpExtraParams","muxParams","sockoptParams","finalMask","inbound","serverDescription","tags","isHidden","overrideSniFromAddress","keepSniBlank","vlessRouteId","pinnedPeerCertSha256","verifyPeerCertByName","shuffleHost","mihomoX25519","mihomoIpVersion","nodes","xrayJsonTemplateUuid","excludeFromSubscriptionTypes","mapper","internalSquads"],"additionalProperties":false}},"required":["response"],"additionalProperties":false,"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"inbound":{"type":"object","properties":{"configProfileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"configProfileInboundUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["configProfileUuid","configProfileInboundUuid"]},"remark":{"type":"string","minLength":1,"maxLength":100},"address":{"type":"string"},"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"path":{"type":["string","null"]},"sni":{"type":["string","null"]},"host":{"type":["string","null"]},"alpn":{"anyOf":[{"type":"string","enum":["h3","h2","http/1.1","h2,http/1.1","h3,h2,http/1.1","h3,h2"]},{"type":"null"}]},"fingerprint":{"type":["string","null"]},"isDisabled":{"type":"boolean"},"securityLayer":{"type":"string","enum":["DEFAULT","TLS","NONE"]},"xhttpExtraParams":{"anyOf":[{},{"type":"null"}]},"muxParams":{"anyOf":[{},{"type":"null"}]},"sockoptParams":{"anyOf":[{},{"type":"null"}]},"finalMask":{"anyOf":[{},{"type":"null"}]},"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"isHidden":{"type":"boolean"},"overrideSniFromAddress":{"type":"boolean"},"keepSniBlank":{"type":"boolean"},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]},"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"shuffleHost":{"type":"boolean"},"mihomoX25519":{"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"nodes":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"xrayJsonTemplateUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"excludeFromSubscriptionTypes":{"description":"Optional. Subscription types from which the host will be excluded from.","type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."},"internalSquads":{"type":"object","properties":{"mode":{"type":"string","enum":["EXCLUDE","ALLOW_ONLY"]},"squads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mode","squads"]}},"required":["uuid"],"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}},"post":{"operationId":"CreateHost","summary":"Create a new host","tags":["hosts"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remark":{"type":"string"},"address":{"type":"string"},"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"path":{"type":["string","null"]},"sni":{"type":["string","null"]},"host":{"type":["string","null"]},"alpn":{"anyOf":[{"type":"string","enum":["h3","h2","http/1.1","h2,http/1.1","h3,h2,http/1.1","h3,h2"]},{"type":"null"}]},"fingerprint":{"type":["string","null"]},"isDisabled":{"type":"boolean"},"securityLayer":{"default":"DEFAULT","type":"string","enum":["DEFAULT","TLS","NONE"]},"xhttpExtraParams":{"anyOf":[{},{"type":"null"}]},"muxParams":{"anyOf":[{},{"type":"null"}]},"sockoptParams":{"anyOf":[{},{"type":"null"}]},"finalMask":{"anyOf":[{},{"type":"null"}]},"inbound":{"type":"object","properties":{"configProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"configProfileInboundUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["configProfileUuid","configProfileInboundUuid"],"additionalProperties":false},"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"tags":{"default":[],"type":"array","items":{"type":"string"}},"isHidden":{"default":false,"type":"boolean"},"overrideSniFromAddress":{"default":false,"type":"boolean"},"keepSniBlank":{"default":false,"type":"boolean"},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]},"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"shuffleHost":{"type":"boolean"},"mihomoX25519":{"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"nodes":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"xrayJsonTemplateUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"excludeFromSubscriptionTypes":{"type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"additionalProperties":false,"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."},"internalSquads":{"type":"object","properties":{"mode":{"type":"string","enum":["EXCLUDE","ALLOW_ONLY"]},"squads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mode","squads"],"additionalProperties":false}},"required":["uuid","viewPosition","remark","address","port","path","sni","host","alpn","fingerprint","isDisabled","securityLayer","xhttpExtraParams","muxParams","sockoptParams","finalMask","inbound","serverDescription","tags","isHidden","overrideSniFromAddress","keepSniBlank","vlessRouteId","pinnedPeerCertSha256","verifyPeerCertByName","shuffleHost","mihomoX25519","mihomoIpVersion","nodes","xrayJsonTemplateUuid","excludeFromSubscriptionTypes","mapper","internalSquads"],"additionalProperties":false}},"required":["response"],"additionalProperties":false,"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"inbound":{"type":"object","properties":{"configProfileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"configProfileInboundUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["configProfileUuid","configProfileInboundUuid"]},"remark":{"type":"string","minLength":1,"maxLength":100},"address":{"type":"string"},"port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"path":{"type":["string","null"]},"sni":{"type":["string","null"]},"host":{"type":["string","null"]},"alpn":{"anyOf":[{"type":"string","enum":["h3","h2","http/1.1","h2,http/1.1","h3,h2,http/1.1","h3,h2"]},{"type":"null"}]},"fingerprint":{"type":["string","null"]},"isDisabled":{"default":false,"type":"boolean"},"securityLayer":{"default":"DEFAULT","type":"string","enum":["DEFAULT","TLS","NONE"]},"xhttpExtraParams":{"anyOf":[{},{"type":"null"}]},"muxParams":{"anyOf":[{},{"type":"null"}]},"sockoptParams":{"anyOf":[{},{"type":"null"}]},"finalMask":{"anyOf":[{},{"type":"null"}]},"serverDescription":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"isHidden":{"default":false,"type":"boolean"},"overrideSniFromAddress":{"default":false,"type":"boolean"},"keepSniBlank":{"default":false,"type":"boolean"},"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":0,"maximum":65535},{"type":"null"}]},"shuffleHost":{"default":false,"type":"boolean"},"mihomoX25519":{"default":false,"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"nodes":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"xrayJsonTemplateUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"excludeFromSubscriptionTypes":{"description":"Optional. Subscription types from which the host will be excluded from.","type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."},"internalSquads":{"type":"object","properties":{"mode":{"type":"string","enum":["EXCLUDE","ALLOW_ONLY"]},"squads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mode","squads"]}},"required":["inbound","remark","address","port"],"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}}},"/api/hwid/devices/{userId}":{"get":{"operationId":"GetUserHwidDevices","summary":"Get user HWID devices","tags":["hwid"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"devices":{"type":"array","items":{"type":"object","properties":{"hwid":{"type":"string"},"userId":{"type":"number"},"platform":{"type":["string","null"]},"osVersion":{"type":["string","null"]},"deviceModel":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"requestIp":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["hwid","userId","platform","osVersion","deviceModel","userAgent","requestIp","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","devices"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/hwid/devices/delete-all":{"post":{"operationId":"DeleteAllUserHwidDevices","summary":"Delete all user HWID devices","tags":["hwid"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"devices":{"type":"array","items":{"type":"object","properties":{"hwid":{"type":"string"},"userId":{"type":"number"},"platform":{"type":["string","null"]},"osVersion":{"type":["string","null"]},"deviceModel":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"requestIp":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["hwid","userId","platform","osVersion","deviceModel","userAgent","requestIp","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","devices"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"number"}},"required":["userId"]}}}}}},"/api/hwid/devices/delete":{"post":{"operationId":"DeleteUserHwidDevice","summary":"Delete a user HWID device","tags":["hwid"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"devices":{"type":"array","items":{"type":"object","properties":{"hwid":{"type":"string"},"userId":{"type":"number"},"platform":{"type":["string","null"]},"osVersion":{"type":["string","null"]},"deviceModel":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"requestIp":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["hwid","userId","platform","osVersion","deviceModel","userAgent","requestIp","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","devices"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"number"},"hwid":{"type":"string"}},"required":["userId","hwid"]}}}}}},"/api/hwid/devices/stats":{"get":{"operationId":"GetHwidDevicesStats","summary":"Get HWID devices stats","tags":["hwid"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"byPlatform":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"count":{"type":"number"},"byApp":{"type":"array","items":{"type":"object","properties":{"app":{"type":"string"},"count":{"type":"number"}},"required":["app","count"],"additionalProperties":false}}},"required":["platform","count","byApp"],"additionalProperties":false}},"stats":{"type":"object","properties":{"totalUniqueDevices":{"type":"number"},"totalHwidDevices":{"type":"number"},"averageHwidDevicesPerUser":{"type":"number"}},"required":["totalUniqueDevices","totalHwidDevices","averageHwidDevicesPerUser"],"additionalProperties":false}},"required":["byPlatform","stats"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/hwid/devices/top-users":{"get":{"operationId":"GetTopUsersByHwidDevices","summary":"Get top users by HWID devices","tags":["hwid"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"default":0,"description":"Start index (offset) of the results to return, default is 0","type":"number"}},{"name":"size","in":"query","required":false,"schema":{"default":5,"type":"number","minimum":1,"maximum":100,"description":"Number of results to return, no more than 100"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"devicesCount":{"type":"number"}},"required":["id","username","devicesCount"],"additionalProperties":false}},"total":{"type":"number"}},"required":["users","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/hwid/devices":{"get":{"operationId":"GetHwidDevices","summary":"Get HWID devices","tags":["hwid"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"default":0,"description":"Start index (offset) of the results to return, default is 0","type":"number"}},{"name":"size","in":"query","required":false,"schema":{"default":25,"type":"number","minimum":1,"maximum":1000,"description":"Number of results to return, no more than 1000"}},{"name":"filters","in":"query","required":false,"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"value":{}},"required":["id","value"]}}},{"name":"filterModes","in":"query","required":false,"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},{"name":"globalFilterMode","in":"query","required":false,"schema":{"type":"string"}},{"name":"sorting","in":"query","required":false,"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"desc":{"type":"boolean"}},"required":["id","desc"]}}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"devices":{"type":"array","items":{"type":"object","properties":{"hwid":{"type":"string"},"userId":{"type":"number"},"platform":{"type":["string","null"]},"osVersion":{"type":["string","null"]},"deviceModel":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"requestIp":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["hwid","userId","platform","osVersion","deviceModel","userAgent","requestIp","createdAt","updatedAt"],"additionalProperties":false}},"total":{"type":"number"}},"required":["devices","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Please note that the filters here are primarily intended for use by the frontend and rely on expensive operators such as LIKE under the hood. Misusing these filters may negatively impact the performance of your database."},"post":{"operationId":"CreateUserHwidDevice","summary":"Create a user HWID device","tags":["hwid"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"devices":{"type":"array","items":{"type":"object","properties":{"hwid":{"type":"string"},"userId":{"type":"number"},"platform":{"type":["string","null"]},"osVersion":{"type":["string","null"]},"deviceModel":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"requestIp":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["hwid","userId","platform","osVersion","deviceModel","userAgent","requestIp","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","devices"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hwid":{"type":"string","pattern":"^[a-zA-Z0-9=-]{10,64}$"},"userId":{"type":"number"},"platform":{"type":"string"},"osVersion":{"type":"string"},"deviceModel":{"type":"string"},"userAgent":{"type":"string"},"requestIp":{"type":"string"}},"required":["hwid","userId"]}}}}}},"/api/infra-billing/history/{uuid}":{"delete":{"operationId":"DeleteInfraBillingRecord","summary":"Delete infra billing history","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}}},"/api/infra-billing/history":{"get":{"operationId":"GetInfraBillingRecords","summary":"Get infra billing history","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"default":0,"description":"Start index (offset) of the billing history records to return, default is 0","type":"number"}},{"name":"size","in":"query","required":false,"schema":{"default":50,"type":"number","minimum":1,"maximum":500,"description":"Number of billing records to return, no more than 500"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"providerUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"number"},"billedAt":{},"provider":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]}},"required":["uuid","name","faviconLink"],"additionalProperties":false}},"required":["uuid","providerUuid","amount","billedAt","provider"],"additionalProperties":false}},"total":{"type":"number"}},"required":["records","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"post":{"operationId":"CreateInfraBillingRecord","summary":"Create infra billing history","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"providerUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"number"},"billedAt":{},"provider":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]}},"required":["uuid","name","faviconLink"],"additionalProperties":false}},"required":["uuid","providerUuid","amount","billedAt","provider"],"additionalProperties":false}},"total":{"type":"number"}},"required":["records","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"providerUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"number","minimum":0},"billedAt":{"description":"Billing date. Format: 2025-01-17T15:38:45.065Z","type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"}},"required":["providerUuid","amount","billedAt"]}}}}}},"/api/infra-billing/nodes/{uuid}":{"delete":{"operationId":"DeleteInfraBillingNode","summary":"Delete infra billing node","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}}},"/api/infra-billing/nodes":{"get":{"operationId":"GetInfraBillingNodes","summary":"Get infra billing nodes","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"totalBillingNodes":{"type":"number"},"billingNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"name":{"type":["string","null"]},"providerUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"provider":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"loginUrl":{"type":["string","null"]},"faviconLink":{"type":["string","null"]}},"required":["uuid","name","loginUrl","faviconLink"],"additionalProperties":false},"node":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false},{"type":"null"}]},"nextBillingAt":{},"createdAt":{},"updatedAt":{}},"required":["uuid","nodeUuid","name","providerUuid","provider","node","nextBillingAt","createdAt","updatedAt"],"additionalProperties":false}},"availableBillingNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"totalAvailableBillingNodes":{"type":"number"},"stats":{"type":"object","properties":{"upcomingNodesCount":{"type":"number"},"currentMonthPayments":{"type":"number"},"totalSpent":{"type":"number"}},"required":["upcomingNodesCount","currentMonthPayments","totalSpent"],"additionalProperties":false}},"required":["totalBillingNodes","billingNodes","availableBillingNodes","totalAvailableBillingNodes","stats"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateInfraBillingNode","summary":"Update infra billing nodes","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"totalBillingNodes":{"type":"number"},"billingNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"name":{"type":["string","null"]},"providerUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"provider":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"loginUrl":{"type":["string","null"]},"faviconLink":{"type":["string","null"]}},"required":["uuid","name","loginUrl","faviconLink"],"additionalProperties":false},"node":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false},{"type":"null"}]},"nextBillingAt":{},"createdAt":{},"updatedAt":{}},"required":["uuid","nodeUuid","name","providerUuid","provider","node","nextBillingAt","createdAt","updatedAt"],"additionalProperties":false}},"availableBillingNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"totalAvailableBillingNodes":{"type":"number"},"stats":{"type":"object","properties":{"upcomingNodesCount":{"type":"number"},"currentMonthPayments":{"type":"number"},"totalSpent":{"type":"number"}},"required":["upcomingNodesCount","currentMonthPayments","totalSpent"],"additionalProperties":false}},"required":["totalBillingNodes","billingNodes","availableBillingNodes","totalAvailableBillingNodes","stats"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"nextBillingAt":{"type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"}},"required":["uuids","nextBillingAt"]}}}}},"post":{"operationId":"CreateInfraBillingNode","summary":"Create infra billing node","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"totalBillingNodes":{"type":"number"},"billingNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"name":{"type":["string","null"]},"providerUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"provider":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"loginUrl":{"type":["string","null"]},"faviconLink":{"type":["string","null"]}},"required":["uuid","name","loginUrl","faviconLink"],"additionalProperties":false},"node":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false},{"type":"null"}]},"nextBillingAt":{},"createdAt":{},"updatedAt":{}},"required":["uuid","nodeUuid","name","providerUuid","provider","node","nextBillingAt","createdAt","updatedAt"],"additionalProperties":false}},"availableBillingNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false}},"totalAvailableBillingNodes":{"type":"number"},"stats":{"type":"object","properties":{"upcomingNodesCount":{"type":"number"},"currentMonthPayments":{"type":"number"},"totalSpent":{"type":"number"}},"required":["upcomingNodesCount","currentMonthPayments","totalSpent"],"additionalProperties":false}},"required":["totalBillingNodes","billingNodes","availableBillingNodes","totalAvailableBillingNodes","stats"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"providerUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"name":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}]},"nextBillingAt":{"description":"Next billing date. Format: 2025-01-17T15:38:45.065Z","type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"}},"required":["providerUuid","nodeUuid","name","nextBillingAt"]}}}}}},"/api/infra-billing/providers/{uuid}":{"delete":{"operationId":"DeleteInfraProvider","summary":"Delete infra provider by uuid","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetInfraProvider","summary":"Get infra provider by uuid","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{},"billingHistory":{"type":"object","properties":{"totalAmount":{"type":"number"},"totalBills":{"type":"number"}},"required":["totalAmount","totalBills"],"additionalProperties":false},"billingNodes":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"details":{"anyOf":[{"type":"object","properties":{"nodeUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"countryCode":{"type":"string"}},"required":["nodeUuid","countryCode"],"additionalProperties":false},{"type":"null"}]}},"required":["name","details"],"additionalProperties":false}}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt","billingHistory","billingNodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/infra-billing/providers":{"get":{"operationId":"GetInfraProviders","summary":"Get all infra providers","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"providers":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{},"billingHistory":{"type":"object","properties":{"totalAmount":{"type":"number"},"totalBills":{"type":"number"}},"required":["totalAmount","totalBills"],"additionalProperties":false},"billingNodes":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"details":{"anyOf":[{"type":"object","properties":{"nodeUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"countryCode":{"type":"string"}},"required":["nodeUuid","countryCode"],"additionalProperties":false},{"type":"null"}]}},"required":["name","details"],"additionalProperties":false}}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt","billingHistory","billingNodes"],"additionalProperties":false}}},"required":["total","providers"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateInfraProvider","summary":"Update infra provider","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{},"billingHistory":{"type":"object","properties":{"totalAmount":{"type":"number"},"totalBills":{"type":"number"}},"required":["totalAmount","totalBills"],"additionalProperties":false},"billingNodes":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"details":{"anyOf":[{"type":"object","properties":{"nodeUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"countryCode":{"type":"string"}},"required":["nodeUuid","countryCode"],"additionalProperties":false},{"type":"null"}]}},"required":["name","details"],"additionalProperties":false}}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt","billingHistory","billingNodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":30},"faviconLink":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"loginUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["uuid"]}}}}},"post":{"operationId":"CreateInfraProvider","summary":"Create infra provider","tags":["infra-billing"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{},"billingHistory":{"type":"object","properties":{"totalAmount":{"type":"number"},"totalBills":{"type":"number"}},"required":["totalAmount","totalBills"],"additionalProperties":false},"billingNodes":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"details":{"anyOf":[{"type":"object","properties":{"nodeUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"countryCode":{"type":"string"}},"required":["nodeUuid","countryCode"],"additionalProperties":false},{"type":"null"}]}},"required":["name","details"],"additionalProperties":false}}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt","billingHistory","billingNodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":30},"faviconLink":{"type":"string","format":"uri"},"loginUrl":{"type":"string","format":"uri"}},"required":["name"]}}}}}},"/api/internal-squads/{uuid}/accessible-nodes":{"get":{"operationId":"GetInternalSquadAccessibleNodes","summary":"Get internal squad accessible nodes","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"squadUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"accessibleNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeName":{"type":"string"},"countryCode":{"type":"string"},"configProfileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"configProfileName":{"type":"string"},"activeInbounds":{"type":"array","items":{"type":"string"}}},"required":["uuid","nodeName","countryCode","configProfileUuid","configProfileName","activeInbounds"],"additionalProperties":false}}},"required":["squadUuid","accessibleNodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/internal-squads/{uuid}/bulk-actions/add-many-users":{"post":{"operationId":"AddManyUsersToInternalSquad","summary":"Add many users to internal squad","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"number"}}},"required":["userIds"]}}}}}},"/api/internal-squads/{uuid}/bulk-actions/add-users":{"post":{"operationId":"AddUsersToInternalSquad","summary":"Add all users to internal squad","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}}},"/api/internal-squads/{uuid}/bulk-actions/remove-many-users":{"delete":{"operationId":"DeleteManyUsersFromInternalSquad","summary":"Delete many users from internal squad","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"number"}}},"required":["userIds"]}}}}}},"/api/internal-squads/{uuid}/bulk-actions/remove-users":{"delete":{"operationId":"DeleteUsersFromInternalSquad","summary":"Delete users from internal squad","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}}},"/api/internal-squads/{uuid}":{"delete":{"operationId":"DeleteInternalSquad","summary":"Delete internal squad","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetInternalSquad","summary":"Get internal squad by uuid","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"},"inboundsCount":{"type":"number"}},"required":["membersCount","inboundsCount"],"additionalProperties":false},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","inbounds","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/internal-squads/actions/reorder":{"post":{"operationId":"ReorderInternalSquad","summary":"Reorder internal squads","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"internalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"},"inboundsCount":{"type":"number"}},"required":["membersCount","inboundsCount"],"additionalProperties":false},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","inbounds","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","internalSquads"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["viewPosition","uuid"]}}},"required":["items"]}}}}}},"/api/internal-squads/tags":{"get":{"operationId":"GetInternalSquadsTags","summary":"Get tags of Internal Squads","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"SetInternalSquadTags","summary":"Set tags of Internal Squad","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"type":"array","items":{"type":"string"}}},"required":["uuid","tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}}},"required":["uuid","tags"]}}}}}},"/api/internal-squads":{"get":{"operationId":"GetInternalSquads","summary":"Get all internal squads","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"internalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"},"inboundsCount":{"type":"number"}},"required":["membersCount","inboundsCount"],"additionalProperties":false},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","inbounds","createdAt","updatedAt"],"additionalProperties":false}}},"required":["total","internalSquads"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateInternalSquad","summary":"Update internal squad","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"},"inboundsCount":{"type":"number"}},"required":["membersCount","inboundsCount"],"additionalProperties":false},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","inbounds","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"},"inbounds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["uuid"]}}}}},"post":{"operationId":"CreateInternalSquad","summary":"Create internal squad","tags":["internal-squads"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"info":{"type":"object","properties":{"membersCount":{"type":"number"},"inboundsCount":{"type":"number"}},"required":["membersCount","inboundsCount"],"additionalProperties":false},"inbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}},"createdAt":{},"updatedAt":{}},"required":["uuid","viewPosition","name","tags","info","inbounds","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"},"inbounds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["name","inbounds"]}}}}}},"/api/keygen":{"get":{"operationId":"GetNodeSecretKey","summary":"Get SECRET_KEY for Remnawave Node","tags":["keygen"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"secretKey":{"type":"string"}},"required":["secretKey"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/metadata/node/{uuid}":{"get":{"operationId":"GetNodeMetadata","summary":"Get node metadata","tags":["metadata"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"metadata":{"type":"object","properties":{},"additionalProperties":{}}},"required":["metadata"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"put":{"operationId":"UpsertNodeMetadata","summary":"Update or create Node Metadata","tags":["metadata"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"metadata":{"type":"object","properties":{},"additionalProperties":{}}},"required":["metadata"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"metadata":{"type":"object","properties":{},"additionalProperties":{}}},"required":["metadata"]}}}}}},"/api/metadata/user/{userId}":{"get":{"operationId":"GetUserMetadata","summary":"Get user metadata","tags":["metadata"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"metadata":{"type":"object","properties":{},"additionalProperties":{}}},"required":["metadata"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"put":{"operationId":"UpsertUserMetadata","summary":"Update or create User Metadata","tags":["metadata"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"metadata":{"type":"object","properties":{},"additionalProperties":{}}},"required":["metadata"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"metadata":{"type":"object","properties":{},"additionalProperties":{}}},"required":["metadata"]}}}}}},"/api/node-integrations/{uuid}":{"delete":{"operationId":"DeleteNodeIntegration","summary":"Delete Node Integration","tags":["node-integrations"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetNodeIntegration","summary":"Get Node Integration by uuid","tags":["node-integrations"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"description":{"type":["string","null"]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["uuid","name","description","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/node-integrations":{"get":{"operationId":"GetNodeIntegrations","summary":"Get all Node Integrations","tags":["node-integrations"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"nodeIntegrations":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"description":{"type":["string","null"]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["uuid","name","description","config"],"additionalProperties":false}}},"required":["total","nodeIntegrations"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateNodeIntegration","summary":"Update Node Integration","tags":["node-integrations"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"description":{"type":["string","null"]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["uuid","name","description","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":30},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"restartNodes":{"type":"boolean"}},"required":["uuid"]}}}}},"post":{"operationId":"CreateNodeIntegration","summary":"Create Node Integration","tags":["node-integrations"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"description":{"type":["string","null"]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["uuid","name","description","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":30},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["name","config"]}}}}}},"/api/node-plugins/{uuid}":{"delete":{"operationId":"DeleteNodePlugin","summary":"Delete Node Plugin","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetNodePlugin","summary":"Get Node Plugin by uuid","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"pluginConfig":{}},"required":["uuid","viewPosition","name","tags","pluginConfig"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/node-plugins/actions/clone":{"post":{"operationId":"CloneNodePlugin","summary":"Clone Node Plugin","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"pluginConfig":{}},"required":["uuid","viewPosition","name","tags","pluginConfig"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cloneFromUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["cloneFromUuid"]}}}}}},"/api/node-plugins/actions/reorder":{"post":{"operationId":"ReorderNodePlugin","summary":"Reorder Node Plugins","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"nodePlugins":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"pluginConfig":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","viewPosition","name","tags","pluginConfig"],"additionalProperties":false}}},"required":["total","nodePlugins"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["viewPosition","uuid"]}}},"required":["items"]}}}}}},"/api/node-plugins/actions/sync":{"post":{"operationId":"SyncNodePlugin","summary":"Sync Node Plugin to nodes","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"description":"Push the current plugin config, including referenced shared lists, to every connected node this plugin is active on.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["uuid"]}}}}}},"/api/node-plugins/executor":{"post":{"operationId":"PluginExecutor","summary":"Execute command on node plugins","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"command":{"oneOf":[{"type":"object","properties":{"command":{"type":"string","const":"blockIps"},"ips":{"minItems":1,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"timeout":{"type":"number"}},"required":["ip","timeout"]}}},"required":["command","ips"],"description":"Block IPs"},{"type":"object","properties":{"command":{"type":"string","const":"unblockIps"},"ips":{"minItems":1,"type":"array","items":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]}}},"required":["command","ips"],"description":"Unblock IPs"},{"type":"object","properties":{"command":{"type":"string","const":"recreateTables"}},"required":["command"],"description":"Recreate tables"}]},"targetNodes":{"oneOf":[{"type":"object","properties":{"target":{"type":"string","const":"allNodes"}},"required":["target"],"description":"Target all connected nodes"},{"type":"object","properties":{"target":{"type":"string","const":"specificNodes"},"nodeUuids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["target","nodeUuids"],"description":"Target specific nodes"}]}},"required":["command","targetNodes"]}}}}}},"/api/node-plugins/shared-lists/actions/sync":{"post":{"operationId":"SyncSharedList","summary":"Sync Shared List to nodes","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"description":"Push every plugin referencing this shared list to the nodes it is active on.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"}},"required":["name"]}}}}}},"/api/node-plugins/shared-lists/by-name":{"get":{"operationId":"GetSharedList","summary":"Get Shared List by name","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["name","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/node-plugins/shared-lists":{"delete":{"operationId":"DeleteSharedList","summary":"Delete Shared List by name","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"}},"required":["name"]}}}}},"get":{"operationId":"GetSharedLists","summary":"Get Shared Lists (Preview)","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"sharedLists":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"},"type":{"type":"string"},"itemsCount":{"type":"number"}},"required":["name","type","itemsCount"],"additionalProperties":false}}},"required":["total","sharedLists"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Returns only the name, type and item count of every shared list. Use \"Get Shared List by name\" to fetch the items themselves."},"patch":{"operationId":"UpdateSharedList","summary":"Update Shared List","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["name","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["name","config"]}}}}},"post":{"operationId":"CreateSharedList","summary":"Create Shared List","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["name","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_-]+(\\/[A-Za-z0-9_-]+)*$"},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["name","config"]}}}}}},"/api/node-plugins/tags":{"get":{"operationId":"GetNodePluginsTags","summary":"Get tags of Node Plugins","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"SetNodePluginTags","summary":"Set tags of Node Plugin","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"type":"array","items":{"type":"string"}}},"required":["uuid","tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}}},"required":["uuid","tags"]}}}}}},"/api/node-plugins/torrent-blocker/stats":{"get":{"operationId":"GetTorrentBlockerReportsStats","summary":"Get Torrent Blocker Reports Stats","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"stats":{"type":"object","properties":{"distinctNodes":{"type":"number"},"distinctUsers":{"type":"number"},"totalReports":{"type":"number"},"reportsLast24Hours":{"type":"number"}},"required":["distinctNodes","distinctUsers","totalReports","reportsLast24Hours"],"additionalProperties":false},"topUsers":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"number"},"color":{"type":"string"},"username":{"type":"string"},"total":{"type":"number"}},"required":["userId","color","username","total"],"additionalProperties":false}},"topNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"countryCode":{"type":"string"},"color":{"type":"string"},"name":{"type":"string"},"total":{"type":"number"}},"required":["uuid","countryCode","color","name","total"],"additionalProperties":false}}},"required":["stats","topUsers","topNodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/node-plugins/torrent-blocker/truncate":{"delete":{"operationId":"TruncateTorrentBlockerReports","summary":"Truncate Torrent Blocker Reports","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}}}},"/api/node-plugins/torrent-blocker":{"get":{"operationId":"GetTorrentBlockerReports","summary":"Get Torrent Blocker Reports","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"default":0,"description":"Start index (offset) of the results to return, default is 0","type":"number"}},{"name":"size","in":"query","required":false,"schema":{"default":25,"type":"number","minimum":1,"maximum":1000,"description":"Number of results to return, no more than 1000"}},{"name":"filters","in":"query","required":false,"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"value":{}},"required":["id","value"]}}},{"name":"filterModes","in":"query","required":false,"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},{"name":"globalFilterMode","in":"query","required":false,"schema":{"type":"string"}},{"name":"sorting","in":"query","required":false,"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"desc":{"type":"boolean"}},"required":["id","desc"]}}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"userId":{"type":"number"},"nodeId":{"type":"number"},"user":{"type":"object","properties":{"username":{"type":"string"}},"required":["username"],"additionalProperties":false},"node":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"countryCode":{"type":"string"}},"required":["uuid","name","countryCode"],"additionalProperties":false},"report":{"type":"object","properties":{"actionReport":{"type":"object","properties":{"blocked":{"type":"boolean"},"ip":{"type":"string"},"blockDuration":{"type":"number"},"willUnblockAt":{},"userId":{"type":"string"},"processedAt":{}},"required":["blocked","ip","blockDuration","willUnblockAt","userId","processedAt"],"additionalProperties":false},"xrayReport":{"type":"object","properties":{"email":{"type":["string","null"]},"level":{"type":["number","null"]},"protocol":{"type":["string","null"]},"network":{"type":"string"},"source":{"type":["string","null"]},"destination":{"type":"string"},"routeTarget":{"type":["string","null"]},"originalTarget":{"type":["string","null"]},"inboundTag":{"type":["string","null"]},"inboundName":{"type":["string","null"]},"inboundLocal":{"type":["string","null"]},"outboundTag":{"type":["string","null"]},"ts":{"type":"number"}},"required":["email","level","protocol","network","source","destination","routeTarget","originalTarget","inboundTag","inboundName","inboundLocal","outboundTag","ts"],"additionalProperties":false}},"required":["actionReport","xrayReport"],"additionalProperties":false},"createdAt":{}},"required":["id","userId","nodeId","user","node","report","createdAt"],"additionalProperties":false}},"total":{"type":"number"}},"required":["records","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Please note that the filters here are primarily intended for use by the frontend and rely on expensive operators such as LIKE under the hood. Misusing these filters may negatively impact the performance of your database."}},"/api/node-plugins":{"get":{"operationId":"GetNodePlugins","summary":"Get all Node Plugins","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"nodePlugins":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"pluginConfig":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","viewPosition","name","tags","pluginConfig"],"additionalProperties":false}}},"required":["total","nodePlugins"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateNodePlugin","summary":"Update Node Plugin","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"pluginConfig":{}},"required":["uuid","viewPosition","name","tags","pluginConfig"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"},"pluginConfig":{}},"required":["uuid"]}}}}},"post":{"operationId":"CreateNodePlugin","summary":"Create Node Plugin","tags":["node-plugins"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"pluginConfig":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","viewPosition","name","tags","pluginConfig"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"}},"required":["name"]}}}}}},"/api/node-ssh/{uuid}/ticket":{"post":{"operationId":"CreateSshTicket","summary":"Create a single-use ticket for opening an SSH terminal session","tags":["node-ssh"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"ticket":{"type":"string"},"path":{"type":"string"},"expiresInSeconds":{"type":"number"}},"required":["ticket","path","expiresInSeconds"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/node-ssh/vault/evaluate":{"post":{"operationId":"EvaluateVault","summary":"Oblivious evaluation step for unlocking the SSH key vault","tags":["node-ssh"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"evaluated":{"type":"string","format":"base64","contentEncoding":"base64","pattern":"^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"}},"required":["evaluated"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"blinded":{"type":"string","maxLength":128,"format":"base64","contentEncoding":"base64","pattern":"^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"}},"required":["blinded"]}}}}}},"/api/nodes/{uuid}/actions/disable":{"post":{"operationId":"DisableNode","summary":"Disable a node","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"id":{"type":"number"},"name":{"type":"string"},"address":{"type":"string"},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxyUrl":{"type":["string","null"]},"isConnected":{"type":"boolean"},"isDisabled":{"type":"boolean"},"isConnecting":{"type":"boolean"},"lastStatusChange":{"anyOf":[{},{"type":"null"}]},"lastStatusMessage":{"type":["string","null"]},"isTrafficTrackingActive":{"type":"boolean"},"trafficResetDay":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"trafficLimitBytes":{"type":["number","null"]},"trafficUsedBytes":{"type":["number","null"]},"notifyPercent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"countryCode":{"type":"string"},"consumptionMultiplier":{"type":"number"},"nodeConsumptionMultiplier":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"integrationUuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"],"additionalProperties":false}},"createdAt":{},"updatedAt":{},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"activeInbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}}},"required":["activeConfigProfileUuid","activeInbounds"],"additionalProperties":false},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"provider":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"system":{"anyOf":[{"type":"object","properties":{"info":{"type":"object","properties":{"arch":{"type":"string"},"cpus":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cpuModel":{"type":"string"},"memoryTotal":{"type":"number"},"hostname":{"type":"string"},"platform":{"type":"string"},"release":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"networkInterfaces":{"type":"array","items":{"type":"string"}}},"required":["arch","cpus","cpuModel","memoryTotal","hostname","platform","release","type","version","networkInterfaces"],"additionalProperties":false},"stats":{"type":"object","properties":{"memoryFree":{"type":"number"},"memoryUsed":{"type":"number"},"uptime":{"type":"number"},"loadAvg":{"type":"array","items":{"type":"number"}},"interface":{"anyOf":[{"type":"object","properties":{"interface":{"type":"string"},"rxBytesPerSec":{"type":"number"},"txBytesPerSec":{"type":"number"},"rxTotal":{"type":"number"},"txTotal":{"type":"number"}},"required":["interface","rxBytesPerSec","txBytesPerSec","rxTotal","txTotal"],"additionalProperties":false},{"type":"null"}]}},"required":["memoryFree","memoryUsed","uptime","loadAvg","interface"],"additionalProperties":false}},"required":["info","stats"],"additionalProperties":false},{"type":"null"}]},"versions":{"anyOf":[{"type":"object","properties":{"xray":{"type":"string"},"node":{"type":"string"}},"required":["xray","node"],"additionalProperties":false},{"type":"null"}]},"xrayUptime":{"type":"number"},"usersOnline":{"type":"number"},"note":{"type":["string","null"]}},"required":["uuid","id","name","address","port","proxyUrl","isConnected","isDisabled","isConnecting","lastStatusChange","lastStatusMessage","isTrafficTrackingActive","trafficResetDay","trafficLimitBytes","trafficUsedBytes","notifyPercent","viewPosition","countryCode","consumptionMultiplier","nodeConsumptionMultiplier","tags","integrationUuids","ips","createdAt","updatedAt","configProfile","providerUuid","provider","activePluginUuid","system","versions","xrayUptime","usersOnline","note"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/nodes/{uuid}/actions/enable":{"post":{"operationId":"EnableNode","summary":"Enable a node","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"id":{"type":"number"},"name":{"type":"string"},"address":{"type":"string"},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxyUrl":{"type":["string","null"]},"isConnected":{"type":"boolean"},"isDisabled":{"type":"boolean"},"isConnecting":{"type":"boolean"},"lastStatusChange":{"anyOf":[{},{"type":"null"}]},"lastStatusMessage":{"type":["string","null"]},"isTrafficTrackingActive":{"type":"boolean"},"trafficResetDay":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"trafficLimitBytes":{"type":["number","null"]},"trafficUsedBytes":{"type":["number","null"]},"notifyPercent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"countryCode":{"type":"string"},"consumptionMultiplier":{"type":"number"},"nodeConsumptionMultiplier":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"integrationUuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"],"additionalProperties":false}},"createdAt":{},"updatedAt":{},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"activeInbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}}},"required":["activeConfigProfileUuid","activeInbounds"],"additionalProperties":false},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"provider":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"system":{"anyOf":[{"type":"object","properties":{"info":{"type":"object","properties":{"arch":{"type":"string"},"cpus":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cpuModel":{"type":"string"},"memoryTotal":{"type":"number"},"hostname":{"type":"string"},"platform":{"type":"string"},"release":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"networkInterfaces":{"type":"array","items":{"type":"string"}}},"required":["arch","cpus","cpuModel","memoryTotal","hostname","platform","release","type","version","networkInterfaces"],"additionalProperties":false},"stats":{"type":"object","properties":{"memoryFree":{"type":"number"},"memoryUsed":{"type":"number"},"uptime":{"type":"number"},"loadAvg":{"type":"array","items":{"type":"number"}},"interface":{"anyOf":[{"type":"object","properties":{"interface":{"type":"string"},"rxBytesPerSec":{"type":"number"},"txBytesPerSec":{"type":"number"},"rxTotal":{"type":"number"},"txTotal":{"type":"number"}},"required":["interface","rxBytesPerSec","txBytesPerSec","rxTotal","txTotal"],"additionalProperties":false},{"type":"null"}]}},"required":["memoryFree","memoryUsed","uptime","loadAvg","interface"],"additionalProperties":false}},"required":["info","stats"],"additionalProperties":false},{"type":"null"}]},"versions":{"anyOf":[{"type":"object","properties":{"xray":{"type":"string"},"node":{"type":"string"}},"required":["xray","node"],"additionalProperties":false},{"type":"null"}]},"xrayUptime":{"type":"number"},"usersOnline":{"type":"number"},"note":{"type":["string","null"]}},"required":["uuid","id","name","address","port","proxyUrl","isConnected","isDisabled","isConnecting","lastStatusChange","lastStatusMessage","isTrafficTrackingActive","trafficResetDay","trafficLimitBytes","trafficUsedBytes","notifyPercent","viewPosition","countryCode","consumptionMultiplier","nodeConsumptionMultiplier","tags","integrationUuids","ips","createdAt","updatedAt","configProfile","providerUuid","provider","activePluginUuid","system","versions","xrayUptime","usersOnline","note"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/nodes/{uuid}/actions/reset-traffic":{"post":{"operationId":"ResetNodeTraffic","summary":"Reset Node Traffic","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}}},"/api/nodes/{uuid}/actions/restart":{"post":{"operationId":"RestartNode","summary":"Restart node","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"forceRestart":{"type":"boolean"}},"required":["forceRestart"]}}}}}},"/api/nodes/{uuid}":{"delete":{"operationId":"DeleteNode","summary":"Delete a node","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetNode","summary":"Get node by UUID","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"id":{"type":"number"},"name":{"type":"string"},"address":{"type":"string"},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxyUrl":{"type":["string","null"]},"isConnected":{"type":"boolean"},"isDisabled":{"type":"boolean"},"isConnecting":{"type":"boolean"},"lastStatusChange":{"anyOf":[{},{"type":"null"}]},"lastStatusMessage":{"type":["string","null"]},"isTrafficTrackingActive":{"type":"boolean"},"trafficResetDay":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"trafficLimitBytes":{"type":["number","null"]},"trafficUsedBytes":{"type":["number","null"]},"notifyPercent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"countryCode":{"type":"string"},"consumptionMultiplier":{"type":"number"},"nodeConsumptionMultiplier":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"integrationUuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"],"additionalProperties":false}},"createdAt":{},"updatedAt":{},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"activeInbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}}},"required":["activeConfigProfileUuid","activeInbounds"],"additionalProperties":false},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"provider":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"system":{"anyOf":[{"type":"object","properties":{"info":{"type":"object","properties":{"arch":{"type":"string"},"cpus":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cpuModel":{"type":"string"},"memoryTotal":{"type":"number"},"hostname":{"type":"string"},"platform":{"type":"string"},"release":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"networkInterfaces":{"type":"array","items":{"type":"string"}}},"required":["arch","cpus","cpuModel","memoryTotal","hostname","platform","release","type","version","networkInterfaces"],"additionalProperties":false},"stats":{"type":"object","properties":{"memoryFree":{"type":"number"},"memoryUsed":{"type":"number"},"uptime":{"type":"number"},"loadAvg":{"type":"array","items":{"type":"number"}},"interface":{"anyOf":[{"type":"object","properties":{"interface":{"type":"string"},"rxBytesPerSec":{"type":"number"},"txBytesPerSec":{"type":"number"},"rxTotal":{"type":"number"},"txTotal":{"type":"number"}},"required":["interface","rxBytesPerSec","txBytesPerSec","rxTotal","txTotal"],"additionalProperties":false},{"type":"null"}]}},"required":["memoryFree","memoryUsed","uptime","loadAvg","interface"],"additionalProperties":false}},"required":["info","stats"],"additionalProperties":false},{"type":"null"}]},"versions":{"anyOf":[{"type":"object","properties":{"xray":{"type":"string"},"node":{"type":"string"}},"required":["xray","node"],"additionalProperties":false},{"type":"null"}]},"xrayUptime":{"type":"number"},"usersOnline":{"type":"number"},"note":{"type":["string","null"]}},"required":["uuid","id","name","address","port","proxyUrl","isConnected","isDisabled","isConnecting","lastStatusChange","lastStatusMessage","isTrafficTrackingActive","trafficResetDay","trafficLimitBytes","trafficUsedBytes","notifyPercent","viewPosition","countryCode","consumptionMultiplier","nodeConsumptionMultiplier","tags","integrationUuids","ips","createdAt","updatedAt","configProfile","providerUuid","provider","activePluginUuid","system","versions","xrayUptime","usersOnline","note"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/nodes/actions/reorder":{"post":{"operationId":"ReorderNodes","summary":"Reorder nodes","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"id":{"type":"number"},"name":{"type":"string"},"address":{"type":"string"},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxyUrl":{"type":["string","null"]},"isConnected":{"type":"boolean"},"isDisabled":{"type":"boolean"},"isConnecting":{"type":"boolean"},"lastStatusChange":{"anyOf":[{},{"type":"null"}]},"lastStatusMessage":{"type":["string","null"]},"isTrafficTrackingActive":{"type":"boolean"},"trafficResetDay":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"trafficLimitBytes":{"type":["number","null"]},"trafficUsedBytes":{"type":["number","null"]},"notifyPercent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"countryCode":{"type":"string"},"consumptionMultiplier":{"type":"number"},"nodeConsumptionMultiplier":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"integrationUuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"],"additionalProperties":false}},"createdAt":{},"updatedAt":{},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"activeInbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}}},"required":["activeConfigProfileUuid","activeInbounds"],"additionalProperties":false},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"provider":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"system":{"anyOf":[{"type":"object","properties":{"info":{"type":"object","properties":{"arch":{"type":"string"},"cpus":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cpuModel":{"type":"string"},"memoryTotal":{"type":"number"},"hostname":{"type":"string"},"platform":{"type":"string"},"release":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"networkInterfaces":{"type":"array","items":{"type":"string"}}},"required":["arch","cpus","cpuModel","memoryTotal","hostname","platform","release","type","version","networkInterfaces"],"additionalProperties":false},"stats":{"type":"object","properties":{"memoryFree":{"type":"number"},"memoryUsed":{"type":"number"},"uptime":{"type":"number"},"loadAvg":{"type":"array","items":{"type":"number"}},"interface":{"anyOf":[{"type":"object","properties":{"interface":{"type":"string"},"rxBytesPerSec":{"type":"number"},"txBytesPerSec":{"type":"number"},"rxTotal":{"type":"number"},"txTotal":{"type":"number"}},"required":["interface","rxBytesPerSec","txBytesPerSec","rxTotal","txTotal"],"additionalProperties":false},{"type":"null"}]}},"required":["memoryFree","memoryUsed","uptime","loadAvg","interface"],"additionalProperties":false}},"required":["info","stats"],"additionalProperties":false},{"type":"null"}]},"versions":{"anyOf":[{"type":"object","properties":{"xray":{"type":"string"},"node":{"type":"string"}},"required":["xray","node"],"additionalProperties":false},{"type":"null"}]},"xrayUptime":{"type":"number"},"usersOnline":{"type":"number"},"note":{"type":["string","null"]}},"required":["uuid","id","name","address","port","proxyUrl","isConnected","isDisabled","isConnecting","lastStatusChange","lastStatusMessage","isTrafficTrackingActive","trafficResetDay","trafficLimitBytes","trafficUsedBytes","notifyPercent","viewPosition","countryCode","consumptionMultiplier","nodeConsumptionMultiplier","tags","integrationUuids","ips","createdAt","updatedAt","configProfile","providerUuid","provider","activePluginUuid","system","versions","xrayUptime","usersOnline","note"],"additionalProperties":false}}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nodes":{"type":"array","items":{"type":"object","properties":{"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["viewPosition","uuid"]}}},"required":["nodes"]}}}}}},"/api/nodes/actions/restart-all":{"post":{"operationId":"RestartAllNodes","summary":"Restart all nodes","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"forceRestart":{"type":"boolean"}},"required":["forceRestart"]}}}}}},"/api/nodes/bulk-actions/profile-modification":{"post":{"operationId":"BulkNodesProfileModification","summary":"Modify Inbounds & Profile for many nodes","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"activeInbounds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["activeConfigProfileUuid","activeInbounds"]}},"required":["uuids","configProfile"]}}}}}},"/api/nodes/bulk-actions/update":{"post":{"operationId":"BulkNodesUpdate","summary":"Update many nodes","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"fields":{"type":"object","properties":{"countryCode":{"type":"string","maxLength":2},"consumptionMultiplier":{"type":"number","minimum":0,"maximum":100},"nodeConsumptionMultiplier":{"type":"number","minimum":0,"maximum":100},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"integrationUuids":{"maxItems":20,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"note":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}]}}}},"required":["uuids","fields"]}}}}}},"/api/nodes/bulk-actions":{"post":{"operationId":"BulkNodesActions","summary":"Perform actions for many nodes","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuids":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"action":{"type":"string","enum":["ENABLE","DISABLE","RESTART","RESET_TRAFFIC"]}},"required":["uuids","action"]}}}}}},"/api/nodes/tags":{"get":{"operationId":"GetNodesTags","summary":"Get nodes tags","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/nodes":{"get":{"operationId":"GetNodes","summary":"Get nodes","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"id":{"type":"number"},"name":{"type":"string"},"address":{"type":"string"},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxyUrl":{"type":["string","null"]},"isConnected":{"type":"boolean"},"isDisabled":{"type":"boolean"},"isConnecting":{"type":"boolean"},"lastStatusChange":{"anyOf":[{},{"type":"null"}]},"lastStatusMessage":{"type":["string","null"]},"isTrafficTrackingActive":{"type":"boolean"},"trafficResetDay":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"trafficLimitBytes":{"type":["number","null"]},"trafficUsedBytes":{"type":["number","null"]},"notifyPercent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"countryCode":{"type":"string"},"consumptionMultiplier":{"type":"number"},"nodeConsumptionMultiplier":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"integrationUuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"],"additionalProperties":false}},"createdAt":{},"updatedAt":{},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"activeInbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}}},"required":["activeConfigProfileUuid","activeInbounds"],"additionalProperties":false},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"provider":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"system":{"anyOf":[{"type":"object","properties":{"info":{"type":"object","properties":{"arch":{"type":"string"},"cpus":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cpuModel":{"type":"string"},"memoryTotal":{"type":"number"},"hostname":{"type":"string"},"platform":{"type":"string"},"release":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"networkInterfaces":{"type":"array","items":{"type":"string"}}},"required":["arch","cpus","cpuModel","memoryTotal","hostname","platform","release","type","version","networkInterfaces"],"additionalProperties":false},"stats":{"type":"object","properties":{"memoryFree":{"type":"number"},"memoryUsed":{"type":"number"},"uptime":{"type":"number"},"loadAvg":{"type":"array","items":{"type":"number"}},"interface":{"anyOf":[{"type":"object","properties":{"interface":{"type":"string"},"rxBytesPerSec":{"type":"number"},"txBytesPerSec":{"type":"number"},"rxTotal":{"type":"number"},"txTotal":{"type":"number"}},"required":["interface","rxBytesPerSec","txBytesPerSec","rxTotal","txTotal"],"additionalProperties":false},{"type":"null"}]}},"required":["memoryFree","memoryUsed","uptime","loadAvg","interface"],"additionalProperties":false}},"required":["info","stats"],"additionalProperties":false},{"type":"null"}]},"versions":{"anyOf":[{"type":"object","properties":{"xray":{"type":"string"},"node":{"type":"string"}},"required":["xray","node"],"additionalProperties":false},{"type":"null"}]},"xrayUptime":{"type":"number"},"usersOnline":{"type":"number"},"note":{"type":["string","null"]}},"required":["uuid","id","name","address","port","proxyUrl","isConnected","isDisabled","isConnecting","lastStatusChange","lastStatusMessage","isTrafficTrackingActive","trafficResetDay","trafficLimitBytes","trafficUsedBytes","notifyPercent","viewPosition","countryCode","consumptionMultiplier","nodeConsumptionMultiplier","tags","integrationUuids","ips","createdAt","updatedAt","configProfile","providerUuid","provider","activePluginUuid","system","versions","xrayUptime","usersOnline","note"],"additionalProperties":false}}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateNode","summary":"Update node","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"id":{"type":"number"},"name":{"type":"string"},"address":{"type":"string"},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxyUrl":{"type":["string","null"]},"isConnected":{"type":"boolean"},"isDisabled":{"type":"boolean"},"isConnecting":{"type":"boolean"},"lastStatusChange":{"anyOf":[{},{"type":"null"}]},"lastStatusMessage":{"type":["string","null"]},"isTrafficTrackingActive":{"type":"boolean"},"trafficResetDay":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"trafficLimitBytes":{"type":["number","null"]},"trafficUsedBytes":{"type":["number","null"]},"notifyPercent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"countryCode":{"type":"string"},"consumptionMultiplier":{"type":"number"},"nodeConsumptionMultiplier":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"integrationUuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"],"additionalProperties":false}},"createdAt":{},"updatedAt":{},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"activeInbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}}},"required":["activeConfigProfileUuid","activeInbounds"],"additionalProperties":false},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"provider":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"system":{"anyOf":[{"type":"object","properties":{"info":{"type":"object","properties":{"arch":{"type":"string"},"cpus":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cpuModel":{"type":"string"},"memoryTotal":{"type":"number"},"hostname":{"type":"string"},"platform":{"type":"string"},"release":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"networkInterfaces":{"type":"array","items":{"type":"string"}}},"required":["arch","cpus","cpuModel","memoryTotal","hostname","platform","release","type","version","networkInterfaces"],"additionalProperties":false},"stats":{"type":"object","properties":{"memoryFree":{"type":"number"},"memoryUsed":{"type":"number"},"uptime":{"type":"number"},"loadAvg":{"type":"array","items":{"type":"number"}},"interface":{"anyOf":[{"type":"object","properties":{"interface":{"type":"string"},"rxBytesPerSec":{"type":"number"},"txBytesPerSec":{"type":"number"},"rxTotal":{"type":"number"},"txTotal":{"type":"number"}},"required":["interface","rxBytesPerSec","txBytesPerSec","rxTotal","txTotal"],"additionalProperties":false},{"type":"null"}]}},"required":["memoryFree","memoryUsed","uptime","loadAvg","interface"],"additionalProperties":false}},"required":["info","stats"],"additionalProperties":false},{"type":"null"}]},"versions":{"anyOf":[{"type":"object","properties":{"xray":{"type":"string"},"node":{"type":"string"}},"required":["xray","node"],"additionalProperties":false},{"type":"null"}]},"xrayUptime":{"type":"number"},"usersOnline":{"type":"number"},"note":{"type":["string","null"]}},"required":["uuid","id","name","address","port","proxyUrl","isConnected","isDisabled","isConnecting","lastStatusChange","lastStatusMessage","isTrafficTrackingActive","trafficResetDay","trafficLimitBytes","trafficUsedBytes","notifyPercent","viewPosition","countryCode","consumptionMultiplier","nodeConsumptionMultiplier","tags","integrationUuids","ips","createdAt","updatedAt","configProfile","providerUuid","provider","activePluginUuid","system","versions","xrayUptime","usersOnline","note"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":3,"maxLength":30},"address":{"type":"string","minLength":2},"port":{"type":"number","minimum":1,"maximum":65535},"proxyUrl":{"anyOf":[{"type":"string","pattern":"^socks5:\\/\\/(?:[^:@/\\s]+(?::[^@/\\s]*)?@)?[^:@/\\s]+:\\d{1,5}$"},{"type":"null"}]},"isTrafficTrackingActive":{"type":"boolean"},"trafficLimitBytes":{"type":"number","minimum":0},"notifyPercent":{"type":"number","minimum":0,"maximum":100},"trafficResetDay":{"type":"number","minimum":1,"maximum":31},"countryCode":{"type":"string","maxLength":2},"consumptionMultiplier":{"type":"number","minimum":0,"maximum":100},"nodeConsumptionMultiplier":{"type":"number","minimum":0,"maximum":100},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"activeInbounds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["activeConfigProfileUuid","activeInbounds"]},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"integrationUuids":{"maxItems":20,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"note":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"]}},"trafficTrackingStart":{"type":"string","enum":["keep","zero","period"],"description":"GoWave extension. Applies when this update turns `isTrafficTrackingActive` on: `keep` keeps the bytes counted since the last reset (the default, as upstream), `zero` starts from nothing, `period` counts the current period from the usage history."}},"required":["uuid"]}}}}},"post":{"operationId":"CreateNode","summary":"Create a new node","tags":["nodes"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"id":{"type":"number"},"name":{"type":"string"},"address":{"type":"string"},"port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxyUrl":{"type":["string","null"]},"isConnected":{"type":"boolean"},"isDisabled":{"type":"boolean"},"isConnecting":{"type":"boolean"},"lastStatusChange":{"anyOf":[{},{"type":"null"}]},"lastStatusMessage":{"type":["string","null"]},"isTrafficTrackingActive":{"type":"boolean"},"trafficResetDay":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"trafficLimitBytes":{"type":["number","null"]},"trafficUsedBytes":{"type":["number","null"]},"notifyPercent":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"countryCode":{"type":"string"},"consumptionMultiplier":{"type":"number"},"nodeConsumptionMultiplier":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"integrationUuids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"],"additionalProperties":false}},"createdAt":{},"updatedAt":{},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"activeInbounds":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"profileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag":{"type":"string"},"type":{"type":"string"},"network":{"type":["string","null"]},"security":{"type":["string","null"]},"port":{"type":["number","null"]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","profileUuid","tag","type","network","security","port","rawInbound"],"additionalProperties":false}}},"required":["activeConfigProfileUuid","activeInbounds"],"additionalProperties":false},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"provider":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"faviconLink":{"type":["string","null"]},"loginUrl":{"type":["string","null"]},"createdAt":{},"updatedAt":{}},"required":["uuid","name","faviconLink","loginUrl","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"system":{"anyOf":[{"type":"object","properties":{"info":{"type":"object","properties":{"arch":{"type":"string"},"cpus":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cpuModel":{"type":"string"},"memoryTotal":{"type":"number"},"hostname":{"type":"string"},"platform":{"type":"string"},"release":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"networkInterfaces":{"type":"array","items":{"type":"string"}}},"required":["arch","cpus","cpuModel","memoryTotal","hostname","platform","release","type","version","networkInterfaces"],"additionalProperties":false},"stats":{"type":"object","properties":{"memoryFree":{"type":"number"},"memoryUsed":{"type":"number"},"uptime":{"type":"number"},"loadAvg":{"type":"array","items":{"type":"number"}},"interface":{"anyOf":[{"type":"object","properties":{"interface":{"type":"string"},"rxBytesPerSec":{"type":"number"},"txBytesPerSec":{"type":"number"},"rxTotal":{"type":"number"},"txTotal":{"type":"number"}},"required":["interface","rxBytesPerSec","txBytesPerSec","rxTotal","txTotal"],"additionalProperties":false},{"type":"null"}]}},"required":["memoryFree","memoryUsed","uptime","loadAvg","interface"],"additionalProperties":false}},"required":["info","stats"],"additionalProperties":false},{"type":"null"}]},"versions":{"anyOf":[{"type":"object","properties":{"xray":{"type":"string"},"node":{"type":"string"}},"required":["xray","node"],"additionalProperties":false},{"type":"null"}]},"xrayUptime":{"type":"number"},"usersOnline":{"type":"number"},"note":{"type":["string","null"]}},"required":["uuid","id","name","address","port","proxyUrl","isConnected","isDisabled","isConnecting","lastStatusChange","lastStatusMessage","isTrafficTrackingActive","trafficResetDay","trafficLimitBytes","trafficUsedBytes","notifyPercent","viewPosition","countryCode","consumptionMultiplier","nodeConsumptionMultiplier","tags","integrationUuids","ips","createdAt","updatedAt","configProfile","providerUuid","provider","activePluginUuid","system","versions","xrayUptime","usersOnline","note"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":3,"maxLength":30},"address":{"type":"string","minLength":2},"port":{"type":"integer","minimum":1,"maximum":65535},"proxyUrl":{"anyOf":[{"type":"string","pattern":"^socks5:\\/\\/(?:[^:@/\\s]+(?::[^@/\\s]*)?@)?[^:@/\\s]+:\\d{1,5}$"},{"type":"null"}]},"isTrafficTrackingActive":{"default":false,"type":"boolean"},"trafficLimitBytes":{"type":"number","minimum":0},"notifyPercent":{"type":"integer","minimum":0,"maximum":100},"trafficResetDay":{"type":"integer","minimum":1,"maximum":31},"countryCode":{"default":"XX","type":"string","maxLength":2},"consumptionMultiplier":{"type":"number","minimum":0,"maximum":100},"nodeConsumptionMultiplier":{"type":"number","minimum":0,"maximum":100},"configProfile":{"type":"object","properties":{"activeConfigProfileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"activeInbounds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["activeConfigProfileUuid","activeInbounds"]},"providerUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"activePluginUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"integrationUuids":{"maxItems":20,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"note":{"type":"string","maxLength":255},"ips":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"ip":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]},"status":{"type":"string","enum":["INBOUND","OUTBOUND","MANAGEMENT","TRANSIT","MONITORING","RESERVE","BLOCKED","FLAGGED","DEPRECATED","UNKNOWN"]}},"required":["ip","status"]}}},"required":["name","address","configProfile"]}}}}}},"/api/passkeys/registration/options":{"get":{"operationId":"GetPasskeyRegistrationOptions","summary":"Get registration options for passkey","tags":["passkeys"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{}},"required":["response"],"additionalProperties":false}}}}}}},"/api/passkeys/registration/verify":{"post":{"operationId":"VerifyPasskeyRegistration","summary":"Verify registration for passkey","tags":["passkeys"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"verified":{"type":"boolean"}},"required":["verified"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"response":{}},"required":["response"]}}}}}},"/api/passkeys":{"delete":{"operationId":"DeletePasskey","summary":"Delete a passkey by ID","tags":["passkeys"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}}},"get":{"operationId":"GetPasskeys","summary":"Get passkeys","tags":["passkeys"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"passkeys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"description":"Created date. Format: 2025-01-17T15:38:45.065Z"},"lastUsedAt":{"description":"Last used date. Format: 2025-01-17T15:38:45.065Z"}},"required":["id","name","createdAt","lastUsedAt"],"additionalProperties":false}}},"required":["passkeys"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdatePasskey","summary":"Update passkey","tags":["passkeys"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"passkeys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"description":"Created date. Format: 2025-01-17T15:38:45.065Z"},"lastUsedAt":{"description":"Last used date. Format: 2025-01-17T15:38:45.065Z"}},"required":["id","name","createdAt","lastUsedAt"],"additionalProperties":false}}},"required":["passkeys"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"}},"required":["id","name"]}}}}}},"/api/remnawave-settings":{"get":{"operationId":"GetRemnawaveSettings","summary":"Get Remnawave settings","tags":["remnawave-settings"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"passkeySettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"rpId":{"type":["string","null"]},"origin":{"type":["string","null"]}},"required":["enabled","rpId","origin"],"additionalProperties":false},{"type":"null"}]},"oauth2Settings":{"anyOf":[{"type":"object","properties":{"github":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","allowedEmails"],"additionalProperties":false},"pocketid":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"plainDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","frontendDomain","plainDomain","allowedEmails"],"additionalProperties":false},"yandex":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","allowedEmails"],"additionalProperties":false,"description":"Not supported by GoWave: Yandex sign-in is removed. The provider is always disabled and saved settings are discarded."},"keycloak":{"default":{"enabled":false,"realm":null,"frontendDomain":null,"keycloakDomain":null,"clientId":null,"clientSecret":null,"allowedEmails":[]},"type":"object","properties":{"enabled":{"type":"boolean"},"realm":{"type":["string","null"]},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"keycloakDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","realm","clientId","clientSecret","frontendDomain","keycloakDomain","allowedEmails"],"additionalProperties":false},"generic":{"default":{"enabled":false,"frontendDomain":null,"tokenUrl":null,"clientId":null,"clientSecret":null,"withPkce":false,"authorizationUrl":null,"allowedEmails":[]},"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"withPkce":{"type":"boolean"},"authorizationUrl":{"type":["string","null"]},"tokenUrl":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","withPkce","authorizationUrl","tokenUrl","frontendDomain","allowedEmails"],"additionalProperties":false},"telegram":{"default":{"enabled":false,"clientId":null,"clientSecret":null,"allowedIds":[],"frontendDomain":null},"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedIds":{"type":"array","items":{"type":"string"}},"frontendDomain":{"type":["string","null"]}},"required":["enabled","clientId","clientSecret","allowedIds","frontendDomain"],"additionalProperties":false}},"required":["github","pocketid","yandex","keycloak","generic","telegram"],"additionalProperties":false},{"type":"null"}]},"passwordSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"additionalProperties":false},{"type":"null"}]},"brandingSettings":{"anyOf":[{"type":"object","properties":{"title":{"type":["string","null"]},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["title","logoUrl"],"additionalProperties":false},{"type":"null"}]}},"required":["passkeySettings","oauth2Settings","passwordSettings","brandingSettings"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateRemnawaveSettings","summary":"Update Remnawave settings","tags":["remnawave-settings"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"passkeySettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"rpId":{"type":["string","null"]},"origin":{"type":["string","null"]}},"required":["enabled","rpId","origin"],"additionalProperties":false},{"type":"null"}]},"oauth2Settings":{"anyOf":[{"type":"object","properties":{"github":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","allowedEmails"],"additionalProperties":false},"pocketid":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"plainDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","frontendDomain","plainDomain","allowedEmails"],"additionalProperties":false},"yandex":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","allowedEmails"],"additionalProperties":false,"description":"Not supported by GoWave: Yandex sign-in is removed. The provider is always disabled and saved settings are discarded."},"keycloak":{"default":{"enabled":false,"realm":null,"frontendDomain":null,"keycloakDomain":null,"clientId":null,"clientSecret":null,"allowedEmails":[]},"type":"object","properties":{"enabled":{"type":"boolean"},"realm":{"type":["string","null"]},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"keycloakDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","realm","clientId","clientSecret","frontendDomain","keycloakDomain","allowedEmails"],"additionalProperties":false},"generic":{"default":{"enabled":false,"frontendDomain":null,"tokenUrl":null,"clientId":null,"clientSecret":null,"withPkce":false,"authorizationUrl":null,"allowedEmails":[]},"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"withPkce":{"type":"boolean"},"authorizationUrl":{"type":["string","null"]},"tokenUrl":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","withPkce","authorizationUrl","tokenUrl","frontendDomain","allowedEmails"],"additionalProperties":false},"telegram":{"default":{"enabled":false,"clientId":null,"clientSecret":null,"allowedIds":[],"frontendDomain":null},"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedIds":{"type":"array","items":{"type":"string"}},"frontendDomain":{"type":["string","null"]}},"required":["enabled","clientId","clientSecret","allowedIds","frontendDomain"],"additionalProperties":false}},"required":["github","pocketid","yandex","keycloak","generic","telegram"],"additionalProperties":false},{"type":"null"}]},"passwordSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"additionalProperties":false},{"type":"null"}]},"brandingSettings":{"anyOf":[{"type":"object","properties":{"title":{"type":["string","null"]},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["title","logoUrl"],"additionalProperties":false},{"type":"null"}]}},"required":["passkeySettings","oauth2Settings","passwordSettings","brandingSettings"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"passkeySettings":{"type":"object","properties":{"enabled":{"type":"boolean"},"rpId":{"type":["string","null"]},"origin":{"type":["string","null"]}},"required":["enabled","rpId","origin"]},"oauth2Settings":{"type":"object","properties":{"github":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","allowedEmails"]},"pocketid":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"plainDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","frontendDomain","plainDomain","allowedEmails"]},"yandex":{"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","allowedEmails"],"description":"Not supported by GoWave: Yandex sign-in is removed. The provider is always disabled and saved settings are discarded."},"keycloak":{"default":{"enabled":false,"realm":null,"frontendDomain":null,"keycloakDomain":null,"clientId":null,"clientSecret":null,"allowedEmails":[]},"type":"object","properties":{"enabled":{"type":"boolean"},"realm":{"type":["string","null"]},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"keycloakDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","realm","clientId","clientSecret","frontendDomain","keycloakDomain","allowedEmails"]},"generic":{"default":{"enabled":false,"frontendDomain":null,"tokenUrl":null,"clientId":null,"clientSecret":null,"withPkce":false,"authorizationUrl":null,"allowedEmails":[]},"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"withPkce":{"type":"boolean"},"authorizationUrl":{"type":["string","null"]},"tokenUrl":{"type":["string","null"]},"frontendDomain":{"type":["string","null"]},"allowedEmails":{"type":"array","items":{"type":"string"}}},"required":["enabled","clientId","clientSecret","withPkce","authorizationUrl","tokenUrl","frontendDomain","allowedEmails"]},"telegram":{"default":{"enabled":false,"clientId":null,"clientSecret":null,"allowedIds":[],"frontendDomain":null},"type":"object","properties":{"enabled":{"type":"boolean"},"clientId":{"type":["string","null"]},"clientSecret":{"type":["string","null"]},"allowedIds":{"type":"array","items":{"type":"string"}},"frontendDomain":{"type":["string","null"]}},"required":["enabled","clientId","clientSecret","allowedIds","frontendDomain"]}},"required":["github","pocketid","yandex"]},"passwordSettings":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"brandingSettings":{"type":"object","properties":{"title":{"type":["string","null"]},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["title","logoUrl"]}}}}}}}},"/api/snippets/actions/sync":{"post":{"operationId":"SyncSnippet","summary":"Sync snippet to affected config profiles","tags":["snippets"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"description":"Trigger the sync of a snippet to all config profiles that reference it. Nodes which use affected config profiles will be restarted.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_ -]+(\\/[A-Za-z0-9_ -]+)*$"}},"required":["name"]}}}}}},"/api/snippets":{"delete":{"operationId":"DeleteSnippet","summary":"Delete snippet","tags":["snippets"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_ -]+(\\/[A-Za-z0-9_ -]+)*$"}},"required":["name"]}}}}},"get":{"operationId":"GetSnippets","summary":"Get snippets","tags":["snippets"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"snippets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"snippet":{}},"required":["name","snippet"],"additionalProperties":false}}},"required":["total","snippets"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateSnippet","summary":"Update snippet","tags":["snippets"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"snippets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"snippet":{}},"required":["name","snippet"],"additionalProperties":false}}},"required":["total","snippets"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_ -]+(\\/[A-Za-z0-9_ -]+)*$"},"snippet":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["name","snippet"]}}}}},"post":{"operationId":"CreateSnippet","summary":"Create snippet","tags":["snippets"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"snippets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"snippet":{}},"required":["name","snippet"],"additionalProperties":false}}},"required":["total","snippets"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_ -]+(\\/[A-Za-z0-9_ -]+)*$"},"snippet":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["name","snippet"]}}}}}},"/api/sub/{shortUuid}/info":{"get":{"operationId":"GetSubscriptionInfoByShortUuid","summary":"Get Subscription Info by Short UUID","tags":["sub"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"shortUuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isFound":{"type":"boolean"},"user":{"type":"object","properties":{"shortUuid":{"type":"string"},"daysLeft":{"type":"number"},"trafficUsed":{"type":"string"},"trafficLimit":{"type":"string"},"lifetimeTrafficUsed":{"type":"string"},"trafficUsedBytes":{"type":"string"},"trafficLimitBytes":{"type":"string"},"lifetimeTrafficUsedBytes":{"type":"string"},"username":{"type":"string"},"expiresAt":{},"isActive":{"type":"boolean"},"userStatus":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"]}},"required":["shortUuid","daysLeft","trafficUsed","trafficLimit","lifetimeTrafficUsed","trafficUsedBytes","trafficLimitBytes","lifetimeTrafficUsedBytes","username","expiresAt","isActive","userStatus","trafficLimitStrategy"],"additionalProperties":false},"links":{"type":"array","items":{"type":"string"}},"ssConfLinks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"subscriptionUrl":{"type":"string"}},"required":["isFound","user","links","ssConfLinks","subscriptionUrl"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/subscription-page-configs/{uuid}":{"delete":{"operationId":"DeleteSubpageConfig","summary":"Delete subscription page config","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetSubpageConfig","summary":"Get subscription page config by uuid","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{}},"required":["uuid","viewPosition","name","tags","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/subscription-page-configs/actions/clone":{"post":{"operationId":"CloneSubpageConfig","summary":"Clone subscription page config","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{}},"required":["uuid","viewPosition","name","tags","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cloneFromUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["cloneFromUuid"]}}}}}},"/api/subscription-page-configs/actions/reorder":{"post":{"operationId":"ReorderSubpageConfigs","summary":"Reorder subscription page configs","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"configs":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","viewPosition","name","tags","config"],"additionalProperties":false}}},"required":["total","configs"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["viewPosition","uuid"]}}},"required":["items"]}}}}}},"/api/subscription-page-configs/tags":{"get":{"operationId":"GetSubpageConfigsTags","summary":"Get tags of Subpage Configs","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"SetSubpageConfigTags","summary":"Set tags of Subpage Config","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"type":"array","items":{"type":"string"}}},"required":["uuid","tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}}},"required":["uuid","tags"]}}}}}},"/api/subscription-page-configs":{"get":{"operationId":"GetSubpageConfigs","summary":"Get all subscription page configs","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"configs":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","viewPosition","name","tags","config"],"additionalProperties":false}}},"required":["total","configs"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateSubpageConfig","summary":"Update subscription page config","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{}},"required":["uuid","viewPosition","name","tags","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"},"config":{}},"required":["uuid"]}}}}},"post":{"operationId":"CreateSubpageConfig","summary":"Create subscription page config","tags":["subscription-page-configs"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"config":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","viewPosition","name","tags","config"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":30,"pattern":"^[A-Za-z0-9_\\s-]+$"}},"required":["name"]}}}}}},"/api/subscription-request-history/stats":{"get":{"operationId":"GetSubscriptionRequestHistoryStats","summary":"Get subscription request history stats","tags":["subscription-request-history"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"byParsedApp":{"type":"array","items":{"type":"object","properties":{"app":{"type":"string"},"count":{"type":"number"}},"required":["app","count"],"additionalProperties":false}},"hourlyRequestStats":{"type":"array","items":{"type":"object","properties":{"dateTime":{},"requestCount":{"type":"number"}},"required":["dateTime","requestCount"],"additionalProperties":false}}},"required":["byParsedApp","hourlyRequestStats"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/subscription-request-history":{"get":{"operationId":"GetSubscriptionRequestHistory","summary":"Get all subscription request history","tags":["subscription-request-history"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"default":0,"description":"Start index (offset) of the results to return, default is 0","type":"number"}},{"name":"size","in":"query","required":false,"schema":{"default":25,"type":"number","minimum":1,"maximum":1000,"description":"Number of results to return, no more than 1000"}},{"name":"filters","in":"query","required":false,"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"value":{}},"required":["id","value"]}}},{"name":"filterModes","in":"query","required":false,"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},{"name":"globalFilterMode","in":"query","required":false,"schema":{"type":"string"}},{"name":"sorting","in":"query","required":false,"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"desc":{"type":"boolean"}},"required":["id","desc"]}}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"userId":{"type":"number"},"srrResponseType":{"type":"string"},"srrRuleName":{"type":["string","null"]},"requestIp":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"requestAt":{}},"required":["id","userId","srrResponseType","srrRuleName","requestIp","userAgent","requestAt"],"additionalProperties":false}},"total":{"type":"number"}},"required":["records","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Please note that the filters here are primarily intended for use by the frontend and rely on expensive operators such as LIKE under the hood. Misusing these filters may negatively impact the performance of your database."}},"/api/subscription-settings":{"get":{"operationId":"GetSubscriptionSettings","summary":"Get subscription settings","tags":["subscription-settings"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"customRemarks":{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"],"additionalProperties":false},"customResponseHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]},"randomizeHosts":{"type":"boolean"},"responseRules":{"anyOf":[{"type":"object","properties":{"version":{"type":"string","enum":["1"],"title":"Response Rules Config Version","markdownDescription":"Version of the **response rules** config. Currently supported version is **1**."},"settings":{"title":"Response Rule Settings","markdownDescription":"Settings for the **response rules** config. Optional.","type":"object","properties":{"disableSubscriptionAccessByPath":{"title":"Disable Subscription Access by Path","markdownDescription":"Usually, a user's subscription may also be available via additional paths such as **/json**, **/stash**, or **/mihomo**. If this flag is set to **true**, access via these additional paths will be disabled.","type":"boolean"}},"additionalProperties":false},"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50,"title":"Name","markdownDescription":"Name of the response rule."},"description":{"title":"Description","markdownDescription":"Description of the response rule. Optional.","type":"string","minLength":1,"maxLength":250},"enabled":{"type":"boolean","title":"Enabled","markdownDescription":"Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored."},"operator":{"type":"string","enum":["AND","OR"],"markdownDescription":"Operator to use for combining conditions in the rule."},"conditions":{"type":"array","items":{"type":"object","properties":{"headerName":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Name","markdownDescription":"**Name** of the HTTP header to check. Must comply with RFC 7230."},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","CONTAINS","NOT_CONTAINS","STARTS_WITH","NOT_STARTS_WITH","ENDS_WITH","NOT_ENDS_WITH","REGEX","NOT_REGEX"],"errorMessage":"Invalid operator. Please select a valid operator.","markdownDescription":"Operator to use for comparing the `headerName` with `value`.","markdownEnumDescriptions":["Performs an exact, comparison between the header value and specified string. `string === value`","Ensures the header value does not exactly match the specified string. `string !== value`","Checks if the header value contains the specified string as a substring. `string.includes()`","Verifies the header value does not contain the specified string as a substring. `!string.includes()`","Validates that the header value begins with the specified string. `string.startsWith()`","Validates that the header value does not begin with the specified string. `!string.startsWith()`","Confirms the header value ends with the specified string. `string.endsWith()`","Confirms the header value does not end with the specified string. `!string.endsWith()`","Evaluates if the header value matches the specified regular expression pattern. `regex.test()`","Evaluates if the header value does not match the specified regular expression pattern. `!regex.test()`"]},"value":{"type":"string","minLength":1,"maxLength":255,"markdownDescription":"**Value** to check against the **headerName**."},"caseSensitive":{"type":"boolean","markdownDescription":"Whether the value is **case sensitive**. \n\n - `true`: the value will be compared as is. \n\n - `false`: the value will be lowercased **before** comparison."}},"required":["headerName","operator","value","caseSensitive"],"additionalProperties":false,"markdownDescription":"Condition to check against the **headerName**.","defaultSnippets":[{"label":"Examples: Check if header contains \"text/html\"","markdownDescription":"Condition to check if **headerName** contains \"text/html\"","body":{"headerName":"accept","operator":"CONTAINS","value":"text/html","caseSensitive":true}}]},"title":"Conditions","markdownDescription":"Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched."},"responseType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX","BROWSER","BLOCK","STATUS_CODE_404","STATUS_CODE_451","SOCKET_DROP"],"errorMessage":"Invalid response type. Please select a valid response type.","markdownDescription":"Type of the response. Determines the type of **response** to be returned when the rule is matched.","markdownEnumDescriptions":["Return **subscription** in XRAY-JSON format. (Using `Xray Json` template)","Return **subscription** in BASE64 encoded string. Compatible with most client application with Xray core.","Return **subscription** in Mihomo format. (Using `Mihomo` template)","Return **subscription** in Stash format. (Using `Stash` template)","Return **subscription** in Clash format. (Using `Clash` template) Useful for client application that use Legacy Clash core.","Return **subscription** in Singbox format. (Using `Singbox` template) Format which is used by Singbox client application.","Return **subscription** as browser format. The same as on `/info` route.","**Drop** request and return `403` status code.","**Drop** request and return `404` status code.","**Drop** request and return `451` status code.","**Drop** the socket connection."]},"responseModifications":{"title":"Response Modifications","examples":[{"headers":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Response modifications to be applied when the rule is matched. Optional.","type":"object","properties":{"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Key","markdownDescription":"Key of the response header. Must comply with RFC 7230."},"value":{"type":"string","minLength":1,"title":"Header Value","markdownDescription":"Value of the response header."}},"required":["key","value"],"additionalProperties":false,"title":"Headers","markdownDescription":"**Key** and **value** of the response header will be added to the response."},"defaultSnippets":[{"label":"Examples: Add custom header","markdownDescription":"Add a custom header to the response","body":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Array of headers to be added when the rule is matched."},"applyHeadersToEnd":{"title":"Apply Headers to End","markdownDescription":"By default, headers are added when forming the response. In some cases, headers set in SRR may be overridden by headers from other parts of the system. If you set this flag to **true**, headers from SRR will be added at the very end, just before the response is sent. In this case, SRR headers may override headers from other sections.","type":"boolean"},"subscriptionTemplate":{"title":"Subscription Template","markdownDescription":"Override the subscription template with the given name. If not provided, the default subscription template will be used. If the template name is not found, the default subscription template for this type will be used. **This modification have higher priority than settings from External Squads.**","type":"string","minLength":1},"ignoreHostXrayJsonTemplate":{"title":"Ignore Host Xray Json Template","markdownDescription":"Each Host may have its own Xray Json Template. If you set this flag to **true**, the Xray Json Template defined by the SRR will be used. **The Host's Xray Json Template will be ignored.**","type":"boolean"},"ignoreServeJsonAtBaseSubscription":{"title":"Ignore Serve Json at Base Subscription","markdownDescription":"If you set this flag to **true**, the **Serve JSON at Base Subscription** setting will be ignored (set to **false**).","type":"boolean"},"additionalExtendedClientsRegex":{"markdownDescription":"Additional regex patterns to match extended clients. Matched clients will receive `serverDescription` in the subscription response.\n\n**Default Mihomo extended clients:**\n- `^FlClash ?X/`\n- `^Flowvy/`\n- `^prizrak-box/`\n- `^koala-clash/`\n\n**Default Xray extended clients:**\n- `^Happ/`\n- `^INCY/`\n\n**Example:** `[\"^MyClient/\", \"^CustomApp\\\\/v2\"]`","type":"array","items":{"type":"string","minLength":1}},"disableHwidCheck":{"title":"Disable HWID Check","markdownDescription":"If you set this flag to **true**, the HWID check will be disabled. **This modification have higher priority than settings from Subscription Settings.**","type":"boolean"},"encryption":{"title":"Encryption","markdownDescription":"Encrypt response body with given parameters. Generate keypairs with Rescue CLI: `docker exec -it remnawave cli`, select \"Generate keypairs\".","type":"object","properties":{"method":{"type":"string","enum":["age1","age1pq1"]},"key":{"type":"string"}},"required":["method","key"],"additionalProperties":false},"excludeHostsByTags":{"title":"Exclude Hosts by Tags","markdownDescription":"Excludes hosts from the subscription output if at least one tag in the host matches the given tags.","minItems":1,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"respondWithRemarks":{"title":"Respond With Remarks","markdownDescription":"Replaces the response body with the provided remarks. If this array contains more than one element, actual hosts will not be sent.","type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["name","enabled","operator","conditions","responseType"],"additionalProperties":false,"title":"Response Rule","markdownDescription":"Response rule configuration.\n\n**Fields:**\n- **name**: Name of the response rule.\n- **description**: Description of the response rule. Optional.\n- **enabled**: Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored.\n- **operator**: Operator to use for combining conditions in the rule.\n- **conditions**: Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched.\n- **responseType**: Type of the response. Determines the type of **response** to be returned when the rule is matched.\n- **responseModifications**: Response modifications to be applied when the rule is matched. Optional.\n\n**Example:**\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","defaultSnippets":[{"label":"Examples: Blank rule","markdownDescription":"Simple blank rule with no conditions or modifications.\n```json\n{\n  \"name\": \"Blank rule\",\n  \"description\": \"Blank rule\",\n  \"operator\": \"AND\",\n  \"enabled\": true,\n  \"conditions\": [],\n  \"responseType\": \"BLOCK\",\n  \"responseModifications\": {\n    \"headers\": []\n  }\n}\n```","body":{"name":"Blank rule","description":"Blank rule","operator":"AND","enabled":true,"conditions":[],"responseType":"BLOCK","responseModifications":{"headers":[]}}},{"label":"Examples: Block Legacy Clients","markdownDescription":"Block requests from legacy clients\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","body":{"name":"Block Legacy Clients","description":"Block requests from legacy clients","enabled":true,"operator":"OR","conditions":[{"headerName":"user-agent","operator":"CONTAINS","value":"Hiddify","caseSensitive":true},{"headerName":"user-agent","operator":"CONTAINS","value":"FoxRay","caseSensitive":true}],"responseType":"BLOCK"}}]},"title":"Response Rules","markdownDescription":"Array of **response rules**. Rules are evaluated in order and the first rule that matches is applied. If no rule matches, request will be blocked by default.\n\n**Example:**\n```json\n[\n  {\n    \"name\": \"Blank rule\",\n    \"description\": \"Blank rule\",\n    \"operator\": \"AND\",\n    \"enabled\": true,\n    \"conditions\": [],\n    \"responseType\": \"BLOCK\",\n    \"responseModifications\": {\n      \"headers\": []\n    }\n  }\n]\n```","defaultSnippets":[]}},"required":["version","rules"],"additionalProperties":false},{"type":"null"}]},"hwidSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"],"additionalProperties":false},{"type":"null"}]},"createdAt":{},"updatedAt":{}},"required":["uuid","serveJsonAtBaseSubscription","isShowCustomRemarks","customRemarks","customResponseHeaders","randomizeHosts","responseRules","hwidSettings","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateSubscriptionSettings","summary":"Update subscription settings","tags":["subscription-settings"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"customRemarks":{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"],"additionalProperties":false},"customResponseHeaders":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]},"randomizeHosts":{"type":"boolean"},"responseRules":{"anyOf":[{"type":"object","properties":{"version":{"type":"string","enum":["1"],"title":"Response Rules Config Version","markdownDescription":"Version of the **response rules** config. Currently supported version is **1**."},"settings":{"title":"Response Rule Settings","markdownDescription":"Settings for the **response rules** config. Optional.","type":"object","properties":{"disableSubscriptionAccessByPath":{"title":"Disable Subscription Access by Path","markdownDescription":"Usually, a user's subscription may also be available via additional paths such as **/json**, **/stash**, or **/mihomo**. If this flag is set to **true**, access via these additional paths will be disabled.","type":"boolean"}},"additionalProperties":false},"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50,"title":"Name","markdownDescription":"Name of the response rule."},"description":{"title":"Description","markdownDescription":"Description of the response rule. Optional.","type":"string","minLength":1,"maxLength":250},"enabled":{"type":"boolean","title":"Enabled","markdownDescription":"Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored."},"operator":{"type":"string","enum":["AND","OR"],"markdownDescription":"Operator to use for combining conditions in the rule."},"conditions":{"type":"array","items":{"type":"object","properties":{"headerName":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Name","markdownDescription":"**Name** of the HTTP header to check. Must comply with RFC 7230."},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","CONTAINS","NOT_CONTAINS","STARTS_WITH","NOT_STARTS_WITH","ENDS_WITH","NOT_ENDS_WITH","REGEX","NOT_REGEX"],"errorMessage":"Invalid operator. Please select a valid operator.","markdownDescription":"Operator to use for comparing the `headerName` with `value`.","markdownEnumDescriptions":["Performs an exact, comparison between the header value and specified string. `string === value`","Ensures the header value does not exactly match the specified string. `string !== value`","Checks if the header value contains the specified string as a substring. `string.includes()`","Verifies the header value does not contain the specified string as a substring. `!string.includes()`","Validates that the header value begins with the specified string. `string.startsWith()`","Validates that the header value does not begin with the specified string. `!string.startsWith()`","Confirms the header value ends with the specified string. `string.endsWith()`","Confirms the header value does not end with the specified string. `!string.endsWith()`","Evaluates if the header value matches the specified regular expression pattern. `regex.test()`","Evaluates if the header value does not match the specified regular expression pattern. `!regex.test()`"]},"value":{"type":"string","minLength":1,"maxLength":255,"markdownDescription":"**Value** to check against the **headerName**."},"caseSensitive":{"type":"boolean","markdownDescription":"Whether the value is **case sensitive**. \n\n - `true`: the value will be compared as is. \n\n - `false`: the value will be lowercased **before** comparison."}},"required":["headerName","operator","value","caseSensitive"],"additionalProperties":false,"markdownDescription":"Condition to check against the **headerName**.","defaultSnippets":[{"label":"Examples: Check if header contains \"text/html\"","markdownDescription":"Condition to check if **headerName** contains \"text/html\"","body":{"headerName":"accept","operator":"CONTAINS","value":"text/html","caseSensitive":true}}]},"title":"Conditions","markdownDescription":"Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched."},"responseType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX","BROWSER","BLOCK","STATUS_CODE_404","STATUS_CODE_451","SOCKET_DROP"],"errorMessage":"Invalid response type. Please select a valid response type.","markdownDescription":"Type of the response. Determines the type of **response** to be returned when the rule is matched.","markdownEnumDescriptions":["Return **subscription** in XRAY-JSON format. (Using `Xray Json` template)","Return **subscription** in BASE64 encoded string. Compatible with most client application with Xray core.","Return **subscription** in Mihomo format. (Using `Mihomo` template)","Return **subscription** in Stash format. (Using `Stash` template)","Return **subscription** in Clash format. (Using `Clash` template) Useful for client application that use Legacy Clash core.","Return **subscription** in Singbox format. (Using `Singbox` template) Format which is used by Singbox client application.","Return **subscription** as browser format. The same as on `/info` route.","**Drop** request and return `403` status code.","**Drop** request and return `404` status code.","**Drop** request and return `451` status code.","**Drop** the socket connection."]},"responseModifications":{"title":"Response Modifications","examples":[{"headers":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Response modifications to be applied when the rule is matched. Optional.","type":"object","properties":{"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Key","markdownDescription":"Key of the response header. Must comply with RFC 7230."},"value":{"type":"string","minLength":1,"title":"Header Value","markdownDescription":"Value of the response header."}},"required":["key","value"],"additionalProperties":false,"title":"Headers","markdownDescription":"**Key** and **value** of the response header will be added to the response."},"defaultSnippets":[{"label":"Examples: Add custom header","markdownDescription":"Add a custom header to the response","body":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Array of headers to be added when the rule is matched."},"applyHeadersToEnd":{"title":"Apply Headers to End","markdownDescription":"By default, headers are added when forming the response. In some cases, headers set in SRR may be overridden by headers from other parts of the system. If you set this flag to **true**, headers from SRR will be added at the very end, just before the response is sent. In this case, SRR headers may override headers from other sections.","type":"boolean"},"subscriptionTemplate":{"title":"Subscription Template","markdownDescription":"Override the subscription template with the given name. If not provided, the default subscription template will be used. If the template name is not found, the default subscription template for this type will be used. **This modification have higher priority than settings from External Squads.**","type":"string","minLength":1},"ignoreHostXrayJsonTemplate":{"title":"Ignore Host Xray Json Template","markdownDescription":"Each Host may have its own Xray Json Template. If you set this flag to **true**, the Xray Json Template defined by the SRR will be used. **The Host's Xray Json Template will be ignored.**","type":"boolean"},"ignoreServeJsonAtBaseSubscription":{"title":"Ignore Serve Json at Base Subscription","markdownDescription":"If you set this flag to **true**, the **Serve JSON at Base Subscription** setting will be ignored (set to **false**).","type":"boolean"},"additionalExtendedClientsRegex":{"markdownDescription":"Additional regex patterns to match extended clients. Matched clients will receive `serverDescription` in the subscription response.\n\n**Default Mihomo extended clients:**\n- `^FlClash ?X/`\n- `^Flowvy/`\n- `^prizrak-box/`\n- `^koala-clash/`\n\n**Default Xray extended clients:**\n- `^Happ/`\n- `^INCY/`\n\n**Example:** `[\"^MyClient/\", \"^CustomApp\\\\/v2\"]`","type":"array","items":{"type":"string","minLength":1}},"disableHwidCheck":{"title":"Disable HWID Check","markdownDescription":"If you set this flag to **true**, the HWID check will be disabled. **This modification have higher priority than settings from Subscription Settings.**","type":"boolean"},"encryption":{"title":"Encryption","markdownDescription":"Encrypt response body with given parameters. Generate keypairs with Rescue CLI: `docker exec -it remnawave cli`, select \"Generate keypairs\".","type":"object","properties":{"method":{"type":"string","enum":["age1","age1pq1"]},"key":{"type":"string"}},"required":["method","key"],"additionalProperties":false},"excludeHostsByTags":{"title":"Exclude Hosts by Tags","markdownDescription":"Excludes hosts from the subscription output if at least one tag in the host matches the given tags.","minItems":1,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"respondWithRemarks":{"title":"Respond With Remarks","markdownDescription":"Replaces the response body with the provided remarks. If this array contains more than one element, actual hosts will not be sent.","type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["name","enabled","operator","conditions","responseType"],"additionalProperties":false,"title":"Response Rule","markdownDescription":"Response rule configuration.\n\n**Fields:**\n- **name**: Name of the response rule.\n- **description**: Description of the response rule. Optional.\n- **enabled**: Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored.\n- **operator**: Operator to use for combining conditions in the rule.\n- **conditions**: Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched.\n- **responseType**: Type of the response. Determines the type of **response** to be returned when the rule is matched.\n- **responseModifications**: Response modifications to be applied when the rule is matched. Optional.\n\n**Example:**\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","defaultSnippets":[{"label":"Examples: Blank rule","markdownDescription":"Simple blank rule with no conditions or modifications.\n```json\n{\n  \"name\": \"Blank rule\",\n  \"description\": \"Blank rule\",\n  \"operator\": \"AND\",\n  \"enabled\": true,\n  \"conditions\": [],\n  \"responseType\": \"BLOCK\",\n  \"responseModifications\": {\n    \"headers\": []\n  }\n}\n```","body":{"name":"Blank rule","description":"Blank rule","operator":"AND","enabled":true,"conditions":[],"responseType":"BLOCK","responseModifications":{"headers":[]}}},{"label":"Examples: Block Legacy Clients","markdownDescription":"Block requests from legacy clients\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","body":{"name":"Block Legacy Clients","description":"Block requests from legacy clients","enabled":true,"operator":"OR","conditions":[{"headerName":"user-agent","operator":"CONTAINS","value":"Hiddify","caseSensitive":true},{"headerName":"user-agent","operator":"CONTAINS","value":"FoxRay","caseSensitive":true}],"responseType":"BLOCK"}}]},"title":"Response Rules","markdownDescription":"Array of **response rules**. Rules are evaluated in order and the first rule that matches is applied. If no rule matches, request will be blocked by default.\n\n**Example:**\n```json\n[\n  {\n    \"name\": \"Blank rule\",\n    \"description\": \"Blank rule\",\n    \"operator\": \"AND\",\n    \"enabled\": true,\n    \"conditions\": [],\n    \"responseType\": \"BLOCK\",\n    \"responseModifications\": {\n      \"headers\": []\n    }\n  }\n]\n```","defaultSnippets":[]}},"required":["version","rules"],"additionalProperties":false},{"type":"null"}]},"hwidSettings":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"],"additionalProperties":false},{"type":"null"}]},"createdAt":{},"updatedAt":{}},"required":["uuid","serveJsonAtBaseSubscription","isShowCustomRemarks","customRemarks","customResponseHeaders","randomizeHosts","responseRules","hwidSettings","createdAt","updatedAt"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"serveJsonAtBaseSubscription":{"type":"boolean"},"isShowCustomRemarks":{"type":"boolean"},"customRemarks":{"type":"object","properties":{"expiredUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"limitedUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"disabledUsers":{"minItems":1,"type":"array","items":{"type":"string"}},"emptyHosts":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDMaxDevicesExceeded":{"minItems":1,"type":"array","items":{"type":"string"}},"HWIDNotSupported":{"minItems":1,"type":"array","items":{"type":"string"}}},"required":["expiredUsers","limitedUsers","disabledUsers","emptyHosts","HWIDMaxDevicesExceeded","HWIDNotSupported"]},"customResponseHeaders":{"type":"object","propertyNames":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$"},"additionalProperties":{"type":"string"}},"randomizeHosts":{"type":"boolean"},"responseRules":{"type":"object","properties":{"version":{"type":"string","enum":["1"],"title":"Response Rules Config Version","markdownDescription":"Version of the **response rules** config. Currently supported version is **1**."},"settings":{"title":"Response Rule Settings","markdownDescription":"Settings for the **response rules** config. Optional.","type":"object","properties":{"disableSubscriptionAccessByPath":{"title":"Disable Subscription Access by Path","markdownDescription":"Usually, a user's subscription may also be available via additional paths such as **/json**, **/stash**, or **/mihomo**. If this flag is set to **true**, access via these additional paths will be disabled.","type":"boolean"}}},"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50,"title":"Name","markdownDescription":"Name of the response rule."},"description":{"title":"Description","markdownDescription":"Description of the response rule. Optional.","type":"string","minLength":1,"maxLength":250},"enabled":{"type":"boolean","title":"Enabled","markdownDescription":"Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored."},"operator":{"type":"string","enum":["AND","OR"],"markdownDescription":"Operator to use for combining conditions in the rule."},"conditions":{"type":"array","items":{"type":"object","properties":{"headerName":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Name","markdownDescription":"**Name** of the HTTP header to check. Must comply with RFC 7230."},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","CONTAINS","NOT_CONTAINS","STARTS_WITH","NOT_STARTS_WITH","ENDS_WITH","NOT_ENDS_WITH","REGEX","NOT_REGEX"],"errorMessage":"Invalid operator. Please select a valid operator.","markdownDescription":"Operator to use for comparing the `headerName` with `value`.","markdownEnumDescriptions":["Performs an exact, comparison between the header value and specified string. `string === value`","Ensures the header value does not exactly match the specified string. `string !== value`","Checks if the header value contains the specified string as a substring. `string.includes()`","Verifies the header value does not contain the specified string as a substring. `!string.includes()`","Validates that the header value begins with the specified string. `string.startsWith()`","Validates that the header value does not begin with the specified string. `!string.startsWith()`","Confirms the header value ends with the specified string. `string.endsWith()`","Confirms the header value does not end with the specified string. `!string.endsWith()`","Evaluates if the header value matches the specified regular expression pattern. `regex.test()`","Evaluates if the header value does not match the specified regular expression pattern. `!regex.test()`"]},"value":{"type":"string","minLength":1,"maxLength":255,"markdownDescription":"**Value** to check against the **headerName**."},"caseSensitive":{"type":"boolean","markdownDescription":"Whether the value is **case sensitive**. \n\n - `true`: the value will be compared as is. \n\n - `false`: the value will be lowercased **before** comparison."}},"required":["headerName","operator","value","caseSensitive"],"markdownDescription":"Condition to check against the **headerName**.","defaultSnippets":[{"label":"Examples: Check if header contains \"text/html\"","markdownDescription":"Condition to check if **headerName** contains \"text/html\"","body":{"headerName":"accept","operator":"CONTAINS","value":"text/html","caseSensitive":true}}]},"title":"Conditions","markdownDescription":"Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched."},"responseType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX","BROWSER","BLOCK","STATUS_CODE_404","STATUS_CODE_451","SOCKET_DROP"],"errorMessage":"Invalid response type. Please select a valid response type.","markdownDescription":"Type of the response. Determines the type of **response** to be returned when the rule is matched.","markdownEnumDescriptions":["Return **subscription** in XRAY-JSON format. (Using `Xray Json` template)","Return **subscription** in BASE64 encoded string. Compatible with most client application with Xray core.","Return **subscription** in Mihomo format. (Using `Mihomo` template)","Return **subscription** in Stash format. (Using `Stash` template)","Return **subscription** in Clash format. (Using `Clash` template) Useful for client application that use Legacy Clash core.","Return **subscription** in Singbox format. (Using `Singbox` template) Format which is used by Singbox client application.","Return **subscription** as browser format. The same as on `/info` route.","**Drop** request and return `403` status code.","**Drop** request and return `404` status code.","**Drop** request and return `451` status code.","**Drop** the socket connection."]},"responseModifications":{"title":"Response Modifications","examples":[{"headers":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Response modifications to be applied when the rule is matched. Optional.","type":"object","properties":{"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Key","markdownDescription":"Key of the response header. Must comply with RFC 7230."},"value":{"type":"string","minLength":1,"title":"Header Value","markdownDescription":"Value of the response header."}},"required":["key","value"],"title":"Headers","markdownDescription":"**Key** and **value** of the response header will be added to the response."},"defaultSnippets":[{"label":"Examples: Add custom header","markdownDescription":"Add a custom header to the response","body":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Array of headers to be added when the rule is matched."},"applyHeadersToEnd":{"title":"Apply Headers to End","markdownDescription":"By default, headers are added when forming the response. In some cases, headers set in SRR may be overridden by headers from other parts of the system. If you set this flag to **true**, headers from SRR will be added at the very end, just before the response is sent. In this case, SRR headers may override headers from other sections.","type":"boolean"},"subscriptionTemplate":{"title":"Subscription Template","markdownDescription":"Override the subscription template with the given name. If not provided, the default subscription template will be used. If the template name is not found, the default subscription template for this type will be used. **This modification have higher priority than settings from External Squads.**","type":"string","minLength":1},"ignoreHostXrayJsonTemplate":{"title":"Ignore Host Xray Json Template","markdownDescription":"Each Host may have its own Xray Json Template. If you set this flag to **true**, the Xray Json Template defined by the SRR will be used. **The Host's Xray Json Template will be ignored.**","type":"boolean"},"ignoreServeJsonAtBaseSubscription":{"title":"Ignore Serve Json at Base Subscription","markdownDescription":"If you set this flag to **true**, the **Serve JSON at Base Subscription** setting will be ignored (set to **false**).","type":"boolean"},"additionalExtendedClientsRegex":{"markdownDescription":"Additional regex patterns to match extended clients. Matched clients will receive `serverDescription` in the subscription response.\n\n**Default Mihomo extended clients:**\n- `^FlClash ?X/`\n- `^Flowvy/`\n- `^prizrak-box/`\n- `^koala-clash/`\n\n**Default Xray extended clients:**\n- `^Happ/`\n- `^INCY/`\n\n**Example:** `[\"^MyClient/\", \"^CustomApp\\\\/v2\"]`","type":"array","items":{"type":"string","minLength":1}},"disableHwidCheck":{"title":"Disable HWID Check","markdownDescription":"If you set this flag to **true**, the HWID check will be disabled. **This modification have higher priority than settings from Subscription Settings.**","type":"boolean"},"encryption":{"title":"Encryption","markdownDescription":"Encrypt response body with given parameters. Generate keypairs with Rescue CLI: `docker exec -it remnawave cli`, select \"Generate keypairs\".","type":"object","properties":{"method":{"type":"string","enum":["age1","age1pq1"]},"key":{"type":"string"}},"required":["method","key"]},"excludeHostsByTags":{"title":"Exclude Hosts by Tags","markdownDescription":"Excludes hosts from the subscription output if at least one tag in the host matches the given tags.","minItems":1,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"respondWithRemarks":{"title":"Respond With Remarks","markdownDescription":"Replaces the response body with the provided remarks. If this array contains more than one element, actual hosts will not be sent.","type":"array","items":{"type":"string"}}}}},"required":["name","enabled","operator","conditions","responseType"],"title":"Response Rule","markdownDescription":"Response rule configuration.\n\n**Fields:**\n- **name**: Name of the response rule.\n- **description**: Description of the response rule. Optional.\n- **enabled**: Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored.\n- **operator**: Operator to use for combining conditions in the rule.\n- **conditions**: Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched.\n- **responseType**: Type of the response. Determines the type of **response** to be returned when the rule is matched.\n- **responseModifications**: Response modifications to be applied when the rule is matched. Optional.\n\n**Example:**\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","defaultSnippets":[{"label":"Examples: Blank rule","markdownDescription":"Simple blank rule with no conditions or modifications.\n```json\n{\n  \"name\": \"Blank rule\",\n  \"description\": \"Blank rule\",\n  \"operator\": \"AND\",\n  \"enabled\": true,\n  \"conditions\": [],\n  \"responseType\": \"BLOCK\",\n  \"responseModifications\": {\n    \"headers\": []\n  }\n}\n```","body":{"name":"Blank rule","description":"Blank rule","operator":"AND","enabled":true,"conditions":[],"responseType":"BLOCK","responseModifications":{"headers":[]}}},{"label":"Examples: Block Legacy Clients","markdownDescription":"Block requests from legacy clients\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","body":{"name":"Block Legacy Clients","description":"Block requests from legacy clients","enabled":true,"operator":"OR","conditions":[{"headerName":"user-agent","operator":"CONTAINS","value":"Hiddify","caseSensitive":true},{"headerName":"user-agent","operator":"CONTAINS","value":"FoxRay","caseSensitive":true}],"responseType":"BLOCK"}}]},"title":"Response Rules","markdownDescription":"Array of **response rules**. Rules are evaluated in order and the first rule that matches is applied. If no rule matches, request will be blocked by default.\n\n**Example:**\n```json\n[\n  {\n    \"name\": \"Blank rule\",\n    \"description\": \"Blank rule\",\n    \"operator\": \"AND\",\n    \"enabled\": true,\n    \"conditions\": [],\n    \"responseType\": \"BLOCK\",\n    \"responseModifications\": {\n      \"headers\": []\n    }\n  }\n]\n```","defaultSnippets":[]}},"required":["version","rules"]},"hwidSettings":{"type":"object","properties":{"enabled":{"type":"boolean"},"fallbackDeviceLimit":{"type":"number"},"maxDevicesAnnounce":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["enabled","fallbackDeviceLimit","maxDevicesAnnounce"]}},"required":["uuid"]}}}}}},"/api/subscription-templates/{uuid}":{"delete":{"operationId":"DeleteSubscriptionTemplate","summary":"Delete subscription template","tags":["subscription-templates"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetSubscriptionTemplate","summary":"Get subscription template by uuid","tags":["subscription-templates"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]},"templateJson":{"anyOf":[{},{"type":"null"}]},"encodedTemplateYaml":{"type":["string","null"]}},"required":["uuid","viewPosition","name","tags","templateType","templateJson","encodedTemplateYaml"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/subscription-templates/actions/reorder":{"post":{"operationId":"ReorderSubscriptionTemplate","summary":"Reorder subscription templates","tags":["subscription-templates"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"templates":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]},"templateJson":{"anyOf":[{},{"type":"null"}]},"encodedTemplateYaml":{"type":["string","null"]}},"required":["uuid","viewPosition","name","tags","templateType","templateJson","encodedTemplateYaml"],"additionalProperties":false}}},"required":["total","templates"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["viewPosition","uuid"]}}},"required":["items"]}}}}}},"/api/subscription-templates/tags":{"get":{"operationId":"GetSubscriptionTemplatesTags","summary":"Get tags of Subscription Templates","tags":["subscription-templates"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"SetSubscriptionTemplateTags","summary":"Set tags of Subscription Template","tags":["subscription-templates"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"type":"array","items":{"type":"string"}}},"required":["uuid","tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"maxItems":10,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}}},"required":["uuid","tags"]}}}}}},"/api/subscription-templates":{"get":{"operationId":"GetSubscriptionTemplates","summary":"Get all subscription templates (wihout content)","tags":["subscription-templates"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"templates":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]},"templateJson":{"anyOf":[{},{"type":"null"}]},"encodedTemplateYaml":{"type":["string","null"]}},"required":["uuid","viewPosition","name","tags","templateType","templateJson","encodedTemplateYaml"],"additionalProperties":false}}},"required":["total","templates"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}},"patch":{"operationId":"UpdateSubscriptionTemplate","summary":"Update subscription template","tags":["subscription-templates"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]},"templateJson":{"anyOf":[{},{"type":"null"}]},"encodedTemplateYaml":{"type":["string","null"]}},"required":["uuid","viewPosition","name","tags","templateType","templateJson","encodedTemplateYaml"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_\\s-]+$"},"templateJson":{"type":"object","properties":{},"additionalProperties":{}},"encodedTemplateYaml":{"type":"string"}},"required":["uuid"]}}}}},"post":{"operationId":"CreateSubscriptionTemplate","summary":"Create subscription template","tags":["subscription-templates"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]},"templateJson":{"anyOf":[{},{"type":"null"}]},"encodedTemplateYaml":{"type":["string","null"]}},"required":["uuid","viewPosition","name","tags","templateType","templateJson","encodedTemplateYaml"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255,"pattern":"^[A-Za-z0-9_\\s-]+$"},"templateType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"required":["name","templateType"]}}}}}},"/api/subscriptions/by-id/{userId}":{"get":{"operationId":"GetSubscriptionById","summary":"Get subscription by User ID","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isFound":{"type":"boolean"},"user":{"type":"object","properties":{"shortUuid":{"type":"string"},"daysLeft":{"type":"number"},"trafficUsed":{"type":"string"},"trafficLimit":{"type":"string"},"lifetimeTrafficUsed":{"type":"string"},"trafficUsedBytes":{"type":"string"},"trafficLimitBytes":{"type":"string"},"lifetimeTrafficUsedBytes":{"type":"string"},"username":{"type":"string"},"expiresAt":{},"isActive":{"type":"boolean"},"userStatus":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"]}},"required":["shortUuid","daysLeft","trafficUsed","trafficLimit","lifetimeTrafficUsed","trafficUsedBytes","trafficLimitBytes","lifetimeTrafficUsedBytes","username","expiresAt","isActive","userStatus","trafficLimitStrategy"],"additionalProperties":false},"links":{"type":"array","items":{"type":"string"}},"ssConfLinks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"subscriptionUrl":{"type":"string"}},"required":["isFound","user","links","ssConfLinks","subscriptionUrl"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/subscriptions/by-short-uuid/{shortUuid}/raw":{"get":{"operationId":"GetRawSubscriptionByShortUuid","summary":"Get Raw Subscription by Short UUID","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"shortUuid","in":"path","required":true,"schema":{"type":"string"}},{"name":"withDisabledHosts","in":"query","required":false,"schema":{"default":"false","type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false},"convertedUserInfo":{"type":"object","properties":{"daysLeft":{"type":"number"},"trafficLimit":{"type":"string"},"trafficUsed":{"type":"string"},"lifetimeTrafficUsed":{"type":"string"},"hwidCheckup":{"anyOf":[{"type":"object","properties":{"subscriptionAllowed":{"type":"boolean"},"maxDeviceReached":{"type":"boolean"},"hwidNotSupported":{"type":"boolean"},"limitBypassed":{"type":"boolean"}},"required":["subscriptionAllowed","maxDeviceReached","hwidNotSupported","limitBypassed"],"additionalProperties":false},{"type":"null"}]}},"required":["daysLeft","trafficLimit","trafficUsed","lifetimeTrafficUsed","hwidCheckup"],"additionalProperties":false},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"resolvedProxyConfigs":{"type":"array","items":{"allOf":[{"type":"object","properties":{"finalRemark":{"type":"string"},"address":{"type":"string"},"port":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streamOverrides":{"type":"object","properties":{"finalMask":{"anyOf":[{},{"type":"null"}]},"sockopt":{"anyOf":[{},{"type":"null"}]}},"required":["finalMask","sockopt"],"additionalProperties":false},"mux":{"anyOf":[{},{"type":"null"}]},"clientOverrides":{"type":"object","properties":{"shuffleHost":{"type":"boolean"},"mihomoX25519":{"type":"boolean"},"mihomoIpVersion":{"anyOf":[{"type":"string","enum":["dual","ipv4","ipv6","ipv4-prefer","ipv6-prefer"]},{"type":"null"}]},"serverDescription":{"type":["string","null"]},"xrayJsonTemplate":{"anyOf":[{},{"type":"null"}]},"mapper":{"type":"object","properties":{"xrayJson":{"title":"Xray JSON","markdownDescription":"Operations applied to the **outbound** generated for this host in the Xray JSON subscription. Paths are counted from the root of the outbound.\n\n```json\n[\n  {\n    \"op\": \"copy\",\n    \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n    \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"mux\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.tlsSettings.cipherSuites\",\n  \"to\": \"streamSettings.tlsSettings.cipherSuites\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"streamSettings.tlsSettings.enableSessionResumption\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["streamSettings.tlsSettings.enableSessionResumption","streamSettings.tlsSettings.cipherSuites"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"mux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"mihomo":{"title":"Mihomo","markdownDescription":"Operations applied to the **proxy node** generated for this host in the Mihomo subscription.\n\nPaths are counted from the root of the node, where Mihomo keys are written in kebab-case.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"ip-version\",\n    \"value\": \"ipv4\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"servername\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"reality-opts.support-x25519mlkem768\",\n  \"value\": true\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **proxy node**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["ip-version","client-fingerprint","tfo","reality-opts.support-x25519mlkem768"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"smux\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"base64":{"title":"Base64","markdownDescription":"Operations applied to the share link generated for this host in the Base64 subscription.\n\n`to` is a plain query parameter name, not a path – dots carry no meaning here.\n\nWith a `$link.` prefix the operation rewrites the link itself instead of its query string. Writable parts: `$link.address`, `$link.port`, `$link.password`, `$link.remark`, and `$link.method` for Shadowsocks. `$link.password` is the credential of the protocol.\n\n> A value that cannot make a valid link – an empty address, a port outside 1-65535 – is ignored, and the generated one is kept.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"fp\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"fm\"\n  },\n  {\n    \"op\": \"set\",\n    \"to\": \"$link.port\",\n    \"value\": 2053\n  },\n  {\n    \"op\": \"copy\",\n    \"from\": \"$host.securityOptions.serverName\",\n    \"to\": \"$link.address\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"sni\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"fp\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the query string of the generated **share link**, or the link itself with a `$link.` prefix, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["$link.address","$link.port","$link.password","$link.remark","$link.method","alpn","authority","cs","encryption","extra","flow","fm","fp","headerType","heartbeatPeriod","host","mode","mtu","obfs","obfs-password","path","pbk","pcs","pinSHA256","pqv","security","serviceName","sid","sni","spx","tti","type","vcn"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"fm\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}},"singbox":{"title":"sing-box","markdownDescription":"Operations applied to the **outbound** generated for this host in the sing-box subscription. Paths are counted from the root of the outbound.\n\nsing-box keys are written in snake_case, and the outbound of a Hysteria2 host has a shape of its own.\n\n```json\n[\n  {\n    \"op\": \"set\",\n    \"to\": \"tls.utls.fingerprint\",\n    \"value\": \"chrome\"\n  },\n  {\n    \"op\": \"unset\",\n    \"to\": \"multiplex\"\n  }\n]\n```","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"copy","title":"Copy","markdownDescription":"Take a value from the raw inbound."},"from":{"type":"string","minLength":1,"maxLength":512,"title":"Source path","markdownDescription":"Dot-separated path inside the **raw inbound** of the config profile this host belongs to. Array items are addressed by index.\n\nWith a `$host.` prefix the value is read from the **host** itself, after overrides have been resolved – `$host.securityOptions.serverName` holds the SNI that actually went into the config.\n\nOnly a part of the host is readable. Each entry below also opens everything nested under it:\n\n`address`, `port`, `finalRemark`, `protocol`, `transport`, `security`, `protocolOptions`, `transportOptions`, `securityOptions`, `mux`, `streamOverrides.finalMask`, `streamOverrides.sockopt`, `clientOverrides.serverDescription`, `metadata.remark`, `metadata.tags`, `metadata.inboundTag`\n\n> If the path resolves to nothing – or points outside the list above – the operation is skipped and the target key is **not** created.","examples":["streamSettings.tlsSettings.cipherSuites","streamSettings.tlsSettings.alpn","streamSettings.realitySettings.serverNames.0","$host.address","$host.securityOptions.serverName","$host.transportOptions.path","$host.mux.smux"]},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","from","to"],"additionalProperties":false,"title":"Copy from the inbound","markdownDescription":"Reads a value from the raw inbound and writes it into the generated config.\n\n```json\n{\n  \"op\": \"copy\",\n  \"from\": \"streamSettings.realitySettings.serverNames.0\",\n  \"to\": \"tls.server_name\"\n}\n```","defaultSnippets":[{"label":"copy","description":"Copy a value from the raw inbound","body":{"op":"copy","from":"$1","to":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"set","title":"Set","markdownDescription":"Write a fixed value."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}],"title":"Value","markdownDescription":"The value to write. Strings, numbers, booleans, arrays and objects are allowed."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","value","to"],"additionalProperties":false,"title":"Set a fixed value","markdownDescription":"Writes a literal value into the generated config, creating the key if it is missing.\n\n```json\n{\n  \"op\": \"set\",\n  \"to\": \"tls.utls.fingerprint\",\n  \"value\": \"chrome\"\n}\n```","defaultSnippets":[{"label":"set","description":"Write a fixed value","body":{"op":"set","to":"$1","value":"$2"}}]},{"type":"object","properties":{"op":{"type":"string","const":"unset","title":"Unset","markdownDescription":"Remove a field."},"to":{"type":"string","minLength":1,"maxLength":512,"title":"Target path","markdownDescription":"Dot-separated path inside the generated **outbound**, counted from its root.\n\nMissing objects along the path are created. Array items are addressed by index, and keys with dashes are written as is (`ip-version`).\n\n> A path running through a value that is not an object – for example `path.foo`, where `path` holds a string – is refused, so an existing value is never destroyed.","examples":["domain_resolver","multiplex.protocol","packet_encoding","tcp_fast_open","tls.insecure","tls.utls.fingerprint"]}},"required":["op","to"],"additionalProperties":false,"title":"Remove a field","markdownDescription":"Removes a field the generator produced by itself.\n\n```json\n{\n  \"op\": \"unset\",\n  \"to\": \"multiplex\"\n}\n```\n\n> Only the field itself is removed. A parent object left empty stays in the config as `{}`.","defaultSnippets":[{"label":"unset","description":"Remove a field","body":{"op":"unset","to":"$1"}}]}],"title":"Operation","markdownDescription":"Operations run one after another, in the order they are listed.\n\nA later operation sees what the previous ones wrote, so an `unset` can remove a key an earlier `set` added."}}},"additionalProperties":false,"title":"Host Mapper","markdownDescription":"Rewrites the config generated for this host, per client type.\n\nOperations run **after** the generator has finished, so they can change or remove anything it produced.\n\nThe source for `copy` is the raw inbound of the config profile this host belongs to, or the host itself when the path starts with `$host.`.\n\n> `to` is never checked against the target client. A misspelled key is written exactly like a real one."}},"required":["shuffleHost","mihomoX25519","mihomoIpVersion","serverDescription","xrayJsonTemplate","mapper"],"additionalProperties":false},"metadata":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tags":{"type":"array","items":{"type":"string"}},"excludeFromSubscriptionTypes":{"type":"array","items":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX"]}},"inboundTag":{"type":"string"},"configProfileUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"configProfileInboundUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"isDisabled":{"type":"boolean"},"isHidden":{"type":"boolean"},"viewPosition":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remark":{"type":"string"},"vlessRouteId":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"rawInbound":{"anyOf":[{},{"type":"null"}]}},"required":["uuid","tags","excludeFromSubscriptionTypes","inboundTag","configProfileUuid","configProfileInboundUuid","isDisabled","isHidden","viewPosition","remark","vlessRouteId","rawInbound"],"additionalProperties":false}},"required":["finalRemark","address","port","streamOverrides","mux","clientOverrides","metadata"],"additionalProperties":false},{"oneOf":[{"type":"object","properties":{"protocol":{"type":"string","const":"vless"},"protocolOptions":{"type":"object","properties":{"encryption":{"type":"string"},"id":{"type":"string"},"flow":{"type":"string","enum":["","xtls-rprx-vision","xtls-rprx-vision-udp443"]}},"required":["encryption","id","flow"],"additionalProperties":false}},"required":["protocol","protocolOptions"],"additionalProperties":false,"title":"vless"},{"type":"object","properties":{"protocol":{"type":"string","const":"trojan"},"protocolOptions":{"type":"object","properties":{"password":{"type":"string"}},"required":["password"],"additionalProperties":false}},"required":["protocol","protocolOptions"],"additionalProperties":false,"title":"trojan"},{"type":"object","properties":{"protocol":{"type":"string","const":"shadowsocks"},"protocolOptions":{"type":"object","properties":{"method":{"type":"string"},"password":{"type":"string"},"uot":{"type":"boolean"},"uotVersion":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["method","password","uot","uotVersion"],"additionalProperties":false}},"required":["protocol","protocolOptions"],"additionalProperties":false,"title":"shadowsocks"},{"type":"object","properties":{"protocol":{"type":"string","const":"hysteria"},"protocolOptions":{"type":"object","properties":{"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["version"],"additionalProperties":false}},"required":["protocol","protocolOptions"],"additionalProperties":false,"title":"hysteria"}]},{"oneOf":[{"type":"object","properties":{"transport":{"type":"string","const":"tcp"},"transportOptions":{"type":"object","properties":{"header":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"none"}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"http"},"request":{"type":"object","properties":{"version":{"type":"string"},"method":{"type":"string"},"path":{"type":"array","items":{"type":"string"}},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"additionalProperties":false},"response":{"type":"object","properties":{"version":{"type":"string"},"status":{"type":"string"},"reason":{"type":"string"},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"additionalProperties":false}},"required":["type"],"additionalProperties":false}]},{"type":"null"}]}},"required":["header"],"additionalProperties":false}},"required":["transport","transportOptions"],"additionalProperties":false,"title":"tcp"},{"type":"object","properties":{"transport":{"type":"string","const":"xhttp"},"transportOptions":{"type":"object","properties":{"path":{"type":["string","null"]},"host":{"type":["string","null"]},"mode":{"type":"string","enum":["auto","packet-up","stream-up","stream-one"]},"extra":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]}},"required":["path","host","mode","extra"],"additionalProperties":false}},"required":["transport","transportOptions"],"additionalProperties":false,"title":"xhttp"},{"type":"object","properties":{"transport":{"type":"string","const":"ws"},"transportOptions":{"type":"object","properties":{"path":{"type":["string","null"]},"host":{"type":["string","null"]},"headers":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]},"heartbeatPeriod":{"type":["number","null"]}},"required":["path","host","headers","heartbeatPeriod"],"additionalProperties":false}},"required":["transport","transportOptions"],"additionalProperties":false,"title":"ws"},{"type":"object","properties":{"transport":{"type":"string","const":"httpupgrade"},"transportOptions":{"type":"object","properties":{"path":{"type":["string","null"]},"host":{"type":["string","null"]},"headers":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]}},"required":["path","host","headers"],"additionalProperties":false}},"required":["transport","transportOptions"],"additionalProperties":false,"title":"httpupgrade"},{"type":"object","properties":{"transport":{"type":"string","const":"grpc"},"transportOptions":{"type":"object","properties":{"authority":{"type":["string","null"]},"serviceName":{"type":["string","null"]},"multiMode":{"type":"boolean"}},"required":["authority","serviceName","multiMode"],"additionalProperties":false}},"required":["transport","transportOptions"],"additionalProperties":false,"title":"grpc"},{"type":"object","properties":{"transport":{"type":"string","const":"kcp"},"transportOptions":{"type":"object","properties":{"clientMtu":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"clientTti":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"congestion":{"type":"boolean"}},"required":["clientMtu","clientTti","congestion"],"additionalProperties":false}},"required":["transport","transportOptions"],"additionalProperties":false,"title":"kcp"},{"type":"object","properties":{"transport":{"type":"string","const":"hysteria"},"transportOptions":{"type":"object","properties":{"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"auth":{"type":"string"}},"required":["version","auth"],"additionalProperties":false}},"required":["transport","transportOptions"],"additionalProperties":false,"title":"hysteria"}]},{"oneOf":[{"type":"object","properties":{"security":{"type":"string","const":"tls"},"securityOptions":{"type":"object","properties":{"pinnedPeerCertSha256":{"type":["string","null"]},"verifyPeerCertByName":{"type":["string","null"]},"alpn":{"type":["string","null"]},"enableSessionResumption":{"type":"boolean"},"fingerprint":{"type":["string","null"]},"serverName":{"type":["string","null"]},"echConfigList":{"type":["string","null"]},"echForceQuery":{"type":["string","null"]},"echSockopt":{"anyOf":[{},{"type":"null"}]},"cipherSuites":{"type":["string","null"]}},"required":["pinnedPeerCertSha256","verifyPeerCertByName","alpn","enableSessionResumption","fingerprint","serverName","echConfigList","echForceQuery","echSockopt","cipherSuites"],"additionalProperties":false}},"required":["security","securityOptions"],"additionalProperties":false,"title":"tls"},{"type":"object","properties":{"security":{"type":"string","const":"reality"},"securityOptions":{"type":"object","properties":{"fingerprint":{"type":"string"},"publicKey":{"type":"string"},"shortId":{"type":["string","null"]},"serverName":{"type":"string"},"spiderX":{"type":["string","null"]},"mldsa65Verify":{"type":["string","null"]}},"required":["fingerprint","publicKey","shortId","serverName","spiderX","mldsa65Verify"],"additionalProperties":false}},"required":["security","securityOptions"],"additionalProperties":false,"title":"reality"},{"type":"object","properties":{"security":{"type":"string","const":"none"}},"required":["security"],"additionalProperties":false,"title":"none"}]}]}}},"required":["user","convertedUserInfo","headers","resolvedProxyConfigs"],"additionalProperties":false}},"required":["response"],"additionalProperties":false,"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema0"}}]},"__schema1":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema1"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema1"}}]},"__schema2":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema2"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema2"}}]},"__schema3":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema3"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema3"}}]},"__schema4":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema4"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema4"}}]},"__schema5":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema5"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema5"}}]},"__schema6":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema6"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema6"}}]},"__schema7":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/__schema7"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/$defs/__schema7"}}]}}}}}}}}},"/api/subscriptions/by-short-uuid/{shortUuid}":{"get":{"operationId":"GetSubscriptionByShortUuidProtected","summary":"Get subscription by short uuid (protected route)","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"shortUuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isFound":{"type":"boolean"},"user":{"type":"object","properties":{"shortUuid":{"type":"string"},"daysLeft":{"type":"number"},"trafficUsed":{"type":"string"},"trafficLimit":{"type":"string"},"lifetimeTrafficUsed":{"type":"string"},"trafficUsedBytes":{"type":"string"},"trafficLimitBytes":{"type":"string"},"lifetimeTrafficUsedBytes":{"type":"string"},"username":{"type":"string"},"expiresAt":{},"isActive":{"type":"boolean"},"userStatus":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"]}},"required":["shortUuid","daysLeft","trafficUsed","trafficLimit","lifetimeTrafficUsed","trafficUsedBytes","trafficLimitBytes","lifetimeTrafficUsedBytes","username","expiresAt","isActive","userStatus","trafficLimitStrategy"],"additionalProperties":false},"links":{"type":"array","items":{"type":"string"}},"ssConfLinks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"subscriptionUrl":{"type":"string"}},"required":["isFound","user","links","ssConfLinks","subscriptionUrl"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/subscriptions/by-username/{username}":{"get":{"operationId":"GetSubscriptionByUsername","summary":"Get subscription by username","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"isFound":{"type":"boolean"},"user":{"type":"object","properties":{"shortUuid":{"type":"string"},"daysLeft":{"type":"number"},"trafficUsed":{"type":"string"},"trafficLimit":{"type":"string"},"lifetimeTrafficUsed":{"type":"string"},"trafficUsedBytes":{"type":"string"},"trafficLimitBytes":{"type":"string"},"lifetimeTrafficUsedBytes":{"type":"string"},"username":{"type":"string"},"expiresAt":{},"isActive":{"type":"boolean"},"userStatus":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"]}},"required":["shortUuid","daysLeft","trafficUsed","trafficLimit","lifetimeTrafficUsed","trafficUsedBytes","trafficLimitBytes","lifetimeTrafficUsedBytes","username","expiresAt","isActive","userStatus","trafficLimitStrategy"],"additionalProperties":false},"links":{"type":"array","items":{"type":"string"}},"ssConfLinks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"subscriptionUrl":{"type":"string"}},"required":["isFound","user","links","ssConfLinks","subscriptionUrl"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/subscriptions/connection-keys/{userId}":{"get":{"operationId":"GetConnectionKeysByUserId","summary":"Get connection keys (base64 format) by user id","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"enabledKeys":{"type":"array","items":{"type":"string"}},"hiddenKeys":{"type":"array","items":{"type":"string"}},"disabledKeys":{"type":"array","items":{"type":"string"}}},"required":["enabledKeys","hiddenKeys","disabledKeys"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/subscriptions/subpage-config/{shortUuid}":{"get":{"operationId":"GetSubpageConfigByShortUuid","summary":"Get Subpage Config by Short UUID","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"shortUuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"subpageConfigUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"webpageAllowed":{"type":"boolean"}},"required":["subpageConfigUuid","webpageAllowed"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"requestHeaders":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["requestHeaders"]}}}}}},"/api/subscriptions":{"get":{"operationId":"GetSubscriptions","summary":"Get all subscriptions","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"default":0,"description":"Start index (offset) of the users to return, default is 0","type":"number"}},{"name":"size","in":"query","required":false,"schema":{"default":25,"type":"number","minimum":1,"maximum":500,"description":"Number of subscriptions to return, no more than 500"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"subscriptions":{"type":"array","items":{"type":"object","properties":{"isFound":{"type":"boolean"},"user":{"type":"object","properties":{"shortUuid":{"type":"string"},"daysLeft":{"type":"number"},"trafficUsed":{"type":"string"},"trafficLimit":{"type":"string"},"lifetimeTrafficUsed":{"type":"string"},"trafficUsedBytes":{"type":"string"},"trafficLimitBytes":{"type":"string"},"lifetimeTrafficUsedBytes":{"type":"string"},"username":{"type":"string"},"expiresAt":{},"isActive":{"type":"boolean"},"userStatus":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"]}},"required":["shortUuid","daysLeft","trafficUsed","trafficLimit","lifetimeTrafficUsed","trafficUsedBytes","trafficLimitBytes","lifetimeTrafficUsedBytes","username","expiresAt","isActive","userStatus","trafficLimitStrategy"],"additionalProperties":false},"links":{"type":"array","items":{"type":"string"}},"ssConfLinks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"subscriptionUrl":{"type":"string"}},"required":["isFound","user","links","ssConfLinks","subscriptionUrl"],"additionalProperties":false}},"total":{"type":"number"}},"required":["subscriptions","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/configuration":{"get":{"operationId":"GetConfiguration","summary":"Get Remnawave Configuration","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"notifications":{"type":"object","properties":{"webhook":{"type":"boolean","description":"WEBHOOK_ENABLED"},"bandwidthUsage":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}],"description":"BANDWIDTH_USAGE_NOTIFICATIONS_THRESHOLD"},"notConnectedAfter":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}],"description":"NOT_CONNECTED_USERS_NOTIFICATIONS_AFTER_HOURS"},"expirationNotifications":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}],"description":"EXPIRATION_NOTIFICATIONS"}},"required":["webhook","bandwidthUsage","notConnectedAfter","expirationNotifications"],"additionalProperties":false},"service":{"type":"object","properties":{"cleanUsageHistory":{"type":"boolean","description":"SERVICE_CLEAN_USAGE_HISTORY"},"disableUserUsageRecords":{"type":"boolean","description":"SERVICE_DISABLE_USER_USAGE_RECORDS"},"disableSrhRecords":{"type":"boolean","description":"SERVICE_DISABLE_SRH_RECORDS"},"exportToRedisStream":{"type":"boolean","description":"EXPORT_TO_STREAM_ENABLED"}},"required":["cleanUsageHistory","disableUserUsageRecords","disableSrhRecords","exportToRedisStream"],"additionalProperties":false},"misc":{"type":"object","properties":{"shortUuidLength":{"type":"number","description":"SHORT_UUID_LENGTH"},"subPublicDomain":{"type":"string"},"userUsageIgnoreBelowBytes":{"type":"number","description":"USER_USAGE_IGNORE_BELOW_BYTES"}},"required":["shortUuidLength","subPublicDomain","userUsageIgnoreBelowBytes"],"additionalProperties":false}},"required":["notifications","service","misc"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Returns some of the configuration values."}},"/api/system/health":{"get":{"operationId":"GetRemnawaveHealth","summary":"Get Remnawave Health","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"runtimeMetrics":{"type":"array","items":{"type":"object","properties":{"rss":{"type":"number"},"heapUsed":{"type":"number"},"heapTotal":{"type":"number"},"external":{"type":"number"},"arrayBuffers":{"type":"number"},"eventLoopDelayMs":{"type":"number"},"eventLoopP99Ms":{"type":"number"},"activeHandles":{"type":"number"},"uptime":{"type":"number"},"pid":{"type":"number"},"timestamp":{"type":"number"},"instanceId":{"type":"string"},"instanceType":{"type":"string"}},"required":["rss","heapUsed","heapTotal","external","arrayBuffers","eventLoopDelayMs","eventLoopP99Ms","activeHandles","uptime","pid","timestamp","instanceId","instanceType"],"additionalProperties":false}}},"required":["runtimeMetrics"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/metadata":{"get":{"operationId":"GetMetadata","summary":"Get Remnawave Information","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"object","properties":{"time":{"type":"string"},"number":{"type":"string"}},"required":["time","number"],"additionalProperties":false},"git":{"type":"object","properties":{"backend":{"type":"object","properties":{"commitSha":{"type":"string"},"branch":{"type":"string"},"commitUrl":{"type":"string"}},"required":["commitSha","branch","commitUrl"],"additionalProperties":false},"frontend":{"type":"object","properties":{"commitSha":{"type":"string"},"commitUrl":{"type":"string"}},"required":["commitSha","commitUrl"],"additionalProperties":false}},"required":["backend","frontend"],"additionalProperties":false}},"required":["version","build","git"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/nodes/metrics":{"get":{"operationId":"GetNodesMetrics","summary":"Get Nodes Metrics","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"nodes":{"type":"array","items":{"type":"object","properties":{"nodeUuid":{"type":"string"},"nodeName":{"type":"string"},"countryEmoji":{"type":"string"},"providerName":{"type":"string"},"usersOnline":{"type":"number"},"inboundsStats":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"upload":{"type":"string"},"download":{"type":"string"}},"required":["tag","upload","download"],"additionalProperties":false}},"outboundsStats":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"upload":{"type":"string"},"download":{"type":"string"}},"required":["tag","upload","download"],"additionalProperties":false}}},"required":["nodeUuid","nodeName","countryEmoji","providerName","usersOnline","inboundsStats","outboundsStats"],"additionalProperties":false}}},"required":["nodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/stats/bandwidth":{"get":{"operationId":"GetBandwidthStats","summary":"Get Bandwidth Stats","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"bandwidthLastTwoDays":{"type":"object","properties":{"current":{"type":"string"},"previous":{"type":"string"},"difference":{"type":"string"}},"required":["current","previous","difference"],"additionalProperties":false},"bandwidthLastSevenDays":{"type":"object","properties":{"current":{"type":"string"},"previous":{"type":"string"},"difference":{"type":"string"}},"required":["current","previous","difference"],"additionalProperties":false},"bandwidthLast30Days":{"type":"object","properties":{"current":{"type":"string"},"previous":{"type":"string"},"difference":{"type":"string"}},"required":["current","previous","difference"],"additionalProperties":false},"bandwidthCalendarMonth":{"type":"object","properties":{"current":{"type":"string"},"previous":{"type":"string"},"difference":{"type":"string"}},"required":["current","previous","difference"],"additionalProperties":false},"bandwidthCurrentYear":{"type":"object","properties":{"current":{"type":"string"},"previous":{"type":"string"},"difference":{"type":"string"}},"required":["current","previous","difference"],"additionalProperties":false}},"required":["bandwidthLastTwoDays","bandwidthLastSevenDays","bandwidthLast30Days","bandwidthCalendarMonth","bandwidthCurrentYear"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/stats/digest":{"get":{"operationId":"GetStatsDigest","summary":"Get Stats Digest","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Start of the range, ISO 8601 datetime with timezone (e.g. 2026-07-15T00:00:00Z). Inclusive."}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"End of the range, ISO 8601 datetime with timezone (e.g. 2026-07-16T00:00:00Z). Exclusive."}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"users":{"type":"object","properties":{"createdCount":{"type":"number"},"expiredCount":{"type":"number"}},"required":["createdCount","expiredCount"],"additionalProperties":false},"traffic":{"type":"object","properties":{"totalBytes":{"type":"string"},"byUsersCreatedInRangeBytes":{"type":"string"}},"required":["totalBytes","byUsersCreatedInRangeBytes"],"additionalProperties":false},"hwidDevices":{"type":"object","properties":{"createdCount":{"type":"number"}},"required":["createdCount"],"additionalProperties":false}},"required":["users","traffic","hwidDevices"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Aggregated statistics for a datetime range [start, end): created and expired users, total traffic, traffic spent by users created within the range and new HWID devices. Per-user traffic history is stored with daily granularity (UTC), so the \"traffic by new users\" metric snaps to whole days at the range edges."}},"/api/system/stats/http":{"get":{"operationId":"GetHttpStats","summary":"Get HTTP Stats","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"routes":{"type":"array","items":{"type":"object","properties":{"method":{"type":"string"},"route":{"type":"string"},"count":{"type":"integer","minimum":0,"maximum":2147483647}},"required":["method","route","count"],"additionalProperties":false}},"total":{"type":"integer","minimum":0,"maximum":2147483647}},"required":["routes","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/stats/nodes":{"get":{"operationId":"GetNodesStatistics","summary":"Get Nodes Statistics","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"lastSevenDays":{"type":"array","items":{"type":"object","properties":{"nodeName":{"type":"string"},"date":{"type":"string"},"totalBytes":{"type":"string"}},"required":["nodeName","date","totalBytes"],"additionalProperties":false}}},"required":["lastSevenDays"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/stats/recap":{"get":{"operationId":"GetRecap","summary":"Get Recap","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"thisMonth":{"type":"object","properties":{"users":{"type":"number"},"traffic":{"type":"string"}},"required":["users","traffic"],"additionalProperties":false},"total":{"type":"object","properties":{"users":{"type":"number"},"nodes":{"type":"number"},"traffic":{"type":"string"},"nodesRam":{"type":"string"},"nodesCpuCores":{"type":"number"},"distinctCountries":{"type":"number"}},"required":["users","nodes","traffic","nodesRam","nodesCpuCores","distinctCountries"],"additionalProperties":false},"version":{"type":"string"},"initDate":{}},"required":["thisMonth","total","version","initDate"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/stats":{"get":{"operationId":"GetStats","summary":"Get Stats","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"cpu":{"type":"object","properties":{"cores":{"type":"number"}},"required":["cores"],"additionalProperties":false},"memory":{"type":"object","properties":{"total":{"type":"number"},"free":{"type":"number"},"used":{"type":"number"}},"required":["total","free","used"],"additionalProperties":false},"uptime":{"type":"number"},"timestamp":{"type":"number"},"users":{"type":"object","properties":{"statusCounts":{"type":"object","propertyNames":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"additionalProperties":{"type":"number"},"required":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"totalUsers":{"type":"number"}},"required":["statusCounts","totalUsers"],"additionalProperties":false},"onlineStats":{"type":"object","properties":{"lastDay":{"type":"number"},"lastWeek":{"type":"number"},"neverOnline":{"type":"number"},"onlineNow":{"type":"number"}},"required":["lastDay","lastWeek","neverOnline","onlineNow"],"additionalProperties":false},"nodes":{"type":"object","properties":{"totalOnline":{"type":"number"},"totalBytesLifetime":{"type":"string"}},"required":["totalOnline","totalBytesLifetime"],"additionalProperties":false}},"required":["cpu","memory","uptime","timestamp","users","onlineStats","nodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/system/testers/srr-matcher":{"post":{"operationId":"TestSrrMatcher","summary":"Test SRR Matcher","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"matched":{"type":"boolean"},"responseType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX","BROWSER","BLOCK","STATUS_CODE_404","STATUS_CODE_451","SOCKET_DROP"]},"matchedRule":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50,"title":"Name","markdownDescription":"Name of the response rule."},"description":{"title":"Description","markdownDescription":"Description of the response rule. Optional.","type":"string","minLength":1,"maxLength":250},"enabled":{"type":"boolean","title":"Enabled","markdownDescription":"Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored."},"operator":{"type":"string","enum":["AND","OR"],"markdownDescription":"Operator to use for combining conditions in the rule."},"conditions":{"type":"array","items":{"type":"object","properties":{"headerName":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Name","markdownDescription":"**Name** of the HTTP header to check. Must comply with RFC 7230."},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","CONTAINS","NOT_CONTAINS","STARTS_WITH","NOT_STARTS_WITH","ENDS_WITH","NOT_ENDS_WITH","REGEX","NOT_REGEX"],"errorMessage":"Invalid operator. Please select a valid operator.","markdownDescription":"Operator to use for comparing the `headerName` with `value`.","markdownEnumDescriptions":["Performs an exact, comparison between the header value and specified string. `string === value`","Ensures the header value does not exactly match the specified string. `string !== value`","Checks if the header value contains the specified string as a substring. `string.includes()`","Verifies the header value does not contain the specified string as a substring. `!string.includes()`","Validates that the header value begins with the specified string. `string.startsWith()`","Validates that the header value does not begin with the specified string. `!string.startsWith()`","Confirms the header value ends with the specified string. `string.endsWith()`","Confirms the header value does not end with the specified string. `!string.endsWith()`","Evaluates if the header value matches the specified regular expression pattern. `regex.test()`","Evaluates if the header value does not match the specified regular expression pattern. `!regex.test()`"]},"value":{"type":"string","minLength":1,"maxLength":255,"markdownDescription":"**Value** to check against the **headerName**."},"caseSensitive":{"type":"boolean","markdownDescription":"Whether the value is **case sensitive**. \n\n - `true`: the value will be compared as is. \n\n - `false`: the value will be lowercased **before** comparison."}},"required":["headerName","operator","value","caseSensitive"],"additionalProperties":false,"markdownDescription":"Condition to check against the **headerName**.","defaultSnippets":[{"label":"Examples: Check if header contains \"text/html\"","markdownDescription":"Condition to check if **headerName** contains \"text/html\"","body":{"headerName":"accept","operator":"CONTAINS","value":"text/html","caseSensitive":true}}]},"title":"Conditions","markdownDescription":"Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched."},"responseType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX","BROWSER","BLOCK","STATUS_CODE_404","STATUS_CODE_451","SOCKET_DROP"],"errorMessage":"Invalid response type. Please select a valid response type.","markdownDescription":"Type of the response. Determines the type of **response** to be returned when the rule is matched.","markdownEnumDescriptions":["Return **subscription** in XRAY-JSON format. (Using `Xray Json` template)","Return **subscription** in BASE64 encoded string. Compatible with most client application with Xray core.","Return **subscription** in Mihomo format. (Using `Mihomo` template)","Return **subscription** in Stash format. (Using `Stash` template)","Return **subscription** in Clash format. (Using `Clash` template) Useful for client application that use Legacy Clash core.","Return **subscription** in Singbox format. (Using `Singbox` template) Format which is used by Singbox client application.","Return **subscription** as browser format. The same as on `/info` route.","**Drop** request and return `403` status code.","**Drop** request and return `404` status code.","**Drop** request and return `451` status code.","**Drop** the socket connection."]},"responseModifications":{"title":"Response Modifications","examples":[{"headers":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Response modifications to be applied when the rule is matched. Optional.","type":"object","properties":{"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Key","markdownDescription":"Key of the response header. Must comply with RFC 7230."},"value":{"type":"string","minLength":1,"title":"Header Value","markdownDescription":"Value of the response header."}},"required":["key","value"],"additionalProperties":false,"title":"Headers","markdownDescription":"**Key** and **value** of the response header will be added to the response."},"defaultSnippets":[{"label":"Examples: Add custom header","markdownDescription":"Add a custom header to the response","body":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Array of headers to be added when the rule is matched."},"applyHeadersToEnd":{"title":"Apply Headers to End","markdownDescription":"By default, headers are added when forming the response. In some cases, headers set in SRR may be overridden by headers from other parts of the system. If you set this flag to **true**, headers from SRR will be added at the very end, just before the response is sent. In this case, SRR headers may override headers from other sections.","type":"boolean"},"subscriptionTemplate":{"title":"Subscription Template","markdownDescription":"Override the subscription template with the given name. If not provided, the default subscription template will be used. If the template name is not found, the default subscription template for this type will be used. **This modification have higher priority than settings from External Squads.**","type":"string","minLength":1},"ignoreHostXrayJsonTemplate":{"title":"Ignore Host Xray Json Template","markdownDescription":"Each Host may have its own Xray Json Template. If you set this flag to **true**, the Xray Json Template defined by the SRR will be used. **The Host's Xray Json Template will be ignored.**","type":"boolean"},"ignoreServeJsonAtBaseSubscription":{"title":"Ignore Serve Json at Base Subscription","markdownDescription":"If you set this flag to **true**, the **Serve JSON at Base Subscription** setting will be ignored (set to **false**).","type":"boolean"},"additionalExtendedClientsRegex":{"markdownDescription":"Additional regex patterns to match extended clients. Matched clients will receive `serverDescription` in the subscription response.\n\n**Default Mihomo extended clients:**\n- `^FlClash ?X/`\n- `^Flowvy/`\n- `^prizrak-box/`\n- `^koala-clash/`\n\n**Default Xray extended clients:**\n- `^Happ/`\n- `^INCY/`\n\n**Example:** `[\"^MyClient/\", \"^CustomApp\\\\/v2\"]`","type":"array","items":{"type":"string","minLength":1}},"disableHwidCheck":{"title":"Disable HWID Check","markdownDescription":"If you set this flag to **true**, the HWID check will be disabled. **This modification have higher priority than settings from Subscription Settings.**","type":"boolean"},"encryption":{"title":"Encryption","markdownDescription":"Encrypt response body with given parameters. Generate keypairs with Rescue CLI: `docker exec -it remnawave cli`, select \"Generate keypairs\".","type":"object","properties":{"method":{"type":"string","enum":["age1","age1pq1"]},"key":{"type":"string"}},"required":["method","key"],"additionalProperties":false},"excludeHostsByTags":{"title":"Exclude Hosts by Tags","markdownDescription":"Excludes hosts from the subscription output if at least one tag in the host matches the given tags.","minItems":1,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"respondWithRemarks":{"title":"Respond With Remarks","markdownDescription":"Replaces the response body with the provided remarks. If this array contains more than one element, actual hosts will not be sent.","type":"array","items":{"type":"string"}}},"additionalProperties":false}},"required":["name","enabled","operator","conditions","responseType"],"additionalProperties":false,"title":"Response Rule","markdownDescription":"Response rule configuration.\n\n**Fields:**\n- **name**: Name of the response rule.\n- **description**: Description of the response rule. Optional.\n- **enabled**: Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored.\n- **operator**: Operator to use for combining conditions in the rule.\n- **conditions**: Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched.\n- **responseType**: Type of the response. Determines the type of **response** to be returned when the rule is matched.\n- **responseModifications**: Response modifications to be applied when the rule is matched. Optional.\n\n**Example:**\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","defaultSnippets":[{"label":"Examples: Blank rule","markdownDescription":"Simple blank rule with no conditions or modifications.\n```json\n{\n  \"name\": \"Blank rule\",\n  \"description\": \"Blank rule\",\n  \"operator\": \"AND\",\n  \"enabled\": true,\n  \"conditions\": [],\n  \"responseType\": \"BLOCK\",\n  \"responseModifications\": {\n    \"headers\": []\n  }\n}\n```","body":{"name":"Blank rule","description":"Blank rule","operator":"AND","enabled":true,"conditions":[],"responseType":"BLOCK","responseModifications":{"headers":[]}}},{"label":"Examples: Block Legacy Clients","markdownDescription":"Block requests from legacy clients\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","body":{"name":"Block Legacy Clients","description":"Block requests from legacy clients","enabled":true,"operator":"OR","conditions":[{"headerName":"user-agent","operator":"CONTAINS","value":"Hiddify","caseSensitive":true},{"headerName":"user-agent","operator":"CONTAINS","value":"FoxRay","caseSensitive":true}],"responseType":"BLOCK"}}]},{"type":"null"}]},"inputHeaders":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"outputHeaders":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["matched","responseType","matchedRule","inputHeaders","outputHeaders"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"responseRules":{"type":"object","properties":{"version":{"type":"string","enum":["1"],"title":"Response Rules Config Version","markdownDescription":"Version of the **response rules** config. Currently supported version is **1**."},"settings":{"title":"Response Rule Settings","markdownDescription":"Settings for the **response rules** config. Optional.","type":"object","properties":{"disableSubscriptionAccessByPath":{"title":"Disable Subscription Access by Path","markdownDescription":"Usually, a user's subscription may also be available via additional paths such as **/json**, **/stash**, or **/mihomo**. If this flag is set to **true**, access via these additional paths will be disabled.","type":"boolean"}}},"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50,"title":"Name","markdownDescription":"Name of the response rule."},"description":{"title":"Description","markdownDescription":"Description of the response rule. Optional.","type":"string","minLength":1,"maxLength":250},"enabled":{"type":"boolean","title":"Enabled","markdownDescription":"Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored."},"operator":{"type":"string","enum":["AND","OR"],"markdownDescription":"Operator to use for combining conditions in the rule."},"conditions":{"type":"array","items":{"type":"object","properties":{"headerName":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Name","markdownDescription":"**Name** of the HTTP header to check. Must comply with RFC 7230."},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","CONTAINS","NOT_CONTAINS","STARTS_WITH","NOT_STARTS_WITH","ENDS_WITH","NOT_ENDS_WITH","REGEX","NOT_REGEX"],"errorMessage":"Invalid operator. Please select a valid operator.","markdownDescription":"Operator to use for comparing the `headerName` with `value`.","markdownEnumDescriptions":["Performs an exact, comparison between the header value and specified string. `string === value`","Ensures the header value does not exactly match the specified string. `string !== value`","Checks if the header value contains the specified string as a substring. `string.includes()`","Verifies the header value does not contain the specified string as a substring. `!string.includes()`","Validates that the header value begins with the specified string. `string.startsWith()`","Validates that the header value does not begin with the specified string. `!string.startsWith()`","Confirms the header value ends with the specified string. `string.endsWith()`","Confirms the header value does not end with the specified string. `!string.endsWith()`","Evaluates if the header value matches the specified regular expression pattern. `regex.test()`","Evaluates if the header value does not match the specified regular expression pattern. `!regex.test()`"]},"value":{"type":"string","minLength":1,"maxLength":255,"markdownDescription":"**Value** to check against the **headerName**."},"caseSensitive":{"type":"boolean","markdownDescription":"Whether the value is **case sensitive**. \n\n - `true`: the value will be compared as is. \n\n - `false`: the value will be lowercased **before** comparison."}},"required":["headerName","operator","value","caseSensitive"],"markdownDescription":"Condition to check against the **headerName**.","defaultSnippets":[{"label":"Examples: Check if header contains \"text/html\"","markdownDescription":"Condition to check if **headerName** contains \"text/html\"","body":{"headerName":"accept","operator":"CONTAINS","value":"text/html","caseSensitive":true}}]},"title":"Conditions","markdownDescription":"Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched."},"responseType":{"type":"string","enum":["XRAY_JSON","XRAY_BASE64","MIHOMO","STASH","CLASH","SINGBOX","BROWSER","BLOCK","STATUS_CODE_404","STATUS_CODE_451","SOCKET_DROP"],"errorMessage":"Invalid response type. Please select a valid response type.","markdownDescription":"Type of the response. Determines the type of **response** to be returned when the rule is matched.","markdownEnumDescriptions":["Return **subscription** in XRAY-JSON format. (Using `Xray Json` template)","Return **subscription** in BASE64 encoded string. Compatible with most client application with Xray core.","Return **subscription** in Mihomo format. (Using `Mihomo` template)","Return **subscription** in Stash format. (Using `Stash` template)","Return **subscription** in Clash format. (Using `Clash` template) Useful for client application that use Legacy Clash core.","Return **subscription** in Singbox format. (Using `Singbox` template) Format which is used by Singbox client application.","Return **subscription** as browser format. The same as on `/info` route.","**Drop** request and return `403` status code.","**Drop** request and return `404` status code.","**Drop** request and return `451` status code.","**Drop** the socket connection."]},"responseModifications":{"title":"Response Modifications","examples":[{"headers":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Response modifications to be applied when the rule is matched. Optional.","type":"object","properties":{"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$","title":"Header Key","markdownDescription":"Key of the response header. Must comply with RFC 7230."},"value":{"type":"string","minLength":1,"title":"Header Value","markdownDescription":"Value of the response header."}},"required":["key","value"],"title":"Headers","markdownDescription":"**Key** and **value** of the response header will be added to the response."},"defaultSnippets":[{"label":"Examples: Add custom header","markdownDescription":"Add a custom header to the response","body":[{"key":"X-Custom-Header","value":"CustomValue"}]}],"markdownDescription":"Array of headers to be added when the rule is matched."},"applyHeadersToEnd":{"title":"Apply Headers to End","markdownDescription":"By default, headers are added when forming the response. In some cases, headers set in SRR may be overridden by headers from other parts of the system. If you set this flag to **true**, headers from SRR will be added at the very end, just before the response is sent. In this case, SRR headers may override headers from other sections.","type":"boolean"},"subscriptionTemplate":{"title":"Subscription Template","markdownDescription":"Override the subscription template with the given name. If not provided, the default subscription template will be used. If the template name is not found, the default subscription template for this type will be used. **This modification have higher priority than settings from External Squads.**","type":"string","minLength":1},"ignoreHostXrayJsonTemplate":{"title":"Ignore Host Xray Json Template","markdownDescription":"Each Host may have its own Xray Json Template. If you set this flag to **true**, the Xray Json Template defined by the SRR will be used. **The Host's Xray Json Template will be ignored.**","type":"boolean"},"ignoreServeJsonAtBaseSubscription":{"title":"Ignore Serve Json at Base Subscription","markdownDescription":"If you set this flag to **true**, the **Serve JSON at Base Subscription** setting will be ignored (set to **false**).","type":"boolean"},"additionalExtendedClientsRegex":{"markdownDescription":"Additional regex patterns to match extended clients. Matched clients will receive `serverDescription` in the subscription response.\n\n**Default Mihomo extended clients:**\n- `^FlClash ?X/`\n- `^Flowvy/`\n- `^prizrak-box/`\n- `^koala-clash/`\n\n**Default Xray extended clients:**\n- `^Happ/`\n- `^INCY/`\n\n**Example:** `[\"^MyClient/\", \"^CustomApp\\\\/v2\"]`","type":"array","items":{"type":"string","minLength":1}},"disableHwidCheck":{"title":"Disable HWID Check","markdownDescription":"If you set this flag to **true**, the HWID check will be disabled. **This modification have higher priority than settings from Subscription Settings.**","type":"boolean"},"encryption":{"title":"Encryption","markdownDescription":"Encrypt response body with given parameters. Generate keypairs with Rescue CLI: `docker exec -it remnawave cli`, select \"Generate keypairs\".","type":"object","properties":{"method":{"type":"string","enum":["age1","age1pq1"]},"key":{"type":"string"}},"required":["method","key"]},"excludeHostsByTags":{"title":"Exclude Hosts by Tags","markdownDescription":"Excludes hosts from the subscription output if at least one tag in the host matches the given tags.","minItems":1,"type":"array","items":{"type":"string","maxLength":36,"pattern":"^[A-Z0-9_:]+$"}},"respondWithRemarks":{"title":"Respond With Remarks","markdownDescription":"Replaces the response body with the provided remarks. If this array contains more than one element, actual hosts will not be sent.","type":"array","items":{"type":"string"}}}}},"required":["name","enabled","operator","conditions","responseType"],"title":"Response Rule","markdownDescription":"Response rule configuration.\n\n**Fields:**\n- **name**: Name of the response rule.\n- **description**: Description of the response rule. Optional.\n- **enabled**: Control whether the response rule is enabled or disabled. \n\n - `true` the rule will be applied. \n\n - `false` the rule will be always ignored.\n- **operator**: Operator to use for combining conditions in the rule.\n- **conditions**: Array of conditions to check against the request headers. Conditions are applied with **operator**. If conditions are empty, the rule will be matched.\n- **responseType**: Type of the response. Determines the type of **response** to be returned when the rule is matched.\n- **responseModifications**: Response modifications to be applied when the rule is matched. Optional.\n\n**Example:**\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","defaultSnippets":[{"label":"Examples: Blank rule","markdownDescription":"Simple blank rule with no conditions or modifications.\n```json\n{\n  \"name\": \"Blank rule\",\n  \"description\": \"Blank rule\",\n  \"operator\": \"AND\",\n  \"enabled\": true,\n  \"conditions\": [],\n  \"responseType\": \"BLOCK\",\n  \"responseModifications\": {\n    \"headers\": []\n  }\n}\n```","body":{"name":"Blank rule","description":"Blank rule","operator":"AND","enabled":true,"conditions":[],"responseType":"BLOCK","responseModifications":{"headers":[]}}},{"label":"Examples: Block Legacy Clients","markdownDescription":"Block requests from legacy clients\n```json\n{\n  \"name\": \"Block Legacy Clients\",\n  \"description\": \"Block requests from legacy clients\",\n  \"enabled\": true,\n  \"operator\": \"OR\",\n  \"conditions\": [\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"Hiddify\",\n      \"caseSensitive\": true\n    },\n    {\n      \"headerName\": \"user-agent\",\n      \"operator\": \"CONTAINS\",\n      \"value\": \"FoxRay\",\n      \"caseSensitive\": true\n    }\n  ],\n  \"responseType\": \"BLOCK\"\n}\n```","body":{"name":"Block Legacy Clients","description":"Block requests from legacy clients","enabled":true,"operator":"OR","conditions":[{"headerName":"user-agent","operator":"CONTAINS","value":"Hiddify","caseSensitive":true},{"headerName":"user-agent","operator":"CONTAINS","value":"FoxRay","caseSensitive":true}],"responseType":"BLOCK"}}]},"title":"Response Rules","markdownDescription":"Array of **response rules**. Rules are evaluated in order and the first rule that matches is applied. If no rule matches, request will be blocked by default.\n\n**Example:**\n```json\n[\n  {\n    \"name\": \"Blank rule\",\n    \"description\": \"Blank rule\",\n    \"operator\": \"AND\",\n    \"enabled\": true,\n    \"conditions\": [],\n    \"responseType\": \"BLOCK\",\n    \"responseModifications\": {\n      \"headers\": []\n    }\n  }\n]\n```","defaultSnippets":[]}},"required":["version","rules"]}},"required":["responseRules"]}}}}}},"/api/system/tools/x25519/generate":{"get":{"operationId":"GenerateX25519","summary":"Generate 30 X25519 keypairs","tags":["system"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"keypairs":{"type":"array","items":{"type":"object","properties":{"publicKey":{"type":"string"},"privateKey":{"type":"string"}},"required":["publicKey","privateKey"],"additionalProperties":false}}},"required":["keypairs"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/tokens/{uuid}":{"delete":{"operationId":"DeleteApiToken","summary":"Delete API token","tags":["tokens"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}},"description":"This endpoint is forbidden to use via \"API-key\". It can be used only with an admin JWT-token."}},"/api/tokens/ott":{"post":{"operationId":"GetOtt","summary":"Get short-lived token for accessing backend tools (Swagger, Scalar, Bull Board)","tags":["tokens"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"ott":{"type":"string"}},"required":["ott"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/tokens/scopes":{"get":{"operationId":"GetApiTokenScopes","summary":"Get available API token scopes","tags":["tokens"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"wildcard":{"type":"string"},"resources":{"type":"array","items":{"type":"object","properties":{"resource":{"type":"string"},"resourceScopes":{"type":"array","items":{"type":"string"}},"endpoints":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"kind":{"type":"string","enum":["read","write"]},"method":{"type":"string"},"path":{"type":"string"},"description":{"type":"string"}},"required":["key","kind","method","path","description"],"additionalProperties":false}}},"required":["resource","resourceScopes","endpoints"],"additionalProperties":false}}},"required":["wildcard","resources"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Returns the catalog of scopes that can be granted to an API token, grouped by resource. Forbidden via \"API-key\", admin JWT only."}},"/api/tokens":{"get":{"operationId":"GetApiTokens","summary":"Get all API tokens","tags":["tokens"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"expireAt":{},"scopes":{"type":"array","items":{"type":"string"}},"createdAt":{},"updatedAt":{}},"required":["uuid","name","expireAt","scopes","createdAt","updatedAt"],"additionalProperties":false}}},"required":["tokens"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"This endpoint is forbidden to use via \"API-key\". It can only be used with admin JWT-token."},"post":{"operationId":"CreateApiToken","summary":"Create a new API token","tags":["tokens"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"expireAt":{},"scopes":{"type":"array","items":{"type":"string"}},"createdAt":{},"updatedAt":{},"token":{"type":"string"}},"required":["uuid","name","expireAt","scopes","createdAt","updatedAt","token"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"This endpoint is forbidden to use via \"API-key\". It can only be used with an admin JWT-token.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":30,"description":"Name of the API token"},"expiresInDays":{"type":"number","minimum":1,"description":"Expiration days of the API token"},"scopes":{"default":["*"],"description":"Scopes of the API token","type":"array","items":{"type":"string"}}},"required":["name","expiresInDays"]}}}}}},"/api/users/{userId}/accessible-nodes":{"get":{"operationId":"GetUserAccessibleNodes","summary":"Get user accessible nodes","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"userId":{"type":"number"},"activeNodes":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nodeName":{"type":"string"},"countryCode":{"type":"string"},"configProfileUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"configProfileName":{"type":"string"},"activeSquads":{"type":"array","items":{"type":"object","properties":{"squadName":{"type":"string"},"activeInbounds":{"type":"array","items":{"type":"string"}}},"required":["squadName","activeInbounds"],"additionalProperties":false}}},"required":["uuid","nodeName","countryCode","configProfileUuid","configProfileName","activeSquads"],"additionalProperties":false}}},"required":["userId","activeNodes"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/{userId}/actions/disable":{"post":{"operationId":"DisableUser","summary":"Disable user","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/{userId}/actions/enable":{"post":{"operationId":"EnableUser","summary":"Enable user","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/{userId}/actions/extend":{"post":{"operationId":"ExtendUser","summary":"Extend user expiration date","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"If user status is EXPIRED, the new expiration date is calculated from the current date and the user becomes ACTIVE. If user status is ACTIVE, the given number of days is added to the existing expiration date. DISABLED and LIMITED users will be extended, but their status will not change.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"number","minimum":1,"description":"The number of days to extend the expiration date."}},"required":["days"]}}}}}},"/api/users/{userId}/actions/reset-traffic":{"post":{"operationId":"ResetUserTraffic","summary":"Reset user traffic","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/{userId}/actions/revoke":{"post":{"operationId":"RevokeUserSubscription","summary":"Revoke user subscription","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revokeOnlyPasswords":{"default":false,"description":"Optional. If true, only passwords will be revoked, without changing the short UUID (Subscription URL).","type":"boolean"},"shortUuid":{"type":"string","minLength":16,"maxLength":64,"description":"Optional. If not provided, a new short UUID will be generated by Remnawave. Please note that it is strongly recommended to allow Remnawave to generate the short UUID."}}}}}}}},"/api/users/{userId}/subscription-request-history":{"get":{"operationId":"GetUserSubscriptionRequestHistory","summary":"Get user subscription request history, recent 24 records","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"total":{"type":"number"},"records":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"userId":{"type":"number"},"requestAt":{},"srrResponseType":{"type":"string"},"requestIp":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"srrRuleName":{"type":["string","null"]}},"required":["id","userId","requestAt","srrResponseType"],"additionalProperties":false}}},"required":["total","records"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/{userId}":{"delete":{"operationId":"DeleteUser","summary":"Delete user","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success"}}},"get":{"operationId":"GetUserById","summary":"Get user by ID","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/bulk/all/extend-expiration-date":{"post":{"operationId":"BulkAllExtendExpirationDate","summary":"Extend expiration date for all users by days","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"extendDays":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["extendDays"]}}}}}},"/api/users/bulk/all/reset-traffic":{"post":{"operationId":"BulkAllResetTrafficUsers","summary":"Reset user used traffic for all users","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}}}},"/api/users/bulk/all/update":{"post":{"operationId":"BulkAllUpdateUsers","summary":"Bulk update all users","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number","minimum":0,"description":"Traffic limit in bytes. 0 - unlimited"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{"description":"Expiration date: 2025-01-17T15:38:45.065Z","type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"},"description":{"type":["string","null"]},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"tag":{"anyOf":[{"type":"string","maxLength":16,"pattern":"^[A-Z0-9_]+$"},{"type":"null"}]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]}}}}}}}},"/api/users/bulk/delete-by-status":{"post":{"operationId":"BulkDeleteUsersByStatus","summary":"Bulk delete users by status","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]}},"required":["status"]}}}}}},"/api/users/bulk/delete":{"post":{"operationId":"BulkDeleteUsers","summary":"Bulk delete users by User IDs","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"number"}}},"required":["userIds"]}}}}}},"/api/users/bulk/extend-expiration-date":{"post":{"operationId":"BulkExtendExpirationDate","summary":"Extend expiration date for specified users by days","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"number"}},"extendDays":{"type":"integer","minimum":1,"maximum":9999}},"required":["userIds","extendDays"]}}}}}},"/api/users/bulk/reset-traffic":{"post":{"operationId":"BulkResetTrafficUsers","summary":"Bulk reset traffic users by User IDs","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"number"}}},"required":["userIds"]}}}}}},"/api/users/bulk/revoke-subscription":{"post":{"operationId":"BulkRevokeUsersSubscription","summary":"Revoke users subscription by User IDs","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"number"}}},"required":["userIds"]}}}}}},"/api/users/bulk/update-squads":{"post":{"operationId":"BulkUpdateUsersSquads","summary":"Bulk update users internal squads by User IDs","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"number"}},"activeInternalSquads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["userIds","activeInternalSquads"]}}}}}},"/api/users/bulk/update":{"post":{"operationId":"BulkUpdateUsers","summary":"Bulk update users by User IDs","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"number"}},"fields":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number","minimum":0,"description":"Traffic limit in bytes. 0 - unlimited"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{"description":"Expiration date: 2025-01-17T15:38:45.065Z","type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"},"description":{"type":["string","null"]},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"tag":{"anyOf":[{"type":"string","maxLength":16,"pattern":"^[A-Z0-9_]+$"},{"type":"null"}]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"description":"Optional. External squad UUID.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}}}},"required":["userIds","fields"]}}}}}},"/api/users/by-short-uuid/{shortUuid}":{"get":{"operationId":"GetUserByShortUuid","summary":"Get user by Short UUID","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"shortUuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/by-username/{username}":{"get":{"operationId":"GetUserByUsername","summary":"Get user by username","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/resolve":{"post":{"operationId":"ResolveUser","summary":"Resolve a user","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"},"shortUuid":{"type":"string"}},"required":["id","username","shortUuid"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Resolve a user by ID, Short UUID or username. Exactly one of the fields must be provided.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"}}}}}}}},"/api/users/stream":{"get":{"operationId":"GetUsersStream","summary":"Get all users using cursor-based (keyset) pagination with filtering options","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"description":"Cursor for pagination — pass the nextCursor from the previous response. Omit on the first request.","type":"number"}},{"name":"size","in":"query","required":false,"schema":{"default":250,"type":"number","minimum":1,"maximum":1000,"description":"Number of results to return, no more than 1000"}},{"name":"status","in":"query","required":false,"schema":{"description":"Status to filter users by","type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]}},{"name":"trafficLimitStrategy","in":"query","required":false,"schema":{"description":"Traffic limit strategy to filter users by","type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"]}},{"name":"telegramId","in":"query","required":false,"schema":{"description":"Telegram ID to filter users by","type":"string"}},{"name":"email","in":"query","required":false,"schema":{"description":"Email to filter users by","type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},{"name":"tag","in":"query","required":false,"schema":{"description":"Tag to filter users by","type":"string"}},{"name":"externalSquadUuid","in":"query","required":false,"schema":{"description":"External squad UUID to filter users by","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"nextCursor":{"description":"Cursor to fetch the next page, or null if there are no more results","type":["string","null"]},"hasMore":{"type":"boolean","description":"Whether there are more results to fetch"}},"required":["users","nextCursor","hasMore"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users/tags":{"get":{"operationId":"GetUsersTags","summary":"Get users tags","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}}}},"/api/users":{"get":{"operationId":"GetUsers","summary":"Get all users using offset-based pagination","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"default":0,"description":"Start index (offset) of the results to return, default is 0","type":"number"}},{"name":"size","in":"query","required":false,"schema":{"default":25,"type":"number","minimum":1,"maximum":1000,"description":"Number of results to return, no more than 1000"}},{"name":"filters","in":"query","required":false,"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"value":{}},"required":["id","value"]}}},{"name":"filterModes","in":"query","required":false,"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},{"name":"globalFilterMode","in":"query","required":false,"schema":{"type":"string"}},{"name":"sorting","in":"query","required":false,"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"desc":{"type":"boolean"}},"required":["id","desc"]}}}],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"users":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"total":{"type":"number"}},"required":["users","total"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Please note that the filters here are primarily intended for use by the frontend and rely on expensive operators such as LIKE under the hood. Misusing these filters may negatively impact the performance of your database."},"patch":{"operationId":"UpdateUser","summary":"Update a user","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"description":"Update a user by ID or username. Exactly one of the fields must be provided.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","description":"Username of the user"},"id":{"type":"number","description":"ID of the user"},"status":{"type":"string","enum":["ACTIVE","DISABLED"]},"trafficLimitBytes":{"type":"number","minimum":0,"description":"Traffic limit in bytes. 0 - unlimited"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Traffic limit reset strategy"},"expireAt":{"description":"Expiration date: 2025-01-17T15:38:45.065Z","type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"},"description":{"type":["string","null"]},"tag":{"anyOf":[{"type":"string","maxLength":16,"pattern":"^[A-Z0-9_]+$"},{"type":"null"}]},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"activeInternalSquads":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"externalSquadUuid":{"description":"Optional. External squad UUID.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}}}}}}},"post":{"operationId":"CreateUser","summary":"Create a new user","tags":["users"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"default":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"id":{"type":"number"},"shortUuid":{"type":"string"},"username":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"trafficLimitBytes":{"type":"number"},"trafficLimitStrategy":{"type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"],"description":"Available reset periods"},"expireAt":{},"telegramId":{"type":["number","null"]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"description":{"type":["string","null"]},"tag":{"type":["string","null"]},"hwidDeviceLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"externalSquadUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"trojanPassword":{"type":"string"},"vlessUuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"type":"string"},"lastTriggeredThreshold":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"subRevokedAt":{"anyOf":[{},{"type":"null"}]},"lastTrafficResetAt":{"anyOf":[{},{"type":"null"}]},"createdAt":{},"updatedAt":{},"subscriptionUrl":{"type":"string"},"activeInternalSquads":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"}},"required":["uuid","name"],"additionalProperties":false}},"userTraffic":{"type":"object","properties":{"usedTrafficBytes":{"type":"number"},"lifetimeUsedTrafficBytes":{"type":"number"},"onlineAt":{"anyOf":[{},{"type":"null"}]},"firstConnectedAt":{"anyOf":[{},{"type":"null"}]},"lastConnectedNodeUuid":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["usedTrafficBytes","lifetimeUsedTrafficBytes","onlineAt","firstConnectedAt","lastConnectedNodeUuid"],"additionalProperties":false}},"required":["id","shortUuid","username","status","trafficLimitBytes","trafficLimitStrategy","expireAt","telegramId","email","description","tag","hwidDeviceLimit","externalSquadUuid","trojanPassword","vlessUuid","ssPassword","lastTriggeredThreshold","subRevokedAt","lastTrafficResetAt","createdAt","updatedAt","subscriptionUrl","activeInternalSquads","userTraffic"],"additionalProperties":false}},"required":["response"],"additionalProperties":false}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","minLength":3,"maxLength":36,"pattern":"^[a-zA-Z0-9_-]+$","description":"Unique username for the user. Required. Must be 3-36 characters long and contain only letters, numbers, underscores and dashes."},"status":{"description":"Optional. User account status. Defaults to ACTIVE.","default":"ACTIVE","type":"string","enum":["ACTIVE","DISABLED","LIMITED","EXPIRED"]},"shortUuid":{"description":"Optional. Short UUID identifier for the user.","type":"string"},"trojanPassword":{"description":"Optional. Password for Trojan protocol. Must be 8-32 characters.","type":"string","minLength":8,"maxLength":32},"vlessUuid":{"description":"Optional. UUID for VLESS protocol. Must be a valid UUID format.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"ssPassword":{"description":"Optional. Password for Shadowsocks protocol. Must be 8-32 characters.","type":"string","minLength":8,"maxLength":32},"trafficLimitBytes":{"description":"Optional. Traffic limit in bytes. Set to 0 for unlimited traffic.","type":"number","minimum":0},"trafficLimitStrategy":{"default":"NO_RESET","description":"Available reset periods","type":"string","enum":["NO_RESET","DAY","WEEK","MONTH","MONTH_ROLLING"]},"expireAt":{"description":"Account expiration date. Required. Format: 2025-01-17T15:38:45.065Z","type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"},"createdAt":{"description":"Optional. Account creation date. Format: 2025-01-17T15:38:45.065Z","type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"},"lastTrafficResetAt":{"description":"Optional. Date of last traffic reset. Format: 2025-01-17T15:38:45.065Z","type":"string","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d))|(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?)$"},"description":{"description":"Optional. Additional notes or description for the user account.","type":"string"},"tag":{"description":"Optional. User tag for categorization. Max 16 characters, uppercase letters, numbers and underscores only.","anyOf":[{"type":"string","maxLength":16,"pattern":"^[A-Z0-9_]+$"},{"type":"null"}]},"telegramId":{"description":"Optional. Telegram user ID for notifications. Must be an integer.","type":["number","null"]},"email":{"description":"Optional. User email address. Must be a valid email format.","anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"hwidDeviceLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Optional. Maximum number of hardware devices allowed. Must be a positive integer."},"activeInternalSquads":{"description":"Optional. Array of UUIDs representing enabled internal squads.","type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"externalSquadUuid":{"description":"Optional. External squad UUID.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["username","expireAt"]}}}}}},"/api/sub/{shortUuid}":{"get":{"operationId":"GetSubscription","summary":"Get subscription","description":"Public subscription link, no token. The format is picked by the subscription response rules from `User-Agent` and other request headers: base64 links, Xray JSON, Mihomo, Stash, Clash or sing-box. A rule can also answer `403`, `404`, `451` or drop the connection. Traffic and expiry come in `subscription-userinfo`, the next traffic reset in `subscription-refill-date`; headers from the subscription settings and the matched rule are added on top. Served by the upstream backend too, but outside the contract package.","tags":["sub"],"security":[],"parameters":[{"name":"shortUuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Subscription body. `Content-Type` depends on the client: `text/plain` for base64, `application/json` for Xray JSON and sing-box, `text/yaml` for Mihomo, Stash and Clash.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"object"}},"text/yaml":{"schema":{"type":"string"}}}},"403":{"description":"No `User-Agent`, no matching rule, or the rule answers `BLOCK`."},"404":{"description":"User not found, or the rule answers `STATUS_CODE_404`."},"451":{"description":"The rule answers `STATUS_CODE_451`."}}}},"/api/sub/{shortUuid}/{clientType}":{"get":{"operationId":"GetSubscriptionByClientType","summary":"Get subscription for a client type","description":"Same as `GET /api/sub/{shortUuid}`, but the format comes from the path and the response rules are not checked. Any other `clientType` answers `403`. `disableSubscriptionAccessByPath: true` in the response rules settings turns these links off (`403`).","tags":["sub"],"security":[],"parameters":[{"name":"shortUuid","in":"path","required":true,"schema":{"type":"string"}},{"name":"clientType","in":"path","required":true,"schema":{"type":"string","enum":["json","v2ray-json","mihomo","stash","clash","singbox"]}}],"responses":{"200":{"description":"Subscription body in the requested format.","content":{"application/json":{"schema":{"type":"object"}},"text/yaml":{"schema":{"type":"string"}}}},"403":{"description":"Unknown client type, or links with a type in the path are disabled."},"404":{"description":"User not found."}}}},"/api/nodes/traffic-summary":{"get":{"operationId":"GetNodesTrafficSummary","summary":"Get lifetime node traffic","description":"Raw bytes each node has served since it was added, summed from the usage history. Monthly resets of `trafficUsedBytes` do not clear it, and the node consumption multiplier is not applied. Nodes without recorded traffic are absent.","tags":["gowave"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["response"],"properties":{"response":{"type":"object","required":["nodes"],"properties":{"nodes":{"type":"array","items":{"type":"object","required":["uuid","lifetimeTrafficBytes"],"properties":{"uuid":{"type":"string","format":"uuid"},"lifetimeTrafficBytes":{"type":"integer","minimum":0}}}}}}}}}}}}}},"/api/nodes/{uuid}/logs":{"get":{"operationId":"GetNodeLogs","summary":"Get node logs","description":"Last lines of the Xray or node log, read from the node. Works with the Go node; `remnawave/node` has no such endpoint. If the node cannot be reached, the response is still `200` with a single `[ERROR] ...` line.","tags":["gowave"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"type","in":"query","schema":{"type":"string","enum":["xray","node"],"default":"xray"}},{"name":"lines","in":"query","schema":{"type":"integer","minimum":1,"default":500}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["response"],"properties":{"response":{"type":"object","required":["logs"],"properties":{"logs":{"type":"array","items":{"type":"string"}}}}}}}}},"404":{"description":"Node not found."}}}},"/api/nodes/{uuid}/updates":{"get":{"operationId":"GetNodeUpdates","summary":"Check node updates","description":"Asks a Go node for its versions and the releases it can install. Without `repo` the node lists `aaaSaZaN/remnanode-go` releases; pass `XTLS/Xray-core` for the core. If the node cannot fetch the releases, `response` holds only `error`.","tags":["gowave"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"repo","in":"query","description":"GitHub repository, `owner/name`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["response"],"properties":{"response":{"type":"object","properties":{"currentVersion":{"type":"string","description":"Node version."},"currentCoreVersion":{"type":"string","description":"Xray core version."},"architecture":{"type":"string"},"os":{"type":"string"},"latestRelease":{"$ref":"#/components/schemas/GoWaveNodeRelease"},"latestPrerelease":{"$ref":"#/components/schemas/GoWaveNodeRelease"},"allReleases":{"type":"array","items":{"$ref":"#/components/schemas/GoWaveNodeRelease"}},"error":{"type":"string"}}}}}}}},"404":{"description":"Node not found."},"502":{"description":"The node did not answer."}}}},"/api/nodes/{uuid}/updates/apply":{"post":{"operationId":"ApplyNodeUpdate","summary":"Update node or core","description":"Installs the given release of the Go node or its Xray core. The body goes to the node as is. The node checks the checksum, keeps the previous binary and restarts; the panel re-checks its health two seconds later.","tags":["gowave"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type","version"],"properties":{"type":{"type":"string","enum":["node","core"]},"version":{"type":"string","description":"Release tag, as `tag_name` in `GET /api/nodes/{uuid}/updates`."},"repo":{"type":"string","description":"Defaults to `aaaSaZaN/remnanode-go` for `node` and `XTLS/Xray-core` for `core`."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["response"],"properties":{"response":{"type":"object","properties":{"success":{"type":"boolean"},"version":{"type":"string"}}}}}}}},"400":{"description":"Invalid body."},"404":{"description":"Node not found."},"502":{"description":"The node refused the update or did not answer."}}}},"/api/system/updates/check":{"get":{"operationId":"CheckPanelUpdate","summary":"Check panel updates","description":"Compares the running version with the latest GoWave release on GitHub. The body is not wrapped in `response`. In Docker `canAutoUpdate` is `false` and `updateCommand` holds the command to run on the server.","tags":["gowave"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["currentVersion","latestVersion","changelog","hasUpdate","isDocker","canAutoUpdate"],"properties":{"currentVersion":{"type":"string"},"latestVersion":{"type":"string"},"changelog":{"type":"string","description":"Release notes in Markdown."},"hasUpdate":{"type":"boolean"},"isDocker":{"type":"boolean"},"canAutoUpdate":{"type":"boolean"},"updateCommand":{"type":"string"}}}}}},"502":{"description":"GitHub did not answer. The body is plain text."}}}},"/api/system/updates/apply":{"post":{"operationId":"ApplyPanelUpdate","summary":"Update the panel","description":"Systemd installs only. Downloads the latest release binary and web interface, replaces them and exits two seconds after answering; systemd starts the new version (`Restart=always`).","tags":["gowave"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Files replaced, the panel is restarting.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Running in Docker. The body is plain text with the update command."},"500":{"description":"Download or replacement failed; the old version keeps running. The body is plain text."}}}},"/api/system/actions/restore":{"post":{"operationId":"RestoreBackup","summary":"Restore from backup","description":"Replaces the panel data with a backup: a `.tar.gz` archive with a `*.sql.gz` PostgreSQL dump inside, as Remnawave makes them. The dump is loaded into a staging database first, so a broken backup leaves the live data untouched.","tags":["gowave"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["response"],"properties":{"response":{"type":"object","properties":{"message":{"type":"string"}}}}}}}},"400":{"description":"No file, or the backup could not be restored."}}}},"/api/node-ssh/ws":{"get":{"operationId":"NodeSshSocket","summary":"Node SSH terminal (WebSocket)","description":"WebSocket for the node SSH terminal. First get a ticket with `POST /api/node-ssh/{uuid}/ticket`: it lives 15 seconds, works once and only from the same client IP. Then open the socket with `Sec-WebSocket-Protocol: rw, <ticket>, <admin JWT>`. API tokens are rejected; the socket needs an administrator session.","tags":["node-ssh"],"security":[],"parameters":[{"name":"Sec-WebSocket-Protocol","in":"header","required":true,"schema":{"type":"string","example":"rw, <ticket>, <jwt>"}}],"responses":{"101":{"description":"Switching to WebSocket."},"401":{"description":"Missing, expired or foreign ticket."},"403":{"description":"Not an administrator, for example an API token."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"GoWaveNodeRelease":{"type":"object","properties":{"tag_name":{"type":"string"},"name":{"type":"string"},"prerelease":{"type":"boolean"},"published_at":{"type":"string","format":"date-time"},"assets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"digest":{"type":"string"},"browser_download_url":{"type":"string"},"size":{"type":"integer"}}}}}}}},"tags":[{"name":"gowave","x-displayName":"GoWave extensions","description":"Endpoints GoWave adds on top of `@remnawave/backend-contract`. Remnawave clients and bots do not call them; the GoWave web interface does."}]}