From 5e49e3bd79174c3c2b3900b2705639daf20428fa Mon Sep 17 00:00:00 2001 From: AjdinDev Date: Tue, 16 Sep 2025 08:49:01 +0200 Subject: [PATCH 1/2] Add new API endpoints for retrieving deployable nodes, server by external ID, and user by external ID --- docs/api/application/databases.md | 852 ++++++++++++++++++++++++++++++ docs/api/application/nodes.md | 183 +++++++ docs/api/application/servers.md | 179 +++++++ docs/api/application/users.md | 155 ++++++ docs/api/websocket.md | 24 +- sidebars.ts | 1 + 6 files changed, 1389 insertions(+), 5 deletions(-) create mode 100644 docs/api/application/databases.md diff --git a/docs/api/application/databases.md b/docs/api/application/databases.md new file mode 100644 index 0000000..3d90b61 --- /dev/null +++ b/docs/api/application/databases.md @@ -0,0 +1,852 @@ +--- +sidebar_position: 7 +title: Database Management +description: Application API documentation for managing server databases +keywords: [pterodactyl, application api, database management, mysql, server databases] +--- + +import CodeTabs from '@site/src/components/CodeTabs'; + +# Database Management + +The Application API Database Management endpoints allow administrators to manage databases for servers. These endpoints provide operations for creating, viewing, and managing MySQL databases associated with servers. + +:::warning Administrative Access Required +These endpoints require administrative privileges and an Application API key with appropriate permissions. +::: + +## List Server Databases + +Retrieve a list of all databases for a specific server. + +```http +GET /api/application/servers/{server}/databases +``` + +### Parameters + +| Parameter | Type | Location | Required | Description | +|-----------|------|----------|----------|-------------| +| `server` | string | path | Yes | The server's UUID or ID | + +### Query Parameters + +| Parameter | Type | Description | Default | +|-----------|------|-------------|---------| +| `page` | integer | Page number for pagination | 1 | +| `per_page` | integer | Results per page (1-100) | 50 | +| `include` | string | Include related resources (host, password) | - | + + response = client.send(request, HttpResponse.BodyHandlers.ofString());`, + csharp: `using System.Net.Http; +using System.Net.Http.Headers; + +var client = new HttpClient(); +client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_APPLICATION_API_KEY"); +client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + +var response = await client.GetAsync("https://panel.example.com/api/application/servers/{server}/databases"); +var content = await response.Content.ReadAsStringAsync();`, + ruby: `require 'net/http' +require 'json' + +uri = URI('https://panel.example.com/api/application/servers/{server}/databases') +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Get.new(uri) +request['Authorization'] = 'Bearer YOUR_APPLICATION_API_KEY' +request['Accept'] = 'application/json' +request['Content-Type'] = 'application/json' + +response = http.request(request) +databases = JSON.parse(response.body)` + }} +/> + +### Response + +```json +{ + "object": "list", + "data": [ + { + "object": "server_database", + "attributes": { + "id": 1, + "server": 1, + "host": 1, + "database": "s1_example", + "username": "u1_example", + "remote": "%", + "max_connections": 0, + "created_at": "2024-01-01T00:00:00+00:00", + "updated_at": "2024-01-01T00:00:00+00:00" + } + } + ], + "meta": { + "pagination": { + "total": 1, + "count": 1, + "per_page": 50, + "current_page": 1, + "total_pages": 1 + } + } +} +``` + +--- + +## Get Server Database + +Retrieve details for a specific database. + +```http +GET /api/application/servers/{server}/databases/{database} +``` + +### Parameters + +| Parameter | Type | Location | Required | Description | +|-----------|------|----------|----------|-------------| +| `server` | string | path | Yes | The server's UUID or ID | +| `database` | integer | path | Yes | The database ID | + + response = client.send(request, HttpResponse.BodyHandlers.ofString());`, + csharp: `using System.Net.Http; +using System.Net.Http.Headers; + +var client = new HttpClient(); +client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_APPLICATION_API_KEY"); +client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + +var response = await client.GetAsync("https://panel.example.com/api/application/servers/{server}/databases/{database}"); +var content = await response.Content.ReadAsStringAsync();`, + ruby: `require 'net/http' +require 'json' + +uri = URI('https://panel.example.com/api/application/servers/{server}/databases/{database}') +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Get.new(uri) +request['Authorization'] = 'Bearer YOUR_APPLICATION_API_KEY' +request['Accept'] = 'application/json' +request['Content-Type'] = 'application/json' + +response = http.request(request) +database = JSON.parse(response.body)` + }} +/> + +### Response + +```json +{ + "object": "server_database", + "attributes": { + "id": 1, + "server": 1, + "host": 1, + "database": "s1_example", + "username": "u1_example", + "remote": "%", + "max_connections": 0, + "created_at": "2024-01-01T00:00:00+00:00", + "updated_at": "2024-01-01T00:00:00+00:00", + "relationships": { + "password": { + "object": "database_password", + "attributes": { + "password": "example_password" + } + }, + "host": { + "object": "database_host", + "attributes": { + "id": 1, + "name": "localhost", + "host": "127.0.0.1", + "port": 3306, + "username": "root", + "node": 1, + "created_at": "2024-01-01T00:00:00+00:00", + "updated_at": "2024-01-01T00:00:00+00:00" + } + } + } + } +} +``` + +--- + +## Create Server Database + +Create a new database for a server. + +```http +POST /api/application/servers/{server}/databases +``` + +### Parameters + +| Parameter | Type | Location | Required | Description | +|-----------|------|----------|----------|-------------| +| `server` | string | path | Yes | The server's UUID or ID | + +### Request Body + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `database` | string | Yes | Database name (will be prefixed with server ID) | +| `remote` | string | Yes | Remote connection address (use % for any) | +| `host` | integer | Yes | Database host ID | + + 'my_database', + 'remote' => '%', + 'host' => 1 +]; + +$ch = curl_init('https://panel.example.com/api/application/servers/{server}/databases'); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); +curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Authorization: Bearer YOUR_APPLICATION_API_KEY', + 'Accept: application/json', + 'Content-Type: application/json' +]); + +$response = curl_exec($ch); +$database = json_decode($response, true); +curl_close($ch);`, + go: `package main + +import ( + "bytes" + "encoding/json" + "net/http" +) + +func main() { + data := map[string]interface{}{ + "database": "my_database", + "remote": "%", + "host": 1, + } + + jsonData, _ := json.Marshal(data) + + client := &http.Client{} + req, _ := http.NewRequest("POST", "https://panel.example.com/api/application/servers/{server}/databases", bytes.NewBuffer(jsonData)) + req.Header.Add("Authorization", "Bearer YOUR_APPLICATION_API_KEY") + req.Header.Add("Accept", "application/json") + req.Header.Add("Content-Type", "application/json") + + resp, _ := client.Do(req) + defer resp.Body.Close() +}`, + java: `import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.URI; + +String requestBody = """ +{ + "database": "my_database", + "remote": "%", + "host": 1 +} +"""; + +HttpClient client = HttpClient.newHttpClient(); +HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://panel.example.com/api/application/servers/{server}/databases")) + .header("Authorization", "Bearer YOUR_APPLICATION_API_KEY") + .header("Accept", "application/json") + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(requestBody)) + .build(); + +HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());`, + csharp: `using System.Net.Http; +using System.Text; +using System.Text.Json; + +var client = new HttpClient(); +client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_APPLICATION_API_KEY"); + +var data = new +{ + database = "my_database", + remote = "%", + host = 1 +}; + +var json = JsonSerializer.Serialize(data); +var content = new StringContent(json, Encoding.UTF8, "application/json"); + +var response = await client.PostAsync("https://panel.example.com/api/application/servers/{server}/databases", content);`, + ruby: `require 'net/http' +require 'json' + +uri = URI('https://panel.example.com/api/application/servers/{server}/databases') +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Post.new(uri) +request['Authorization'] = 'Bearer YOUR_APPLICATION_API_KEY' +request['Accept'] = 'application/json' +request['Content-Type'] = 'application/json' +request.body = { + database: 'my_database', + remote: '%', + host: 1 +}.to_json + +response = http.request(request) +database = JSON.parse(response.body)` + }} +/> + +### Response + +```json +{ + "object": "server_database", + "attributes": { + "id": 2, + "server": 1, + "host": 1, + "database": "s1_my_database", + "username": "u1_randomuser", + "remote": "%", + "max_connections": 0, + "created_at": "2024-01-01T00:00:00+00:00", + "updated_at": "2024-01-01T00:00:00+00:00", + "relationships": { + "password": { + "object": "database_password", + "attributes": { + "password": "generated_password" + } + } + } + } +} +``` + +--- + +## Reset Database Password + +Reset the password for a server database. + +```http +POST /api/application/servers/{server}/databases/{database}/reset-password +``` + +### Parameters + +| Parameter | Type | Location | Required | Description | +|-----------|------|----------|----------|-------------| +| `server` | string | path | Yes | The server's UUID or ID | +| `database` | integer | path | Yes | The database ID | + + response = client.send(request, HttpResponse.BodyHandlers.ofString());`, + csharp: `using System.Net.Http; +using System.Net.Http.Headers; + +var client = new HttpClient(); +client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_APPLICATION_API_KEY"); +client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + +var response = await client.PostAsync("https://panel.example.com/api/application/servers/{server}/databases/{database}/reset-password", null); +var content = await response.Content.ReadAsStringAsync();`, + ruby: `require 'net/http' +require 'json' + +uri = URI('https://panel.example.com/api/application/servers/{server}/databases/{database}/reset-password') +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Post.new(uri) +request['Authorization'] = 'Bearer YOUR_APPLICATION_API_KEY' +request['Accept'] = 'application/json' +request['Content-Type'] = 'application/json' + +response = http.request(request) +result = JSON.parse(response.body)` + }} +/> + +### Response + +```json +{ + "object": "server_database", + "attributes": { + "id": 1, + "server": 1, + "host": 1, + "database": "s1_example", + "username": "u1_example", + "remote": "%", + "max_connections": 0, + "created_at": "2024-01-01T00:00:00+00:00", + "updated_at": "2024-01-01T00:00:00+00:00", + "relationships": { + "password": { + "object": "database_password", + "attributes": { + "password": "new_generated_password" + } + } + } + } +} +``` + +--- + +## Delete Server Database + +Delete a database from a server. + +```http +DELETE /api/application/servers/{server}/databases/{database} +``` + +### Parameters + +| Parameter | Type | Location | Required | Description | +|-----------|------|----------|----------|-------------| +| `server` | string | path | Yes | The server's UUID or ID | +| `database` | integer | path | Yes | The database ID | + + response = client.send(request, HttpResponse.BodyHandlers.ofString()); + +if (response.statusCode() == 204) { + System.out.println("Database deleted successfully"); +}`, + csharp: `using System.Net.Http; +using System.Net.Http.Headers; + +var client = new HttpClient(); +client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_APPLICATION_API_KEY"); +client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + +var response = await client.DeleteAsync("https://panel.example.com/api/application/servers/{server}/databases/{database}"); + +if (response.StatusCode == System.Net.HttpStatusCode.NoContent) +{ + Console.WriteLine("Database deleted successfully"); +}`, + ruby: `require 'net/http' + +uri = URI('https://panel.example.com/api/application/servers/{server}/databases/{database}') +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Delete.new(uri) +request['Authorization'] = 'Bearer YOUR_APPLICATION_API_KEY' +request['Accept'] = 'application/json' +request['Content-Type'] = 'application/json' + +response = http.request(request) + +if response.code == '204' + puts 'Database deleted successfully' +end` + }} +/> + +### Response + +Returns `204 No Content` on successful deletion. + +## Error Responses + +All database management endpoints may return the following errors: + +| Status Code | Error | Description | +|-------------|-------|-------------| +| 400 | Bad Request | Invalid request parameters | +| 401 | Unauthorized | Invalid or missing API key | +| 403 | Forbidden | Insufficient permissions | +| 404 | Not Found | Server or database not found | +| 409 | Conflict | Database name already exists | +| 422 | Unprocessable Entity | Validation errors | +| 500 | Internal Server Error | Server error | + +### Error Response Format + +```json +{ + "errors": [ + { + "code": "ValidationException", + "status": "422", + "detail": "The database name has already been taken." + } + ] +} +``` \ No newline at end of file diff --git a/docs/api/application/nodes.md b/docs/api/application/nodes.md index ff63140..4dd40e6 100644 --- a/docs/api/application/nodes.md +++ b/docs/api/application/nodes.md @@ -469,6 +469,189 @@ puts JSON.parse(response.body) +## Get Deployable Nodes + +Retrieve a list of nodes available for server deployment. + +```http +GET /api/application/nodes/deployable +``` + +### Query Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `per_page` | integer | Results per page (default: 50) | +| `page` | integer | Page number | +| `memory` | integer | Required memory in MB | +| `disk` | integer | Required disk space in MB | + +get('https://your-panel.com/api/application/nodes/deployable', [ + 'headers' => [ + 'Authorization' => 'Bearer ptla_YOUR_API_KEY', + 'Accept' => 'Application/vnd.pterodactyl.v1+json' + ], + 'query' => [ + 'memory' => 1024, + 'disk' => 5000 + ] +]); + +$data = json_decode($response->getBody(), true); +print_r($data); +?>`, + go: `package main + +import ( + "encoding/json" + "fmt" + "net/http" +) + +func main() { + url := "https://your-panel.com/api/application/nodes/deployable?memory=1024&disk=5000" + + client := &http.Client{} + req, _ := http.NewRequest("GET", url, nil) + req.Header.Add("Authorization", "Bearer ptla_YOUR_API_KEY") + req.Header.Add("Accept", "Application/vnd.pterodactyl.v1+json") + + resp, _ := client.Do(req) + defer resp.Body.Close() + + var result map[string]interface{} + json.NewDecoder(resp.Body).Decode(&result) + fmt.Println(result) +}`, + java: `import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.URI; + +HttpClient client = HttpClient.newHttpClient(); +HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://your-panel.com/api/application/nodes/deployable?memory=1024&disk=5000")) + .header("Authorization", "Bearer ptla_YOUR_API_KEY") + .header("Accept", "Application/vnd.pterodactyl.v1+json") + .GET() + .build(); + +HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); +System.out.println(response.body());`, + csharp: `using System.Net.Http; +using System.Threading.Tasks; + +var client = new HttpClient(); +client.DefaultRequestHeaders.Add("Authorization", "Bearer ptla_YOUR_API_KEY"); +client.DefaultRequestHeaders.Add("Accept", "Application/vnd.pterodactyl.v1+json"); + +var response = await client.GetAsync("https://your-panel.com/api/application/nodes/deployable?memory=1024&disk=5000"); +var content = await response.Content.ReadAsStringAsync(); +Console.WriteLine(content);`, + ruby: `require 'net/http' +require 'json' + +uri = URI('https://your-panel.com/api/application/nodes/deployable') +uri.query = URI.encode_www_form(memory: 1024, disk: 5000) + +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Get.new(uri) +request['Authorization'] = 'Bearer ptla_YOUR_API_KEY' +request['Accept'] = 'Application/vnd.pterodactyl.v1+json' + +response = http.request(request) +puts JSON.parse(response.body)` + }} +/> + +### Response + +```json +{ + "object": "list", + "data": [ + { + "object": "node", + "attributes": { + "id": 1, + "uuid": "4aec6f5b-8fbc-4f95-bc7f-8f0c8e6b6f0e", + "public": true, + "name": "Node 1", + "description": "Primary node", + "location_id": 1, + "fqdn": "node1.example.com", + "scheme": "https", + "behind_proxy": false, + "maintenance_mode": false, + "memory": 32768, + "memory_overallocate": 0, + "disk": 409600, + "disk_overallocate": 0, + "upload_size": 100, + "daemon_listen": 8080, + "daemon_sftp": 2022, + "daemon_base": "/var/lib/pterodactyl/volumes", + "created_at": "2024-01-01T00:00:00+00:00", + "updated_at": "2024-01-01T00:00:00+00:00", + "allocated_resources": { + "memory": 8192, + "disk": 102400 + } + } + } + ], + "meta": { + "pagination": { + "total": 1, + "count": 1, + "per_page": 50, + "current_page": 1, + "total_pages": 1 + } + } +} +``` ## Create New Node diff --git a/docs/api/application/servers.md b/docs/api/application/servers.md index 79886ed..58b6680 100644 --- a/docs/api/application/servers.md +++ b/docs/api/application/servers.md @@ -478,6 +478,185 @@ puts JSON.parse(response.body) +## Get Server by External ID + +Retrieve server details using an external ID. + +```http +GET /api/application/servers/external/{external_id} +``` + +### Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `external_id` | string | External ID of the server | + +### Query Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `include` | string | Include relationships (allocations, user, subusers, pack, nest, egg, variables, location, node, databases, backups) | + +get("https://your-panel.com/api/application/servers/external/{$externalId}", [ + 'headers' => [ + 'Authorization' => 'Bearer ptla_YOUR_API_KEY', + 'Accept' => 'Application/vnd.pterodactyl.v1+json' + ] +]); + +$data = json_decode($response->getBody(), true); +print_r($data); +?>`, + go: `package main + +import ( + "encoding/json" + "fmt" + "net/http" +) + +func main() { + externalId := "srv-ext-123" + url := fmt.Sprintf("https://your-panel.com/api/application/servers/external/%s", externalId) + + client := &http.Client{} + req, _ := http.NewRequest("GET", url, nil) + req.Header.Add("Authorization", "Bearer ptla_YOUR_API_KEY") + req.Header.Add("Accept", "Application/vnd.pterodactyl.v1+json") + + resp, _ := client.Do(req) + defer resp.Body.Close() + + var result map[string]interface{} + json.NewDecoder(resp.Body).Decode(&result) + fmt.Println(result) +}`, + java: `import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.URI; + +String externalId = "srv-ext-123"; +String url = String.format("https://your-panel.com/api/application/servers/external/%s", externalId); + +HttpClient client = HttpClient.newHttpClient(); +HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Authorization", "Bearer ptla_YOUR_API_KEY") + .header("Accept", "Application/vnd.pterodactyl.v1+json") + .GET() + .build(); + +HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); +System.out.println(response.body());`, + csharp: `using System.Net.Http; +using System.Threading.Tasks; + +var client = new HttpClient(); +client.DefaultRequestHeaders.Add("Authorization", "Bearer ptla_YOUR_API_KEY"); +client.DefaultRequestHeaders.Add("Accept", "Application/vnd.pterodactyl.v1+json"); + +string externalId = "srv-ext-123"; +var response = await client.GetAsync($"https://your-panel.com/api/application/servers/external/{externalId}"); +var content = await response.Content.ReadAsStringAsync(); +Console.WriteLine(content);`, + ruby: `require 'net/http' +require 'json' + +external_id = 'srv-ext-123' +uri = URI("https://your-panel.com/api/application/servers/external/#{external_id}") +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Get.new(uri) +request['Authorization'] = 'Bearer ptla_YOUR_API_KEY' +request['Accept'] = 'Application/vnd.pterodactyl.v1+json' + +response = http.request(request) +puts JSON.parse(response.body)` + }} +/> + +### Response + +```json +{ + "object": "server", + "attributes": { + "id": 1, + "external_id": "srv-ext-123", + "uuid": "4fcb9e86-cef2-4aab-998e-3ad529761fa5", + "identifier": "4fcb9e86", + "name": "My Server", + "description": "A Minecraft Server", + "suspended": false, + "limits": { + "memory": 1024, + "swap": 0, + "disk": 2048, + "io": 500, + "cpu": 100, + "threads": null, + "oom_disabled": false + }, + "feature_limits": { + "databases": 2, + "allocations": 1, + "backups": 5 + }, + "user": 1, + "node": 1, + "allocation": 1, + "nest": 1, + "egg": 5, + "container": { + "startup_command": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", + "image": "quay.io/pterodactyl/core:java", + "installed": true, + "environment": { + "MINECRAFT_VERSION": "latest", + "SERVER_JARFILE": "server.jar" + } + }, + "updated_at": "2024-01-20T12:00:00+00:00", + "created_at": "2024-01-20T12:00:00+00:00" + } +} +``` ## Create New Server diff --git a/docs/api/application/users.md b/docs/api/application/users.md index ab53f00..8204e66 100644 --- a/docs/api/application/users.md +++ b/docs/api/application/users.md @@ -433,6 +433,161 @@ puts JSON.parse(response.body)` } ``` +## Get User by External ID + +Retrieve user details using an external ID. + +```http +GET /api/application/users/external/{external_id} +``` + +### Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `external_id` | string | External ID of the user | + +### Query Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `include` | string | Include relationships (servers) | + +get("https://your-panel.com/api/application/users/external/{$externalId}", [ + 'headers' => [ + 'Authorization' => 'Bearer ptla_YOUR_API_KEY', + 'Accept' => 'Application/vnd.pterodactyl.v1+json' + ] +]); + +$data = json_decode($response->getBody(), true); +print_r($data); +?>`, + go: `package main + +import ( + "encoding/json" + "fmt" + "net/http" +) + +func main() { + externalId := "ext-123456" + url := fmt.Sprintf("https://your-panel.com/api/application/users/external/%s", externalId) + + client := &http.Client{} + req, _ := http.NewRequest("GET", url, nil) + req.Header.Add("Authorization", "Bearer ptla_YOUR_API_KEY") + req.Header.Add("Accept", "Application/vnd.pterodactyl.v1+json") + + resp, _ := client.Do(req) + defer resp.Body.Close() + + var result map[string]interface{} + json.NewDecoder(resp.Body).Decode(&result) + fmt.Println(result) +}`, + java: `import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.URI; + +String externalId = "ext-123456"; +String url = String.format("https://your-panel.com/api/application/users/external/%s", externalId); + +HttpClient client = HttpClient.newHttpClient(); +HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Authorization", "Bearer ptla_YOUR_API_KEY") + .header("Accept", "Application/vnd.pterodactyl.v1+json") + .GET() + .build(); + +HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); +System.out.println(response.body());`, + csharp: `using System.Net.Http; +using System.Threading.Tasks; + +var client = new HttpClient(); +client.DefaultRequestHeaders.Add("Authorization", "Bearer ptla_YOUR_API_KEY"); +client.DefaultRequestHeaders.Add("Accept", "Application/vnd.pterodactyl.v1+json"); + +string externalId = "ext-123456"; +var response = await client.GetAsync($"https://your-panel.com/api/application/users/external/{externalId}"); +var content = await response.Content.ReadAsStringAsync(); +Console.WriteLine(content);`, + ruby: `require 'net/http' +require 'json' + +external_id = 'ext-123456' +uri = URI("https://your-panel.com/api/application/users/external/#{external_id}") +http = Net::HTTP.new(uri.host, uri.port) +http.use_ssl = true + +request = Net::HTTP::Get.new(uri) +request['Authorization'] = 'Bearer ptla_YOUR_API_KEY' +request['Accept'] = 'Application/vnd.pterodactyl.v1+json' + +response = http.request(request) +puts JSON.parse(response.body)` + }} +/> + +### Response + +```json +{ + "object": "user", + "attributes": { + "id": 1, + "external_id": "ext-123456", + "uuid": "3f7a8b4c-2e9d-4b6f-8c5e-1a2b3c4d5e6f", + "username": "admin", + "email": "admin@example.com", + "first_name": "System", + "last_name": "Administrator", + "language": "en", + "root_admin": true, + "2fa": false, + "created_at": "2023-01-15T10:26:32+00:00", + "updated_at": "2023-01-15T10:26:32+00:00" + } +} +``` + ## Create New User Create a new user account in the panel. diff --git a/docs/api/websocket.md b/docs/api/websocket.md index b016bb3..ec7fd01 100644 --- a/docs/api/websocket.md +++ b/docs/api/websocket.md @@ -280,7 +280,8 @@ const socketUrl = 'wss://node1.example.com:8080/api/servers/d3aac109-e5e0-4331-b const socket = new WebSocket(socketUrl, [], { headers: { - 'Authorization': `Bearer ${token}` + 'Authorization': `Bearer ${token}`, + 'Origin': 'https://your-panel.com' } }); @@ -317,7 +318,8 @@ const socketUrl = 'wss://node1.example.com:8080/api/servers/d3aac109-e5e0-4331-b const socket = new WebSocket(socketUrl, { headers: { - 'Authorization': `Bearer ${token}` + 'Authorization': `Bearer ${token}`, + 'Origin': 'https://your-panel.com' } }); @@ -773,7 +775,11 @@ export function useWebSocket(serverId, apiKey) { const { token, socket: socketUrl } = await getWebSocketToken(); tokenRef.current = token; - const socket = new WebSocket(socketUrl); + const socket = new WebSocket(socketUrl, { + headers: { + 'Origin': 'https://your-panel.com' + } + }); socketRef.current = socket; socket.onopen = () => { @@ -978,7 +984,11 @@ export function useWebSocket(serverId, apiKey) { const { token: wsToken, socket: socketUrl } = await getWebSocketToken(); token.value = wsToken; - socket.value = new WebSocket(socketUrl); + socket.value = new WebSocket(socketUrl, { + headers: { + 'Origin': 'https://your-panel.com' + } + }); socket.value.onopen = () => { console.log('WebSocket connected'); @@ -1142,7 +1152,11 @@ class PterodactylWebSocket { const tokenData = await this.getWebSocketToken(); this.token = tokenData.token; - this.socket = new WebSocket(tokenData.socket); + this.socket = new WebSocket(tokenData.socket, { + headers: { + 'Origin': 'https://your-panel.com' + } + }); this.setupEventHandlers(); } catch (error) { diff --git a/sidebars.ts b/sidebars.ts index a790ea0..89f2b71 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -46,6 +46,7 @@ const sidebars: SidebarsConfig = { items: [ 'api/application/users', 'api/application/servers', + 'api/application/databases', 'api/application/nodes', 'api/application/locations', 'api/application/nests-eggs', From 120df62a6c7daff885898c80cff3ea58562406c8 Mon Sep 17 00:00:00 2001 From: AjdinDev Date: Tue, 16 Sep 2025 08:57:58 +0200 Subject: [PATCH 2/2] Add headers to WebSocket connection --- docs/api/client/servers.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/api/client/servers.md b/docs/api/client/servers.md index 607a2b8..0f7b089 100644 --- a/docs/api/client/servers.md +++ b/docs/api/client/servers.md @@ -680,7 +680,11 @@ const response = await axios.get(\`https://your-panel.com/api/client/servers/\${ const { token, socket } = response.data.data; // Connect to WebSocket -const ws = new WebSocket(socket); +const ws = new WebSocket(socket, { + headers: { + 'Origin': 'https://your-panel.com' + } +}); ws.on('open', () => { // Authenticate @@ -747,7 +751,11 @@ ws.run_forever()` Use the returned token and socket URL to establish a WebSocket connection: ```javascript -const socket = new WebSocket('wss://node.example.com:8080/api/servers/d3aac109-e5e0-4331-b03e-3454f7e136dc/ws'); +const socket = new WebSocket('wss://node.example.com:8080/api/servers/d3aac109-e5e0-4331-b03e-3454f7e136dc/ws', { + headers: { + 'Origin': 'https://your-panel.com' + } +}); socket.addEventListener('open', function (event) { // Authenticate with the WebSocket