Skip to content
Hoody.com

Proxy permissions define which requests reach your container’s services and which programs each authenticated identity may use. Use these endpoints to read, replace, mutate, or delete the authentication groups, program access rules, default policy, and proxy enable-state on a project or on a specific container. Every write operation requires the If-Match: file:v precondition header; read the current file_version from GET first (use file:v0 to bootstrap when no document is stored).

The set of supported authentication group types is jwt, password, ip, token, and hoody-identity. Each project/container stores one document containing both the groups and the per-group program permissions.

GET /api/v1/containers/{id}/proxy/permissions

Section titled “GET /api/v1/containers/{id}/proxy/permissions”

Retrieve the full proxy access control configuration for a single container, including authentication groups, per-group program permissions, default policy, and proxy enable-state.

NameInTypeRequiredDescription
idpathstringYesContainer ID
{
"statusCode": 200,
"message": "Container proxy permissions retrieved successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {},
"default": "deny",
"enable_proxy": true,
"file_version": 3,
"etag": "file:v3"
}
}
Terminal window
curl https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions

PUT /api/v1/containers/{id}/proxy/permissions

Section titled “PUT /api/v1/containers/{id}/proxy/permissions”

Replace the entire container proxy permissions document. Requires If-Match: file:v (428 when absent, 412 when stale).

NameInTypeRequiredDescription
idpathstringYesContainer ID
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
projectstringYesProject ID owning this container
containerstringYesContainer ID (must match path id)
groupsobjectYesAuthentication groups configuration
permissionsobjectYesPer-group program access rules
defaultstring (allow | deny)NoDefaults to deny if omitted
enable_proxybooleanNoEnable or disable the proxy. Defaults to true
hooksobjectNoPer-service proxy hook arrays
{
"statusCode": 200,
"message": "Container proxy permissions updated successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {},
"default": "deny"
}'

DELETE /api/v1/containers/{id}/proxy/permissions

Section titled “DELETE /api/v1/containers/{id}/proxy/permissions”

Delete the container proxy permissions document.

NameInTypeRequiredDescription
idpathstringYesContainer ID
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
{
"statusCode": 200,
"message": "Container proxy permissions deleted successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {},
"default": "allow"
}
}
Terminal window
curl -X DELETE https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions \
-H "If-Match: file:v3"

PATCH /api/v1/containers/{id}/proxy/permissions/default

Section titled “PATCH /api/v1/containers/{id}/proxy/permissions/default”

Update only the container default access policy (allow or deny) without touching groups or program permissions.

NameInTypeRequiredDescription
idpathstringYesContainer ID
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
defaultstring (allow | deny)YesDefault access policy for unmatched requests
{
"statusCode": 200,
"message": "Default policy updated successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {},
"default": "allow"
}
}
Terminal window
curl -X PATCH https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/default \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"default": "allow"}'

PATCH /api/v1/containers/{id}/proxy/permissions/state

Section titled “PATCH /api/v1/containers/{id}/proxy/permissions/state”

Enable or disable the proxy for a single container.

NameInTypeRequiredDescription
idpathstringYesContainer ID
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
enable_proxybooleanYesEnable or disable the proxy entirely
{
"statusCode": 200,
"message": "Proxy state updated successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {},
"default": "deny",
"enable_proxy": true
}
}
Terminal window
curl -X PATCH https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/state \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"enable_proxy": true}'

Configure named authentication groups for a container. Each group belongs to one of the supported types: jwt, password, ip, token, or hoody-identity.

PUT /api/v1/containers/{id}/proxy/permissions/groups/{groupName}/jwt

Section titled “PUT /api/v1/containers/{id}/proxy/permissions/groups/{groupName}/jwt”

