Proxy Aliases
Section titled “Proxy Aliases”Proxy aliases let you expose a container behind a short, human-readable label that masks the raw {projectId}-{containerId} host. Instead of sharing https://{projectId}-{containerId}.{server}.containers.hoody.com/, you can hand out https://{alias}.{server}.containers.hoody.com/ and revoke it without touching the container itself. Aliases can target built-in Hoody programs (such as terminal, files, code, browser, agent, display) or any HTTP/HTTPS server you run inside the container on a chosen port.
List proxy aliases
Section titled “List proxy aliases”GET /api/v1/proxy/aliases
Return every proxy alias owned by the caller, with optional filters by project, container, realm, enabled status, or expiration.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | query | string | No | Filter by project ID |
container_id | query | string | No | Filter by container ID |
realm_id | query | string | No | Filter by realm ID. Alternative to using realm subdomain in URL. |
enabled | query | string | No | Filter by enabled status. Allowed values: "true", "false". |
expired | query | string | No | Filter by expiration. Allowed values: "true" (only expired), "false" (only non-expired). |
Request
Section titled “Request”curl -X GET "https://api.hoody.com/api/v1/proxy/aliases?enabled=true&expired=false" \ -H "Authorization: Bearer <token>"import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://api.hoody.com', token: process.env.HOODY_TOKEN });
await client.api.proxyAliases.listIterator({ enabled: 'true', expired: 'false' });Response
Section titled “Response”{ "statusCode": 200, "message": "Proxy aliases retrieved successfully", "data": { "aliases": [ { "id": "507f1f77bcf86cd799439022", "user_id": "507f1f77bcf86cd799439077", "project_id": "507f1f77bcf86cd799439033", "container_id": "507f1f77bcf86cd799439011", "alias": "my-portfolio", "program": "http", "index": 3000, "target_path": null, "allow_path_override": true, "expires_at": null, "enabled": true, "created_at": "2025-01-15T10:30:00.000Z", "updated_at": "2025-01-15T10:30:00.000Z", "server_id": "507f1f77bcf86cd799439044", "server_name": "node-sg-sin-1", "subserver_name": "user-slice-7", "url": "https://my-portfolio.node-sg-sin-1.containers.hoody.com" }, { "id": "507f1f77bcf86cd799439055", "user_id": "507f1f77bcf86cd799439077", "project_id": "507f1f77bcf86cd799439033", "container_id": "507f1f77bcf86cd799439066", "alias": "c3a8f1b2e4d5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3", "program": "https", "index": 8443, "target_path": "/v1", "allow_path_override": true, "expires_at": "2025-06-30T23:59:59.000Z", "enabled": true, "created_at": "2025-01-10T08:00:00.000Z", "updated_at": "2025-01-10T08:00:00.000Z", "server_id": "507f1f77bcf86cd799439044", "server_name": "node-sg-sin-1", "subserver_name": "user-slice-7", "url": "https://c3a8f1b2e4d5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3.node-sg-sin-1.containers.hoody.com" } ], "count": 2 }}Get proxy alias by ID
Section titled “Get proxy alias by ID”GET /api/v1/proxy/aliases/{id}
Retrieve a single proxy alias along with its associated project and container records.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Proxy alias ID |
Request
Section titled “Request”curl -X GET "https://api.hoody.com/api/v1/proxy/aliases/507f1f77bcf86cd799439022" \ -H "Authorization: Bearer <token>"import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://api.hoody.com', token: process.env.HOODY_TOKEN });
await client.api.proxyAliases.get('507f1f77bcf86cd799439022');Response
Section titled “Response”{ "statusCode": 200, "message": "Proxy alias retrieved successfully", "data": { "id": "507f1f77bcf86cd799439022", "user_id": "507f1f77bcf86cd799439077", "project_id": "507f1f77bcf86cd799439033", "container_id": "507f1f77bcf86cd799439011", "alias": "my-app", "program": "http", "index": 3000, "target_path": "/api", "allow_path_override": true, "expires_at": "2025-12-31T23:59:59.000Z", "enabled": true, "created_at": "2025-01-15T10:30:00.000Z", "updated_at": "2025-01-15T10:30:00.000Z", "url": "https://my-app.node-sg-sin-1.containers.hoody.com", "server_id": "507f1f77bcf86cd799439044", "server_name": "node-sg-sin-1", "subserver_name": "user-slice-7", "project": { "id": "507f1f77bcf86cd799439033", "alias": "production" }, "container": { "id": "507f1f77bcf86cd799439011", "name": "web-app-1" } }}{ "statusCode": 404, "error": "Not Found", "message": "Proxy alias not found"}Create a new proxy alias
Section titled “Create a new proxy alias”POST /api/v1/proxy/aliases
Create a new alias for a container you own. The alias field is optional — pass null (or false) and the system generates a 48-character hex label for maximum obscurity. If you supply your own, it must match ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$ and be 3–61 characters long.
To point an alias at an HTTP/HTTPS server running inside the container, set program to "http" or "https" and pass the listener port in port. To target a built-in Hoody program such as terminal, just set program (the port is fixed by the program).
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
container_id | string | Yes | Container ID that this alias points to. You must own this container. |
program | string | Yes | The program or protocol the alias targets. Built-in Hoody programs ("terminal", "files", "code", "browser", "agent", "display", …) or a transport protocol ("http", "https", "ssh"). |
alias | string | null | boolean | No | Custom alias (3–61 chars, a-z, 0-9, hyphens; cannot start or end with -). Pass null or false to auto-generate a 48-char hex label. Must be unique on the physical server. |
port | integer | No | Target port for http/https (1–65535). Takes precedence over index and any port embedded in program. |
index | integer | No | Instance index; for http/https it is read as the target port. Prefer port for those. Defaults to 1. |
target_path | string | No | Base path prefix. Auto-prefixed with / if missing. Max length 2048. |
allow_path_override | boolean | No | Whether paths beyond target_path are allowed. Default: true. |
expires_at | string | No | ISO 8601 expiration date. Alias is auto-disabled after this time. |
enabled | boolean | No | Whether the alias starts enabled. Default: true. |
Request
Section titled “Request”curl -X POST "https://api.hoody.com/api/v1/proxy/aliases" \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{ "container_id": "507f1f77bcf86cd799439011", "alias": "my-app", "program": "http", "port": 3000, "target_path": null, "allow_path_override": true }'import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://api.hoody.com', token: process.env.HOODY_TOKEN });
await client.api.proxyAliases.create({ container_id: '507f1f77bcf86cd799439011', alias: 'my-app', program: 'http', port: 3000, target_path: null, allow_path_override: true,});Response
Section titled “Response”{ "statusCode": 201, "message": "Proxy alias created successfully", "data": { "id": "507f1f77bcf86cd799439022", "user_id": "507f1f77bcf86cd799439077", "project_id": "507f1f77bcf86cd799439033", "container_id": "507f1f77bcf86cd799439011", "alias": "my-app", "program": "http", "index": 3000, "target_path": "/api", "allow_path_override": true, "expires_at": "2025-12-31T23:59:59.000Z", "enabled": true, "created_at": "2025-01-15T10:30:00.000Z", "updated_at": "2025-01-15T10:30:00.000Z", "server_id": "507f1f77bcf86cd799439044", "server_name": "node-sg-sin-1", "subserver_name": "user-slice-7", "url": "https://my-app.node-sg-sin-1.containers.hoody.com" }}{ "statusCode": 400, "error": "Bad Request", "message": "Invalid alias format."}| Error Code | Title | Description | Resolution |
|---|---|---|---|
VALIDATION_ERROR | Invalid input parameters | One or more request parameters failed validation | Check the error message for specific field requirements and correct your input |
INVALID_ALIAS_FORMAT | Invalid Alias Format | The alias contains invalid characters or does not meet length requirements. | Alias must be 3-61 characters, contain only a-z, 0-9, and hyphens (not at start/end). |
{ "statusCode": 401, "error": "Unauthorized", "message": "Authentication token required"}| Error Code | Title | Description | Resolution |
|---|---|---|---|
MISSING_TOKEN | Authentication token missing | No authentication token was provided in the request | Include a valid JWT token in the Authorization header as Bearer <token> |
INVALID_TOKEN | Invalid authentication token | The provided authentication token is malformed or invalid | Obtain a new token by logging in again or using a valid auth token |
{ "statusCode": 403, "error": "Forbidden", "message": "Insufficient permissions"}| Error Code | Title | Description | Resolution |
|---|---|---|---|
INSUFFICIENT_PERMISSIONS | Insufficient permissions | You do not have the required permissions to perform this action | Contact the resource owner or administrator to request access |
{ "statusCode": 404, "error": "Not Found", "message": "Container not found"}| Error Code | Title | Description | Resolution |
|---|---|---|---|
CONTAINER_NOT_FOUND | Container not found | The requested container does not exist or you do not have permission to access it. | Verify the container ID is correct and that you have access to the project it belongs to. |
{ "statusCode": 409, "error": "Conflict", "message": "Alias is already in use."}| Error Code | Title | Description | Resolution |
|---|---|---|---|
ALIAS_IN_USE | Alias In Use | The requested alias is already in use by another user or project. | Choose a different alias. |
Update proxy alias
Section titled “Update proxy alias”PATCH /api/v1/proxy/aliases/{id}
Patch one or more fields of an existing alias. Only fields present in the body are touched; omitted fields stay as they were. Renaming an alias changes the URL on the server immediately. Pass target_path: null to remove a path prefix, and expires_at: null to clear an expiration.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Proxy alias ID to update |
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
alias | string | No | New alias name. Same format rules as on create. |
program | string | No | New program or protocol. |
port | integer | No | New target port for http/https (1–65535). |
index | integer | No | New instance index; for http/https it is read as the target port. Prefer port for those. |
target_path | string | No | New base path prefix. Set to null to remove the prefix. |
allow_path_override | boolean | No | Whether to allow paths beyond target_path. |
expires_at | string | number | null | No | Expiration (ISO 8601, Unix timestamp seconds/ms, or null to remove). |
enabled | boolean | No | Whether the alias is enabled. |
Request
Section titled “Request”curl -X PATCH "https://api.hoody.com/api/v1/proxy/aliases/507f1f77bcf86cd799439022" \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{ "program": "http", "port": 8080, "target_path": "/v2" }'import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://api.hoody.com', token: process.env.HOODY_TOKEN });
await client.api.proxyAliases.update('507f1f77bcf86cd799439022', { program: 'http', port: 8080, target_path: '/v2',});Response
Section titled “Response”{ "statusCode": 200, "message": "Proxy alias updated successfully", "data": { "id": "507f1f77bcf86cd799439022", "user_id": "507f1f77bcf86cd799439077", "project_id": "507f1f77bcf86cd799439033", "container_id": "507f1f77bcf86cd799439011", "alias": "updated-app-name", "program": "http", "index": 8080, "target_path": "/v2", "allow_path_override": false, "expires_at": null, "enabled": true, "created_at": "2025-01-15T10:30:00.000Z", "updated_at": "2025-01-15T14:45:00.000Z", "url": "https://updated-app-name.node-sg-sin-1.containers.hoody.com", "server_id": "507f1f77bcf86cd799439044", "server_name": "node-sg-sin-1", "subserver_name": "user-slice-7" }}{ "statusCode": 400, "error": "Bad Request", "message": "Invalid alias format."}{ "statusCode": 404, "error": "Not Found", "message": "Proxy alias not found"}{ "statusCode": 409, "error": "Conflict", "message": "Alias is already in use."}Enable or disable proxy alias
Section titled “Enable or disable proxy alias”PATCH /api/v1/proxy/aliases/{id}/state
Toggle a proxy alias on or off without deleting it. Disabled aliases continue to exist in the API but the proxy URL returns 404. If the alias name has since become reserved, a request to re-enable it is refused — rename it first, or delete it. Disabling is never refused for that reason.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Proxy alias ID |
Request Body
Section titled “Request Body”| Name | Type | Required | Description |
|---|---|---|---|
enabled | boolean | Yes | Set to true to enable, false to disable. |
Request
Section titled “Request”curl -X PATCH "https://api.hoody.com/api/v1/proxy/aliases/507f1f77bcf86cd799439022/state" \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{ "enabled": false }'import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://api.hoody.com', token: process.env.HOODY_TOKEN });
await client.api.proxyAliases.setState('507f1f77bcf86cd799439022', { enabled: false });Response
Section titled “Response”{ "statusCode": 200, "message": "Proxy alias disabled successfully", "data": { "id": "507f1f77bcf86cd799439022", "user_id": "507f1f77bcf86cd799439077", "project_id": "507f1f77bcf86cd799439033", "container_id": "507f1f77bcf86cd799439011", "alias": "my-app", "program": "http", "index": 3000, "target_path": "/api", "allow_path_override": true, "expires_at": "2025-12-31T23:59:59.000Z", "enabled": false, "created_at": "2025-01-15T10:30:00.000Z", "updated_at": "2025-01-15T14:45:00.000Z", "url": "https://my-app.node-sg-sin-1.containers.hoody.com", "server_id": "507f1f77bcf86cd799439044", "server_name": "node-sg-sin-1", "subserver_name": "user-slice-7" }}{ "statusCode": 404, "error": "Not Found", "message": "Proxy alias not found"}Delete proxy alias
Section titled “Delete proxy alias”DELETE /api/v1/proxy/aliases/{id}
Permanently delete a proxy alias and remove its file from the server. The alias URL returns 404 immediately after this call.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Proxy alias ID to delete |
Request
Section titled “Request”curl -X DELETE "https://api.hoody.com/api/v1/proxy/aliases/507f1f77bcf86cd799439022" \ -H "Authorization: Bearer <token>"import { HoodyClient } from 'hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://api.hoody.com', token: process.env.HOODY_TOKEN });
await client.api.proxyAliases.delete('507f1f77bcf86cd799439022');Response
Section titled “Response”{ "statusCode": 200, "message": "Proxy alias deleted successfully"}{ "statusCode": 404, "error": "Not Found", "message": "Proxy alias not found"}