Skip to content
Hoody.com

Use the Profiles endpoints to manage named application profiles within a Hoody Run container. A profile bundles default preferences (operating system, app kind, source filter, candidate selection mode, terminal session, and so on) with optional source overrides and a sourcing policy. One profile can be selected as the active default; its defaults are then applied to subsequent requests that do not explicitly override them.

The endpoints below let you list existing profiles, create new ones, partially update them, switch the active profile, and delete profiles by name.


Return every configured profile along with its default preferences and source overrides.

This endpoint takes no parameters.

Terminal window
curl -X GET "https://{projectId}-{containerId}-run-1.{server}.containers.hoody.com/api/v1/run/profiles" \
-H "Authorization: Bearer $HOODY_TOKEN"
[
{
"name": "default",
"description": "Default profile (inherits global sources)",
"defaults": {
"os": "any",
"kind": "any",
"source": ["any"],
"pick": "ask",
"limit": 20
},
"sources_mode": "inherit",
"sources": [],
"policy": {
"require_verified": false,
"require_integrity": false,
"deny_providers": [],
"deny_source_ids": []
}
},
{
"name": "workstation",
"description": "GUI-focused profile pinned to Linux package sources",
"defaults": {
"os": "linux",
"kind": "gui",
"source": ["nix", "appimage"],
"pick": "first"
},
"sources_mode": "allowlist",
"sources": [
{ "source_id": "nixpkgs", "enabled": true, "priority": 10 }
],
"policy": {
"require_verified": true,
"deny_providers": ["system"]
}
}
]

Create a new user profile with default preferences and optional source overrides. Returns the updated list of all profiles.

This endpoint takes no parameters.

A request body is required. See the run_ProfileConfig schema in the referenced schemas section for the supported fields. The name field is required.

Terminal window
curl -X POST "https://{projectId}-{containerId}-run-1.{server}.containers.hoody.com/api/v1/run/profiles" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "workstation",
"description": "GUI-focused profile pinned to Linux package sources",
"defaults": {
"os": "linux",
"kind": "gui",
"source": ["nix", "appimage"],
"pick": "first"
},
"sources_mode": "allowlist",
"sources": [
{ "source_id": "nixpkgs", "enabled": true, "priority": 10 }
]
}'
[
{
"name": "default",
"description": "Default profile (inherits global sources)",
"defaults": { "os": "any", "kind": "any", "source": ["any"], "pick": "ask", "limit": 20 },
"sources_mode": "inherit",
"sources": [],
"policy": { "require_verified": false, "require_integrity": false, "deny_providers": [], "deny_source_ids": [] }
},
{
"name": "workstation",
"description": "GUI-focused profile pinned to Linux package sources",
"defaults": { "os": "linux", "kind": "gui", "source": ["nix", "appimage"], "pick": "first" },
"sources_mode": "allowlist",
"sources": [
{ "source_id": "nixpkgs", "enabled": true, "priority": 10 }
],
"policy": { "require_verified": false, "require_integrity": false, "deny_providers": [], "deny_source_ids": [] }
}
]

Partially update a profile with a JSON merge patch (RFC 7396) onto the stored profile. Nested objects (defaults, policy) merge field by field, so {"defaults":{"limit":3}} keeps the other defaults; null resets a field to its default; arrays (sources, defaults.source, the policy deny lists) replace the stored list as a unit. The merged profile is validated before it is stored: an invalid value, an unknown top-level field or a different name is a 400 and nothing changes. Unknown keys inside a nested object are ignored, as on create.

NameInTypeRequiredDescription
profilepathstringYesProfile name

A request body is required. See the run_ProfileUpdate schema in the referenced schemas section for the supported fields. Only include the fields you want to change; the profile’s name is taken from the path and cannot be changed here.

Terminal window
curl -X PATCH "https://{projectId}-{containerId}-run-1.{server}.containers.hoody.com/api/v1/run/profiles/workstation" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"description": "GUI-focused profile pinned to Linux package sources (verified only)",
"policy": {
"require_verified": true,
"deny_providers": ["system"]
}
}'
{
"name": "workstation",
"description": "GUI-focused profile pinned to Linux package sources (verified only)",
"defaults": { "os": "linux", "kind": "gui", "source": ["nix", "appimage"], "pick": "first" },
"sources_mode": "allowlist",
"sources": [
{ "source_id": "nixpkgs", "enabled": true, "priority": 10 }
],
"policy": {
"require_verified": true,
"require_integrity": false,
"deny_providers": ["system"],
"deny_source_ids": []
}
}

POST /api/v1/run/profiles/{profile}/select

Section titled “POST /api/v1/run/profiles/{profile}/select”

Set the named profile as the currently active profile. Its defaults will be applied to all subsequent requests that do not explicitly override them.

NameInTypeRequiredDescription
profilepathstringYesProfile name to select

This endpoint takes no request body.

