Files
3x-ui-agent/frontend/src/generated/schemas.ts
T
Muse 3a02211555 merge fix/settings-trim: dead settings, upstream remnants, JSON/Clash subscriptions removed
# Conflicts:
#	frontend/src/models/setting.ts
#	frontend/src/pages/settings/GeneralTab.tsx
#	frontend/src/pages/settings/SettingsPage.tsx
#	frontend/src/pages/settings/SubscriptionBalancersTab.tsx
#	frontend/src/pages/xray/outbounds/OutboundsTab.css
#	frontend/src/schemas/setting.ts
2026-10-23 00:39:44 +00:00

2797 lines
65 KiB
TypeScript

// Code generated by tools/openapigen. DO NOT EDIT.
export const SCHEMAS: Record<string, unknown> = {
"AllSetting": {
"properties": {
"datepicker": {
"type": "string"
},
"expireDiff": {
"minimum": 0,
"type": "integer"
},
"pageSize": {
"maximum": 1000,
"minimum": 0,
"type": "integer"
},
"remarkTemplate": {
"type": "string"
},
"restartXrayOnClientDisable": {
"type": "boolean"
},
"sessionMaxAge": {
"maximum": 525600,
"minimum": 1,
"type": "integer"
},
"subAnnounce": {
"type": "string"
},
"subCertFile": {
"type": "string"
},
"subDomain": {
"type": "string"
},
"subEnable": {
"type": "boolean"
},
"subEncrypt": {
"type": "boolean"
},
"subHideSettings": {
"type": "boolean"
},
"subKeyFile": {
"type": "string"
},
"subListen": {
"type": "string"
},
"subPath": {
"type": "string"
},
"subPort": {
"description": "SubPort 0 means \"no explicit port\": subscription links are generated\nwithout a port (standard scheme port behind a reverse proxy) while the\nsub server still binds the default port. See SettingService.BuildSubURIBase\nand the sub server bootstrap for the two sides of that split.",
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"subProfileUrl": {
"type": "string"
},
"subShowIdentityOnAllLinks": {
"type": "boolean"
},
"subSupportUrl": {
"type": "string"
},
"subTitle": {
"type": "string"
},
"subURI": {
"type": "string"
},
"subUpdates": {
"maximum": 525600,
"minimum": 0,
"type": "integer"
},
"tgBotAPIServer": {
"type": "string"
},
"tgBotBackup": {
"type": "boolean"
},
"tgBotChatId": {
"type": "string"
},
"tgBotEnable": {
"type": "boolean"
},
"tgBotProxy": {
"type": "string"
},
"tgBotToken": {
"type": "string"
},
"tgCpu": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"tgEnabledEvents": {
"type": "string"
},
"tgLang": {
"type": "string"
},
"tgMemory": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"tgRunTime": {
"type": "string"
},
"timeLocation": {
"type": "string"
},
"trafficDiff": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"trafficStatsSwitches": {
"description": "TrafficStatsSwitches (ITEM6 §4.3.1): the whole-network traffic\naccounting switches as one JSON string\n({inboundUplink,inboundDownlink,outboundUplink,outboundDownlink}),\ncarried verbatim so the settings page edits the same key the\nsing-box generator reads (settings.trafficStatsSwitches).",
"type": "string"
},
"trustedProxyCIDRs": {
"type": "string"
},
"warpUpdateInterval": {
"minimum": 0,
"type": "integer"
},
"webBasePath": {
"type": "string"
},
"webCertFile": {
"type": "string"
},
"webDomain": {
"type": "string"
},
"webKeyFile": {
"type": "string"
},
"webListen": {
"type": "string"
},
"webPort": {
"maximum": 65535,
"minimum": 1,
"type": "integer"
}
},
"required": [
"datepicker",
"expireDiff",
"pageSize",
"remarkTemplate",
"restartXrayOnClientDisable",
"sessionMaxAge",
"subAnnounce",
"subCertFile",
"subDomain",
"subEnable",
"subEncrypt",
"subHideSettings",
"subKeyFile",
"subListen",
"subPath",
"subPort",
"subProfileUrl",
"subShowIdentityOnAllLinks",
"subSupportUrl",
"subTitle",
"subURI",
"subUpdates",
"tgBotAPIServer",
"tgBotBackup",
"tgBotChatId",
"tgBotEnable",
"tgBotProxy",
"tgBotToken",
"tgCpu",
"tgEnabledEvents",
"tgLang",
"tgMemory",
"tgRunTime",
"timeLocation",
"trafficDiff",
"trafficStatsSwitches",
"trustedProxyCIDRs",
"warpUpdateInterval",
"webBasePath",
"webCertFile",
"webDomain",
"webKeyFile",
"webListen",
"webPort"
],
"type": "object"
},
"AllSettingView": {
"properties": {
"datepicker": {
"type": "string"
},
"expireDiff": {
"minimum": 0,
"type": "integer"
},
"hasApiToken": {
"type": "boolean"
},
"hasNordSecret": {
"type": "boolean"
},
"hasTgBotToken": {
"type": "boolean"
},
"hasWarpSecret": {
"type": "boolean"
},
"pageSize": {
"maximum": 1000,
"minimum": 0,
"type": "integer"
},
"remarkTemplate": {
"type": "string"
},
"restartXrayOnClientDisable": {
"type": "boolean"
},
"sessionMaxAge": {
"maximum": 525600,
"minimum": 1,
"type": "integer"
},
"subAnnounce": {
"type": "string"
},
"subCertFile": {
"type": "string"
},
"subDomain": {
"type": "string"
},
"subEnable": {
"type": "boolean"
},
"subEncrypt": {
"type": "boolean"
},
"subHideSettings": {
"type": "boolean"
},
"subKeyFile": {
"type": "string"
},
"subListen": {
"type": "string"
},
"subPath": {
"type": "string"
},
"subPort": {
"description": "SubPort 0 means \"no explicit port\": subscription links are generated\nwithout a port (standard scheme port behind a reverse proxy) while the\nsub server still binds the default port. See SettingService.BuildSubURIBase\nand the sub server bootstrap for the two sides of that split.",
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"subProfileUrl": {
"type": "string"
},
"subShowIdentityOnAllLinks": {
"type": "boolean"
},
"subSupportUrl": {
"type": "string"
},
"subTitle": {
"type": "string"
},
"subURI": {
"type": "string"
},
"subUpdates": {
"maximum": 525600,
"minimum": 0,
"type": "integer"
},
"tgBotAPIServer": {
"type": "string"
},
"tgBotBackup": {
"type": "boolean"
},
"tgBotChatId": {
"type": "string"
},
"tgBotEnable": {
"type": "boolean"
},
"tgBotProxy": {
"type": "string"
},
"tgBotToken": {
"type": "string"
},
"tgCpu": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"tgEnabledEvents": {
"type": "string"
},
"tgLang": {
"type": "string"
},
"tgMemory": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"tgRunTime": {
"type": "string"
},
"timeLocation": {
"type": "string"
},
"trafficDiff": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"trafficStatsSwitches": {
"description": "TrafficStatsSwitches (ITEM6 §4.3.1): the whole-network traffic\naccounting switches as one JSON string\n({inboundUplink,inboundDownlink,outboundUplink,outboundDownlink}),\ncarried verbatim so the settings page edits the same key the\nsing-box generator reads (settings.trafficStatsSwitches).",
"type": "string"
},
"trustedProxyCIDRs": {
"type": "string"
},
"warpUpdateInterval": {
"minimum": 0,
"type": "integer"
},
"webBasePath": {
"type": "string"
},
"webCertFile": {
"type": "string"
},
"webDomain": {
"type": "string"
},
"webKeyFile": {
"type": "string"
},
"webListen": {
"type": "string"
},
"webPort": {
"maximum": 65535,
"minimum": 1,
"type": "integer"
}
},
"required": [
"datepicker",
"expireDiff",
"hasApiToken",
"hasNordSecret",
"hasTgBotToken",
"hasWarpSecret",
"pageSize",
"remarkTemplate",
"restartXrayOnClientDisable",
"sessionMaxAge",
"subAnnounce",
"subCertFile",
"subDomain",
"subEnable",
"subEncrypt",
"subHideSettings",
"subKeyFile",
"subListen",
"subPath",
"subPort",
"subProfileUrl",
"subShowIdentityOnAllLinks",
"subSupportUrl",
"subTitle",
"subURI",
"subUpdates",
"tgBotAPIServer",
"tgBotBackup",
"tgBotChatId",
"tgBotEnable",
"tgBotProxy",
"tgBotToken",
"tgCpu",
"tgEnabledEvents",
"tgLang",
"tgMemory",
"tgRunTime",
"timeLocation",
"trafficDiff",
"trafficStatsSwitches",
"trustedProxyCIDRs",
"warpUpdateInterval",
"webBasePath",
"webCertFile",
"webDomain",
"webKeyFile",
"webListen",
"webPort"
],
"type": "object"
},
"ApiToken": {
"properties": {
"createdAt": {
"format": "int64",
"type": "integer"
},
"enabled": {
"type": "boolean"
},
"expiresAt": {
"format": "int64",
"type": "integer"
},
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"scope": {
"type": "string"
},
"token": {
"description": "SHA-256 hash; the plaintext is shown only once at creation",
"type": "string"
}
},
"required": [
"createdAt",
"enabled",
"expiresAt",
"id",
"name",
"scope",
"token"
],
"type": "object"
},
"ApiTokenView": {
"properties": {
"createdAt": {
"example": 1736000000,
"format": "int64",
"type": "integer"
},
"enabled": {
"example": true,
"type": "boolean"
},
"expiresAt": {
"example": 0,
"format": "int64",
"type": "integer"
},
"id": {
"example": 2,
"type": "integer"
},
"name": {
"example": "central-panel-a",
"type": "string"
},
"scope": {
"example": "admin",
"type": "string"
},
"token": {
"example": "new-token-string",
"type": "string"
}
},
"required": [
"createdAt",
"enabled",
"expiresAt",
"id",
"name",
"scope"
],
"type": "object"
},
"Client": {
"description": "Client represents a client configuration for Xray inbounds with traffic limits and settings.",
"properties": {
"adTag": {
"example": "0123456789abcdef0123456789abcdef",
"type": "string"
},
"allowedIPs": {
"items": {
"type": "string"
},
"type": "array"
},
"allowedIPsByInbound": {
"additionalProperties": {
"items": {
"type": "string"
},
"type": "array"
},
"description": "AllowedIPsByInbound optionally overrides AllowedIPs on a per-inbound\nbasis, keyed by inbound id. Lets one identity attached to both\nWireGuard and AmneziaWG carry two genuinely different addresses in a\nsingle Create/Update call instead of the shared AllowedIPs field\nbeing broadcast to every attached tunnel inbound. Absent/unset for a\ngiven inbound id falls back to the shared AllowedIPs exactly as\nbefore -- fully backward compatible for callers that never set this.",
"type": "object"
},
"auth": {
"description": "Auth password (Hysteria)",
"type": "string"
},
"comment": {
"description": "Client comment",
"type": "string"
},
"created_at": {
"description": "Creation timestamp",
"format": "int64",
"type": "integer"
},
"email": {
"description": "Client email identifier",
"type": "string"
},
"enable": {
"description": "Whether the client is enabled",
"type": "boolean"
},
"expiryTime": {
"description": "Expiration timestamp",
"format": "int64",
"type": "integer"
},
"flow": {
"description": "Flow control (XTLS)",
"type": "string"
},
"forwardedPorts": {
"description": "AmneziaWG per-client port-forwarding spec, e.g. \"80,443,8000-8100\"",
"type": "string"
},
"group": {
"description": "Logical grouping label",
"type": "string"
},
"id": {
"description": "Unique client identifier",
"type": "string"
},
"keepAlive": {
"type": "integer"
},
"limitIp": {
"description": "IP limit for this client",
"type": "integer"
},
"password": {
"description": "Client password",
"type": "string"
},
"preSharedKey": {
"type": "string"
},
"privateKey": {
"type": "string"
},
"publicKey": {
"type": "string"
},
"reset": {
"description": "Reset period in days",
"type": "integer"
},
"resetDay": {
"description": "Calendar renewal day 1-31, 0 = interval mode",
"type": "integer"
},
"resetMax": {
"description": "Max auto-renew count, 0 = unlimited",
"type": "integer"
},
"reverse": {
"allOf": [
{
"$ref": "#/components/schemas/ClientReverse"
}
],
"description": "VLESS simple reverse proxy settings",
"nullable": true
},
"secret": {
"example": "ee1234567890abcdef1234567890abcd7777772e636c6f7564666c6172652e636f6d",
"type": "string"
},
"security": {
"description": "Security method (e.g., \"auto\", \"aes-128-gcm\")",
"type": "string"
},
"subId": {
"description": "Subscription identifier",
"type": "string"
},
"tgId": {
"description": "Telegram user ID for notifications",
"format": "int64",
"type": "integer"
},
"totalGB": {
"description": "Total traffic limit in GB",
"format": "int64",
"type": "integer"
},
"trafficReset": {
"description": "Per-client traffic reset cycle, independent of the inbound's own (#5497).",
"enum": [
"never",
"hourly",
"daily",
"weekly",
"monthly"
],
"type": "string"
},
"trafficResetDay": {
"maximum": 31,
"minimum": 1,
"type": "integer"
},
"updated_at": {
"description": "Last update timestamp",
"format": "int64",
"type": "integer"
}
},
"required": [
"comment",
"email",
"enable",
"expiryTime",
"limitIp",
"reset",
"resetDay",
"resetMax",
"security",
"subId",
"tgId",
"totalGB"
],
"type": "object"
},
"ClientInbound": {
"properties": {
"clientId": {
"type": "integer"
},
"createdAt": {
"format": "int64",
"type": "integer"
},
"flowOverride": {
"type": "string"
},
"inboundId": {
"type": "integer"
}
},
"required": [
"clientId",
"createdAt",
"flowOverride",
"inboundId"
],
"type": "object"
},
"ClientRecord": {
"properties": {
"adTag": {
"type": "string"
},
"allowedIPs": {
"type": "string"
},
"auth": {
"type": "string"
},
"comment": {
"type": "string"
},
"createdAt": {
"format": "int64",
"type": "integer"
},
"email": {
"type": "string"
},
"enable": {
"type": "boolean"
},
"expiryTime": {
"format": "int64",
"type": "integer"
},
"flow": {
"type": "string"
},
"forwardedPorts": {
"type": "string"
},
"group": {
"type": "string"
},
"id": {
"type": "integer"
},
"keepAlive": {
"type": "integer"
},
"limitHwid": {
"type": "integer"
},
"limitIp": {
"type": "integer"
},
"password": {
"type": "string"
},
"preSharedKey": {
"type": "string"
},
"privateKey": {
"type": "string"
},
"publicKey": {
"type": "string"
},
"reset": {
"type": "integer"
},
"resetDay": {
"type": "integer"
},
"resetMax": {
"type": "integer"
},
"reverse": {},
"secret": {
"type": "string"
},
"security": {
"type": "string"
},
"subId": {
"type": "string"
},
"tgId": {
"format": "int64",
"type": "integer"
},
"totalGB": {
"format": "int64",
"type": "integer"
},
"trafficReset": {
"type": "string"
},
"trafficResetDay": {
"type": "integer"
},
"updatedAt": {
"format": "int64",
"type": "integer"
},
"uuid": {
"type": "string"
}
},
"required": [
"adTag",
"allowedIPs",
"auth",
"comment",
"createdAt",
"email",
"enable",
"expiryTime",
"flow",
"forwardedPorts",
"group",
"id",
"keepAlive",
"limitHwid",
"limitIp",
"password",
"preSharedKey",
"privateKey",
"publicKey",
"reset",
"resetDay",
"resetMax",
"reverse",
"secret",
"security",
"subId",
"tgId",
"totalGB",
"trafficReset",
"trafficResetDay",
"updatedAt",
"uuid"
],
"type": "object"
},
"ClientReverse": {
"properties": {
"tag": {
"type": "string"
}
},
"required": [
"tag"
],
"type": "object"
},
"ClientTraffic": {
"description": "ClientTraffic represents traffic statistics and limits for a specific client.\nIt tracks upload/download usage, expiry times, and online status for inbound clients.",
"properties": {
"down": {
"example": 2097152,
"format": "int64",
"type": "integer"
},
"email": {
"example": "user1",
"type": "string"
},
"enable": {
"example": true,
"type": "boolean"
},
"expiryTime": {
"example": 1735689600000,
"format": "int64",
"type": "integer"
},
"id": {
"example": 14825,
"type": "integer"
},
"inboundId": {
"example": 1,
"type": "integer"
},
"lastOnline": {
"example": 1735680000000,
"format": "int64",
"type": "integer"
},
"lastSubFetch": {
"example": 1735680000000,
"format": "int64",
"type": "integer"
},
"reset": {
"example": 0,
"type": "integer"
},
"resetCount": {
"description": "ResetCount is how many have fired, so a prepaid plan stops on its own.",
"example": 0,
"type": "integer"
},
"resetDay": {
"description": "ResetDay renews on that day of each calendar month instead of every\nReset days; 0 keeps the interval behaviour.",
"example": 0,
"type": "integer"
},
"resetMax": {
"description": "ResetMax caps how many times auto-renew may fire; 0 means no cap.",
"example": 0,
"type": "integer"
},
"subId": {
"example": "i7tvdpeffi0hvvf1",
"type": "string"
},
"total": {
"example": 10737418240,
"format": "int64",
"type": "integer"
},
"up": {
"example": 1048576,
"format": "int64",
"type": "integer"
},
"uuid": {
"example": "e18c9a96-71bf-48d4-933f-8b9a46d4290c",
"type": "string"
}
},
"required": [
"down",
"email",
"enable",
"expiryTime",
"id",
"inboundId",
"lastOnline",
"lastSubFetch",
"reset",
"resetCount",
"resetDay",
"resetMax",
"subId",
"total",
"up",
"uuid"
],
"type": "object"
},
"FallbackParentInfo": {
"description": "FallbackParentInfo carries everything the frontend needs to rewrite a\nchild inbound's client link: where to connect (the master's address\nand port) and which path matched on the master's fallbacks array.\nThe frontend already has the master inbound in its dbInbounds list,\nso we only ship identifiers + the match path here.",
"properties": {
"masterId": {
"type": "integer"
},
"path": {
"type": "string"
}
},
"required": [
"masterId"
],
"type": "object"
},
"GeoCategory": {
"description": "GeoCategory is one code inside a database, such as geosite's \"google\".",
"properties": {
"attributes": {
"example": [
"ads",
"cn"
],
"items": {
"type": "string"
},
"type": "array"
},
"code": {
"example": "google",
"type": "string"
},
"entries": {
"example": 1284,
"type": "integer"
}
},
"required": [
"attributes",
"code",
"entries"
],
"type": "object"
},
"GeoCategoryPage": {
"description": "GeoCategoryPage is one page of categories plus the unpaged total.",
"properties": {
"items": {
"items": {
"$ref": "#/components/schemas/GeoCategory"
},
"type": "array"
},
"total": {
"example": 1043,
"type": "integer"
}
},
"required": [
"items",
"total"
],
"type": "object"
},
"GeoEntry": {
"description": "GeoEntry is a single rule inside a category: a domain rule for geosite\ndatabases, a CIDR for geoip ones.",
"properties": {
"kind": {
"example": "domain",
"type": "string"
},
"value": {
"example": "google.com",
"type": "string"
}
},
"required": [
"kind",
"value"
],
"type": "object"
},
"GeoEntryPage": {
"description": "GeoEntryPage is one page of category entries plus the unpaged total.",
"properties": {
"items": {
"items": {
"$ref": "#/components/schemas/GeoEntry"
},
"type": "array"
},
"total": {
"example": 1284,
"type": "integer"
}
},
"required": [
"items",
"total"
],
"type": "object"
},
"GeoFile": {
"description": "GeoFile describes one .dat database found in the asset directory.",
"properties": {
"categories": {
"example": 1043,
"type": "integer"
},
"error": {
"type": "string"
},
"kind": {
"example": "site",
"type": "string"
},
"modifiedAt": {
"example": 1769558400000,
"format": "int64",
"type": "integer"
},
"name": {
"example": "geosite.dat",
"type": "string"
},
"size": {
"example": 1467392,
"format": "int64",
"type": "integer"
}
},
"required": [
"categories",
"kind",
"modifiedAt",
"name",
"size"
],
"type": "object"
},
"HistoryOfSeeders": {
"description": "HistoryOfSeeders tracks which database seeders have been executed to prevent re-running.",
"properties": {
"id": {
"type": "integer"
},
"seederName": {
"type": "string"
}
},
"required": [
"id",
"seederName"
],
"type": "object"
},
"Host": {
"properties": {
"address": {
"example": "cdn.example.com",
"type": "string"
},
"allowInsecure": {
"type": "boolean"
},
"alpn": {
"items": {
"type": "string"
},
"type": "array"
},
"createdAt": {
"format": "int64",
"type": "integer"
},
"echConfigList": {
"type": "string"
},
"excludeFromSubTypes": {
"items": {
"type": "string"
},
"type": "array"
},
"finalMask": {
"description": "FinalMask is a JSON object of xray finalmask masks (tcp/udp/quicParams),\nmerged into this host's JSON-subscription stream. Empty = no override.",
"type": "string"
},
"fingerprint": {
"type": "string"
},
"groupId": {
"type": "string"
},
"hostHeader": {
"type": "string"
},
"id": {
"example": 1,
"type": "integer"
},
"inboundId": {
"example": 1,
"type": "integer"
},
"isDisabled": {
"type": "boolean"
},
"isHidden": {
"type": "boolean"
},
"keepSniBlank": {
"type": "boolean"
},
"mihomoIpVersion": {
"enum": [
"dual",
"ipv4",
"ipv6",
"ipv4-prefer",
"ipv6-prefer"
],
"type": "string"
},
"mihomoX25519": {
"type": "boolean"
},
"muxParams": {},
"nodeGuids": {
"items": {
"type": "string"
},
"type": "array"
},
"overrideSniFromAddress": {
"type": "boolean"
},
"path": {
"type": "string"
},
"pinnedPeerCertSha256": {
"items": {
"type": "string"
},
"type": "array"
},
"port": {
"example": 8443,
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"remark": {
"example": "cdn-front",
"maxLength": 256,
"type": "string"
},
"security": {
"enum": [
"same",
"tls",
"none",
"reality"
],
"example": "same",
"type": "string"
},
"serverDescription": {
"maxLength": 64,
"type": "string"
},
"shuffleHost": {
"type": "boolean"
},
"sni": {
"type": "string"
},
"sockoptParams": {},
"sortOrder": {
"type": "integer"
},
"tags": {
"items": {
"type": "string"
},
"type": "array"
},
"updatedAt": {
"format": "int64",
"type": "integer"
},
"verifyPeerCertByName": {
"type": "string"
},
"vlessRoute": {
"description": "Single VLESS route value (0-65535) baked into the subscription UUID's 3rd\ngroup (bytes 6-7), which xray reads via net.PortFromBytes(id[6:8]). Empty = none.",
"example": "443",
"type": "string"
}
},
"required": [
"address",
"allowInsecure",
"alpn",
"createdAt",
"echConfigList",
"excludeFromSubTypes",
"finalMask",
"fingerprint",
"groupId",
"hostHeader",
"id",
"inboundId",
"isDisabled",
"isHidden",
"keepSniBlank",
"mihomoIpVersion",
"mihomoX25519",
"muxParams",
"overrideSniFromAddress",
"path",
"pinnedPeerCertSha256",
"port",
"remark",
"security",
"serverDescription",
"shuffleHost",
"sni",
"sockoptParams",
"sortOrder",
"tags",
"updatedAt",
"verifyPeerCertByName",
"vlessRoute"
],
"type": "object"
},
"HostGroup": {
"properties": {
"allowInsecure": {
"type": "boolean"
},
"alpn": {
"items": {
"type": "string"
},
"type": "array"
},
"echConfigList": {
"type": "string"
},
"excludeFromSubTypes": {
"items": {
"type": "string"
},
"type": "array"
},
"finalMask": {
"type": "string"
},
"fingerprint": {
"type": "string"
},
"groupId": {
"type": "string"
},
"hostHeader": {
"type": "string"
},
"hosts": {
"items": {
"type": "string"
},
"type": "array"
},
"inboundIds": {
"items": {
"type": "integer"
},
"type": "array"
},
"isDisabled": {
"type": "boolean"
},
"isHidden": {
"type": "boolean"
},
"keepSniBlank": {
"type": "boolean"
},
"mihomoIpVersion": {
"enum": [
"dual",
"ipv4",
"ipv6",
"ipv4-prefer",
"ipv6-prefer"
],
"type": "string"
},
"mihomoX25519": {
"type": "boolean"
},
"muxParams": {
"type": "string"
},
"nodeGuids": {
"items": {
"type": "string"
},
"type": "array"
},
"overrideSniFromAddress": {
"type": "boolean"
},
"path": {
"type": "string"
},
"pinnedPeerCertSha256": {
"items": {
"type": "string"
},
"type": "array"
},
"port": {
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"remark": {
"maxLength": 256,
"type": "string"
},
"security": {
"enum": [
"same",
"tls",
"none",
"reality"
],
"type": "string"
},
"serverDescription": {
"maxLength": 64,
"type": "string"
},
"shuffleHost": {
"type": "boolean"
},
"sni": {
"type": "string"
},
"sockoptParams": {
"type": "string"
},
"sortOrder": {
"type": "integer"
},
"tags": {
"items": {
"type": "string"
},
"type": "array"
},
"verifyPeerCertByName": {
"type": "string"
},
"vlessRoute": {
"type": "string"
}
},
"required": [
"allowInsecure",
"alpn",
"echConfigList",
"excludeFromSubTypes",
"finalMask",
"fingerprint",
"groupId",
"hostHeader",
"hosts",
"inboundIds",
"isDisabled",
"isHidden",
"keepSniBlank",
"mihomoIpVersion",
"mihomoX25519",
"muxParams",
"nodeGuids",
"overrideSniFromAddress",
"path",
"pinnedPeerCertSha256",
"port",
"remark",
"security",
"serverDescription",
"shuffleHost",
"sni",
"sockoptParams",
"sortOrder",
"tags",
"verifyPeerCertByName",
"vlessRoute"
],
"type": "object"
},
"Inbound": {
"description": "Inbound represents an Xray inbound configuration with traffic statistics and settings.",
"properties": {
"clientStats": {
"description": "Client traffic statistics",
"items": {
"$ref": "#/components/schemas/ClientTraffic"
},
"type": "array"
},
"disableFlow": {
"example": false,
"type": "boolean"
},
"down": {
"description": "Download traffic in bytes",
"format": "int64",
"type": "integer"
},
"enable": {
"description": "Whether the inbound is enabled",
"example": true,
"type": "boolean"
},
"expiryTime": {
"description": "Expiration timestamp",
"format": "int64",
"type": "integer"
},
"fallbackParent": {
"allOf": [
{
"$ref": "#/components/schemas/FallbackParentInfo"
}
],
"description": "FallbackParent is populated by the API layer when this inbound is\nattached as a fallback child of a VLESS/Trojan TCP-TLS master.\nThe frontend uses it to rewrite client-share links so they advertise\nthe master's externally reachable endpoint instead of the child's\nloopback listen. Not persisted.",
"nullable": true
},
"forwarding": {
"description": "Forwarding holds the per-inbound forwarding form as JSON\n(service.ForwardingSpec). Empty means direct egress. Panel-side\nmetadata only: when an agent pulls its config, the entry agent's\noutbounds/routing gain a compiled entry for this inbound — the raw\nstring itself never reaches xray.",
"type": "string"
},
"id": {
"description": "Unique identifier",
"example": 1,
"type": "integer"
},
"lastTrafficResetTime": {
"description": "Last traffic reset timestamp",
"format": "int64",
"type": "integer"
},
"listen": {
"description": "Xray configuration fields",
"type": "string"
},
"nodeId": {
"nullable": true,
"type": "integer"
},
"originNodeGuid": {
"description": "OriginNodeGuid is the panelGuid of the node that physically hosts this\ninbound, propagated up across hops (#4983). Empty for an inbound that\nlives on this panel's own xray; set to the originating node's GUID when\nthe inbound was synced from a node (kept as-is across further hops). Lets\nthe master attribute a deeply nested inbound to the real node instead of\nthe intermediate one it was fetched through.",
"type": "string"
},
"port": {
"example": 443,
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"protocol": {
"enum": [
"vmess",
"vless",
"trojan",
"shadowsocks",
"wireguard",
"hysteria",
"http",
"mixed",
"tunnel",
"tun",
"mtproto",
"amneziawg"
],
"example": "vless",
"type": "string"
},
"remark": {
"description": "Human-readable remark",
"example": "VLESS-443",
"type": "string"
},
"settings": {},
"shareAddr": {
"type": "string"
},
"shareAddrStrategy": {
"enum": [
"node",
"listen",
"custom"
],
"type": "string"
},
"sniffing": {},
"streamSettings": {},
"subSortIndex": {
"description": "1-based sort order of this inbound's links in subscription output only (lower first; ties by id)",
"example": 1,
"minimum": 1,
"type": "integer"
},
"tag": {
"example": "in-443-tcp",
"type": "string"
},
"total": {
"description": "Total traffic limit in bytes",
"format": "int64",
"type": "integer"
},
"trafficReset": {
"description": "Traffic reset schedule",
"enum": [
"never",
"hourly",
"daily",
"weekly",
"monthly"
],
"type": "string"
},
"trafficResetDay": {
"description": "Day of month for monthly traffic resets",
"example": 1,
"maximum": 31,
"minimum": 1,
"type": "integer"
},
"up": {
"description": "Upload traffic in bytes",
"format": "int64",
"type": "integer"
}
},
"required": [
"clientStats",
"disableFlow",
"down",
"enable",
"expiryTime",
"forwarding",
"id",
"lastTrafficResetTime",
"listen",
"port",
"protocol",
"remark",
"settings",
"shareAddr",
"shareAddrStrategy",
"sniffing",
"streamSettings",
"subSortIndex",
"tag",
"total",
"trafficReset",
"trafficResetDay",
"up"
],
"type": "object"
},
"InboundClientIps": {
"description": "InboundClientIps stores IP addresses associated with inbound clients for access control.",
"properties": {
"clientEmail": {
"type": "string"
},
"id": {
"type": "integer"
},
"ips": {}
},
"required": [
"clientEmail",
"id",
"ips"
],
"type": "object"
},
"InboundFallback": {
"properties": {
"alpn": {
"type": "string"
},
"childId": {
"type": "integer"
},
"dest": {
"type": "string"
},
"id": {
"type": "integer"
},
"masterId": {
"type": "integer"
},
"name": {
"type": "string"
},
"path": {
"type": "string"
},
"sortOrder": {
"type": "integer"
},
"xver": {
"type": "integer"
}
},
"required": [
"alpn",
"childId",
"dest",
"id",
"masterId",
"name",
"path",
"sortOrder",
"xver"
],
"type": "object"
},
"InboundOption": {
"properties": {
"awgServer": {
"allOf": [
{
"$ref": "#/components/schemas/ServerSettings"
}
],
"description": "AwgServer carries the full AmneziaWG server block (keys, subnet,\nobfuscation params) so the clients page can render a downloadable\nper-client .conf without a second round trip.",
"nullable": true
},
"enable": {
"example": true,
"type": "boolean"
},
"id": {
"example": 1,
"type": "integer"
},
"listen": {
"type": "string"
},
"mtprotoDomain": {
"type": "string"
},
"nodeAddress": {
"description": "Share-host resolution inputs, mirroring the subscription's\nresolveInboundAddress so the clients page renders a node-managed WireGuard\nEndpoint that points at the node, not the master panel. NodeAddress is the\nhosting node's externally reachable address (empty for this panel's own\ninbounds); Listen and ShareAddrStrategy/ShareAddr feed the same\nnode→listen→custom fallback the share/QR links already use.",
"type": "string"
},
"nodeId": {
"description": "Hosting node; nil for this panel's own inbounds. Lets the clients\npage map a node filter onto inbound IDs (#4997).",
"nullable": true,
"type": "integer"
},
"port": {
"example": 443,
"type": "integer"
},
"protocol": {
"example": "vless",
"type": "string"
},
"remark": {
"example": "VLESS-443",
"type": "string"
},
"shareAddr": {
"type": "string"
},
"shareAddrStrategy": {
"type": "string"
},
"ssMethod": {
"type": "string"
},
"tag": {
"example": "in-443-tcp",
"type": "string"
},
"tlsFlowCapable": {
"example": true,
"type": "boolean"
},
"wgDns": {
"type": "string"
},
"wgMtu": {
"type": "integer"
},
"wgPublicKey": {
"type": "string"
}
},
"required": [
"enable",
"id",
"port",
"protocol",
"remark",
"ssMethod",
"tag",
"tlsFlowCapable"
],
"type": "object"
},
"Msg": {
"properties": {
"msg": {
"type": "string"
},
"obj": {},
"success": {
"type": "boolean"
}
},
"required": [
"msg",
"obj",
"success"
],
"type": "object"
},
"Node": {
"description": "Node represents a remote 3x-ui panel registered with the central panel.\nThe central panel polls each node's existing /panel/api/server/status\nendpoint over HTTP using the per-node ApiToken to populate the runtime\nstatus fields below.",
"properties": {
"activeCount": {
"example": 23,
"type": "integer"
},
"address": {
"example": "node1.example.com",
"type": "string"
},
"allowPrivateAddress": {
"type": "boolean"
},
"basePath": {
"example": "/",
"type": "string"
},
"clientCount": {
"example": 27,
"type": "integer"
},
"configDirty": {
"type": "boolean"
},
"configDirtyAt": {
"format": "int64",
"type": "integer"
},
"cpuPct": {
"example": 23.5,
"type": "number"
},
"createdAt": {
"example": 1700000000,
"format": "int64",
"type": "integer"
},
"depletedCount": {
"example": 1,
"type": "integer"
},
"disabledCount": {
"example": 3,
"type": "integer"
},
"enable": {
"example": true,
"type": "boolean"
},
"guid": {
"description": "Guid is the remote panel's stable self-identifier (its panelGuid),\nlearned from each heartbeat. It is the globally stable node identity used\nto attribute online clients/inbounds to the physical node across a chain\nof nodes (#4983); panel-local autoincrement ids don't survive a hop.\nObserved-state only — never user-edited.",
"type": "string"
},
"id": {
"example": 1,
"type": "integer"
},
"inboundCount": {
"example": 5,
"type": "integer"
},
"inboundSyncMode": {
"enum": [
"all",
"selected"
],
"type": "string"
},
"inboundTags": {
"items": {
"type": "string"
},
"type": "array"
},
"lastError": {
"type": "string"
},
"lastHeartbeat": {
"description": "unix seconds, 0 = never",
"example": 1700000000,
"format": "int64",
"type": "integer"
},
"latencyMs": {
"example": 42,
"type": "integer"
},
"memPct": {
"example": 45.1,
"type": "number"
},
"name": {
"example": "de-fra-1",
"type": "string"
},
"netDown": {
"example": 2097152,
"format": "int64",
"type": "integer"
},
"netUp": {
"example": 1048576,
"format": "int64",
"type": "integer"
},
"onlineCount": {
"example": 3,
"type": "integer"
},
"outboundTag": {
"type": "string"
},
"panelVersion": {
"example": "v3.x.x",
"type": "string"
},
"parentGuid": {
"description": "ParentGuid + Transitive are set only when a node is surfaced as part of a\nnode tree (#4983): direct nodes carry the master panel's own GUID, a\ntransitive sub-node carries its parent node's GUID. Transitive nodes are\nread-only projections (Id == 0, not persisted) — never edited or deployed.",
"type": "string"
},
"pinnedCertSha256": {
"type": "string"
},
"port": {
"example": 2053,
"maximum": 65535,
"minimum": 1,
"type": "integer"
},
"remark": {
"type": "string"
},
"scheme": {
"enum": [
"http",
"https"
],
"example": "https",
"type": "string"
},
"status": {
"description": "Heartbeat-updated fields. UpdatedAt advances on every probe even when\nthe row is otherwise unchanged so the UI's \"last seen\" tooltip is\ntruthful without us having to read LastHeartbeat separately.\nonline|offline|unknown",
"example": "online",
"type": "string"
},
"tlsVerifyMode": {
"enum": [
"verify",
"skip",
"pin",
"mtls"
],
"type": "string"
},
"transitive": {
"type": "boolean"
},
"updatedAt": {
"example": 1700000000,
"format": "int64",
"type": "integer"
},
"uptimeSecs": {
"example": 86400,
"format": "int64",
"type": "integer"
},
"xrayError": {
"type": "string"
},
"xrayState": {
"description": "XrayState and XrayError are captured from the remote node's /panel/api/server/status\nduring heartbeats. They let the central panel distinguish \"panel API reachable\"\n(status=online) from \"Xray core itself has failed on the node\" for monitoring.",
"type": "string"
},
"xrayVersion": {
"example": "25.10.31",
"type": "string"
}
},
"required": [
"activeCount",
"address",
"allowPrivateAddress",
"basePath",
"clientCount",
"configDirty",
"configDirtyAt",
"cpuPct",
"createdAt",
"depletedCount",
"disabledCount",
"enable",
"guid",
"id",
"inboundCount",
"inboundSyncMode",
"inboundTags",
"lastError",
"lastHeartbeat",
"latencyMs",
"memPct",
"name",
"netDown",
"netUp",
"onlineCount",
"outboundTag",
"panelVersion",
"pinnedCertSha256",
"port",
"remark",
"scheme",
"status",
"tlsVerifyMode",
"updatedAt",
"uptimeSecs",
"xrayError",
"xrayState",
"xrayVersion"
],
"type": "object"
},
"NodeMutationRequest": {
"description": "NodeMutationRequest is the node write/probe contract. ApiToken is accepted\nonly as input. On update, nil means keep the stored token; replacement and\nclearing are explicit and mutually exclusive.",
"properties": {
"address": {
"type": "string"
},
"allowPrivateAddress": {
"type": "boolean"
},
"apiToken": {
"nullable": true,
"type": "string"
},
"basePath": {
"type": "string"
},
"clearApiToken": {
"type": "boolean"
},
"enable": {
"type": "boolean"
},
"id": {
"type": "integer"
},
"inboundSyncMode": {
"enum": [
"all",
"selected"
],
"type": "string"
},
"inboundTags": {
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"type": "string"
},
"nodeType": {
"description": "NodeType distinguishes traditional panel-to-panel nodes from lightweight\nagent nodes. Agent nodes skip the panel reachability probe and the API\ntoken requirement; an agent token is issued on creation instead.",
"enum": [
"traditional",
"agent"
],
"type": "string"
},
"outboundTag": {
"type": "string"
},
"pinnedCertSha256": {
"type": "string"
},
"port": {
"maximum": 65535,
"minimum": 0,
"type": "integer"
},
"remark": {
"type": "string"
},
"scheme": {
"enum": [
"http",
"https"
],
"type": "string"
},
"tlsVerifyMode": {
"enum": [
"verify",
"skip",
"pin",
"mtls"
],
"type": "string"
}
},
"required": [
"address",
"allowPrivateAddress",
"basePath",
"enable",
"id",
"inboundSyncMode",
"inboundTags",
"name",
"outboundTag",
"pinnedCertSha256",
"port",
"remark",
"scheme",
"tlsVerifyMode"
],
"type": "object"
},
"NodeView": {
"description": "NodeView is the browser/API read contract for nodes. Credentials are\nwrite-only: responses expose only whether a node has a token configured.",
"properties": {
"activeCount": {
"example": 20,
"type": "integer"
},
"activeEmails": {
"example": [
"a@example.com"
],
"items": {
"type": "string"
},
"type": "array"
},
"address": {
"example": "node.example.com",
"type": "string"
},
"agentUpdateError": {
"type": "string"
},
"agentUpdateState": {
"description": "Agent one-click update bookkeeping (item 20), agent nodes only:\nthe last intent's state/target and, on failure, its error.",
"example": "failed",
"type": "string"
},
"agentUpdateTarget": {
"example": "A1.0.1",
"type": "string"
},
"allowPrivateAddress": {
"example": false,
"type": "boolean"
},
"basePath": {
"example": "/",
"type": "string"
},
"clientCount": {
"example": 25,
"type": "integer"
},
"configDirty": {
"example": false,
"type": "boolean"
},
"configDirtyAt": {
"example": 0,
"format": "int64",
"type": "integer"
},
"cpuPct": {
"example": 12.5,
"type": "number"
},
"createdAt": {
"example": 1700000000,
"format": "int64",
"type": "integer"
},
"depletedCount": {
"example": 1,
"type": "integer"
},
"depletedEmails": {
"example": [
"c@example.com"
],
"items": {
"type": "string"
},
"type": "array"
},
"disabledCount": {
"example": 2,
"type": "integer"
},
"disabledEmails": {
"example": [
"b@example.com"
],
"items": {
"type": "string"
},
"type": "array"
},
"enable": {
"example": true,
"type": "boolean"
},
"guid": {
"example": "node-guid",
"type": "string"
},
"hasApiToken": {
"example": true,
"type": "boolean"
},
"id": {
"example": 1,
"type": "integer"
},
"inboundCount": {
"example": 3,
"type": "integer"
},
"inboundSyncMode": {
"example": "all",
"type": "string"
},
"inboundTags": {
"example": [
"in-443-tcp"
],
"items": {
"type": "string"
},
"type": "array"
},
"ipv4": {
"description": "Ipv4/Ipv6 carry the resolved externally usable host addresses for\nagent nodes (P13 telemetry, public-address resolution on top).\nThe nodes page renders them as plain text on agent rows instead\nof the panel-URL link used for traditional nodes. Empty for\ntraditional nodes and for agents with no known address yet.",
"example": "203.0.113.7",
"type": "string"
},
"ipv6": {
"example": "2001:db8::7",
"type": "string"
},
"lastError": {
"type": "string"
},
"lastHeartbeat": {
"example": 1700000000,
"format": "int64",
"type": "integer"
},
"latencyMs": {
"example": 42,
"type": "integer"
},
"memPct": {
"example": 45.2,
"type": "number"
},
"name": {
"example": "edge-1",
"type": "string"
},
"netDown": {
"example": 1048576,
"format": "int64",
"type": "integer"
},
"netUp": {
"example": 2097152,
"format": "int64",
"type": "integer"
},
"nodeType": {
"description": "NodeType is \"agent\" for lightweight agent-managed nodes (an agent is\nbound to the node) and \"traditional\" otherwise. It is derived from the\nagent binding, not stored on the node row; read paths that serve the\npanel UI annotate it via annotateNodeTypes. Empty on views built\noutside those paths.",
"example": "traditional",
"type": "string"
},
"onlineCount": {
"example": 5,
"type": "integer"
},
"onlineEmails": {
"description": "Per-category client email lists behind the counts above, from the\nsame attribution bucketing, so the nodes page category chips can\npop over the actual usernames. Empty when the category is empty.",
"example": [
"a@example.com"
],
"items": {
"type": "string"
},
"type": "array"
},
"outboundTag": {
"example": "direct",
"type": "string"
},
"panelVersion": {
"example": "v3.x.x",
"type": "string"
},
"parentGuid": {
"type": "string"
},
"pinnedCertSha256": {
"type": "string"
},
"port": {
"example": 2053,
"type": "integer"
},
"remark": {
"example": "Primary edge",
"type": "string"
},
"scheme": {
"example": "https",
"type": "string"
},
"status": {
"example": "online",
"type": "string"
},
"tlsVerifyMode": {
"example": "verify",
"type": "string"
},
"transitive": {
"example": false,
"type": "boolean"
},
"updatedAt": {
"example": 1700003600,
"format": "int64",
"type": "integer"
},
"uptimeSecs": {
"example": 86400,
"format": "int64",
"type": "integer"
},
"xrayError": {
"type": "string"
},
"xrayState": {
"example": "running",
"type": "string"
},
"xrayVersion": {
"example": "25.10.31",
"type": "string"
}
},
"required": [
"activeCount",
"address",
"allowPrivateAddress",
"basePath",
"clientCount",
"configDirty",
"configDirtyAt",
"cpuPct",
"createdAt",
"depletedCount",
"disabledCount",
"enable",
"guid",
"hasApiToken",
"id",
"inboundCount",
"inboundSyncMode",
"inboundTags",
"lastError",
"lastHeartbeat",
"latencyMs",
"memPct",
"name",
"netDown",
"netUp",
"onlineCount",
"outboundTag",
"panelVersion",
"pinnedCertSha256",
"port",
"remark",
"scheme",
"status",
"tlsVerifyMode",
"updatedAt",
"uptimeSecs",
"xrayError",
"xrayState",
"xrayVersion"
],
"type": "object"
},
"OutboundTraffics": {
"description": "OutboundTraffics tracks traffic statistics for Xray outbound connections.",
"properties": {
"down": {
"format": "int64",
"type": "integer"
},
"id": {
"type": "integer"
},
"tag": {
"type": "string"
},
"total": {
"format": "int64",
"type": "integer"
},
"up": {
"format": "int64",
"type": "integer"
}
},
"required": [
"down",
"id",
"tag",
"total",
"up"
],
"type": "object"
},
"PanelUpdateStatus": {
"description": "PanelUpdateStatus reports the outcome of the most recently launched panel\nself-update. RunID lets the caller confirm this status belongs to the\nupdate it started rather than a stale result left over from an earlier\nrun; State is one of \"pending\", \"success\", or \"failed\". RunID is a decimal\nstring, not a JSON number: it's a formatted UnixNano timestamp, and\nJavaScript's number type can't represent that precisely (it exceeds\nNumber.MAX_SAFE_INTEGER), which would let two different runs round to the\nsame value on the wire and defeat the whole point of this field.",
"properties": {
"exitCode": {
"example": 0,
"type": "integer"
},
"finishedAt": {
"example": 1735689612,
"format": "int64",
"type": "integer"
},
"runId": {
"example": "1735689600123456789",
"type": "string"
},
"state": {
"example": "success",
"type": "string"
}
},
"required": [
"exitCode",
"finishedAt",
"runId",
"state"
],
"type": "object"
},
"ProbeResultUI": {
"properties": {
"cpuPct": {
"example": 12.5,
"type": "number"
},
"error": {
"type": "string"
},
"latencyMs": {
"example": 42,
"type": "integer"
},
"memPct": {
"example": 45.2,
"type": "number"
},
"panelVersion": {
"example": "v3.x.x",
"type": "string"
},
"status": {
"example": "online",
"type": "string"
},
"uptimeSecs": {
"example": 86400,
"format": "int64",
"type": "integer"
},
"xrayError": {
"type": "string"
},
"xrayState": {
"description": "XrayState/XrayError are populated on successful probes even when the node's\nXray core is not healthy. The UI uses them for a distinct \"panel ok, xray failed\" indicator.",
"type": "string"
},
"xrayVersion": {
"example": "25.10.31",
"type": "string"
}
},
"required": [
"cpuPct",
"error",
"latencyMs",
"memPct",
"panelVersion",
"status",
"uptimeSecs",
"xrayError",
"xrayState",
"xrayVersion"
],
"type": "object"
},
"RealityScanResult": {
"properties": {
"alpn": {
"example": "h2",
"type": "string"
},
"certChainValid": {
"description": "CertChainValid ignores the name: a trusted chain presented for other names\nstill has serverNames the panel can offer instead of the failing SNI.",
"example": true,
"type": "boolean"
},
"certIssuer": {
"example": "Google Trust Services",
"type": "string"
},
"certSubject": {
"example": "cloudflare.com",
"type": "string"
},
"certValid": {
"example": true,
"type": "boolean"
},
"curveID": {
"example": "X25519",
"type": "string"
},
"feasible": {
"example": true,
"type": "boolean"
},
"h2": {
"example": true,
"type": "boolean"
},
"host": {
"example": "www.cloudflare.com",
"type": "string"
},
"ip": {
"example": "104.16.124.96",
"type": "string"
},
"latencyMs": {
"example": 180,
"type": "integer"
},
"notAfter": {
"example": "2026-08-01T00:00:00Z",
"type": "string"
},
"port": {
"example": 443,
"type": "integer"
},
"privateTarget": {
"description": "PrivateTarget marks a target that resolves to a loopback/private/link-local\naddress: blocked before the probe unless the caller opted in, then flagged.",
"example": false,
"type": "boolean"
},
"reason": {
"type": "string"
},
"serverNames": {
"items": {
"type": "string"
},
"type": "array"
},
"target": {
"example": "www.cloudflare.com:443",
"type": "string"
},
"tls13": {
"example": true,
"type": "boolean"
},
"tlsVersion": {
"example": "1.3",
"type": "string"
},
"x25519": {
"example": true,
"type": "boolean"
}
},
"required": [
"alpn",
"certChainValid",
"certIssuer",
"certSubject",
"certValid",
"curveID",
"feasible",
"h2",
"host",
"ip",
"latencyMs",
"notAfter",
"port",
"privateTarget",
"reason",
"serverNames",
"target",
"tls13",
"tlsVersion",
"x25519"
],
"type": "object"
},
"ServerSettings": {
"description": "ServerSettings is the \"server\" block of an AmneziaWG inbound's Settings\nJSON: the interface-level configuration shared by every client/peer. The\nlisten port is deliberately not duplicated here — it lives on the inbound\nrow itself (Inbound.Port), like every other protocol.",
"properties": {
"contentPaddingAddition": {
"type": "string"
},
"disableCookies": {
"type": "boolean"
},
"externalInterface": {
"description": "ExternalInterface, IPv6Enabled, and IPv6ExternalInterface are live\nagain as of Phase 3.5 -- see the matching fields on Instance for what\nthey gate (internal/amneziawgnet's IPv6-address-alias mechanism).\nIPv6Subnet was never actually vestigial either: InstanceFromInbound\nalready consumes it (via serverAddressV6) to build the server's own\ntunnel address, same as always. Only RouteThroughXray, below, remains\ngenuinely vestigial as of the hard cutover to the embedded path\n(internal/amneziawgnet) -- read from existing stored settings for\nbackward compatibility, but not acted on by anything.",
"type": "string"
},
"h1": {
"type": "string"
},
"h2": {
"type": "string"
},
"h3": {
"type": "string"
},
"h4": {
"type": "string"
},
"headerProtectionKey": {
"description": "HeaderProtectionKey and ContentPaddingAddition are AmneziaWG 3.0\nfields, flat and top-level for the same tools/openapigen reason as\nthe block above; Obfuscation() below folds them back into\nObfuscation31's own identically named fields.\nHeaderProtectionKey is a base64 32-byte key; empty (the default)\ndisables AWG 3.0 header protection. A non-empty value requires\nevery one of S1-S4 above to be \u003e= 12 -- ValidateObfuscation\nenforces this at save time, not just at IpcSet time.\nContentPaddingAddition is a \"low-high\" range or bare integer, the\nsame grammar and uint32 cap as H1-H4.",
"type": "string"
},
"i1": {
"type": "string"
},
"i2": {
"type": "string"
},
"i3": {
"type": "string"
},
"i4": {
"type": "string"
},
"i5": {
"type": "string"
},
"ipv6Enabled": {
"type": "boolean"
},
"ipv6ExternalInterface": {
"type": "string"
},
"ipv6Subnet": {
"type": "string"
},
"jc": {
"description": "Obfuscation31's fields, repeated flat (not embedded) rather than\nnested under their own key: encoding/json would happily inline an\nembedded Obfuscation31 the same way, but the frontend's Go-\u003eZod/TS\ngenerator (tools/openapigen) does not — it emits a genuinely nested\n`obfuscation31` object, which would silently diverge from the real\nwire JSON. See Obfuscation() below for the manager-facing conversion.",
"type": "integer"
},
"jmax": {
"type": "integer"
},
"jmin": {
"type": "integer"
},
"keepaliveTimeout": {
"type": "string"
},
"maxHandshakeAttempts": {
"type": "string"
},
"mtu": {
"type": "integer"
},
"primaryDns": {
"description": "PrimaryDNS/SecondaryDNS seed client configs' DNS line. Blank is\nmeaningful, so no omitempty: a dropped key resurrects frontend defaults.",
"type": "string"
},
"privateKey": {
"type": "string"
},
"publicKey": {
"type": "string"
},
"randomTrailers": {
"description": "RandomTrailers/DisableCookies mirror Instance's identically named\nAmneziaWG 3.1 fields -- see that type's own doc comment for the real\nprotocol/interop details. Both real bool fields (not omitempty):\nbuildUAPIConfig always emits both lines explicitly so the\nreconfigure-in-place diff correctly notices a true-\u003efalse edit, not\njust false-\u003etrue.",
"type": "boolean"
},
"rejectAfterTime": {
"type": "string"
},
"rekeyAfterTime": {
"description": "RekeyAfterTime/RekeyTimeout/RejectAfterTime/KeepaliveTimeout/\nMaxHandshakeAttempts mirror Instance's identically named fields --\nsee that type's own doc comment for the grammar/width/real-default\ndetails. Flat and top-level for the same tools/openapigen reason as\nthe rest of this struct.",
"type": "string"
},
"rekeyTimeout": {
"type": "string"
},
"routeThroughXray": {
"type": "boolean"
},
"s1": {
"type": "integer"
},
"s2": {
"type": "integer"
},
"s3": {
"type": "integer"
},
"s4": {
"type": "integer"
},
"secondaryDns": {
"type": "string"
},
"subnetCidr": {
"type": "integer"
},
"subnetIp": {
"type": "string"
}
},
"required": [
"disableCookies",
"h1",
"h2",
"h3",
"h4",
"jc",
"jmax",
"jmin",
"primaryDns",
"privateKey",
"publicKey",
"randomTrailers",
"s1",
"s2",
"s3",
"s4",
"secondaryDns",
"subnetCidr",
"subnetIp"
],
"type": "object"
},
"Setting": {
"description": "Setting stores key-value configuration settings for the 3x-ui panel.",
"properties": {
"id": {
"type": "integer"
},
"key": {
"type": "string"
},
"value": {
"type": "string"
}
},
"required": [
"id",
"key",
"value"
],
"type": "object"
},
"User": {
"description": "User represents a user account in the 3x-ui panel.",
"properties": {
"id": {
"type": "integer"
},
"password": {
"type": "string"
},
"username": {
"type": "string"
}
},
"required": [
"id",
"password",
"username"
],
"type": "object"
}
};