PPanel Edge

network

由 openapi.json 自动生成的 40 个端点及其请求、响应和权限元数据。

此参考由已发布 API 契约生成。字段、请求头和权限要求如下。

下载完整 OpenAPI 文档 · SHA-256: ccaa20cec11fad96e369b88073ce3608a5b071ce55d6dc03fa31df7b0f08c525

标识符和数据结构与公开契约一致,说明直接给出调用规则。共享模型见 数据模型.

DELETE /api/v1/admin/network/inbounds/{id}

DELETE /api/v1/admin/network/inbounds/{id}

Delete an inbound that has no nodes (If-Match)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "responses": {
    "204": {
      "description": "Deleted"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such inbound"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.inbound_in_use (details.node_count) or common.version_conflict"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Delete an inbound that has no nodes (If-Match)",
  "tags": [
    "network"
  ],
  "x-audit": "network.inbound.delete",
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "ifMatch": true
  },
  "x-idempotency": "optional",
  "x-permission": "network.inbound.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/inbounds/{id}

GET /api/v1/admin/network/inbounds/{id}

One inbound (secrets as { "set": true }), with ETag

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkInbound"
          }
        }
      },
      "description": "The inbound",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such inbound"
    }
  },
  "summary": "One inbound (secrets as { \"set\": true }), with ETag",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "etag": true
  },
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

PUT /api/v1/admin/network/inbounds/{id}

PUT /api/v1/admin/network/inbounds/{id}

Replace an inbound (If-Match)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkInboundInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkInbound"
          }
        }
      },
      "description": "The inbound, with ETag"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server or inbound"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.port_conflict, network.server_retired or common.version_conflict"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.protocol_params_invalid or common.validation_failed"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Replace an inbound (If-Match)",
  "tags": [
    "network"
  ],
  "x-audit": "network.inbound.update",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-idempotency": "optional",
  "x-permission": "network.inbound.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/inbounds/{id}/secret

GET /api/v1/admin/network/inbounds/{id}/secret

Plaintext secrets of an inbound (re-authentication within 10 minutes; audited)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkInboundSecrets"
          }
        }
      },
      "description": "Secrets by parameter path"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such inbound"
    }
  },
  "summary": "Plaintext secrets of an inbound (re-authentication within 10 minutes; audited)",
  "tags": [
    "network"
  ],
  "x-audit": "network.inbound.read_secret",
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.inbound.read_secret",
  "x-reauth": true,
  "effectiveSecurity": []
}

POST /api/v1/admin/network/inbounds/{id}/status

POST /api/v1/admin/network/inbounds/{id}/status

Enable or disable an inbound (If-Match)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkInboundStatusInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkInbound"
          }
        }
      },
      "description": "The inbound, with ETag",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server or inbound"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.port_conflict, network.server_retired or common.version_conflict"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.protocol_params_invalid or common.validation_failed"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Enable or disable an inbound (If-Match)",
  "tags": [
    "network"
  ],
  "x-audit": "network.inbound.status",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-concurrency": {
    "etag": true,
    "ifMatch": true
  },
  "x-idempotency": "optional",
  "x-permission": "network.inbound.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/multipliers

GET /api/v1/admin/network/multipliers

Versioned time-of-day traffic rules

{
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "properties": {
              "rules": {
                "additionalProperties": false,
                "properties": {
                  "global": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "days": {
                          "items": {
                            "maximum": 6,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "maxItems": 7,
                          "minItems": 1,
                          "type": "array"
                        },
                        "end": {
                          "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                          "type": "string"
                        },
                        "id": {
                          "pattern": "^[a-zA-Z0-9_-]{1,64}$",
                          "type": "string"
                        },
                        "multiplier_bps": {
                          "maximum": 1000000,
                          "minimum": 1,
                          "type": "integer"
                        },
                        "priority": {
                          "maximum": 1000,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "start": {
                          "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "days",
                        "start",
                        "end",
                        "multiplier_bps",
                        "priority"
                      ],
                      "type": "object"
                    },
                    "maxItems": 100,
                    "type": "array"
                  },
                  "inbounds": {
                    "additionalProperties": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "days": {
                            "items": {
                              "maximum": 6,
                              "minimum": 0,
                              "type": "integer"
                            },
                            "maxItems": 7,
                            "minItems": 1,
                            "type": "array"
                          },
                          "end": {
                            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                            "type": "string"
                          },
                          "id": {
                            "pattern": "^[a-zA-Z0-9_-]{1,64}$",
                            "type": "string"
                          },
                          "multiplier_bps": {
                            "maximum": 1000000,
                            "minimum": 1,
                            "type": "integer"
                          },
                          "priority": {
                            "maximum": 1000,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "start": {
                            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                            "type": "string"
                          }
                        },
                        "required": [
                          "id",
                          "days",
                          "start",
                          "end",
                          "multiplier_bps",
                          "priority"
                        ],
                        "type": "object"
                      },
                      "maxItems": 100,
                      "type": "array"
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "global",
                  "inbounds"
                ],
                "type": "object"
              },
              "version": {
                "type": "integer"
              }
            },
            "required": [
              "rules",
              "version"
            ],
            "type": "object"
          }
        }
      },
      "description": "Rules; weekdays start on Sunday",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    }
  },
  "summary": "Versioned time-of-day traffic rules",
  "tags": [
    "network"
  ],
  "x-audit": "network.multiplier.read",
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "etag": true
  },
  "x-idempotency": "none",
  "x-permission": "network.server.read",
  "x-rate-limit": "network.multiplier.read",
  "x-reauth": false,
  "effectiveSecurity": []
}

