Skip to content
Hoody.com

Configure authentication groups and program access rules for proxy endpoints. This page covers both project-level and container-level permissions documents, including reading, replacing, and incrementally updating groups, default policy, and the proxy enable flag. Each document is versioned: read the current file_version via GET, then pass it back as If-Match: file:v<N> on writes.

The supported group types are jwt, password, ip, token, and hoody-identity. The hoody-identity type authenticates against the identity claim returned by Hoody login and never carries operator-owned key material; use it instead of jwt whenever you need to gate a proxy on a logged-in Hoody user.

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

Retrieve the full proxy access control configuration for a project, including authentication groups, program permissions, and the default policy.

NameInTypeRequiredDescription
idpathstringYesProject ID
Terminal window
curl -X GET https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions \
-H "Authorization: Bearer <token>"

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

PATCH is also accepted on this endpoint with identical behaviour.

Replace the entire proxy permissions configuration for a project with a new configuration. This operation sets authentication groups, program access rules, default policy, and proxy enable state.

NameInTypeRequiredDescription
idpathstringYesProject ID
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
projectstringYesProject ID. Must match path id.
groupsobjectYesAuthentication groups. Key is group name (^[A-Za-z0-9_-]{1,50}$), value is group config. Supported types: jwt, password, ip, token, hoody-identity.
permissionsobjectYesPer-group program permissions. Key is group name, value is map of program to access rule.
defaultstringNoDefault access policy when no rules match. Allowed values: allow, deny. Defaults to deny.
enable_proxybooleanNoEnable or disable the proxy. Defaults to true.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"project": "507f1f77bcf86cd799439011",
"groups": {
"admin": {
"type": "jwt",
"algorithm": "HS256",
"secret": "replace-with-strong-secret",
"sources": ["header:Authorization"]
}
},
"permissions": {
"admin": {
"terminal": true,
"files": true
}
},
"default": "deny",
"enable_proxy": true
}'

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

Update the default access policy (allow or deny) that applies when a request does not match any authentication group rules.

NameInTypeRequiredDescription
idpathstringYesProject ID
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
defaultstringYesDefault access policy for unmatched requests. Allowed values: allow, deny.
Terminal window
curl -X PATCH https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/default \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"default": "deny"}'

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

Enable or disable the proxy for a project. Disabling is a kill-switch, not a bypass: while enable_proxy is false, new requests that reach the proxy permission layer are denied with 403, evaluated before authentication groups, permission rules, and the default policy, so no configured rule can re-open access while it is off. Containers keep running; only proxy reachability is cut.

NameInTypeRequiredDescription
idpathstringYesProject ID
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
enable_proxybooleanYesEnable or disable the proxy entirely.

The SDK has one method per value. Each pins enable_proxy itself, so pass an empty data object:

  • client.api.proxy.projectPermissions.enable(id, {}, { ifMatch }) sets enable_proxy to true.
  • client.api.proxy.projectPermissions.disable(id, {}, { ifMatch }) sets enable_proxy to false.
Terminal window
curl -X PATCH https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/state \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"enable_proxy": false}'

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

PATCH is also accepted on this endpoint with identical behaviour.

Configure an ip authentication group that allows requests from a specific IPv4 CIDR range.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
rangestringYesIPv4 CIDR range. Examples: 192.168.1.0/24, 10.0.0.0/8, 203.0.113.5/32.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/office/ip \
-H "Authorization: Bearer <token>" \
-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}/jwt

PATCH is also accepted on this endpoint with identical behaviour.

Configure a jwt authentication group that verifies tokens issued by your application using a configured secret or public key.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
secretstringYesJWT secret key. For HS256: any string. For RS256/ES256: PEM-encoded SPKI public key.
algorithmstringYesJWT algorithm. Allowed values: HS256, RS256, ES256.
sourcesarrayYesWhere to look for JWT tokens. Format: header:Name or cookie:Name.
claimsobjectNoRequired JWT claims that must match exactly. Values must be string, number, or boolean.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/admin/jwt \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"secret": "replace-with-strong-shared-secret",
"algorithm": "HS256",
"sources": ["header:Authorization"],
"claims": {"role": "admin"}
}'

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

