Saltar al contenido principal

Go SDK [community]

SDK de la comunidad

Este SDK es mantenido completamente por la comunidad.

Remnawave Go SDK es una biblioteca para interactuar cómodamente con la RestAPI.

✨ Características principales

  • Generado con ogen v1.19.0: Decodificador JSON sin reflexión para alto rendimiento
  • Seguro en tipos: Validación en tiempo de compilación contra la especificación OpenAPI 3.0
  • Diseño basado en controladores: Sub-clientes organizados para un acceso limpio a la API
  • Firmas simplificadas: Sin estructuras Params verbosas para operaciones simples
  • Soporte de contexto: Soporte de primera clase para context.Context
  • OpenTelemetry: Instrumentación de trazado integrada
  • Opciones de solicitud: Personalización por solicitud mediante ...RequestOption
  • Editores: Soporte de middleware para solicitudes/respuestas

Instalación

go get github.com/Jolymmiles/remnawave-api-go/v2@latest
aviso

Siempre seleccione y fije la versión correcta del SDK para que coincida con la versión del backend de Remnawave.

Versión del SDKVersión del Panel Remnawave
v2.6.12.6.1
v2.5.32.5.3
v2.3.0-62.3.0
v2.2.6-32.2.6

Uso

Ejemplo básico
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

// Create base client
baseClient, err := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
if err != nil {
log.Fatal(err)
}

// Wrap with organized sub-clients
client := remapi.NewClientExt(baseClient)

// Get user by UUID - simplified signature
resp, err := client.Users().GetUserByUuid(ctx, "user-uuid-here")
if err != nil {
log.Fatal(err)
}

switch r := resp.(type) {
case *remapi.UserResponse:
fmt.Printf("User: %s\n", r.Response.Username)
case *remapi.NotFoundError:
fmt.Println("User not found")
case *remapi.BadRequestError:
fmt.Printf("Validation error: %v\n", r.Errors)
}
}
Crear y gestionar usuarios
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Create user
createResp, err := client.Users().CreateUser(ctx, &remapi.CreateUserRequest{
Username: "john_doe",
})
if err != nil {
log.Fatal(err)
}

user := createResp.(*remapi.UserResponse).Response
fmt.Printf("Created user: %s (UUID: %s)\n", user.Username, user.UUID)

// Disable user
_, err = client.Users().DisableUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User disabled")

// Enable user
_, err = client.Users().EnableUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User enabled")

// Delete user
_, err = client.Users().DeleteUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User deleted")
}
Gestión de nodos
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Get all nodes
nodesResp, err := client.Nodes().GetAllNodes(ctx)
if err != nil {
log.Fatal(err)
}

nodes := nodesResp.(*remapi.NodesResponse).Response
fmt.Printf("Total nodes: %d\n", len(nodes))

for _, node := range nodes {
fmt.Printf(" - %s (%s): connected=%v\n",
node.Name, node.Address, node.IsConnected)
}

// Get single node
if len(nodes) > 0 {
nodeResp, _ := client.Nodes().GetOneNode(ctx, nodes[0].UUID.String())
node := nodeResp.(*remapi.NodeResponse).Response
fmt.Printf("\nNode details: %s\n", node.Name)
}
}
Paginación
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Use PaginationHelper for iterating through pages
pager := remapi.NewPaginationHelper(50) // 50 items per page

for pager.HasMore {
resp, err := client.Users().GetAllUsers(ctx,
pager.Limit, // size
pager.Offset, // start
)
if err != nil {
log.Fatal(err)
}

users := resp.(*remapi.GetAllUsersResponse)
for _, user := range users.Response.Users {
fmt.Printf("User: %s (UUID: %s)\n", user.Username, user.UUID)
}

// Advance to next page
pager.SetTotal(int(users.Response.Total))
pager.NextPage()
}

fmt.Printf("Total users: %d\n", *pager.Total)
}
Manejo de errores
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

resp, err := client.Users().GetUserByUuid(ctx, "invalid-uuid")
if err != nil {
log.Fatal("Network error:", err)
}

// Available error types depend on the endpoint — check the generated
// Res interface (e.g. UsersGetUserByUuidRes) for the full list.
switch e := resp.(type) {
case *remapi.UserResponse:
fmt.Printf("User found: %s\n", e.Response.Username)
case *remapi.BadRequestError:
fmt.Println("Validation errors:")
for _, ve := range e.Errors {
fmt.Printf(" - %s: %s (path: %v)\n",
ve.Code, ve.Message, ve.Path)
}
case *remapi.NotFoundError:
fmt.Println("Resource not found")
case *remapi.InternalServerError:
fmt.Printf("Server error: %s\n", e.Message.Value)
}
}

Controladores disponibles

ControladorDescripción
client.ApiTokens()Gestión de tokens de API
client.Auth()Autenticación
client.BandwidthStatsNodes()Estadísticas de ancho de banda de nodos
client.BandwidthStatsUsers()Estadísticas de ancho de banda de usuarios
client.ConfigProfile()Perfiles de configuración
client.ExternalSquad()Grupos externos
client.Hosts()Gestión de hosts
client.HostsBulkActions()Operaciones masivas de hosts
client.HwidUserDevices()Dispositivos HWID
client.InfraBilling()Facturación de infraestructura
client.InternalSquad()Grupos internos
client.Keygen()Generación de claves
client.Nodes()Gestión de nodos
client.NodesUsageHistory()Historial de uso de nodos
client.Passkey()Autenticación con passkey
client.RemnawaveSettings()Configuración del panel
client.Snippets()Fragmentos de código
client.Subscription()Gestión de suscripciones
client.SubscriptionPageConfig()Configuración de página de suscripción
client.SubscriptionSettings()Ajustes de suscripción
client.SubscriptionTemplate()Plantillas de suscripción
client.Subscriptions()Múltiples suscripciones
client.System()Información del sistema
client.UserSubscriptionRequestHistory()Historial de solicitudes
client.Users()Gestión de usuarios
client.UsersBulkActions()Operaciones masivas de usuarios

Tipos de error

TipoEstado HTTPDescripción
BadRequestError400Errores de validación con detalles
UnauthorizedError401Autenticación requerida
ForbiddenError403Acceso denegado
NotFoundError404Recurso no encontrado
InternalServerError500Error del servidor

🛠️ Enlaces del proyecto