PUT /api/v1/admin/network/multipliers

PUT /api/v1/admin/network/multipliers

Replace time-of-day traffic rules

{
  "parameters": [
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "additionalProperties": false,
          "properties": {
            "rules": {
              "additionalProperties": false,
              "properties": {
                "global": {
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "days": {
                        "items": {
                          "maximum": 6,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "maxItems": 7,
                        "minItems": 1,
                        "type": "array"
                      },
                      "end": {
                        "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                        "type": "string"
                      },
                      "id": {
                        "pattern": "^[a-zA-Z0-9_-]{1,64}$",
                        "type": "string"
                      },
                      "multiplier_bps": {
                        "maximum": 1000000,
                        "minimum": 1,
                        "type": "integer"
                      },
                      "priority": {
                        "maximum": 1000,
                        "minimum": 0,
                        "type": "integer"
                      },
                      "start": {
                        "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                        "type": "string"
                      }
                    },
                    "required": [
                      "id",
                      "days",
                      "start",
                      "end",
                      "multiplier_bps",
                      "priority"
                    ],
                    "type": "object"
                  },
                  "maxItems": 100,
                  "type": "array"
                },
                "inbounds": {
                  "additionalProperties": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "days": {
                          "items": {
                            "maximum": 6,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "maxItems": 7,
                          "minItems": 1,
                          "type": "array"
                        },
                        "end": {
                          "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                          "type": "string"
                        },
                        "id": {
                          "pattern": "^[a-zA-Z0-9_-]{1,64}$",
                          "type": "string"
                        },
                        "multiplier_bps": {
                          "maximum": 1000000,
                          "minimum": 1,
                          "type": "integer"
                        },
                        "priority": {
                          "maximum": 1000,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "start": {
                          "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "days",
                        "start",
                        "end",
                        "multiplier_bps",
                        "priority"
                      ],
                      "type": "object"
                    },
                    "maxItems": 100,
                    "type": "array"
                  },
                  "type": "object"
                }
              },
              "required": [
                "global",
                "inbounds"
              ],
              "type": "object"
            }
          },
          "required": [
            "rules"
          ],
          "type": "object"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "properties": {
              "rules": {
                "additionalProperties": false,
                "properties": {
                  "global": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "days": {
                          "items": {
                            "maximum": 6,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "maxItems": 7,
                          "minItems": 1,
                          "type": "array"
                        },
                        "end": {
                          "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                          "type": "string"
                        },
                        "id": {
                          "pattern": "^[a-zA-Z0-9_-]{1,64}$",
                          "type": "string"
                        },
                        "multiplier_bps": {
                          "maximum": 1000000,
                          "minimum": 1,
                          "type": "integer"
                        },
                        "priority": {
                          "maximum": 1000,
                          "minimum": 0,
                          "type": "integer"
                        },
                        "start": {
                          "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "days",
                        "start",
                        "end",
                        "multiplier_bps",
                        "priority"
                      ],
                      "type": "object"
                    },
                    "maxItems": 100,
                    "type": "array"
                  },
                  "inbounds": {
                    "additionalProperties": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "days": {
                            "items": {
                              "maximum": 6,
                              "minimum": 0,
                              "type": "integer"
                            },
                            "maxItems": 7,
                            "minItems": 1,
                            "type": "array"
                          },
                          "end": {
                            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                            "type": "string"
                          },
                          "id": {
                            "pattern": "^[a-zA-Z0-9_-]{1,64}$",
                            "type": "string"
                          },
                          "multiplier_bps": {
                            "maximum": 1000000,
                            "minimum": 1,
                            "type": "integer"
                          },
                          "priority": {
                            "maximum": 1000,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "start": {
                            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                            "type": "string"
                          }
                        },
                        "required": [
                          "id",
                          "days",
                          "start",
                          "end",
                          "multiplier_bps",
                          "priority"
                        ],
                        "type": "object"
                      },
                      "maxItems": 100,
                      "type": "array"
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "global",
                  "inbounds"
                ],
                "type": "object"
              },
              "version": {
                "type": "integer"
              }
            },
            "required": [
              "rules",
              "version"
            ],
            "type": "object"
          }
        }
      },
      "description": "Saved rules",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Inbound not found"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "common.version_conflict (with current)"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Invalid rules"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Replace time-of-day traffic rules",
  "tags": [
    "network"
  ],
  "x-audit": "network.multiplier.update",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-concurrency": {
    "etag": true,
    "ifMatch": true
  },
  "x-idempotency": "optional",
  "x-permission": "network.runtime.manage",
  "x-rate-limit": "network.multiplier.write",
  "x-reauth": false,
  "effectiveSecurity": []
}