PATCH is also accepted on this endpoint with identical behaviour.

Configure a password authentication group that authenticates HTTP Basic requests with a SHA256-hashed credential.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
usernamestringYesUsername for authentication. Must match exactly what the client provides.
passwordstringYesPassword for authentication. Plaintext or pre-hashed SHA256(salt+password) in lowercase hex.
saltstringYesSalt used for password hashing. Should be unique per user/group for security.
algorithmstringNoHashing algorithm. Allowed values: sha256.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/users/password \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"username": "admin",
"password": "s3cret-password",
"salt": "8f1c2a3b4d5e6f70",
"algorithm": "sha256"
}'

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

PATCH is also accepted on this endpoint with identical behaviour.

Configure a token authentication group that authenticates by exact-match of a single value in a header, cookie, or query parameter. The body shape varies by variant: pick exactly one of header, cookie, or param, and always supply value.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
headerstringYes (in the header variant)HTTP header name to check for the token (case-insensitive).
cookiestringYes (in the cookie variant)Cookie name to check for the token (case-sensitive).
paramstringYes (in the param variant)Query parameter name to check for the token (case-sensitive).
valuestringYes (in all variants)Expected token value that must match exactly.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/api-clients/token \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"header": "X-API-Key", "value": "shared-secret-token"}'

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

PATCH is also accepted on this endpoint with identical behaviour.

Set or replace the access rule for a single program within a group. The access value is a rule defining which instances or ports are allowed, not a list of what exists.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
programstringYesProgram name (for example http, terminal, ssh, files, exec, services, notifications).
accessboolean | number | array | stringYesAccess rule. Use true/false for boolean, a number for a single port/index, an array of numbers for multiple ports, "8000-8100" for a range, or "*" as a wildcard. For programs files, services, notifications, and exec, only boolean is allowed.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/permissions/admin \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"program": "http", "access": [8080, 8443]}'

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

Remove all proxy access control configuration from a project, reverting it to open access with default allow policy. This clears all authentication groups and permission rules.

NameInTypeRequiredDescription
idpathstringYesProject ID
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.

This endpoint takes no request body.

Terminal window
curl -X DELETE https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions \
-H "Authorization: Bearer <token>" \
-H "If-Match: file:v3"

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

Delete a single authentication group from the project permissions document.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name to remove
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.

This endpoint takes no request body.

Terminal window
curl -X DELETE https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/groups/admin \
-H "Authorization: Bearer <token>" \
-H "If-Match: file:v3"

Remove all permissions for a project group

Section titled “Remove all permissions for a project group”

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

Remove every program-level access rule for a group, while keeping the group itself and its authentication definition intact.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.

This endpoint takes no request body.

Terminal window
curl -X DELETE https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/permissions/admin \
-H "Authorization: Bearer <token>" \
-H "If-Match: file:v3"

Remove a single program permission for a project group

Section titled “Remove a single program permission for a project group”

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

Remove a single program-level access rule from a group, leaving the rest of the group’s permissions untouched.

NameInTypeRequiredDescription
idpathstringYesProject ID
groupNamepathstringYesGroup name
programpathstringYesProgram name (for example http, ssh, files)
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.

This endpoint takes no request body.

Terminal window
curl -X DELETE https://api.hoody.com/api/v1/projects/{projectId}/proxy/permissions/permissions/admin/http \
-H "Authorization: Bearer <token>" \
-H "If-Match: file:v3"

Container-level permissions follow the same shape as project-level permissions but apply to a single container. Container documents also support per-service hooks for request-time evaluation. Use the container endpoints when you need to override a project setting for a single container, since saving a container document persists an explicit enable_proxy value.

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

Retrieve the full proxy access control configuration for a container, including authentication groups, program permissions, default policy, and per-service hooks.

NameInTypeRequiredDescription
idpathstringYesContainer ID
Terminal window
curl -X GET https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions \
-H "Authorization: Bearer <token>"

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

PATCH is also accepted on this endpoint with identical behaviour.

Replace the entire container proxy permissions configuration, including groups, permissions, default policy, enable_proxy, and per-service hooks. Requires If-Match: file:v<N> header (428 when absent, 412 when stale): read the current file_version via GET first.