Create or replace a JWT authentication group on a container. The JWT is verified against the configured secret/algorithm; required claims must match exactly.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
secretstringYesJWT secret key used to verify token signatures. For HS256: any string. For RS256/ES256: PEM-encoded SPKI public key.
algorithmstring (HS256 | RS256 | ES256)YesJWT algorithm to use for signature verification.
sourcesarrayYesWhere to look for JWT tokens. Format: header:Name or cookie:Name.
claimsobjectNoOptional JWT claims that must be present and match exactly. Values must be string, number, or boolean.
{
"statusCode": 200,
"message": "JWT authentication group configured successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {
"admin": {
"type": "jwt"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/groups/admin/jwt \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"secret": "shared-secret-change-me",
"algorithm": "HS256",
"sources": ["header:Authorization"],
"claims": { "role": "admin" }
}'

PUT /api/v1/containers/{id}/proxy/permissions/groups/{groupName}/password

Section titled “PUT /api/v1/containers/{id}/proxy/permissions/groups/{groupName}/password”

Create or replace a password authentication group on a container. Passwords are stored as SHA256(salt + password) in lowercase hex.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
usernamestringYesUsername for authentication. Must match exactly what the client provides.
passwordstringYesPassword for authentication. Can be plaintext (will be hashed) or pre-hashed SHA256(salt + password) in lowercase hex format.
algorithmstring (sha256)NoHashing algorithm used for password verification. Currently only SHA256 is supported.
saltstringYesSalt used for password hashing. Should be unique per user/group for security.
{
"statusCode": 200,
"message": "Password authentication group configured successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {
"users": {
"type": "password"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/groups/users/password \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"username": "admin",
"password": "s3cret",
"salt": "b3e7c4a15d2e",
"algorithm": "sha256"
}'

PUT /api/v1/containers/{id}/proxy/permissions/groups/{groupName}/ip

Section titled “PUT /api/v1/containers/{id}/proxy/permissions/groups/{groupName}/ip”

Create or replace an IP-range authentication group on a container. Matches are evaluated against the request’s source IPv4 address.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
rangestringYesIPv4 CIDR range specifying allowed IP addresses. Format: IP/mask where mask is 0-32. Examples: 192.168.1.0/24, 10.0.0.0/8, 203.0.113.5/32.
{
"statusCode": 200,
"message": "IP authentication group configured successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {
"office": {
"type": "ip"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/groups/office/ip \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"range": "192.168.1.0/24"}'

PUT /api/v1/containers/{id}/proxy/permissions/groups/{groupName}/token

Section titled “PUT /api/v1/containers/{id}/proxy/permissions/groups/{groupName}/token”

Create or replace a static-token authentication group on a container. The token must be supplied in exactly one location: a header, a cookie, or a query parameter.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first

Supply exactly one of the following shapes:

  • Header token - header (string, required) and value (string, required)
  • Cookie token - cookie (string, required) and value (string, required)
  • Query param token - param (string, required) and value (string, required)
{
"statusCode": 200,
"message": "Token authentication group configured successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {
"external-api": {
"type": "token"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/groups/external-api/token \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"header": "X-API-Key", "value": "tok_4f12a8"}'

DELETE /api/v1/containers/{id}/proxy/permissions/groups/{groupName}

Section titled “DELETE /api/v1/containers/{id}/proxy/permissions/groups/{groupName}”

Remove an authentication group from a container. Program permissions that referenced the group remain in the document but will no longer match any authenticated identity.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name to remove
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
{
"statusCode": 200,
"message": "Authentication group removed successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {
"admin": {
"type": "jwt"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X DELETE https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/groups/admin \
-H "If-Match: file:v3"

Per-group program access rules. Each rule defines WHICH instances/ports are ALLOWED, not which exist. Use true to allow all, false to deny all, a port number for a single port, an array of ports, a "8000-8100" range, or "*" as the wildcard.

PUT /api/v1/containers/{id}/proxy/permissions/permissions/{groupName}

Section titled “PUT /api/v1/containers/{id}/proxy/permissions/permissions/{groupName}”

Set or replace one program access rule for a container group.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
programstringYesProgram name to set the access rule for (e.g., http, terminal, ssh, files, exec, services, notifications).
accessboolean | number | array | stringYesAccess control rule: true = allow all, false = deny all; a number = allow only that port; an array of numbers = allow only those ports; a "8000-8100" string = allow a port range; "*" = allow all (same as true). For files, services, notifications, exec only boolean is allowed.
{
"statusCode": 200,
"message": "Group program permission set successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {
"admin": {
"http": [80, 443]
}
},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/permissions/admin \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{ "program": "http", "access": [80, 443] }'

DELETE /api/v1/containers/{id}/proxy/permissions/permissions/{groupName}

Section titled “DELETE /api/v1/containers/{id}/proxy/permissions/permissions/{groupName}”

Remove every program permission defined for a container group. The group’s authentication configuration is left untouched.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
{
"statusCode": 200,
"message": "All group permissions removed successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X DELETE https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/permissions/admin \
-H "If-Match: file:v3"

DELETE /api/v1/containers/{id}/proxy/permissions/permissions/{groupName}/{program}

Section titled “DELETE /api/v1/containers/{id}/proxy/permissions/permissions/{groupName}/{program}”

Remove a single program permission from a container group.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
programpathstringYesProgram name (e.g., http, ssh, files)
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
{
"statusCode": 200,
"message": "Program permission removed successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {},
"permissions": {
"admin": {
"http": [8080]
}
},
"default": "deny"
}
}
Terminal window
curl -X DELETE https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/proxy/permissions/permissions/admin/http \
-H "If-Match: file:v3"

Project-level documents apply to every container in the project that does not carry its own container-level proxy document. The set of supported group types is jwt, password, ip, token, and hoody-identity.

GET /api/v1/projects/{id}/proxy/permissions

Section titled “GET /api/v1/projects/{id}/proxy/permissions”

Retrieve the full proxy access control configuration for a project.

NameInTypeRequiredDescription
idpathstringYesProject ID
{
"statusCode": 200,
"message": "Project proxy permissions retrieved successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {},
"default": "deny",
"enable_proxy": true,
"file_version": 3,
"etag": "file:v3"
}
}
Terminal window
curl https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions

PUT /api/v1/projects/{id}/proxy/permissions

Section titled “PUT /api/v1/projects/{id}/proxy/permissions”

Replace the entire project proxy permissions document. Requires If-Match: file:v (428 when absent, 412 when stale).

NameInTypeRequiredDescription
idpathstringYesProject ID
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
projectstringYesProject ID (must match path id)
groupsobjectYesAuthentication groups configuration. Key is group name, value is group config.
permissionsobjectYesPer-group program permissions. Key is group name, value is a map of program -> access-rule.
defaultstring (allow | deny)NoDefault access policy when no rules match (defaults to deny if omitted)
enable_proxybooleanNoEnable or disable the proxy. Defaults to true.
{
"statusCode": 200,
"message": "Project proxy permissions updated successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {
"admin": {
"type": "jwt",
"algorithm": "HS256"
}
},
"permissions": {
"admin": {
"terminal": true,
"files": true
}
},
"default": "deny",
"enable_proxy": true
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {},
"default": "deny",
"enable_proxy": true
}'

DELETE /api/v1/projects/{id}/proxy/permissions

Section titled “DELETE /api/v1/projects/{id}/proxy/permissions”

Remove all proxy access control from a project, reverting it to open access with default allow.

NameInTypeRequiredDescription
idpathstringYesProject ID
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
{
"statusCode": 200,
"message": "Project proxy permissions deleted successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {},
"default": "allow",
"enable_proxy": true
}
}
Terminal window
curl -X DELETE https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions \
-H "If-Match: file:v3"

PATCH /api/v1/projects/{id}/proxy/permissions/default

Section titled “PATCH /api/v1/projects/{id}/proxy/permissions/default”

Update only the project default access policy. The default is the fallback for requests that match no authentication group.

NameInTypeRequiredDescription
idpathstringYesProject ID
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
defaultstring (allow | deny)YesDefault access policy for unmatched requests
{
"statusCode": 200,
"message": "Default policy updated successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PATCH https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/default \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"default": "deny"}'

PATCH /api/v1/projects/{id}/proxy/permissions/state

Section titled “PATCH /api/v1/projects/{id}/proxy/permissions/state”

Enable or disable the proxy for a project. Disabling is a kill-switch: requests that reach the proxy permission layer are denied with 403, evaluated before authentication groups, permission rules, and the default policy. Containers keep running; only proxy reachability is cut.

NameInTypeRequiredDescription
idpathstringYesProject ID
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
enable_proxybooleanYesEnable or disable the proxy entirely
{
"statusCode": 200,
"message": "Proxy state updated successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {},
"default": "deny",
"enable_proxy": false
}
}
Terminal window
curl -X PATCH https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/state \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"enable_proxy": false}'

Configure named authentication groups at the project level. Each group belongs to one of: jwt, password, ip, token, or hoody-identity.

PUT /api/v1/projects/{id}/proxy/permissions/groups/{groupName}/jwt

Section titled “PUT /api/v1/projects/{id}/proxy/permissions/groups/{groupName}/jwt”

Create or replace a JWT authentication group at the project level.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
secretstringYesJWT secret key used to verify token signatures. For HS256: any string. For RS256/ES256: PEM-encoded SPKI public key.
algorithmstring (HS256 | RS256 | ES256)YesJWT algorithm to use for signature verification.
sourcesarrayYesWhere to look for JWT tokens. Format: header:Name or cookie:Name.
claimsobjectNoOptional JWT claims that must be present and match exactly. Values must be string, number, or boolean.
{
"statusCode": 200,
"message": "JWT authentication group configured successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {
"admin": {
"type": "jwt",
"algorithm": "HS256"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/groups/admin/jwt \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"secret": "shared-secret-change-me",
"algorithm": "HS256",
"sources": ["header:Authorization"],
"claims": { "role": "admin" }
}'

PUT /api/v1/projects/{id}/proxy/permissions/groups/{groupName}/password

Section titled “PUT /api/v1/projects/{id}/proxy/permissions/groups/{groupName}/password”

Create or replace a password authentication group at the project level. Passwords are stored as SHA256(salt + password) in lowercase hex.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
usernamestringYesUsername for authentication. Must match exactly what the client provides.
passwordstringYesPassword for authentication. Can be plaintext (will be hashed) or pre-hashed SHA256(salt + password) in lowercase hex format.
algorithmstring (sha256)NoHashing algorithm used for password verification. Currently only SHA256 is supported.
saltstringYesSalt used for password hashing. Should be unique per user/group for security.
{
"statusCode": 200,
"message": "Password authentication group configured successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {
"users": {
"type": "password",
"username": "admin"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/groups/users/password \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"username": "admin",
"password": "s3cret",
"salt": "b3e7c4a15d2e",
"algorithm": "sha256"
}'

PUT /api/v1/projects/{id}/proxy/permissions/groups/{groupName}/ip

Section titled “PUT /api/v1/projects/{id}/proxy/permissions/groups/{groupName}/ip”

Create or replace an IP-range authentication group at the project level.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
rangestringYesIPv4 CIDR range specifying allowed IP addresses. Format: IP/mask where mask is 0-32. Examples: 192.168.1.0/24, 10.0.0.0/8, 203.0.113.5/32.
{
"statusCode": 200,
"message": "IP authentication group configured successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {
"office": {
"type": "ip",
"range": "192.168.1.0/24"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/groups/office/ip \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"range": "192.168.1.0/24"}'

PUT /api/v1/projects/{id}/proxy/permissions/groups/{groupName}/token

Section titled “PUT /api/v1/projects/{id}/proxy/permissions/groups/{groupName}/token”

Create or replace a static-token authentication group at the project level. Supply exactly one location: header, cookie, or param.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first

Supply exactly one of the following shapes:

  • Header token - header (string, required) and value (string, required)
  • Cookie token - cookie (string, required) and value (string, required)
  • Query param token - param (string, required) and value (string, required)
{
"statusCode": 200,
"message": "Token authentication group configured successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {
"api-clients": {
"type": "token",
"header": "X-API-Key"
}
},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/groups/api-clients/token \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"header": "X-API-Key", "value": "tok_4f12a8"}'

DELETE /api/v1/projects/{id}/proxy/permissions/groups/{groupName}

Section titled “DELETE /api/v1/projects/{id}/proxy/permissions/groups/{groupName}”

Remove an authentication group from a project. Program permissions referencing the group remain in the document but will no longer match any authenticated identity.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name to remove
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
{
"statusCode": 200,
"message": "Authentication group removed successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X DELETE https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/groups/admin \
-H "If-Match: file:v3"

Per-group program access rules at the project level. Each rule defines WHICH instances/ports are ALLOWED, not which exist.

PUT /api/v1/projects/{id}/proxy/permissions/permissions/{groupName}

Section titled “PUT /api/v1/projects/{id}/proxy/permissions/permissions/{groupName}”

Set or replace one program access rule for a project group.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
FieldTypeRequiredDescription
programstringYesProgram name to set the access rule for (e.g., http, terminal, ssh, files, exec, services, notifications).
accessboolean | number | array | stringYesAccess control rule: true = allow all, false = deny all; a number = allow only that port; an array of numbers = allow only those ports; a "8000-8100" string = allow a port range; "*" = allow all (same as true). For files, services, notifications, exec only boolean is allowed.
{
"statusCode": 200,
"message": "Group program permission set successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {
"admin": {
"http": [8080]
}
},
"default": "deny"
}
}
Terminal window
curl -X PUT https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/permissions/admin \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{ "program": "http", "access": [8080] }'

DELETE /api/v1/projects/{id}/proxy/permissions/permissions/{groupName}

Section titled “DELETE /api/v1/projects/{id}/proxy/permissions/permissions/{groupName}”

Remove every program permission defined for a project group. The group’s authentication configuration is left untouched.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
{
"statusCode": 200,
"message": "All group permissions removed successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {},
"default": "deny"
}
}
Terminal window
curl -X DELETE https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/permissions/admin \
-H "If-Match: file:v3"

DELETE /api/v1/projects/{id}/proxy/permissions/permissions/{groupName}/{program}

Section titled “DELETE /api/v1/projects/{id}/proxy/permissions/permissions/{groupName}/{program}”

Remove a single program permission from a project group.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
programpathstringYesProgram name (e.g., http, ssh, files)
if-matchheaderstringNofile:v ETag precondition - read current file_version from GET first
{
"statusCode": 200,
"message": "Program permission removed successfully",
"data": {
"project": "507f1f77bcf86cd799439011",
"groups": {},
"permissions": {
"admin": {
"http": [8080]
}
},
"default": "deny"
}
}
Terminal window
curl -X DELETE https://api.hoody.icu/api/v1/projects/507f1f77bcf86cd799439011/proxy/permissions/permissions/admin/http \
-H "If-Match: file:v3"