GET /api/v1/admin/network/multipliers/preview

GET /api/v1/admin/network/multipliers/preview

Effective multiplier now or at an explicit instant

{
  "parameters": [
    {
      "in": "query",
      "name": "inbound_id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "in": "query",
      "name": "at",
      "required": false,
      "schema": {
        "format": "date-time",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "properties": {
              "at": {
                "format": "date-time",
                "type": "string"
              },
              "base_multiplier": {
                "type": "string"
              },
              "effective_multiplier": {
                "type": "string"
              },
              "inbound_id": {
                "format": "uuid",
                "type": "string"
              },
              "multiplier_bps": {
                "type": "integer"
              },
              "rule_id": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "rule_version": {
                "type": "integer"
              },
              "scope": {
                "enum": [
                  "inbound",
                  "global",
                  "default"
                ],
                "type": "string"
              },
              "timezone": {
                "type": "string"
              },
              "windows": {
                "items": {
                  "properties": {
                    "days": {
                      "items": {
                        "type": "integer"
                      },
                      "type": "array"
                    },
                    "effective_multiplier": {
                      "type": "string"
                    },
                    "end": {
                      "type": "string"
                    },
                    "id": {
                      "type": "string"
                    },
                    "multiplier_bps": {
                      "type": "integer"
                    },
                    "priority": {
                      "type": "integer"
                    },
                    "scope": {
                      "enum": [
                        "inbound",
                        "global"
                      ],
                      "type": "string"
                    },
                    "start": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "days",
                    "start",
                    "end",
                    "multiplier_bps",
                    "priority",
                    "scope",
                    "effective_multiplier"
                  ],
                  "type": "object"
                },
                "type": "array"
              }
            },
            "required": [
              "inbound_id",
              "at",
              "timezone",
              "rule_version",
              "base_multiplier",
              "multiplier_bps",
              "rule_id",
              "scope",
              "effective_multiplier",
              "windows"
            ],
            "type": "object"
          }
        }
      },
      "description": "Effective multiplier and windows"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Inbound not found"
    }
  },
  "summary": "Effective multiplier now or at an explicit instant",
  "tags": [
    "network"
  ],
  "x-audit": "network.multiplier.read",
  "x-body": "none",
  "x-body-limit": 0,
  "x-idempotency": "none",
  "x-permission": "network.server.read",
  "x-rate-limit": "network.multiplier.read",
  "x-reauth": false,
  "effectiveSecurity": []
}

GET /api/v1/admin/network/nodes

GET /api/v1/admin/network/nodes

List nodes (sort, id order)

{
  "parameters": [
    {
      "description": "Name or connect host contains",
      "in": "query",
      "name": "q",
      "required": false,
      "schema": {
        "description": "Name or connect host contains",
        "maxLength": 64,
        "minLength": 1,
        "type": "string"
      }
    },
    {
      "in": "query",
      "name": "server_id",
      "required": false,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "in": "query",
      "name": "inbound_id",
      "required": false,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Manual tag the node carries",
      "in": "query",
      "name": "tag",
      "required": false,
      "schema": {
        "description": "Manual tag the node carries",
        "maxLength": 64,
        "minLength": 1,
        "type": "string"
      }
    },
    {
      "description": "Visibility; repeat the parameter for several values",
      "in": "query",
      "name": "visibility",
      "required": false,
      "schema": {
        "anyOf": [
          {
            "enum": [
              "visible",
              "hidden",
              "disabled"
            ],
            "type": "string"
          },
          {
            "items": {
              "enum": [
                "visible",
                "hidden",
                "disabled"
              ],
              "type": "string"
            },
            "type": "array"
          }
        ],
        "description": "Visibility; repeat the parameter for several values"
      }
    },
    {
      "description": "Kind; repeat the parameter for several values",
      "in": "query",
      "name": "kind",
      "required": false,
      "schema": {
        "anyOf": [
          {
            "enum": [
              "direct",
              "relay",
              "cdn"
            ],
            "type": "string"
          },
          {
            "items": {
              "enum": [
                "direct",
                "relay",
                "cdn"
              ],
              "type": "string"
            },
            "type": "array"
          }
        ],
        "description": "Kind; repeat the parameter for several values"
      }
    },
    {
      "description": "Address family; repeat the parameter for several values",
      "in": "query",
      "name": "address_family",
      "required": false,
      "schema": {
        "anyOf": [
          {
            "enum": [
              "ipv4",
              "ipv6",
              "dual"
            ],
            "type": "string"
          },
          {
            "items": {
              "enum": [
                "ipv4",
                "ipv6",
                "dual"
              ],
              "type": "string"
            },
            "type": "array"
          }
        ],
        "description": "Address family; repeat the parameter for several values"
      }
    },
    {
      "in": "query",
      "name": "region_code",
      "required": false,
      "schema": {
        "pattern": "^[a-z][a-z0-9-]{0,31}$",
        "type": "string"
      }
    },
    {
      "description": "Default 20, at most 100",
      "in": "query",
      "name": "page_size",
      "required": false,
      "schema": {
        "description": "Default 20, at most 100",
        "maximum": 100,
        "minimum": 1,
        "type": "integer"
      }
    },
    {
      "description": "`next_cursor` of the previous page",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
        "description": "`next_cursor` of the previous page",
        "maxLength": 512,
        "minLength": 1,
        "type": "string"
      }
    },
    {
      "description": "Return `total` (first page only)",
      "in": "query",
      "name": "include_total",
      "required": false,
      "schema": {
        "description": "Return `total` (first page only)",
        "enum": [
          "true",
          "false"
        ],
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkNodePage"
          }
        }
      },
      "description": "A page of nodes"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Invalid filter or cursor"
    }
  },
  "summary": "List nodes (sort, id order)",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/nodes

