The App Execution API resolves, searches, and runs applications across configured package sources. Use these endpoints to look up candidates, plan an execution, delegate to a terminal session, run preflight checks, or batch multiple requests in a single call. The API supports query-parameter selectors, JSON body selectors, and bookmarkable path-based URLs.
Returns the full persisted runtime configuration including sources, profiles, and the currently selected profile.
This endpoint takes no parameters.
curl -X GET ' https://api.hoody.com/api/v1/run/config ' \
-H ' Authorization: Bearer <token> '
const config = await client . app . configuration . get ();
"source_type" : " nix-pkgs "
"description" : " Default profile (inherits global sources) "
"selected_profile" : " default " ,
Search for runnable application candidates across all configured and enabled package sources. Returns a ranked list of candidates with stable ordering for pick-by-index operations. The returned set_id can be used with subsequent run requests to ensure race-free candidate selection.
Name In Type Required Description appquery string Yes Primary name query (aliases q, name) osquery app_OsNo Target OS filter sourcequery array No Source kind filter (repeatable) kindquery app_AppKindNo App kind filter (gui, cli, any) archquery app_ArchNo Target CPU architecture filter tagsquery array No Free-form tags for filtering and ranking (repeatable) profilequery string No Named profile for default preferences channelquery string No Release channel hint (for example stable or beta) versionquery string No Exact version or provider-defined version constraint variantquery string No Provider-specific variant hint (for example portable or headless) publisherquery string No Publisher hint for curated registries repoquery string No Repository hint such as owner/name releasequery string No Release hint such as a tag name assetquery string No Desired asset name or pattern limitquery integer No Max candidates to return (default 25)
curl -X GET ' https://api.hoody.com/api/v1/run/search?app=firefox&os=linux&kind=any&limit=10 ' \
-H ' Authorization: Bearer <token> '
const result = await client . app . execution . searchCandidates ( {
"set_id" : " a1b2c3d4e5f6 " ,
"candidate_id" : " nix-firefox-128 " ,
"title" : " Firefox (nixpkgs) " ,
"description" : " Mozilla Firefox web browser via nixpkgs " ,
"command" : " nix run nixpkgs#firefox "
Error Code Title Description Resolution MISSING_APPMissing app query No app name was provided in the request Set app, q, or name to the desired program INVALID_SELECTORInvalid selector parameter One or more selector parameters could not be parsed Check enum values and numeric fields, then retry UNKNOWN_PROFILEUnknown profile The requested profile does not exist Call listProfiles or getConfig and choose a valid profile name
"error" : " candidate resolution failed " ,
Error Code Title Description Resolution SOURCE_RESOLUTION_FAILEDSource resolution failed Candidate resolution could not be completed because upstream source work failed Retry or inspect provider/source health
Resolve a full ranked candidate set under a bounded cap, then page through it with an opaque cursor. This is the stable pagination contract for large result sets. The SDK call returns an async iterator that transparently pages through results.
Request Body : JSON body conforming to the app_PagedSearchRequest schema.
curl -X POST ' https://api.hoody.com/api/v1/run/search/paged ' \
-H ' Authorization: Bearer <token> ' \
-H ' Content-Type: application/json ' \
const iterator = client . app . execution . searchCandidatesPagedIterator ( {
selector: { app: " code " , os: " linux " , kind: " any " },
for await ( const page of iterator ) {
"set_id" : " a1b2c3d4e5f6 " ,
"candidate_id" : " nix-vscode-1.85 " ,
"title" : " Visual Studio Code (nixpkgs) " ,
"description" : " Open-source code editor " ,
"command" : " nix run nixpkgs#vscode "
"next_cursor" : " eyJzZXRJZCI6ImExYjJjM2Q0ZTVmNiIsIm9mZnNldCI6MjV9 "
"error" : " cursor set expired " ,
Error Code Title Description Resolution CURSOR_SET_EXPIREDCursor set expired The cached candidate set referenced by the cursor is no longer available Restart pagination from the first page
"error" : " candidate resolution failed " ,
Resolve and select an application using query parameters, then return the exact shell command to run. Supports all selector fields plus pick mode, output control, deferred execution metadata, and redirect behavior.
Name In Type Required Description appquery string Yes Primary name query osquery app_OsNo Target OS filter sourcequery array No Source kind filter (repeatable) kindquery app_AppKindNo App kind filter archquery app_ArchNo Target CPU architecture filter tagsquery array No Free-form tags for filtering and ranking (repeatable) profilequery string No Named profile for default preferences channelquery string No Release channel hint versionquery string No Exact version or provider-defined version constraint variantquery string No Provider-specific variant hint publisherquery string No Publisher hint for curated registries repoquery string No Repository hint such as owner/name releasequery string No Release hint such as a tag name assetquery string No Desired asset name or pattern pickquery app_PickModeNo Candidate selection mode (ask, first, index, id) pick_indexquery integer No Candidate index (required when pick=index) candidate_idquery string No Specific candidate ID (required when pick=id) set_idquery string No Bind pick to a specific candidate set terminal_idquery integer No Terminal session ID (default 1) displayquery string No X11 DISPLAY number originquery string No Origin identifier for observability propagation defer_pidquery integer No Defer command injection until this PID exits defer_start_time_ticksquery string No Start-time ticks used to avoid PID reuse bugs defer_timeout_msquery integer No Maximum defer wait time in milliseconds defer_poll_msquery integer No Defer polling interval in milliseconds dry_runquery boolean No If true, force command-only response (no delegation) print_curlquery app_PrintCurlModeNo Generate curl command (hoody-run or hoody-terminal) formatquery app_OutputFormatNo Output format (json or html) redirectquery boolean No Redirect to display page after scheduling redirect_toquery string No Override redirect target URL limitquery integer No Max candidates (default 25)
curl -X GET ' https://api.hoody.com/api/v1/run/run?app=firefox&os=linux&kind=any&pick=first&terminal_id=1 ' \
-H ' Authorization: Bearer <token> '
const result = await client . app . execution . runAppGet ( {
"set_id" : " a1b2c3d4e5f6 " ,
"candidate_id" : " nix-firefox-128 " ,
"title" : " Firefox (nixpkgs) " ,
"description" : " Mozilla Firefox web browser via nixpkgs " ,
"command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
Error Code Title Description Resolution MISSING_APPMissing app query No app name was provided in the request Set app to the desired program name INVALID_SELECTORInvalid selector parameter One or more selector parameters could not be parsed Check enum values and numeric fields, then retry UNKNOWN_PROFILEUnknown profile The requested profile does not exist Choose a profile returned by listProfiles or getConfig INVALID_PICKInvalid pick request The pick mode requirements were not satisfied or the selected candidate was not found Search first, then supply a valid pick_index or candidate_id
"error" : " invalid terminal url " ,
Error Code Title Description Resolution INVALID_TERMINAL_URLInvalid terminal URL Curl generation could not build a valid hoody-terminal execute URL Check HOODY_TERMINAL_URL and retry
"error" : " candidate resolution failed " ,
Error Code Title Description Resolution SOURCE_RESOLUTION_FAILEDSource resolution failed Candidate resolution could not be completed because upstream source work failed Retry or inspect provider/source health
"error" : " required local tools are unavailable " ,
Error Code Title Description Resolution LOCAL_TOOLS_UNAVAILABLERequired local tools are unavailable The selected candidate requires local tooling that is not currently available Install or repair the required toolchain, then retry
Same behavior as GET /api/v1/run/run but accepts the full Selector as a JSON request body. Useful for programmatic clients and complex selectors.
Request Body : JSON body conforming to the app_Selector schema.
curl -X POST ' https://api.hoody.com/api/v1/run/run ' \
-H ' Authorization: Bearer <token> ' \
-H ' Content-Type: application/json ' \
const result = await client . app . execution . runAppPost ( {
"set_id" : " a1b2c3d4e5f6 " ,
"candidate_id" : " nix-firefox-128 " ,
"title" : " Firefox (nixpkgs) " ,
"description" : " Mozilla Firefox web browser via nixpkgs " ,
"command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
Error Code Title Description Resolution MISSING_APPMissing app query No app name was provided in the request body Set app to the desired program name INVALID_SELECTORInvalid selector parameter One or more selector fields could not be parsed Check enum values and numeric fields, then retry UNKNOWN_PROFILEUnknown profile The requested profile does not exist Choose a profile returned by listProfiles or getConfig INVALID_PICKInvalid pick request The pick mode requirements were not satisfied or the selected candidate was not found Search first, then supply a valid pick_index or candidate_id
"error" : " invalid terminal url " ,
Error Code Title Description Resolution INVALID_TERMINAL_URLInvalid terminal URL Curl generation could not build a valid hoody-terminal execute URL Check HOODY_TERMINAL_URL and retry
"error" : " candidate resolution failed " ,
Error Code Title Description Resolution SOURCE_RESOLUTION_FAILEDSource resolution failed Candidate resolution could not be completed because upstream source work failed Retry or inspect provider/source health
"error" : " required local tools are unavailable " ,
Error Code Title Description Resolution LOCAL_TOOLS_UNAVAILABLERequired local tools are unavailable The selected candidate requires local tooling that is not currently available Install or repair the required toolchain, then retry
Resolve an application using clean, bookmarkable path-based URLs. Supports both positional and key-value path segments.
Positional examples:
/api/v1/run/go/{app}
/api/v1/run/go/{os}/{app}
/api/v1/run/go/{os}/{source}/{app}
/api/v1/run/go/{os}/{source}/{kind}/{app}
Key-value example: /api/v1/run/go/app/{app}/os/{os}/source/{source}/kind/{kind}/pick/{pick}/...
Name In Type Required Description restpath string Yes Path segments for positional or key-value app specification osquery app_OsNo Target OS filter when not supplied in the path sourcequery array No Source kind filter (repeatable) kindquery app_AppKindNo App kind filter when not supplied in the path archquery app_ArchNo Target CPU architecture filter tagsquery array No Free-form tags for filtering and ranking (repeatable) profilequery string No Named profile for default preferences channelquery string No Release channel hint versionquery string No Exact version or provider-defined version constraint variantquery string No Provider-specific variant hint publisherquery string No Publisher hint for curated registries repoquery string No Repository hint such as owner/name releasequery string No Release hint such as a tag name assetquery string No Desired asset name or pattern pickquery app_PickModeNo Candidate selection mode (ask, first, index, id) pick_indexquery integer No Candidate index (required when pick=index) candidate_idquery string No Specific candidate ID (required when pick=id) set_idquery string No Bind pick to a specific candidate set terminal_idquery integer No Terminal session ID when not supplied in the path displayquery string No X11 DISPLAY number originquery string No Origin identifier for observability propagation defer_pidquery integer No Defer command injection until this PID exits defer_start_time_ticksquery string No Start-time ticks used to avoid PID reuse bugs defer_timeout_msquery integer No Maximum defer wait time in milliseconds defer_poll_msquery integer No Defer polling interval in milliseconds dry_runquery boolean No If true, force command-only response (no delegation) print_curlquery app_PrintCurlModeNo Generate curl command (hoody-run or hoody-terminal) formatquery app_OutputFormatNo Output format (json or html) redirectquery boolean No Redirect to display page after scheduling redirect_toquery string No Override redirect target URL limitquery integer No Max candidates (default 25)
curl -X GET ' https://api.hoody.com/api/v1/run/go/linux/nix/firefox?pick=first&terminal_id=1 ' \
-H ' Authorization: Bearer <token> '
const result = await client . app . execution . runPathBased ( {
rest: " linux/nix/firefox " ,
"set_id" : " a1b2c3d4e5f6 " ,
"candidate_id" : " nix-firefox-128 " ,
"title" : " Firefox (nixpkgs) " ,
"description" : " Mozilla Firefox web browser via nixpkgs " ,
"command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
Error Code Title Description Resolution MISSING_APPMissing app query No app name was provided in the request Set the app in the path or query string INVALID_SELECTORInvalid selector parameter One or more selector parameters could not be parsed Check enum values and numeric fields, then retry UNKNOWN_PROFILEUnknown profile The requested profile does not exist Choose a profile returned by listProfiles or getConfig INVALID_PICKInvalid pick request The pick mode requirements were not satisfied or the selected candidate was not found Search first, then supply a valid pick_index or candidate_id
"error" : " invalid terminal url " ,
Error Code Title Description Resolution INVALID_TERMINAL_URLInvalid terminal URL Curl generation could not build a valid hoody-terminal execute URL Check HOODY_TERMINAL_URL and retry
"error" : " candidate resolution failed " ,
Error Code Title Description Resolution SOURCE_RESOLUTION_FAILEDSource resolution failed Candidate resolution could not be completed because upstream source work failed Retry or inspect provider/source health
"error" : " required local tools are unavailable " ,
Error Code Title Description Resolution LOCAL_TOOLS_UNAVAILABLERequired local tools are unavailable The selected candidate requires local tooling that is not currently available Install or repair the required toolchain, then retry
Same as /api/v1/run/go/{rest} but with terminal_id extracted from the path prefix. Allows clean URLs that specify both the target terminal and the application in a single path.
Example: /api/v1/run/t/2/go/linux/nix/firefox runs Firefox in terminal 2.
Name In Type Required Description terminal_idpath integer Yes Terminal session ID (1-65535) restpath string Yes Path segments for app specification osquery app_OsNo Target OS filter when not supplied in the path sourcequery array No Source kind filter (repeatable) kindquery app_AppKindNo App kind filter when not supplied in the path archquery app_ArchNo Target CPU architecture filter tagsquery array No Free-form tags for filtering and ranking (repeatable) profilequery string No Named profile for default preferences channelquery string No Release channel hint versionquery string No Exact version or provider-defined version constraint variantquery string No Provider-specific variant hint publisherquery string No Publisher hint for curated registries repoquery string No Repository hint such as owner/name releasequery string No Release hint such as a tag name assetquery string No Desired asset name or pattern pickquery app_PickModeNo Candidate selection mode (ask, first, index, id) pick_indexquery integer No Candidate index (required when pick=index) candidate_idquery string No Specific candidate ID (required when pick=id) set_idquery string No Bind pick to a specific candidate set displayquery string No X11 DISPLAY number originquery string No Origin identifier for observability propagation defer_pidquery integer No Defer command injection until this PID exits defer_start_time_ticksquery string No Start-time ticks used to avoid PID reuse bugs defer_timeout_msquery integer No Maximum defer wait time in milliseconds defer_poll_msquery integer No Defer polling interval in milliseconds dry_runquery boolean No If true, force command-only response (no delegation) print_curlquery app_PrintCurlModeNo Generate curl command (hoody-run or hoody-terminal) formatquery app_OutputFormatNo Output format (json or html) redirectquery boolean No Redirect to display page after scheduling redirect_toquery string No Override redirect target URL limitquery integer No Max candidates (default 25)
curl -X GET ' https://api.hoody.com/api/v1/run/t/2/go/linux/nix/firefox?pick=first ' \
-H ' Authorization: Bearer <token> '
const result = await client . app . execution . runTerminalAnchored ( {
rest: " linux/nix/firefox " ,
"set_id" : " a1b2c3d4e5f6 " ,
"candidate_id" : " nix-firefox-128 " ,
"title" : " Firefox (nixpkgs) " ,
"description" : " Mozilla Firefox web browser via nixpkgs " ,
"command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
Error Code Title Description Resolution MISSING_APPMissing app query No app name was provided in the request Set the app in the path or query string INVALID_SELECTORInvalid selector parameter One or more selector parameters could not be parsed Check enum values and numeric fields, then retry UNKNOWN_PROFILEUnknown profile The requested profile does not exist Choose a profile returned by listProfiles or getConfig INVALID_PICKInvalid pick request The pick mode requirements were not satisfied or the selected candidate was not found Search first, then supply a valid pick_index or candidate_id
"error" : " invalid terminal url " ,
Error Code Title Description Resolution INVALID_TERMINAL_URLInvalid terminal URL Curl generation could not build a valid hoody-terminal execute URL Check HOODY_TERMINAL_URL and retry
"error" : " candidate resolution failed " ,
Error Code Title Description Resolution SOURCE_RESOLUTION_FAILEDSource resolution failed Candidate resolution could not be completed because upstream source work failed Retry or inspect provider/source health
"error" : " required local tools are unavailable " ,
Error Code Title Description Resolution LOCAL_TOOLS_UNAVAILABLERequired local tools are unavailable The selected candidate requires local tooling that is not currently available Install or repair the required toolchain, then retry
Resolve, optionally pick, and normalize the execution plan for a selector without scheduling execution. Use this endpoint to inspect what would happen — including missing requirements, recommended mode, and effective policy — before actually running a request.
Request Body : JSON body conforming to the app_Selector schema.
curl -X POST ' https://api.hoody.com/api/v1/run/preflight ' \
-H ' Authorization: Bearer <token> ' \
-H ' Content-Type: application/json ' \
const plan = await client . app . execution . preflight ( {
"set_id" : " a1b2c3d4e5f6 " ,
"candidate_id" : " nix-firefox-128 " ,
"title" : " Firefox (nixpkgs) " ,
"description" : " Mozilla Firefox web browser via nixpkgs " ,
"command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox "
"shell_command" : " nix run nixpkgs#firefox " ,
"recommended_mode" : " dry-run " ,
"terminal_request_preview" : {
"terminal_url" : " http://127.0.0.1:7682/api/v1/terminal/execute " ,
"command" : " nix run nixpkgs#firefox "
"redirect_target" : " /apps/nixpkgs/firefox " ,
"missing_requirements" : [],
"require_verified" : false ,
"require_integrity" : false ,
"allow_delegated_execution" : true ,
"error" : " candidate resolution failed " ,
Process multiple search or command-only run items in one request. Each item produces its own success or error payload. Use this endpoint to amortize overhead when you need to resolve or run several apps at once.
Request Body : JSON body conforming to the app_BatchRequest schema.
curl -X POST ' https://api.hoody.com/api/v1/run/batch ' \
-H ' Authorization: Bearer <token> ' \
-H ' Content-Type: application/json ' \
"selector": { "app": "firefox", "os": "linux", "kind": "any" }
"selector": { "app": "code", "os": "linux", "kind": "any", "pick": "first" }
const result = await client . app . execution . runBatch ( {
{ request_id: " req-1 " , mode: " search " , selector: { app: " firefox " , os: " linux " , kind: " any " } },
{ request_id: " req-2 " , mode: " run " , selector: { app: " code " , os: " linux " , kind: " any " , pick: " first " } }
"set_id" : " a1b2c3d4e5f6 " ,
"candidate_id" : " nix-firefox-128 " ,
"title" : " Firefox (nixpkgs) " ,
"description" : " Mozilla Firefox web browser via nixpkgs " ,
"run_plan" : { "command" : " nix run nixpkgs#firefox " }
"set_id" : " b2c3d4e5f6a7 " ,
"shell_command" : " nix run nixpkgs#vscode "
Returns the OpenAPI 3.0.3 specification for this API in JSON format. Converted from the canonical YAML source.
This endpoint takes no parameters.
curl -X GET ' https://api.hoody.com/api/v1/run/openapi.json ' \
-H ' Authorization: Bearer <token> '
const spec = await client . app . docs . getJson ();
"title" : " Hoody App Execution API " ,
Returns the OpenAPI 3.0.3 specification for this API in YAML format.
This endpoint takes no parameters.
curl -X GET ' https://api.hoody.com/api/v1/run/openapi.yaml ' \
-H ' Authorization: Bearer <token> '
const spec = await client . app . docs . getYaml ();
title : Hoody App Execution API