Proxy permissions define how the Hoody proxy layer authenticates incoming requests and routes them to container programs. A permissions file is a JSON document containing authentication groups (JWT, password, IP, or token), per-group program access rules, and a default deny/allow policy. Project-level permissions apply to every container in the project; container-level permissions override or extend them. Use these endpoints to read, replace, or surgically update these documents. Write operations require an If-Match: file:v precondition header (read the current file_version via GET first) — the server returns 428 if the header is absent and 412 if the version is stale.
Note
The access field on a program permission is a rule defining what is allowed , not a list of what currently exists. Values: true/false (allow/deny all), a single port number, an array of port numbers, a port range string like "8000-8100", or the wildcard "*".
Retrieve the complete proxy access control configuration for a project, including authentication groups, program permissions, and default policy.
Name In Type Required Description idpath string Yes Project ID
const { data } = await client . api . proxyPermissionsProject . get ( { id: " 507f1f77bcf86cd799439011 " } );
"message" : " Project proxy permissions retrieved successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Project not found "
Error Code Title Description Resolution PROJECT_NOT_FOUNDProject not found The specified project ID does not exist or you do not have access to it Verify the project ID is correct and that you have permission to access this project
Replace the entire proxy permissions configuration for a project. Requires If-Match: file:v (428 when absent, 412 when stale).
Name In Type Required Description idpath string Yes Project ID if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description projectstring Yes Project ID (must match path :id) groupsobject Yes Authentication groups. Key is group name, value is group config. permissionsobject Yes Per-group program permissions. Key is group name, value is map of program → access rule. defaultstring No Default access policy when no rules match. One of "allow", "deny". Defaults to "deny". enable_proxyboolean No Enable or disable the proxy. Defaults to true.
The groups values may include the following auth-type-specific fields:
JWT (type: "jwt"): secret, algorithm ("HS256" | "RS256" | "ES256"), sources (e.g. ["header:Authorization"]), claims (optional required claim values).
Password (type: "password"): username, password, salt, algorithm ("sha256").
IP (type: "ip"): range (IPv4 CIDR).
Token (type: "token"): header + value, or cookie + value, or param + value.
The permissions values are access rules per program name (terminal, files, ui, exec, etc.). See the note above for the access rule grammar.
await client . api . proxyPermissionsProject . replace ({
id: " 507f1f77bcf86cd799439011 " ,
project: " 507f1f77bcf86cd799439011 " ,
admin: { type: " jwt " , algorithm: " HS256 " , secret: " shhh " , sources: [ " header:Authorization " ] }
admin: { terminal: [ 1 , 2 ], files: true }
"message" : " Project proxy permissions updated successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"admin" : { "type" : " jwt " , "algorithm" : " HS256 " }
"admin" : { "terminal" : true , "files" : true }
"message" : " Invalid permissions configuration "
Error Code Title Description Resolution VALIDATION_ERRORInvalid input parameters The proxy permissions configuration contains invalid data or missing required fields Check that all required fields are present and properly formatted according to the schema INVALID_JWT_CONFIGInvalid JWT configuration JWT authentication group has invalid secret, algorithm, or sources configuration Ensure JWT secret is valid for the algorithm, sources are properly formatted, and claims are scalar values INVALID_IP_RANGEInvalid IP CIDR range IP authentication group has an invalid IPv4 CIDR notation Use valid IPv4 CIDR format like "192.168.1.0/24" or "10.0.0.1/32"
"message" : " Project not found "
Error Code Title Description Resolution PROJECT_NOT_FOUNDProject not found The specified project ID does not exist or you do not have access to it Verify the project ID is correct and that you have permission to access this project
Update the default access policy ("allow" or "deny") that applies when a request does not match any authentication group rules.
Name In Type Required Description idpath string Yes Project ID if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description defaultstring Yes Default access policy for unmatched requests. One of "allow", "deny".
await client . api . proxyPermissionsProject . updateDefault ({
id: " 507f1f77bcf86cd799439011 " ,
data: { default: " deny " }
"message" : " Default policy updated successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Invalid default policy value "
Error Code Title Description Resolution VALIDATION_ERRORInvalid default policy The default policy must be either "allow" or "deny" Provide a valid default value: "allow" or "deny"
"message" : " Project not found "
Error Code Title Description Resolution PROJECT_NOT_FOUNDProject not found The specified project ID does not exist or you do not have access to it Verify the project ID is correct and that you have permission to access this project
Enable or disable the proxy entirely for a project. When disabled, the proxy layer is bypassed and all access control is removed regardless of configured rules.
Name In Type Required Description idpath string Yes Project ID if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description enable_proxyboolean Yes Enable or disable the proxy entirely
await client . api . proxyPermissionsProject . updateState ({
id: " 507f1f77bcf86cd799439011 " ,
data: { enable_proxy: true }
"message" : " Proxy state updated successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Invalid enable_proxy value "
Error Code Title Description Resolution VALIDATION_ERRORInvalid enable_proxy value The enable_proxy field must be a boolean (true or false) Provide a valid boolean value: true to enable proxy, false to disable
"message" : " Project not found "
Error Code Title Description Resolution PROJECT_NOT_FOUNDProject not found The specified project ID does not exist or you do not have access to it Verify the project ID is correct and that you have permission to access this project
Remove all proxy access control configuration from a project, reverting it to open access with a default "allow" policy. This clears all authentication groups and permission rules.
Name In Type Required Description idpath string Yes Project ID if-matchheader string No file:v ETag precondition — read current file_version from GET first
await client . api . proxyPermissionsProject . delete ({
id: " 507f1f77bcf86cd799439011 " ,
"message" : " Project proxy permissions deleted successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Project not found "
Error Code Title Description Resolution PROJECT_NOT_FOUNDProject not found The specified project ID does not exist or you do not have access to it Verify the project ID is correct and that you have permission to access this project
Set or replace an IP-based authentication group for a project.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description rangestring Yes IPv4 CIDR range. Format: IP/mask (mask 0-32). Example: "192.168.1.0/24".
await client . api . proxyPermissionsProject . setIpGroup ({
id: " 507f1f77bcf86cd799439011 " ,
data: { range: " 192.168.1.0/24 " }
"message" : " IP authentication group configured successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Invalid IP CIDR range "
Set or replace a JWT-based authentication group for a project.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description secretstring Yes JWT secret key. For HS256: any string. For RS256/ES256: PEM-encoded public key. algorithmstring Yes One of "HS256", "RS256", "ES256". sourcesarray Yes Token source locations. Each item matches ^(header|cookie):Name$. Example: ["header:Authorization"]. claimsobject No Required JWT claims that must be present and match exactly. Values must be string, number, or boolean.
await client . api . proxyPermissionsProject . setJwtGroup ({
id: " 507f1f77bcf86cd799439011 " ,
secret: " super-secret-key " ,
sources: [ " header:Authorization " ],
claims: { role: " admin " }
"message" : " JWT authentication group configured successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Invalid JWT configuration "
Set or replace a password-based authentication group for a project.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description usernamestring Yes Username for authentication. Must match exactly what the client provides. passwordstring Yes Plaintext (will be hashed) or pre-hashed SHA256(salt+password) in lowercase hex. saltstring Yes Salt for password hashing. Should be unique per user/group. algorithmstring No Hashing algorithm. Currently only "sha256".
await client . api . proxyPermissionsProject . setPasswordGroup ({
id: " 507f1f77bcf86cd799439011 " ,
"message" : " Password authentication group configured successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Invalid password configuration "
Set or replace a static-token authentication group for a project. The request body must specify exactly one token location: header+value, cookie+value, or param+value.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
The body uses a oneOf schema. Supply exactly one of these shapes:
Shape Fields Header header (string, required), value (string, required)Cookie cookie (string, required), value (string, required)Query param param (string, required), value (string, required)
await client . api . proxyPermissionsProject . setTokenGroup ({
id: " 507f1f77bcf86cd799439011 " ,
groupName: " api-clients " ,
data: { header: " X-API-Key " , value: " tok_live_abc123 " }
"message" : " Token authentication group configured successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Invalid token configuration "
Remove an authentication group from a project. This deletes only the group entry; any program permissions that reference the group name are left in place.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name to remove if-matchheader string No file:v ETag precondition — read current file_version from GET first
await client . api . proxyPermissionsProject . removeAuthGroup ({
id: " 507f1f77bcf86cd799439011 " ,
"message" : " Authentication group removed successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Project or group not found "
Set a single program access rule for a project’s authentication group. The access value defines which ports/instances are allowed.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description programstring Yes Program name to set the access rule for (e.g. http, terminal, ssh, files, exec, services, notifications). accessboolean | number | array | string Yes Access rule. See the access-rule grammar at the top of this page.
await client . api . proxyPermissionsProject . setGroup ({
id: " 507f1f77bcf86cd799439011 " ,
data: { program: " http " , access: true }
"message" : " Group program permission set successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"message" : " Invalid permission value "
Remove all program permissions for a project’s group in a single call.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
await client . api . proxyPermissionsProject . removeGroup ({
id: " 507f1f77bcf86cd799439011 " ,
"message" : " All group permissions removed successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
Remove a single program permission from a project’s group.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name programpath string Yes Program name (e.g. http, ssh, files) if-matchheader string No file:v ETag precondition — read current file_version from GET first
await client . api . proxyPermissionsProject . removeProgram ({
id: " 507f1f77bcf86cd799439011 " ,
"message" : " Program permission removed successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
Retrieve the complete proxy access control configuration for a single container.
Name In Type Required Description idpath string Yes Container ID
const { data } = await client . api . proxyPermissionsContainer . get ( { id: " 507f1f77bcf86cd799439012 " } );
"message" : " Container proxy permissions retrieved successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Container not found "
Replace the container proxy permissions configuration. Requires If-Match: file:v (428 when absent, 412 when stale).
Name In Type Required Description idpath string Yes Container ID if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description projectstring Yes Project ID owning this container containerstring Yes Container ID (must match path :id) groupsobject Yes Authentication groups. Key is group name, value is group config. permissionsobject Yes Per-group program permissions. Key is group name, value is map of program → access rule. defaultstring No Default access policy. One of "allow", "deny". Defaults to "deny". enable_proxyboolean No Enable or disable the proxy. Defaults to true. hooksobject No Per-service proxy hooks. Keys are service names; values are first-match-wins arrays of { match, script, timeout? } rules. Max 8 per service, 32 per file total. Reject-listed services: logs, proxy, workspaces.
The groups value structure and permissions value structure are the same as the project-level replace endpoint (see above). The access rule grammar is documented at the top of this page.
await client . api . proxyPermissionsContainer . replace ({
id: " 507f1f77bcf86cd799439012 " ,
project: " 507f1f77bcf86cd799439011 " ,
container: " 507f1f77bcf86cd799439012 " ,
admin: { terminal: [ 1 , 2 ], files: true }
"message" : " Container proxy permissions updated successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Invalid proxy permissions configuration "
Update the container’s default access policy.
Name In Type Required Description idpath string Yes Container ID if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description defaultstring Yes Default access policy for unmatched requests. One of "allow", "deny".
await client . api . proxyPermissionsContainer . updateDefault ({
id: " 507f1f77bcf86cd799439012 " ,
data: { default: " allow " }
"message" : " Default policy updated successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
Enable or disable the proxy for a single container.
Name In Type Required Description idpath string Yes Container ID if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description enable_proxyboolean Yes Enable or disable the proxy entirely
await client . api . proxyPermissionsContainer . updateState ({
id: " 507f1f77bcf86cd799439012 " ,
data: { enable_proxy: true }
"message" : " Proxy state updated successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
Delete the container’s proxy permissions document. The container reverts to a default "allow" policy with the proxy enabled.
Name In Type Required Description idpath string Yes Container ID if-matchheader string No file:v ETag precondition — read current file_version from GET first
await client . api . proxyPermissionsContainer . delete ({
id: " 507f1f77bcf86cd799439012 " ,
"message" : " Container proxy permissions deleted successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Container not found "
Set or replace an IP-based authentication group for a container.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description rangestring Yes IPv4 CIDR range. Format: IP/mask (mask 0-32). Example: "10.0.0.0/8".
await client . api . proxyPermissionsContainer . setIpGroup ({
id: " 507f1f77bcf86cd799439012 " ,
data: { range: " 10.0.0.0/8 " }
"message" : " IP authentication group configured successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Invalid IP CIDR range "
Set or replace a JWT-based authentication group for a container.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description secretstring Yes JWT secret key. For HS256: any string. For RS256/ES256: PEM-encoded public key. algorithmstring Yes One of "HS256", "RS256", "ES256". sourcesarray Yes Token source locations. Each item matches ^(header|cookie):Name$. claimsobject No Required JWT claims that must be present and match exactly. Values must be string, number, or boolean.
await client . api . proxyPermissionsContainer . setJwtGroup ({
id: " 507f1f77bcf86cd799439012 " ,
secret: " container-secret " ,
sources: [ " cookie:jwt_token " ]
"message" : " JWT authentication group configured successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Invalid JWT configuration "
Set or replace a password-based authentication group for a container.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description usernamestring Yes Username for authentication. passwordstring Yes Plaintext (will be hashed) or pre-hashed SHA256(salt+password) in lowercase hex. saltstring Yes Salt for password hashing. algorithmstring No Hashing algorithm. Currently only "sha256".
await client . api . proxyPermissionsContainer . setPasswordGroup ({
id: " 507f1f77bcf86cd799439012 " ,
salt: " container-salt-xyz " ,
"message" : " Password authentication group configured successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Invalid password configuration "
Set or replace a static-token authentication group for a container. The request body must specify exactly one token location.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
The body uses a oneOf schema. Supply exactly one of these shapes:
Shape Fields Header header (string, required), value (string, required)Cookie cookie (string, required), value (string, required)Query param param (string, required), value (string, required)
await client . api . proxyPermissionsContainer . setTokenGroup ({
id: " 507f1f77bcf86cd799439012 " ,
groupName: " external-api " ,
data: { header: " X-Container-Token " , value: " tok_container_xyz " }
"message" : " Token authentication group configured successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Invalid token configuration "
Remove an authentication group from a container.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name to remove if-matchheader string No file:v ETag precondition — read current file_version from GET first
await client . api . proxyPermissionsContainer . removeAuthGroup ({
id: " 507f1f77bcf86cd799439012 " ,
"message" : " Authentication group removed successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Container or group not found "
Set a single program access rule for a container’s authentication group.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
Field Type Required Description programstring Yes Program name (e.g. http, terminal, ssh, files, exec, services, notifications). accessboolean | number | array | string Yes Access rule. See the access-rule grammar at the top of this page.
await client . api . proxyPermissionsContainer . setGroup ({
id: " 507f1f77bcf86cd799439012 " ,
data: { program: " http " , access: [ 80 , 443 ] }
"message" : " Group program permission set successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
"message" : " Invalid permission value "
Remove all program permissions for a container’s group.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name if-matchheader string No file:v ETag precondition — read current file_version from GET first
await client . api . proxyPermissionsContainer . removeGroup ({
id: " 507f1f77bcf86cd799439012 " ,
"message" : " All group permissions removed successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,
Remove a single program permission from a container’s group.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name programpath string Yes Program name (e.g. http, ssh, files) if-matchheader string No file:v ETag precondition — read current file_version from GET first
await client . api . proxyPermissionsContainer . removeProgram ({
id: " 507f1f77bcf86cd799439012 " ,
"message" : " Program permission removed successfully " ,
"project" : " 507f1f77bcf86cd799439011 " ,
"container" : " 507f1f77bcf86cd799439012 " ,