POST /api/v1/admin/network/nodes

Create a node

{
  "parameters": [
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkNodeInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkNode"
          }
        }
      },
      "description": "The node, with ETag"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such node or inbound"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.server_retired or common.version_conflict"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.tag_invalid or common.validation_failed"
    }
  },
  "summary": "Create a node",
  "tags": [
    "network"
  ],
  "x-audit": "network.node.create",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-idempotency": "required",
  "x-permission": "network.node.manage",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/nodes/reorder

POST /api/v1/admin/network/nodes/reorder

Set the order of nodes

{
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkNodeReorderInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkNodeReorderResult"
          }
        }
      },
      "description": "Updated count"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Validation failed"
    }
  },
  "summary": "Set the order of nodes",
  "tags": [
    "network"
  ],
  "x-audit": "network.node.reorder",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-idempotency": "optional",
  "x-permission": "network.node.manage",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/nodes/tags

POST /api/v1/admin/network/nodes/tags

Add or remove manual tags on many nodes

{
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkNodeTagsInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkNodeTagsResult"
          }
        }
      },
      "description": "Nodes whose tags changed"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.tag_invalid or common.validation_failed"
    }
  },
  "summary": "Add or remove manual tags on many nodes",
  "tags": [
    "network"
  ],
  "x-audit": "network.node.tags",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-idempotency": "optional",
  "x-permission": "network.node.manage",
  "effectiveSecurity": []
}

DELETE /api/v1/admin/network/nodes/{id}

DELETE /api/v1/admin/network/nodes/{id}

Delete a node (If-Match)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "responses": {
    "204": {
      "description": "Deleted"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such node"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "common.version_conflict (with current)"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Delete a node (If-Match)",
  "tags": [
    "network"
  ],
  "x-audit": "network.node.delete",
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "ifMatch": true
  },
  "x-idempotency": "optional",
  "x-permission": "network.node.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/nodes/{id}

GET /api/v1/admin/network/nodes/{id}

One node, with ETag

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkNode"
          }
        }
      },
      "description": "The node",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such node"
    }
  },
  "summary": "One node, with ETag",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "etag": true
  },
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

PUT /api/v1/admin/network/nodes/{id}

PUT /api/v1/admin/network/nodes/{id}

Replace a node (If-Match)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkNodeInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkNode"
          }
        }
      },
      "description": "The node, with ETag"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such node or inbound"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.server_retired or common.version_conflict"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.tag_invalid or common.validation_failed"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Replace a node (If-Match)",
  "tags": [
    "network"
  ],
  "x-audit": "network.node.update",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-idempotency": "optional",
  "x-permission": "network.node.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/protocols

GET /api/v1/admin/network/protocols

Protocol catalogue for the inbound forms

{
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkProtocolList"
          }
        }
      },
      "description": "Protocols"
    }
  },
  "summary": "Protocol catalogue for the inbound forms",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/runtime

GET /api/v1/admin/network/runtime

Runtime defaults of every server, with ETag

{
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkRuntimeDefaults"
          }
        }
      },
      "description": "Runtime defaults",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    }
  },
  "summary": "Runtime defaults of every server, with ETag",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "etag": true
  },
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

PUT /api/v1/admin/network/runtime

PUT /api/v1/admin/network/runtime

Replace the runtime defaults (If-Match); servers re-render their desired config

{
  "parameters": [
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkRuntimeDefaultsInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkRuntimeDefaults"
          }
        }
      },
      "description": "Saved defaults, with ETag",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "common.version_conflict (with current)"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Validation failed"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Replace the runtime defaults (If-Match); servers re-render their desired config",
  "tags": [
    "network"
  ],
  "x-audit": "network.runtime.update",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-concurrency": {
    "etag": true,
    "ifMatch": true
  },
  "x-idempotency": "optional",
  "x-permission": "network.runtime.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/servers