NameInTypeRequiredDescription
idpathstringYesContainer ID
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
projectstringYesProject ID owning this container.
containerstringYesContainer ID. Must match path id.
groupsobjectYesAuthentication groups. Supported types: jwt, password, ip, token, hoody-identity.
permissionsobjectYesPer-group program permissions. Key is group name, value is map of program to access rule.
defaultstringNoDefault access policy when no rules match. Allowed values: allow, deny. Defaults to deny.
enable_proxybooleanNoEnable or disable the proxy. Defaults to true.
hooksobjectNoPer-service proxy hooks. Keys are service names; values are first-match-wins arrays of { match, script, timeout? } rules. Max 8 per service, 32 per container in total. Reserved services (such as logs, egress and cdp) are rejected.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {
"admin": {
"type": "hoody-identity",
"audience": "https://app.example.com/proxy"
}
},
"permissions": {
"admin": {
"terminal": true,
"files": true
}
},
"default": "deny",
"enable_proxy": true
}'

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

Update the default access policy (allow or deny) for the container.

NameInTypeRequiredDescription
idpathstringYesContainer ID
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
defaultstringYesDefault access policy for unmatched requests. Allowed values: allow, deny.
Terminal window
curl -X PATCH https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/default \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"default": "allow"}'

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

Enable or disable the proxy for a container. Saving the container permissions document persists an explicit enable_proxy value, which always overrides the project-level setting.

NameInTypeRequiredDescription
idpathstringYesContainer ID
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
enable_proxybooleanYesEnable or disable the proxy entirely.

The SDK has one method per value. Each pins enable_proxy itself, so pass an empty data object:

  • client.api.proxy.containerPermissions.enable(id, {}, { ifMatch }) sets enable_proxy to true.
  • client.api.proxy.containerPermissions.disable(id, {}, { ifMatch }) sets enable_proxy to false.
Terminal window
curl -X PATCH https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/state \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"enable_proxy": true}'

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

PATCH is also accepted on this endpoint with identical behaviour.

Configure an ip authentication group on a container.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
rangestringYesIPv4 CIDR range. Examples: 192.168.1.0/24, 10.0.0.0/8, 203.0.113.5/32.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/office/ip \
-H "Authorization: Bearer <token>" \
-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}/jwt

PATCH is also accepted on this endpoint with identical behaviour.

Configure a jwt authentication group on a container that verifies tokens issued by your application.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
secretstringYesJWT secret key. For HS256: any string. For RS256/ES256: PEM-encoded SPKI public key.
algorithmstringYesJWT algorithm. Allowed values: HS256, RS256, ES256.
sourcesarrayYesWhere to look for JWT tokens. Format: header:Name or cookie:Name.
claimsobjectNoRequired JWT claims that must match exactly. Values must be string, number, or boolean.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/admin/jwt \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"secret": "replace-with-strong-shared-secret",
"algorithm": "HS256",
"sources": ["header:Authorization"],
"claims": {"role": "admin"}
}'

Set container password authentication group

Section titled “Set container password authentication group”

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

PATCH is also accepted on this endpoint with identical behaviour.

Configure a password authentication group on a container.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
usernamestringYesUsername for authentication. Must match exactly what the client provides.
passwordstringYesPassword for authentication. Plaintext or pre-hashed SHA256(salt+password) in lowercase hex.
saltstringYesSalt used for password hashing. Should be unique per user/group for security.
algorithmstringNoHashing algorithm. Allowed values: sha256.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/users/password \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"username": "admin",
"password": "s3cret-password",
"salt": "8f1c2a3b4d5e6f70",
"algorithm": "sha256"
}'

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

PATCH is also accepted on this endpoint with identical behaviour.

Configure a token authentication group on a container. The body shape varies by variant: pick exactly one of header, cookie, or param, and always supply value.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
headerstringYes (in the header variant)HTTP header name to check for the token (case-insensitive).
cookiestringYes (in the cookie variant)Cookie name to check for the token (case-sensitive).
paramstringYes (in the param variant)Query parameter name to check for the token (case-sensitive).
valuestringYes (in all variants)Expected token value that must match exactly.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/external-api/token \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"header": "X-API-Key", "value": "shared-secret-token"}'

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

