Contract 3.4.15
GoWave API
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>.
Endpoints GoWave adds on top of the contract are under GoWave extensions.
Authentication
Send requests to your panel at https://<panel domain>/api/…. Each endpoint lists its authentication requirements.
Security schemes
{
"bearerAuth": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT"
}
}No endpoints match this search.
GoWave extensions
Endpoints GoWave adds on top of @remnawave/backend-contract. Remnawave clients and bots do not call them; the GoWave web interface does.
GET/api/nodes/traffic-summaryGet lifetime node traffic
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}
}
}
}
}
}
}
}GET/api/nodes/{uuid}/logsGet node logs
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 200
{
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"response"
],
"properties": {
"response": {
"type": "object",
"required": [
"logs"
],
"properties": {
"logs": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
}Response: 404
{
"description": "Node not found."
}GET/api/nodes/{uuid}/updatesCheck node updates
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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"
}
}
}
}
}
}
}
}Response: 404
{
"description": "Node not found."
}Response: 502
{
"description": "The node did not answer."
}POST/api/nodes/{uuid}/updates/applyUpdate node or core
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
]Request body
{
"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
Response: 200
{
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"response"
],
"properties": {
"response": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"version": {
"type": "string"
}
}
}
}
}
}
}
}Response: 400
{
"description": "Invalid body."
}Response: 404
{
"description": "Node not found."
}Response: 502
{
"description": "The node refused the update or did not answer."
}GET/api/system/updates/checkCheck panel updates
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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"
}
}
}
}
}
}Response: 502
{
"description": "GitHub did not answer. The body is plain text."
}POST/api/system/updates/applyUpdate the panel
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).
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 200
{
"description": "Files replaced, the panel is restarting.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
}Response: 400
{
"description": "Running in Docker. The body is plain text with the update command."
}Response: 500
{
"description": "Download or replacement failed; the old version keeps running. The body is plain text."
}POST/api/system/actions/restoreRestore from backup
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "string",
"format": "binary"
}
}
}
}
}
}Responses
Response: 200
{
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"response"
],
"properties": {
"response": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}
}
}
}Response: 400
{
"description": "No file, or the backup could not be restored."
}auth
POST/api/auth/loginLogin as superadmin
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/auth/oauth2/authorizeInitiate OAuth2 authorization
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/auth/oauth2/callbackCallback from OAuth2
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/auth/passkey/authentication/optionsGet the authentication options for passkey
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: default
{
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"response": {}
},
"required": [
"response"
],
"additionalProperties": false
}
}
}
}POST/api/auth/passkey/authentication/verifyVerify the authentication for passkey
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"response": {}
},
"required": [
"response"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/auth/registerRegister as superadmin
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/auth/statusGet the status of the authentication
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}bandwidth-stats
GET/api/bandwidth-stats/internal-squads/{squadUuid}/users/{userId}/usageGet a single user daily traffic usage on the internal squad nodes for a period
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}GET/api/bandwidth-stats/internal-squads/{uuid}/usageGet internal squad users traffic usage for a period
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}GET/api/bandwidth-stats/nodes/{uuid}/usersGet Node Users Usage by Node UUID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}POST/api/bandwidth-stats/nodes/usageGet users exceeding a traffic threshold on the given nodes for a period
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
}
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/bandwidth-stats/nodes/usersGet Nodes Users Usage by Nodes UUIDs
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
}
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/bandwidth-stats/nodesGet Nodes Usage by Range
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}GET/api/bandwidth-stats/users/{userId}Get User Usage by Range
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}config-profiles
GET/api/config-profiles/{uuid}/computed-configGet computed config profile by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/config-profiles/{uuid}/inboundsGet inbounds by profile uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/config-profiles/{uuid}Get config profile by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/config-profiles/{uuid}Delete config profile
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/config-profiles/actions/reorderReorder config profiles
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/config-profiles/inboundsGet all inbounds from all config profiles
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/config-profiles/tagsGet tags of Config Profiles
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/config-profiles/tagsSet tags of Config Profile
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/config-profilesGet config profiles
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/config-profilesCreate config profile
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/config-profilesUpdate Core Config in specific config profile
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}connections
GET/api/connections/by-node/{jobId}Get Connections for Node by Job ID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "jobId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/connections/by-node/{nodeUuid}Request Connections for Node
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "nodeUuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/connections/by-user/{jobId}Get Connections for User by Job ID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "jobId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/connections/by-user/{userId}Request Connections for User
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/connections/dropDrop Connections for Users or IPs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}GET/api/connections/geocheck/{jobId}Get Geocheck for Node by Job ID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "jobId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/connections/geocheck/{nodeUuid}Request Geocheck for Node
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "nodeUuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"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"
}
}
}
}
}
}Responses
Response: 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
}
}
}
}external-squads
POST/api/external-squads/{uuid}/bulk-actions/add-usersAdd all users to external squad
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}DELETE/api/external-squads/{uuid}/bulk-actions/remove-usersDelete users from external squad
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}GET/api/external-squads/{uuid}Get external squad by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/external-squads/{uuid}Delete external squad
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/external-squads/actions/reorderReorder external squads
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/external-squads/tagsGet tags of External Squads
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/external-squads/tagsSet tags of External Squad
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/external-squadsGet all external squads
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/external-squadsCreate external squad
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 2,
"maxLength": 30,
"pattern": "^[A-Za-z0-9_\\s-]+$"
}
},
"required": [
"name"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/external-squadsUpdate external squad
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}hosts
GET/api/hosts/{uuid}Get a host by UUID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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"
}
}
]
}
}
}
}
}
}DELETE/api/hosts/{uuid}Delete a host by UUID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/hosts/actions/cloneClone host
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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"
}
}
]
}
}
}
}
}
}POST/api/hosts/actions/reorderReorder hosts
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/hosts/bulk/deleteDelete hosts by UUIDs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/hosts/bulk/disableDisable hosts by UUIDs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/hosts/bulk/enableEnable hosts by UUIDs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}PATCH/api/hosts/bulk/updateUpdate many hosts
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
}
}
]
}
}
}
}
}
}Responses
Response: default
{
"description": "Success"
}GET/api/hosts/tagsGet tags of hosts
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/hostsGet hosts
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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"
}
}
]
}
}
}
}
}
}POST/api/hostsCreate a new host
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
}
}
]
}
}
}
}
}
}Responses
Response: 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"
}
}
]
}
}
}
}
}
}PATCH/api/hostsUpdate a host
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
}
}
]
}
}
}
}
}
}Responses
Response: 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"
}
}
]
}
}
}
}
}
}hwid
GET/api/hwid/devices/{userId}Get user HWID devices
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/hwid/devices/delete-allDelete all user HWID devices
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"userId": {
"type": "number"
}
},
"required": [
"userId"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/hwid/devices/deleteDelete a user HWID device
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"userId": {
"type": "number"
},
"hwid": {
"type": "string"
}
},
"required": [
"userId",
"hwid"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/hwid/devices/statsGet HWID devices stats
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/hwid/devices/top-usersGet top users by HWID devices
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}GET/api/hwid/devicesGet HWID devices
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}POST/api/hwid/devicesCreate a user HWID device
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}infra-billing
DELETE/api/infra-billing/history/{uuid}Delete infra billing history
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}GET/api/infra-billing/historyGet infra billing history
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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/api/infra-billing/historyCreate infra billing history
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}DELETE/api/infra-billing/nodes/{uuid}Delete infra billing node
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}GET/api/infra-billing/nodesGet infra billing nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/infra-billing/nodesCreate infra billing node
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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/api/infra-billing/nodesUpdate infra billing nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/infra-billing/providers/{uuid}Get infra provider by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/infra-billing/providers/{uuid}Delete infra provider by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}GET/api/infra-billing/providersGet all infra providers
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/infra-billing/providersCreate infra provider
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/infra-billing/providersUpdate infra provider
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}internal-squads
GET/api/internal-squads/{uuid}/accessible-nodesGet internal squad accessible nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/internal-squads/{uuid}/bulk-actions/add-many-usersAdd many users to internal squad
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"userIds": {
"minItems": 1,
"maxItems": 1000,
"type": "array",
"items": {
"type": "number"
}
}
},
"required": [
"userIds"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/internal-squads/{uuid}/bulk-actions/add-usersAdd all users to internal squad
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}DELETE/api/internal-squads/{uuid}/bulk-actions/remove-many-usersDelete many users from internal squad
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"userIds": {
"minItems": 1,
"maxItems": 1000,
"type": "array",
"items": {
"type": "number"
}
}
},
"required": [
"userIds"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}DELETE/api/internal-squads/{uuid}/bulk-actions/remove-usersDelete users from internal squad
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}GET/api/internal-squads/{uuid}Get internal squad by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/internal-squads/{uuid}Delete internal squad
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/internal-squads/actions/reorderReorder internal squads
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/internal-squads/tagsGet tags of Internal Squads
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/internal-squads/tagsSet tags of Internal Squad
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/internal-squadsGet all internal squads
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/internal-squadsCreate internal squad
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/internal-squadsUpdate internal squad
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}keygen
GET/api/keygenGet SECRET_KEY for Remnawave Node
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}metadata
GET/api/metadata/node/{uuid}Get node metadata
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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/api/metadata/node/{uuid}Update or create Node Metadata
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"metadata": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"required": [
"metadata"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/metadata/user/{userId}Get user metadata
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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/api/metadata/user/{userId}Update or create User Metadata
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"metadata": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"required": [
"metadata"
]
}
}
}
}Responses
Response: 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
}
}
}
}node-integrations
GET/api/node-integrations/{uuid}Get Node Integration by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/node-integrations/{uuid}Delete Node Integration
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}GET/api/node-integrationsGet all Node Integrations
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/node-integrationsCreate Node Integration
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/node-integrationsUpdate Node Integration
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}node-plugins
GET/api/node-plugins/{uuid}Get Node Plugin by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/node-plugins/{uuid}Delete Node Plugin
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/node-plugins/actions/cloneClone Node Plugin
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/node-plugins/actions/reorderReorder Node Plugins
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/node-plugins/actions/syncSync Node Plugin to nodes
Push the current plugin config, including referenced shared lists, to every connected node this plugin is active on.
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/node-plugins/executorExecute command on node plugins
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}GET/api/node-plugins/tagsGet tags of Node Plugins
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/node-plugins/tagsSet tags of Node Plugin
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/node-plugins/torrent-blocker/statsGet Torrent Blocker Reports Stats
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}DELETE/api/node-plugins/torrent-blocker/truncateTruncate Torrent Blocker Reports
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: default
{
"description": "Success"
}GET/api/node-plugins/torrent-blockerGet Torrent Blocker Reports
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}GET/api/node-pluginsGet all Node Plugins
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/node-pluginsCreate Node Plugin
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 2,
"maxLength": 30,
"pattern": "^[A-Za-z0-9_\\s-]+$"
}
},
"required": [
"name"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/node-pluginsUpdate Node Plugin
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}node-ssh
POST/api/node-ssh/{uuid}/ticketCreate a single-use ticket for opening an SSH terminal session
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/node-ssh/vault/evaluateOblivious evaluation step for unlocking the SSH key vault
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/node-ssh/wsNode SSH terminal (WebSocket)
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.
Authentication: public endpoint.
Path, query and header parameters
[
{
"name": "Sec-WebSocket-Protocol",
"in": "header",
"required": true,
"schema": {
"type": "string",
"example": "rw, <ticket>, <jwt>"
}
}
]Responses
Response: 101
{
"description": "Switching to WebSocket."
}Response: 401
{
"description": "Missing, expired or foreign ticket."
}Response: 403
{
"description": "Not an administrator, for example an API token."
}nodes
POST/api/nodes/{uuid}/actions/disableDisable a node
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/nodes/{uuid}/actions/enableEnable a node
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/nodes/{uuid}/actions/reset-trafficReset Node Traffic
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/nodes/{uuid}/actions/restartRestart node
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"forceRestart": {
"type": "boolean"
}
},
"required": [
"forceRestart"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}GET/api/nodes/{uuid}Get node by UUID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/nodes/{uuid}Delete a node
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/nodes/actions/reorderReorder nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/nodes/actions/restart-allRestart all nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"forceRestart": {
"type": "boolean"
}
},
"required": [
"forceRestart"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/nodes/bulk-actions/profile-modificationModify Inbounds & Profile for many nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/nodes/bulk-actions/updateUpdate many nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/nodes/bulk-actionsPerform actions for many nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}GET/api/nodes/tagsGet nodes tags
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/nodesGet nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/nodesCreate a new node
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/nodesUpdate node
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}passkeys
GET/api/passkeys/registration/optionsGet registration options for passkey
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: default
{
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"response": {}
},
"required": [
"response"
],
"additionalProperties": false
}
}
}
}POST/api/passkeys/registration/verifyVerify registration for passkey
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"response": {}
},
"required": [
"response"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/passkeysGet passkeys
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/passkeysUpdate passkey
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}DELETE/api/passkeysDelete a passkey by ID
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}remnawave-settings
GET/api/remnawave-settingsGet Remnawave settings
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/remnawave-settingsUpdate Remnawave settings
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}
}
}Responses
Response: 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
}
}
}
}snippets
POST/api/snippets/actions/syncSync snippet to affected config profiles
Trigger the sync of a snippet to all config profiles that reference it. Nodes which use affected config profiles will be restarted.
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}GET/api/snippetsGet snippets
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/snippetsCreate snippet
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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/api/snippetsUpdate snippet
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}DELETE/api/snippetsDelete snippet
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}sub
GET/api/sub/{shortUuid}/infoGet Subscription Info by Short UUID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "shortUuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/sub/{shortUuid}Get subscription
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.
Authentication: public endpoint.
Path, query and header parameters
[
{
"name": "shortUuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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"
}
}
}
}Response: 403
{
"description": "No `User-Agent`, no matching rule, or the rule answers `BLOCK`."
}Response: 404
{
"description": "User not found, or the rule answers `STATUS_CODE_404`."
}Response: 451
{
"description": "The rule answers `STATUS_CODE_451`."
}GET/api/sub/{shortUuid}/{clientType}Get subscription for a client type
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).
Authentication: public endpoint.
Path, query and header 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
Response: 200
{
"description": "Subscription body in the requested format.",
"content": {
"application/json": {
"schema": {
"type": "object"
}
},
"text/yaml": {
"schema": {
"type": "string"
}
}
}
}Response: 403
{
"description": "Unknown client type, or links with a type in the path are disabled."
}Response: 404
{
"description": "User not found."
}subscription-page-configs
GET/api/subscription-page-configs/{uuid}Get subscription page config by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/subscription-page-configs/{uuid}Delete subscription page config
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/subscription-page-configs/actions/cloneClone subscription page config
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/subscription-page-configs/actions/reorderReorder subscription page configs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/subscription-page-configs/tagsGet tags of Subpage Configs
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/subscription-page-configs/tagsSet tags of Subpage Config
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/subscription-page-configsGet all subscription page configs
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/subscription-page-configsCreate subscription page config
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 2,
"maxLength": 30,
"pattern": "^[A-Za-z0-9_\\s-]+$"
}
},
"required": [
"name"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/subscription-page-configsUpdate subscription page config
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}subscription-request-history
GET/api/subscription-request-history/statsGet subscription request history stats
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/subscription-request-historyGet all subscription request history
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}subscription-settings
GET/api/subscription-settingsGet subscription settings
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/subscription-settingsUpdate subscription settings
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}subscription-templates
GET/api/subscription-templates/{uuid}Get subscription template by uuid
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/subscription-templates/{uuid}Delete subscription template
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/subscription-templates/actions/reorderReorder subscription templates
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/subscription-templates/tagsGet tags of Subscription Templates
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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/api/subscription-templates/tagsSet tags of Subscription Template
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/subscription-templatesGet all subscription templates (wihout content)
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/subscription-templatesCreate subscription template
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/subscription-templatesUpdate subscription template
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}subscriptions
GET/api/subscriptions/by-id/{userId}Get subscription by User ID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/subscriptions/by-short-uuid/{shortUuid}/rawGet Raw Subscription by Short UUID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "shortUuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "withDisabledHosts",
"in": "query",
"required": false,
"schema": {
"default": "false",
"type": "string"
}
}
]Responses
Response: 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"
}
}
]
}
}
}
}
}
}GET/api/subscriptions/by-short-uuid/{shortUuid}Get subscription by short uuid (protected route)
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "shortUuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/subscriptions/by-username/{username}Get subscription by username
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "username",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/subscriptions/connection-keys/{userId}Get connection keys (base64 format) by user id
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/subscriptions/subpage-config/{shortUuid}Get Subpage Config by Short UUID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "shortUuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"requestHeaders": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
},
"required": [
"requestHeaders"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/subscriptionsGet all subscriptions
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}system
GET/api/system/configurationGet Remnawave Configuration
Returns some of the configuration values.
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/system/healthGet Remnawave Health
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/system/metadataGet Remnawave Information
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/system/nodes/metricsGet Nodes Metrics
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/system/stats/bandwidthGet Bandwidth Stats
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "tz",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/system/stats/digestGet Stats Digest
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}GET/api/system/stats/httpGet HTTP Stats
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/system/stats/nodesGet Nodes Statistics
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "tz",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/system/stats/recapGet Recap
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/system/statsGet Stats
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "tz",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/system/testers/srr-matcherTest SRR Matcher
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/system/tools/x25519/generateGenerate 30 X25519 keypairs
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}tokens
DELETE/api/tokens/{uuid}Delete API token
This endpoint is forbidden to use via "API-key". It can be used only with an admin JWT-token.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "uuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/tokens/ottGet short-lived token for accessing backend tools (Swagger, Scalar, Bull Board)
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/tokens/scopesGet available API token scopes
Returns the catalog of scopes that can be granted to an API token, grouped by resource. Forbidden via "API-key", admin JWT only.
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/tokensGet all API tokens
This endpoint is forbidden to use via "API-key". It can only be used with admin JWT-token.
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}POST/api/tokensCreate a new API token
This endpoint is forbidden to use via "API-key". It can only be used with an admin JWT-token.
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}users
GET/api/users/{userId}/accessible-nodesGet user accessible nodes
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/users/{userId}/actions/disableDisable user
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/users/{userId}/actions/enableEnable user
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/users/{userId}/actions/extendExtend user expiration date
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}POST/api/users/{userId}/actions/reset-trafficReset user traffic
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/users/{userId}/actions/revokeRevoke user subscription
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Request body
{
"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."
}
}
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/users/{userId}/subscription-request-historyGet user subscription request history, recent 24 records
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/users/{userId}Get user by ID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}DELETE/api/users/{userId}Delete user
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/all/extend-expiration-dateExtend expiration date for all users by days
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"extendDays": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"extendDays"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/all/reset-trafficReset user used traffic for all users
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/all/updateBulk update all users
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
}
]
}
}
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/delete-by-statusBulk delete users by status
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ACTIVE",
"DISABLED",
"LIMITED",
"EXPIRED"
]
}
},
"required": [
"status"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/deleteBulk delete users by User IDs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"userIds": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "number"
}
}
},
"required": [
"userIds"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/extend-expiration-dateExtend expiration date for specified users by days
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/reset-trafficBulk reset traffic users by User IDs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"userIds": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "number"
}
}
},
"required": [
"userIds"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/revoke-subscriptionRevoke users subscription by User IDs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"userIds": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "number"
}
}
},
"required": [
"userIds"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/update-squadsBulk update users internal squads by User IDs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}POST/api/users/bulk/updateBulk update users by User IDs
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: default
{
"description": "Success"
}GET/api/users/by-short-uuid/{shortUuid}Get user by Short UUID
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "shortUuid",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}GET/api/users/by-username/{username}Get user by username
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header parameters
[
{
"name": "username",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]Responses
Response: 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
}
}
}
}POST/api/users/resolveResolve a user
Resolve a user by ID, Short UUID or username. Exactly one of the fields must be provided.
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"shortUuid": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
}
}
}Responses
Response: 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
}
}
}
}GET/api/users/streamGet all users using cursor-based (keyset) pagination with filtering options
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}GET/api/users/tagsGet users tags
Authentication requirements
[
{
"bearerAuth": []
}
]Responses
Response: 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
}
}
}
}GET/api/usersGet all users using offset-based pagination
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.
Authentication requirements
[
{
"bearerAuth": []
}
]Path, query and header 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
Response: 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
}
}
}
}POST/api/usersCreate a new user
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
]
}
}
}
}Responses
Response: 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
}
}
}
}PATCH/api/usersUpdate a user
Update a user by ID or username. Exactly one of the fields must be provided.
Authentication requirements
[
{
"bearerAuth": []
}
]Request body
{
"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"
}
]
}
}
}
}
}
}Responses
Response: 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
}
}
}
}Shared 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"
}
}
}
}
}
}