GET /api/v1/admin/network/servers

List servers (sort, id order)

{
  "parameters": [
    {
      "description": "Name or address contains",
      "in": "query",
      "name": "q",
      "required": false,
      "schema": {
        "description": "Name or address contains",
        "maxLength": 64,
        "minLength": 1,
        "type": "string"
      }
    },
    {
      "description": "Status; repeat the parameter for several values",
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
        "anyOf": [
          {
            "enum": [
              "active",
              "maintenance",
              "retired"
            ],
            "type": "string"
          },
          {
            "items": {
              "enum": [
                "active",
                "maintenance",
                "retired"
              ],
              "type": "string"
            },
            "type": "array"
          }
        ],
        "description": "Status; repeat the parameter for several values"
      }
    },
    {
      "description": "Health; repeat the parameter for several values",
      "in": "query",
      "name": "health",
      "required": false,
      "schema": {
        "anyOf": [
          {
            "enum": [
              "unknown",
              "healthy",
              "degraded",
              "offline",
              "config_drift",
              "auth_failed",
              "protocol_conflict"
            ],
            "type": "string"
          },
          {
            "items": {
              "enum": [
                "unknown",
                "healthy",
                "degraded",
                "offline",
                "config_drift",
                "auth_failed",
                "protocol_conflict"
              ],
              "type": "string"
            },
            "type": "array"
          }
        ],
        "description": "Health; repeat the parameter for several values"
      }
    },
    {
      "in": "query",
      "name": "region_code",
      "required": false,
      "schema": {
        "pattern": "^[a-z][a-z0-9-]{0,31}$",
        "type": "string"
      }
    },
    {
      "in": "query",
      "name": "ip_geo_status",
      "required": false,
      "schema": {
        "enum": [
          "ok",
          "unresolved",
          "manual"
        ],
        "type": "string"
      }
    },
    {
      "description": "Default 20, at most 100",
      "in": "query",
      "name": "page_size",
      "required": false,
      "schema": {
        "description": "Default 20, at most 100",
        "maximum": 100,
        "minimum": 1,
        "type": "integer"
      }
    },
    {
      "description": "`next_cursor` of the previous page",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
        "description": "`next_cursor` of the previous page",
        "maxLength": 512,
        "minLength": 1,
        "type": "string"
      }
    },
    {
      "description": "Return `total` (first page only)",
      "in": "query",
      "name": "include_total",
      "required": false,
      "schema": {
        "description": "Return `total` (first page only)",
        "enum": [
          "true",
          "false"
        ],
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServerPage"
          }
        }
      },
      "description": "A page of servers"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Invalid filter or cursor"
    }
  },
  "summary": "List servers (sort, id order)",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/servers

POST /api/v1/admin/network/servers

Create a server (renders desired config revision 1)

{
  "parameters": [
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkServerInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServer"
          }
        }
      },
      "description": "The server, with ETag",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Validation failed"
    }
  },
  "summary": "Create a server (renders desired config revision 1)",
  "tags": [
    "network"
  ],
  "x-audit": "network.server.create",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-concurrency": {
    "etag": true
  },
  "x-idempotency": "required",
  "x-permission": "network.server.manage",
  "effectiveSecurity": []
}

DELETE /api/v1/admin/network/servers/{id}

DELETE /api/v1/admin/network/servers/{id}

Retire a server (If-Match): terminal; its nodes stop authorizing anyone

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServer"
          }
        }
      },
      "description": "The retired server",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "common.version_conflict or network.server_retired"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Retire a server (If-Match): terminal; its nodes stop authorizing anyone",
  "tags": [
    "network"
  ],
  "x-audit": "network.server.retire",
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "etag": true,
    "ifMatch": true
  },
  "x-idempotency": "optional",
  "x-permission": "network.server.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/servers/{id}

GET /api/v1/admin/network/servers/{id}

One server, with ETag

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServer"
          }
        }
      },
      "description": "The server",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    }
  },
  "summary": "One server, with ETag",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "etag": true
  },
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

PUT /api/v1/admin/network/servers/{id}

PUT /api/v1/admin/network/servers/{id}

Edit a server (If-Match): name, location, address, active ⇄ maintenance, order

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkServerInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServer"
          }
        }
      },
      "description": "The server, with ETag",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "common.version_conflict or network.server_retired"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Validation failed"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Edit a server (If-Match): name, location, address, active ⇄ maintenance, order",
  "tags": [
    "network"
  ],
  "x-audit": "network.server.update",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-concurrency": {
    "etag": true,
    "ifMatch": true
  },
  "x-idempotency": "optional",
  "x-permission": "network.server.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/servers/{id}/config

GET /api/v1/admin/network/servers/{id}/config

