Configure authentication groups and access control rules that govern how requests reach the reverse proxy on a Hoody container or project. Each project and each container owns its own proxy permissions document. Mutating endpoints require an If-Match: file:v<N> header built from the current file_version (read it with GET first); the etag field on the GET response is the precomputed value. The document holds authentication groups, per-group permissions, a fallback default policy, an enable_proxy kill-switch, and (for containers) per-service hooks.
The groups object maps a group name to one of five authentication types. Every type is a gate; the type determines which credentials are accepted. Group names must match ^[A-Za-z0-9_-]{1,50}$.
Type Purpose jwtVerifies a JWT the client application issued. See the JWT section for the important caveat about Hoody identity claims. passwordVerifies a username + SHA256-hashed password with a per-group salt. ipAllows requests whose source IP falls inside an IPv4 CIDR range. tokenMatches an opaque token from a single HTTP header, cookie, or query parameter. hoody-identityVerifies the native Hoody identity claim. The supported gate for user identity; carries no key material.
The permissions object maps the same group name to program-level access rules that decide WHICH instances or ports are ALLOWED for each program (e.g. terminal, files, ui, exec, ssh, http).
These endpoints read and mutate the proxy permissions document scoped to a single container.
Retrieve the full container proxy permissions document.
Name In Type Required Description idpath string Yes Container ID
" message " : " Container proxy permissions retrieved successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Container not found "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . get ( id );
curl -X GET " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions " \
-H " Authorization: Bearer $HOODY_TOKEN "
Replace the container proxy permissions document. Pass the document body in the request and If-Match: file:v<N> to prevent lost updates. When the header is missing the API returns 428; when stale it returns 412.
Name In Type Required Description idpath string Yes Container ID if-matchheader string No file:v<N> ETag precondition; read current file_version from GET first
Field Type Required Description projectstring Yes Project ID owning this container (24-hex) containerstring Yes Container ID, must match the path :id (24-hex) groupsobject Yes Authentication groups keyed by group name permissionsobject Yes Per-group program access rules defaultstring No "allow" or "deny". Defaults to "deny" if omitted.enable_proxyboolean No Enable or disable the proxy. Defaults to true. hooksobject No Per-service proxy hook arrays. See below.
Each entry in groups uses one of the five type values: jwt, password, ip, token, or hoody-identity. The hoody-identity config is { audience (REQUIRED), sources?, allow_types?, users?, max_age_seconds? (>=300), expose_type? } and never carries key material — the trust keyring is operator-owned.
The hooks object maps a service name to a first-match-wins array of { match, script, timeout? } rules. Max 8 per service, 32 per file total. The reject-listed services are logs, proxy, workspaces, and cdp.
" message " : " Container proxy permissions updated successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Invalid proxy permissions configuration "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . replace ( id , {
project : ' 507f1f77bcf86cd799439011 ' ,
container : ' 507f1f77bcf86cd799439012 ' ,
secret : ' replace-with-strong-secret ' ,
sources : [ ' header:Authorization ' ],
admin : { terminal : true , files : true },
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"secret": "replace-with-strong-secret",
"sources": ["header:Authorization"]
"admin": { "terminal": true, "files": true }
Create or update a single JWT authentication group on a container.
This group verifies JWTs your app issues — not Hoody identity claims
The identity_claim returned by Hoody login is a detached-signature ED25519 bundle, not a JWT, and cannot be validated by a jwt group. The native hoody-identity group type is the supported gate for Hoody-signed user identity. See Hoody identity authentication and Identity claims for details.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name to create or update if-matchheader string No file:v<N> ETag precondition
Field Type Required Description secretstring Yes JWT secret key. For HS256, any string. For RS256/ES256, a PEM-encoded SPKI public key. Max length 8192. algorithmstring Yes One of "HS256", "RS256", "ES256". sourcesarray of string Yes Token lookup locations. Each item matches ^(header|cookie):[A-Za-z0-9._-]{1,64}$, e.g. "header:Authorization", "cookie:jwt_token". claimsobject No Claim values that must be present and match exactly. Values must be string, number, or boolean.
" message " : " JWT authentication group configured successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Invalid JWT configuration "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . setJwtGroup ( id , ' admin ' , {
secret : ' replace-with-strong-secret ' ,
sources : [ ' header:Authorization ' ],
claims : { role : ' admin ' },
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/admin/jwt " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
"secret": "replace-with-strong-secret",
"sources": ["header:Authorization"],
"claims": { "role": "admin" }
Create or update a password authentication group on a container. The stored password is SHA256(salt + password) in lowercase hex; supply either plaintext (which the API hashes server-side) or the precomputed hex digest.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name to create or update if-matchheader string No file:v<N> ETag precondition
Field Type Required Description usernamestring Yes Username the client must present passwordstring Yes Plaintext password or pre-hashed SHA256(salt + password) hex digest saltstring Yes Per-group salt. Use a unique value per user/group. algorithmstring No "sha256" (only supported value)
" message " : " Password authentication group configured successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Invalid password configuration "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . setPasswordGroup ( id , ' users ' , {
salt : ' unique-salt-value ' ,
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/users/password " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
"salt": "unique-salt-value",
Create or update an IP-range authentication group on a container. The group matches when the request source IP falls inside the IPv4 CIDR range.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name to create or update if-matchheader string No file:v<N> ETag precondition
Field Type Required Description rangestring Yes IPv4 CIDR range in IP/mask form where mask is 0-32, e.g. 192.168.1.0/24, 10.0.0.0/8, 203.0.113.5/32.
" message " : " IP authentication group configured successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Invalid IP CIDR range "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . setIpGroup ( id , ' office ' , {
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/office/ip " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "range": "192.168.1.0/24" } '
Create or update a token authentication group on a container. The body must specify exactly one location — header, cookie, or query parameter — and the expected token value.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name to create or update if-matchheader string No file:v<N> ETag precondition
One of the following shapes (choose exactly one):
Field Type Required Description headerstring Yes (in header variant) HTTP header name to inspect (case-insensitive) valuestring Yes (in header variant) Expected token value, matched exactly cookiestring Yes (in cookie variant) Cookie name to inspect (case-sensitive) valuestring Yes (in cookie variant) Expected token value, matched exactly paramstring Yes (in query variant) Query parameter name to inspect (case-sensitive) valuestring Yes (in query variant) Expected token value, matched exactly
" message " : " Token authentication group configured successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Invalid token configuration "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . setTokenGroup ( id , ' external-api ' , {
value : ' replace-with-strong-key ' ,
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/external-api/token " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "header": "X-API-Key", "value": "replace-with-strong-key" } '
Set or update the access rule for a single program on a container group. The body selects the program and the rule that decides which instances or ports are ALLOWED for it.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name if-matchheader string No file:v<N> ETag precondition
Field Type Required Description programstring Yes Program name (e.g. http, terminal, ssh, files, exec, services, notifications) accessboolean | number | number[] | string Yes Access rule. See below.
The access value is an access CONTROL rule defining WHAT IS ALLOWED, not a list of what exists. It accepts any of:
true / false — allow/deny every instance or port.
A single number — allow only that specific port or index.
An array of numbers — allow only those specific ports or indices.
A range string "<start>-<end>" — allow only that port range.
The wildcard "*" — allow every instance (same as true).
For files, services, notifications, and exec, only the boolean form is allowed.
" message " : " Group program permission set successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Invalid permission value "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . setGroup ( id , ' admin ' , {
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/permissions/admin " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "program": "http", "access": [80, 443] } '
Update only the fallback default policy for the container proxy permissions document.
Name In Type Required Description idpath string Yes Container ID if-matchheader string No file:v<N> ETag precondition
Field Type Required Description defaultstring Yes "allow" or "deny"
" message " : " Default policy updated successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . updateDefault ( id , { default : ' allow ' }, { ifMatch : ' file:v3 ' });
curl -X PATCH " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/default " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "default": "allow" } '
Update only the enable_proxy kill-switch for the container proxy permissions document. Setting false denies every new request that reaches the proxy permission layer with 403, evaluated before authentication groups, permission rules, and the default policy. Containers keep running; only proxy reachability is cut.
Name In Type Required Description idpath string Yes Container ID if-matchheader string No file:v<N> ETag precondition
Field Type Required Description enable_proxyboolean Yes true to enable, false to disable
" message " : " Proxy state updated successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . updateState ( id , { enable_proxy : true }, { ifMatch : ' file:v3 ' });
curl -X PATCH " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/state " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "enable_proxy": true } '
Remove a single authentication group from the container proxy permissions document. The group’s entry under permissions is also removed.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name to remove if-matchheader string No file:v<N> ETag precondition
" message " : " Authentication group removed successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Container or group not found "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . removeAuthGroup ( id , ' admin ' , { ifMatch : ' file:v3 ' });
curl -X DELETE " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/admin " \
-H " Authorization: Bearer $HOODY_TOKEN " \
Remove every program permission for a container group in one call. The authentication group entry under groups is left untouched.
Name In Type Required Description idpath string Yes Container ID groupNamepath string Yes Group name if-matchheader string No file:v<N> ETag precondition
" message " : " All group permissions removed successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . removeGroup ( id , ' admin ' , { ifMatch : ' file:v3 ' });
curl -X DELETE " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/permissions/admin " \
-H " Authorization: Bearer $HOODY_TOKEN " \
Remove the access rule for a single program on a container group. Other program rules for the same group remain.
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<N> ETag precondition
" message " : " Program permission removed successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . removeProgram ( id , ' admin ' , ' http ' , { ifMatch : ' file:v3 ' });
curl -X DELETE " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/permissions/admin/http " \
-H " Authorization: Bearer $HOODY_TOKEN " \
Delete the entire container proxy permissions document.
Name In Type Required Description idpath string Yes Container ID if-matchheader string No file:v<N> ETag precondition
" message " : " Container proxy permissions deleted successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" container " : " 507f1f77bcf86cd799439012 " ,
" message " : " Container not found "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsContainer . delete ( id , { ifMatch : ' file:v3 ' });
curl -X DELETE " https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions " \
-H " Authorization: Bearer $HOODY_TOKEN " \
These endpoints read and mutate the proxy permissions document scoped to an entire project. A project’s document applies to every container in the project that does not set its own container-level override.
Project `enable_proxy` does not override container settings
The project-level enable_proxy is evaluated only for containers that do not set their own enable_proxy. A container document with enable_proxy: true overrides a disabled project, and saving a container permissions document persists an explicit true. To reliably disable a single container, use the container-level state endpoint.
Retrieve the full project proxy permissions document, including authentication groups, program permissions, default policy, and the proxy enable state.
Name In Type Required Description idpath string Yes Project ID
" 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
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . get ( id );
curl -X GET " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions " \
-H " Authorization: Bearer $HOODY_TOKEN "
Replace the project proxy permissions document. Pass the document body in the request and If-Match: file:v<N> to prevent lost updates. When the header is missing the API returns 428; when stale it returns 412.
Name In Type Required Description idpath string Yes Project ID if-matchheader string No file:v<N> ETag precondition; read current file_version from GET first
Field Type Required Description projectstring Yes Project ID, must match the path :id (24-hex) groupsobject Yes Authentication groups keyed by group name permissionsobject Yes Per-group program access rules defaultstring No "allow" or "deny". Defaults to "deny".enable_proxyboolean No Enable or disable the proxy. Defaults to true.
Each entry in groups uses one of the five type values: jwt, password, ip, token, or hoody-identity. The hoody-identity config is { audience (REQUIRED), sources?, allow_types?, users?, max_age_seconds? (>=300), expose_type? } and never carries key material — the trust keyring is operator-owned.
" 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
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . replace ( id , {
project : ' 507f1f77bcf86cd799439011 ' ,
secret : ' replace-with-strong-secret ' ,
sources : [ ' header:Authorization ' ],
admin : { terminal : true , files : true },
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
"project": "507f1f77bcf86cd799439011",
"secret": "replace-with-strong-secret",
"sources": ["header:Authorization"]
"admin": { "terminal": true, "files": true }
Create or update a single JWT authentication group on a project.
This group verifies JWTs your app issues — not Hoody identity claims
The identity_claim returned by Hoody login is a detached-signature ED25519 bundle, not a JWT, and cannot be validated by a jwt group. The native hoody-identity group type is the supported gate for Hoody-signed user identity. See Hoody identity authentication and Identity claims for details.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name to create or update if-matchheader string No file:v<N> ETag precondition
Field Type Required Description secretstring Yes JWT secret key. For HS256, any string. For RS256/ES256, a PEM-encoded SPKI public key. Max length 8192. algorithmstring Yes One of "HS256", "RS256", "ES256". sourcesarray of string Yes Token lookup locations. Each item matches ^(header|cookie):[A-Za-z0-9._-]{1,64}$, e.g. "header:Authorization", "cookie:jwt_token". claimsobject No Claim values that must be present and match exactly. Values must be string, number, or boolean.
" message " : " JWT authentication group configured successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" message " : " Invalid JWT configuration "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . setJwtGroup ( id , ' admin ' , {
secret : ' replace-with-strong-secret ' ,
sources : [ ' header:Authorization ' ],
claims : { role : ' admin ' },
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/admin/jwt " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
"secret": "replace-with-strong-secret",
"sources": ["header:Authorization"],
"claims": { "role": "admin" }
Create or update a password authentication group on a project.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name to create or update if-matchheader string No file:v<N> ETag precondition
Field Type Required Description usernamestring Yes Username the client must present passwordstring Yes Plaintext password or pre-hashed SHA256(salt + password) hex digest saltstring Yes Per-group salt. Use a unique value per user/group. algorithmstring No "sha256" (only supported value)
" message " : " Password authentication group configured successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" message " : " Invalid password configuration "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . setPasswordGroup ( id , ' users ' , {
salt : ' unique-salt-value ' ,
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/users/password " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
"salt": "unique-salt-value",
Create or update an IP-range authentication group on a project. The group matches when the request source IP falls inside the IPv4 CIDR range.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name to create or update if-matchheader string No file:v<N> ETag precondition
Field Type Required Description rangestring Yes IPv4 CIDR range in IP/mask form where mask is 0-32, e.g. 192.168.1.0/24, 10.0.0.0/8, 203.0.113.5/32.
" message " : " IP authentication group configured successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" message " : " Invalid IP CIDR range "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . setIpGroup ( id , ' office ' , {
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/office/ip " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "range": "192.168.1.0/24" } '
Create or update a token authentication group on a project. The body must specify exactly one location — header, cookie, or query parameter — and the expected token value.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name to create or update if-matchheader string No file:v<N> ETag precondition
One of the following shapes (choose exactly one):
Field Type Required Description headerstring Yes (in header variant) HTTP header name to inspect (case-insensitive) valuestring Yes (in header variant) Expected token value, matched exactly cookiestring Yes (in cookie variant) Cookie name to inspect (case-sensitive) valuestring Yes (in cookie variant) Expected token value, matched exactly paramstring Yes (in query variant) Query parameter name to inspect (case-sensitive) valuestring Yes (in query variant) Expected token value, matched exactly
" message " : " Token authentication group configured successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" message " : " Invalid token configuration "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . setTokenGroup ( id , ' api-clients ' , {
value : ' replace-with-strong-key ' ,
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/api-clients/token " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "header": "X-API-Key", "value": "replace-with-strong-key" } '
Set or update the access rule for a single program on a project group.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name if-matchheader string No file:v<N> ETag precondition
Field Type Required Description programstring Yes Program name (e.g. http, terminal, ssh, files, exec, services, notifications) accessboolean | number | number[] | string Yes Access rule. See below.
The access value is an access CONTROL rule defining WHAT IS ALLOWED, not a list of what exists. It accepts any of:
true / false — allow/deny every instance or port.
A single number — allow only that specific port or index.
An array of numbers — allow only those specific ports or indices.
A range string "<start>-<end>" — allow only that port range.
The wildcard "*" — allow every instance (same as true).
For files, services, notifications, and exec, only the boolean form is allowed.
" message " : " Group program permission set successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" message " : " Invalid permission value "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . setGroup ( id , ' admin ' , {
}, { ifMatch : ' file:v3 ' });
curl -X PUT " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/permissions/admin " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "program": "http", "access": [8080] } '
Update the fallback default policy for the project proxy permissions document. This is the policy evaluated for requests that match no authentication group rules.
Name In Type Required Description idpath string Yes Project ID if-matchheader string No file:v<N> ETag precondition
Field Type Required Description defaultstring Yes "allow" or "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
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . updateDefault ( id , { default : ' deny ' }, { ifMatch : ' file:v3 ' });
curl -X PATCH " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/default " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "default": "deny" } '
Update the enable_proxy kill-switch for the project proxy permissions document. Disabling the project kill-switch denies every new request that reaches the proxy permission layer with 403, evaluated before authentication groups, permission rules, and the default policy, so no configured rule can re-open access while the switch is off. Containers keep running; only proxy reachability is cut.
The project value applies only to containers that do not set their own enable_proxy. To reliably disable a single container, use the container-level state endpoint.
Name In Type Required Description idpath string Yes Project ID if-matchheader string No file:v<N> ETag precondition
Field Type Required Description enable_proxyboolean Yes true to enable, false to disable
" 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
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . updateState ( id , { enable_proxy : false }, { ifMatch : ' file:v3 ' });
curl -X PATCH " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/state " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-d ' { "enable_proxy": false } '
Remove a single authentication group from the project proxy permissions document. The group’s entry under permissions is also removed.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name to remove if-matchheader string No file:v<N> ETag precondition
" message " : " Authentication group removed successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
" message " : " Project or group not found "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . removeAuthGroup ( id , ' admin ' , { ifMatch : ' file:v3 ' });
curl -X DELETE " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/admin " \
-H " Authorization: Bearer $HOODY_TOKEN " \
Remove every program permission for a project group in one call. The authentication group entry under groups is left untouched.
Name In Type Required Description idpath string Yes Project ID groupNamepath string Yes Group name if-matchheader string No file:v<N> ETag precondition
" message " : " All group permissions removed successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . removeGroup ( id , ' admin ' , { ifMatch : ' file:v3 ' });
curl -X DELETE " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/permissions/admin " \
-H " Authorization: Bearer $HOODY_TOKEN " \
Remove the access rule for a single program on a project group. Other program rules for the same group remain.
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<N> ETag precondition
" message " : " Program permission removed successfully " ,
" project " : " 507f1f77bcf86cd799439011 " ,
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . removeProgram ( id , ' admin ' , ' http ' , { ifMatch : ' file:v3 ' });
curl -X DELETE " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/permissions/admin/http " \
-H " Authorization: Bearer $HOODY_TOKEN " \
Remove all proxy access control configuration from the project. The project reverts to the default open-access posture with the default policy set to "allow".
Name In Type Required Description idpath string Yes Project ID if-matchheader string No file:v<N> ETag precondition
" 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
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://api.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . api . proxyPermissionsProject . delete ( id , { ifMatch : ' file:v3 ' });
curl -X DELETE " https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions " \
-H " Authorization: Bearer $HOODY_TOKEN " \