PATCH is also accepted on this endpoint with identical behaviour.

Set or replace the access rule for a single program within a container group. The access value is a rule defining which instances or ports are allowed, not a list of what exists.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.
NameTypeRequiredDescription
programstringYesProgram name (for example http, terminal, ssh, files, exec, services, notifications).
accessboolean | number | array | stringYesAccess rule. Use true/false for boolean, a number for a single port/index, an array of numbers for multiple ports, "8000-8100" for a range, or "*" as a wildcard. For programs files, services, notifications, and exec, only boolean is allowed.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/permissions/admin \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{"program": "http", "access": [80, 443]}'

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

Remove the proxy permissions configuration for a single container. The container inherits the project-level configuration afterward.

NameInTypeRequiredDescription
idpathstringYesContainer ID
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.

This endpoint takes no request body.

Terminal window
curl -X DELETE https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions \
-H "Authorization: Bearer <token>" \
-H "If-Match: file:v3"

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

Delete a single authentication group from the container permissions document.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name to remove
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.

This endpoint takes no request body.

Terminal window
curl -X DELETE https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/groups/admin \
-H "Authorization: Bearer <token>" \
-H "If-Match: file:v3"

Remove all permissions for a container group

Section titled “Remove all permissions for a container group”

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

Remove every program-level access rule for a group on a container, while keeping the group itself and its authentication definition intact.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.

This endpoint takes no request body.

Terminal window
curl -X DELETE https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/permissions/admin \
-H "Authorization: Bearer <token>" \
-H "If-Match: file:v3"

Remove a single program permission for a container group

Section titled “Remove a single program permission for a container group”

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

Remove a single program-level access rule from a container group, leaving the rest of the group’s permissions untouched.

NameInTypeRequiredDescription
idpathstringYesContainer ID
groupNamepathstringYesGroup name
programpathstringYesProgram name (for example http, ssh, files)
if-matchheaderstringYesfile:v<N> ETag precondition. Read current file_version from GET first.

This endpoint takes no request body.

Terminal window
curl -X DELETE https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions/permissions/admin/http \
-H "Authorization: Bearer <token>" \
-H "If-Match: file:v3"

The hoody-identity group type authenticates requests against the identity claim returned by Hoody login. Use it whenever you need to gate a proxy on a logged-in Hoody user, since the identity claim is not a JWT and cannot be validated by a jwt group.

A hoody-identity group never carries key material. The operator does not own the signing keyring; Hoody issues and signs the claim, and your group only declares which audience it accepts and any additional policy constraints.

Unlike jwt, password, ip, and token, the hoody-identity type does not have a dedicated /groups/{groupName}/<type> endpoint. It is configured as an entry in the groups map of the full permissions document, so you set it through the replace endpoint (PUT /api/v1/containers/{id}/proxy/permissions or PUT /api/v1/projects/{id}/proxy/permissions), not via setTokenGroup or any other per-type group setter.

NameTypeRequiredDescription
typestringYesGroup type discriminator. Use hoody-identity.
audiencestringYesExact audience the identity claim aud must equal. Maximum 256 characters.
sourcesarrayNoToken source locations. Header-only, in the X-Hoody-Identity- namespace (for example X-Hoody-Identity-User).
allow_typesarrayNoAccount types allowed. Allowed values: user. Omit to allow every signed-in Hoody account.
usersarrayNoOptional user-id allowlist, 24-hex each. Maximum 256 entries.
max_age_secondsintegerNoFreshness gate on claim iat. Must be >= 300.
expose_typebooleanNoAlso inject X-Hoody-Identity-Type for downstream consumers. Defaults to false.
Terminal window
curl -X PUT https://api.hoody.com/api/v1/containers/{containerId}/proxy/permissions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-H "If-Match: file:v3" \
-d '{
"project": "507f1f77bcf86cd799439011",
"container": "507f1f77bcf86cd799439012",
"groups": {
"admins": {
"type": "hoody-identity",
"audience": "https://app.example.com/proxy",
"allow_types": ["user"],
"max_age_seconds": 300,
"expose_type": true
}
},
"permissions": {
"admins": {
"terminal": true,
"files": true
}
},
"default": "deny",
"enable_proxy": true
}'