Runtime configuration and desired config preview (secrets masked)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServerConfig"
          }
        }
      },
      "description": "Configuration",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    }
  },
  "summary": "Runtime configuration and desired config preview (secrets masked)",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-concurrency": {
    "etag": true
  },
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/servers/{id}/create-ipv6-node

POST /api/v1/admin/network/servers/{id}/create-ipv6-node

Create IPv6 twins of the direct IPv4 nodes (needs a reported IPv6 address)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Only these IPv4 nodes; default every direct IPv4 node of the server",
      "in": "query",
      "name": "node_id",
      "required": false,
      "schema": {
        "anyOf": [
          {
            "format": "uuid",
            "type": "string"
          },
          {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 500,
            "type": "array"
          }
        ],
        "description": "Only these IPv4 nodes; default every direct IPv4 node of the server"
      }
    },
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkNodeList"
          }
        }
      },
      "description": "Created nodes"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.server_retired, network.agent_not_active or network.ipv6_unavailable"
    }
  },
  "summary": "Create IPv6 twins of the direct IPv4 nodes (needs a reported IPv6 address)",
  "tags": [
    "network"
  ],
  "x-audit": "network.node.create_ipv6",
  "x-body": "none",
  "x-body-limit": 0,
  "x-idempotency": "required",
  "x-permission": "network.node.manage",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/servers/{id}/disable-agent

POST /api/v1/admin/network/servers/{id}/disable-agent

Disable the agent (node gets 403 node.disabled until it enrolls again)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServer"
          }
        }
      },
      "description": "The server"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.server_retired, network.agent_not_active or network.ipv6_unavailable"
    }
  },
  "summary": "Disable the agent (node gets 403 node.disabled until it enrolls again)",
  "tags": [
    "network"
  ],
  "x-audit": "network.agent.disable",
  "x-body": "none",
  "x-body-limit": 0,
  "x-idempotency": "required",
  "x-permission": "network.agent.manage",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/servers/{id}/enrollment-token

POST /api/v1/admin/network/servers/{id}/enrollment-token

Issue a one-time enrollment token (1 hour)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkAgentToken"
          }
        }
      },
      "description": "The token (shown once)"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.server_retired, network.agent_not_active or network.ipv6_unavailable"
    }
  },
  "summary": "Issue a one-time enrollment token (1 hour)",
  "tags": [
    "network"
  ],
  "x-audit": "network.agent.enrollment_token",
  "x-body": "none",
  "x-body-limit": 0,
  "x-idempotency": "required",
  "x-permission": "network.agent.manage",
  "effectiveSecurity": []
}

PUT /api/v1/admin/network/servers/{id}/geo

PUT /api/v1/admin/network/servers/{id}/geo

Set a manual server location, protected from automatic GeoIP refresh

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    },
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "additionalProperties": false,
          "properties": {
            "country_code": {
              "pattern": "^[A-Z]{2}$",
              "type": [
                "string",
                "null"
              ]
            },
            "region_code": {
              "pattern": "^[a-z][a-z0-9-]{0,31}$",
              "type": [
                "string",
                "null"
              ]
            }
          },
          "required": [
            "country_code",
            "region_code"
          ],
          "type": "object"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServer"
          }
        }
      },
      "description": "Server location",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "common.version_conflict (with current)"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Invalid location"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Set a manual server location, protected from automatic GeoIP refresh",
  "tags": [
    "network"
  ],
  "x-audit": "network.server.geo",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-concurrency": {
    "etag": true,
    "ifMatch": true
  },
  "x-idempotency": "required",
  "x-permission": "network.server.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/servers/{id}/health

GET /api/v1/admin/network/servers/{id}/health

Server health: stored state and the live verdict with reasons

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServerHealth"
          }
        }
      },
      "description": "Health"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    }
  },
  "summary": "Server health: stored state and the live verdict with reasons",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/servers/{id}/inbounds

GET /api/v1/admin/network/servers/{id}/inbounds

A server's inbounds

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkInboundList"
          }
        }
      },
      "description": "Inbounds"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    }
  },
  "summary": "A server's inbounds",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/servers/{id}/inbounds

POST /api/v1/admin/network/servers/{id}/inbounds

Create an inbound; the desired config is re-rendered in the same transaction

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkInboundInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "201": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkInbound"
          }
        }
      },
      "description": "The inbound, with ETag"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server or inbound"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.port_conflict, network.server_retired or common.version_conflict"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.protocol_params_invalid or common.validation_failed"
    }
  },
  "summary": "Create an inbound; the desired config is re-rendered in the same transaction",
  "tags": [
    "network"
  ],
  "x-audit": "network.inbound.create",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-idempotency": "required",
  "x-permission": "network.inbound.manage",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/servers/{id}/republish

POST /api/v1/admin/network/servers/{id}/republish

Re-render the desired config now

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkRepublish"
          }
        }
      },
      "description": "Render result"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.server_retired, network.agent_not_active or network.ipv6_unavailable"
    }
  },
  "summary": "Re-render the desired config now",
  "tags": [
    "network"
  ],
  "x-audit": "network.agent.republish",
  "x-body": "none",
  "x-body-limit": 0,
  "x-idempotency": "required",
  "x-permission": "network.agent.manage",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/servers/{id}/rotate-agent-token