Terminal window
curl -X POST "https://{projectId}-{containerId}-run-1.{server}.containers.hoody.com/api/v1/run/profiles/workstation/select" \
-H "Authorization: Bearer $HOODY_TOKEN"
{
"selected_profile": "workstation"
}

Remove a profile by name. The built-in default profile and the currently selected profile cannot be deleted (409); select another profile first.

NameInTypeRequiredDescription
profilepathstringYesProfile name

This endpoint takes no request body.

Terminal window
curl -X DELETE "https://{projectId}-{containerId}-run-1.{server}.containers.hoody.com/api/v1/run/profiles/workstation" \
-H "Authorization: Bearer $HOODY_TOKEN"

The profile was deleted successfully. The response has no body.


The schemas below define the request and response shapes used by the Profiles endpoints. Use them as a reference when constructing request bodies; only the fields marked required must be present.

The full profile object. Used by the create endpoint and returned by the list and create responses.

FieldTypeRequiredDescription
namestringYesUnique profile name
descriptionstringNoHuman-readable profile description
defaultsrun_ProfileDefaultsNoDefault selector values applied when the profile is active
sources_moderun_ProfileSourceModeNoHow the profile interacts with the global source list
sourcesarray of run_ProfileSourceOverrideNoPer-source overrides (enable/disable/reprioritize). Default: []
policyrun_PolicyConfigNoSourcing policy applied while this profile is active

The partial profile object used by the update endpoint. Only the fields present in the body are applied; everything else keeps its stored value. The profile’s name is taken from the path and cannot be changed here.

FieldTypeRequiredDescription
descriptionstringNoHuman-readable profile description. Send null to clear it.
defaultsrun_ProfileDefaultsUpdateNoMerged field by field into the stored profile defaults. A null field resets it; null for the whole object resets every default.
sources_modestring | nullNoSource mode: inherit or allowlist. Send null to reset it to inherit.
sourcesarray of run_ProfileSourceOverrideNoPer-source overrides (enable/disable/reprioritize). Replaces the stored list as a unit.
policyrun_PolicyConfigUpdateNoMerged field by field into the stored policy, so setting one flag keeps the deny lists. A null field resets it; the deny lists replace as a unit.

The same fields as run_ProfileDefaults, each nullable: send null for a field to reset it to its default.

FieldTypeRequiredDescription
osstring, nullableNoTarget app runtime OS (not the host OS). One of linux, windows, any
kindstring, nullableNoApplication kind filter. One of gui, cli, any
sourcearray of run_SourceKind, nullableNoDefault source filter
pickstring, nullableNoCandidate selection mode. One of ask, first, index, id
terminal_idinteger, nullableNoDefault terminal session ID. Range: 1 to 65535
displaystring, nullableNoDefault X11 DISPLAY number
limitinteger, nullableNoDefault maximum candidates to return. Range: 1 to 100

The same fields as run_PolicyConfig, each nullable: send null for a field to reset it.

FieldTypeRequiredDescription
require_verifiedboolean, nullableNoRequire verified sources
require_integrityboolean, nullableNoRequire integrity-checked sources
deny_providersarray of run_SourceKind, nullableNoProviders to deny
deny_source_idsarray of string, nullableNoSpecific source IDs to deny
FieldTypeRequiredDescription
osrun_OsNoTarget app runtime OS (not the host OS). One of linux, windows, any
kindrun_AppKindNoApplication kind filter. One of gui, cli, any
sourcearray of run_SourceKindNoDefault source filter. One of nix, pkgx, appimage, oci, registry, system, any. Default: []
pickrun_PickModeNoCandidate selection mode. One of ask, first, index, id
terminal_idintegerNoDefault terminal session ID. Range: 1 to 65535
displaystringNoDefault X11 DISPLAY number
limitintegerNoDefault maximum candidates to return. Range: 1 to 100
FieldTypeRequiredDescription
source_idstringYesID of the source to override
enabledbooleanNoOverride enabled state
priorityintegerNoOverride priority
FieldTypeRequiredDescription
require_verifiedbooleanNoRequire verified sources
require_integritybooleanNoRequire integrity-checked sources
deny_providersarray of run_SourceKindNoProviders to deny. Default: []
deny_source_idsarray of stringNoSpecific source IDs to deny. Default: []

Selection mode for candidates:

  • ask: return candidate list without selecting (default)
  • first: automatically select the highest-ranked candidate
  • index: select by 0-based index (requires pick_index)
  • id: select by candidate_id (requires candidate_id)

How a profile interacts with the global source list:

  • inherit: start from global sources, apply overrides
  • allowlist: disable all sources first, then enable only those listed in the profile’s sources array

Standard JSON error payload returned for validation, lookup, and persistence failures.

FieldTypeRequiredDescription
errorstringYesHuman-readable error message
codestringYesSymbolic error code to branch on (for example MISSING_PROFILE_NAME). Operation-specific codes are listed under each response
statusintegerYesHTTP status code of the response
FieldTypeRequiredDescription
selected_profilestringYesName of the active profile