POST /api/v1/admin/network/servers/{id}/rotate-agent-token

Rotate the agent token (10-minute overlap unless immediate revocation is selected)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Revoke immediately (token leaked); default false keeps the 10-minute overlap",
      "in": "query",
      "name": "immediate",
      "required": false,
      "schema": {
        "default": "false",
        "description": "Revoke immediately (token leaked); default false keeps the 10-minute overlap",
        "enum": [
          "true",
          "false"
        ],
        "type": "string"
      }
    },
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkAgentToken"
          }
        }
      },
      "description": "The new token (shown once); expires_at is the previous token cut-off time"
    },
    "403": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "auth.forbidden or auth.reauth_required"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.server_retired, network.agent_not_active or network.ipv6_unavailable"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Invalid immediate option"
    }
  },
  "summary": "Rotate the agent token (10-minute overlap unless immediate revocation is selected)",
  "tags": [
    "network"
  ],
  "x-audit": "network.agent.rotate_token",
  "x-body": "none",
  "x-body-limit": 0,
  "x-idempotency": "required",
  "x-permission": "network.agent.manage",
  "x-reauth": true,
  "effectiveSecurity": []
}

PUT /api/v1/admin/network/servers/{id}/runtime

PUT /api/v1/admin/network/servers/{id}/runtime

Replace the runtime override patch (If-Match = server ETag); re-renders the desired config

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Resource ETag; missing 428, malformed 412, stale 409.",
      "in": "header",
      "name": "If-Match",
      "required": true,
      "schema": {
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkRuntimeOverridesInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServerConfig"
          }
        }
      },
      "description": "Configuration, with the server ETag",
      "headers": {
        "ETag": {
          "description": "Current resource version for If-Match.",
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "409": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "common.version_conflict or network.server_retired"
    },
    "412": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Malformed If-Match"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Validation failed (e.g. a rule names an unknown outbound)"
    },
    "428": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "If-Match missing"
    }
  },
  "summary": "Replace the runtime override patch (If-Match = server ETag); re-renders the desired config",
  "tags": [
    "network"
  ],
  "x-audit": "network.server.runtime_update",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-concurrency": {
    "etag": true,
    "ifMatch": true
  },
  "x-idempotency": "optional",
  "x-permission": "network.runtime.manage",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/servers/{id}/stats

GET /api/v1/admin/network/servers/{id}/stats

Daily load and speed statistics (business dates)

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    },
    {
      "description": "Business date (inclusive); default 29 days before date_to",
      "in": "query",
      "name": "date_from",
      "required": false,
      "schema": {
        "description": "Business date (inclusive); default 29 days before date_to",
        "example": "2026-10-22",
        "format": "date",
        "type": "string"
      }
    },
    {
      "description": "Business date (inclusive); default today",
      "in": "query",
      "name": "date_to",
      "required": false,
      "schema": {
        "description": "Business date (inclusive); default today",
        "example": "2026-10-22",
        "format": "date",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkServerStats"
          }
        }
      },
      "description": "Statistics"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "No such server"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Invalid range"
    }
  },
  "summary": "Daily load and speed statistics (business dates)",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/tags

GET /api/v1/admin/network/tags

Tag summary: manual tags (nodes, plans, active subscriptions) and system tags

{
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkTagList"
          }
        }
      },
      "description": "Tags"
    }
  },
  "summary": "Tag summary: manual tags (nodes, plans, active subscriptions) and system tags",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

GET /api/v1/admin/network/tags/impact

GET /api/v1/admin/network/tags/impact

What renaming or merging these tags would touch

{
  "parameters": [
    {
      "description": "Tags to inspect; repeat the parameter for several",
      "in": "query",
      "name": "tags",
      "required": true,
      "schema": {
        "anyOf": [
          {
            "maxLength": 128,
            "type": "string"
          },
          {
            "items": {
              "maxLength": 128,
              "type": "string"
            },
            "maxItems": 64,
            "type": "array"
          }
        ],
        "description": "Tags to inspect; repeat the parameter for several"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkTagImpact"
          }
        }
      },
      "description": "Counts per tag"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Validation failed"
    }
  },
  "summary": "What renaming or merging these tags would touch",
  "tags": [
    "network"
  ],
  "x-body": "none",
  "x-body-limit": 0,
  "x-permission": "network.server.read",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/tags/merge

POST /api/v1/admin/network/tags/merge

Merge tags into one on nodes, plans and subscriptions in one transaction

{
  "parameters": [
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkTagMergeInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkTagChange"
          }
        }
      },
      "description": "What changed"
    },
    "403": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "auth.forbidden: catalog.plan.manage is also required"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.tag_invalid (system tag shape, unknown source, existing target for a rename)"
    }
  },
  "summary": "Merge tags into one on nodes, plans and subscriptions in one transaction",
  "tags": [
    "network"
  ],
  "x-audit": "network.tag.merge",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-idempotency": "required",
  "x-permission": "network.node.manage",
  "effectiveSecurity": []
}

POST /api/v1/admin/network/tags/rename

POST /api/v1/admin/network/tags/rename

Rename a tag on nodes, plans and subscriptions in one transaction

{
  "parameters": [
    {
      "description": "Idempotency-Key: 16–128 visible ASCII characters",
      "in": "header",
      "name": "idempotency-key",
      "required": true,
      "schema": {
        "description": "Idempotency-Key: 16–128 visible ASCII characters",
        "pattern": "^[\\x21-\\x7e]{16,128}$",
        "type": "string"
      }
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/NetworkTagRenameInput"
        }
      }
    },
    "required": true
  },
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NetworkTagChange"
          }
        }
      },
      "description": "What changed"
    },
    "403": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "auth.forbidden: catalog.plan.manage is also required"
    },
    "422": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "network.tag_invalid (system tag shape, unknown source, existing target for a rename)"
    }
  },
  "summary": "Rename a tag on nodes, plans and subscriptions in one transaction",
  "tags": [
    "network"
  ],
  "x-audit": "network.tag.rename",
  "x-body": "json",
  "x-body-limit": 65536,
  "x-idempotency": "required",
  "x-permission": "network.node.manage",
  "effectiveSecurity": []
}

GET /api/v1/me/subscriptions/{id}/node-multipliers

GET /api/v1/me/subscriptions/{id}/node-multipliers

Current effective multipliers for my subscription nodes

{
  "parameters": [
    {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
        "format": "uuid",
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "content": {
        "application/json": {
          "schema": {
            "properties": {
              "at": {
                "format": "date-time",
                "type": "string"
              },
              "nodes": {
                "items": {
                  "properties": {
                    "effective_multiplier": {
                      "type": "string"
                    },
                    "id": {
                      "format": "uuid",
                      "type": "string"
                    },
                    "rule_version": {
                      "type": "integer"
                    }
                  },
                  "required": [
                    "id",
                    "effective_multiplier",
                    "rule_version"
                  ],
                  "type": "object"
                },
                "type": "array"
              }
            },
            "required": [
              "at",
              "nodes"
            ],
            "type": "object"
          }
        }
      },
      "description": "Current rates"
    },
    "404": {
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      },
      "description": "Subscription not found"
    }
  },
  "summary": "Current effective multipliers for my subscription nodes",
  "tags": [
    "network"
  ],
  "x-audit": "network.multiplier.read",
  "x-body": "none",
  "x-body-limit": 0,
  "x-idempotency": "none",
  "x-rate-limit": "network.multiplier.read",
  "x-reauth": false,
  "effectiveSecurity": []
}

本页目录

DELETE /api/v1/admin/network/inbounds/{id}GET /api/v1/admin/network/inbounds/{id}PUT /api/v1/admin/network/inbounds/{id}GET /api/v1/admin/network/inbounds/{id}/secretPOST /api/v1/admin/network/inbounds/{id}/statusGET /api/v1/admin/network/multipliersPUT /api/v1/admin/network/multipliersGET /api/v1/admin/network/multipliers/previewGET /api/v1/admin/network/nodesPOST /api/v1/admin/network/nodesPOST /api/v1/admin/network/nodes/reorderPOST /api/v1/admin/network/nodes/tagsDELETE /api/v1/admin/network/nodes/{id}GET /api/v1/admin/network/nodes/{id}PUT /api/v1/admin/network/nodes/{id}GET /api/v1/admin/network/protocolsGET /api/v1/admin/network/runtimePUT /api/v1/admin/network/runtimeGET /api/v1/admin/network/serversPOST /api/v1/admin/network/serversDELETE /api/v1/admin/network/servers/{id}GET /api/v1/admin/network/servers/{id}PUT /api/v1/admin/network/servers/{id}GET /api/v1/admin/network/servers/{id}/configPOST /api/v1/admin/network/servers/{id}/create-ipv6-nodePOST /api/v1/admin/network/servers/{id}/disable-agentPOST /api/v1/admin/network/servers/{id}/enrollment-tokenPUT /api/v1/admin/network/servers/{id}/geoGET /api/v1/admin/network/servers/{id}/healthGET /api/v1/admin/network/servers/{id}/inboundsPOST /api/v1/admin/network/servers/{id}/inboundsPOST /api/v1/admin/network/servers/{id}/republishPOST /api/v1/admin/network/servers/{id}/rotate-agent-tokenPUT /api/v1/admin/network/servers/{id}/runtimeGET /api/v1/admin/network/servers/{id}/statsGET /api/v1/admin/network/tagsGET /api/v1/admin/network/tags/impactPOST /api/v1/admin/network/tags/mergePOST /api/v1/admin/network/tags/renameGET /api/v1/me/subscriptions/{id}/node-multipliers