Storage shares let a source container expose a directory to a target container (1:1) or to every container in a target project (project-wide). The source container controls what is shared (the path), while the server infrastructure determines where the path is mounted inside the target. All share paths are absolute and restricted to a character whitelist (a-z A-Z 0-9 / - _ .); system paths (/proc, /sys, /dev, /boot, /run, /var/run) and traversal sequences (..) are rejected.
Use these endpoints to create, inspect, update, and delete shares; list shares a container is exporting; list shares a container is receiving; and let a target container accept or reject incoming mounts.
List all shares originating from the specified source container. Use query parameters to narrow results.
Name In Type Required Description idpath string Yes Source container ID target_typequery string No Filter by target type. Allowed values: container, project labelquery string No Filter by label statusquery string No Filter by status. Allowed values: active, failed enabledquery string No Filter by enabled status. Allowed values: true, false include_expiredquery string No Include expired shares. Allowed values: true, false. Default: false realm_idquery string No Filter by realm ID. Alternative to using realm subdomain in URL
" message " : " Storage shares retrieved successfully " ,
" id " : " 507f1f77bcf86cd799439011 " ,
" source_container_id " : " 507f1f77bcf86cd799439022 " ,
" source_path " : " /home/app/shared-data " ,
" target_container_id " : " 507f1f77bcf86cd799439033 " ,
" target_project_id " : null ,
" target_type " : " container " ,
" alias " : " prod-data-share " ,
" description " : " Shared application data directory " ,
" expires_at " : 1735689599 ,
" expiry_notified " : false ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-15T10:30:00.000Z " ,
" updated_at " : " 2025-01-15T10:30:00.000Z "
" id " : " 507f1f77bcf86cd799439066 " ,
" source_container_id " : " 507f1f77bcf86cd799439022 " ,
" source_path " : " /var/log/app " ,
" target_project_id " : " 507f1f77bcf86cd799439055 " ,
" target_container_id " : null ,
" target_type " : " project " ,
" description " : " Application logs shared with project " ,
" expiry_notified " : false ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-10T08:00:00.000Z " ,
" updated_at " : " 2025-01-10T08:00:00.000Z "
" message " : " Authentication required "
" message " : " Insufficient permissions "
// List all shares from the source container
await client . api . storageShares . listIterator ( id )
// Filter by target type and status
await client . api . storageShares . listIterator ( id , {
target_type : ' container ' ,
curl -X GET " https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439022/storage/shares?status=active&enabled=true " \
-H " Authorization: Bearer <token> "
List all shares targeting this container, including both direct (1:1) shares and project-level shares. Results are deduplicated so that a direct share takes priority over a project share for the same source path. Self-shares and expired shares are filtered out.
Name In Type Required Description idpath string Yes Container ID
" message " : " Incoming shares retrieved successfully " ,
" id " : " 507f1f77bcf86cd799439011 " ,
" source_container_id " : " 507f1f77bcf86cd799439022 " ,
" source_path " : " /etc/app/config " ,
" target_container_id " : " 507f1f77bcf86cd799439033 " ,
" target_project_id " : null ,
" target_type " : " container " ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-15T10:30:00.000Z " ,
" updated_at " : " 2025-01-15T10:30:00.000Z "
" id " : " 507f1f77bcf86cd799439077 " ,
" source_container_id " : " 507f1f77bcf86cd799439088 " ,
" source_path " : " /opt/shared-libs " ,
" target_project_id " : " 507f1f77bcf86cd799439055 " ,
" target_container_id " : null ,
" target_type " : " project " ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-01T00:00:00.000Z " ,
" updated_at " : " 2025-01-01T00:00:00.000Z "
" message " : " Authentication required "
" message " : " Insufficient permissions "
" message " : " Container not found "
await client . api . storageShares . listIncoming ( id )
curl -X GET " https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439033/storage/incoming " \
-H " Authorization: Bearer <token> "
List every storage share you have created across all your containers. Use this to audit what you are sharing with others.
Name In Type Required Description realm_idquery string No Filter by realm ID. Alternative to using realm subdomain in URL
" message " : " All storage shares retrieved successfully " ,
" id " : " 507f1f77bcf86cd799439011 " ,
" source_container_id " : " 507f1f77bcf86cd799439022 " ,
" source_path " : " /home/app/shared-data " ,
" target_container_id " : " 507f1f77bcf86cd799439033 " ,
" target_project_id " : null ,
" target_type " : " container " ,
" alias " : " prod-data-share " ,
" description " : " Shared application data directory " ,
" expires_at " : 1735689599 ,
" expiry_notified " : false ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-15T10:30:00.000Z " ,
" updated_at " : " 2025-01-15T10:30:00.000Z "
" message " : " Authentication required "
await client . api . storageShares . listGlobalIterator ()
await client . api . storageShares . listGlobalIterator ({ realm_id : ' 507f1f77bcf86cd799439055 ' })
curl -X GET " https://api.hoody.icu/api/v1/storage/shares " \
-H " Authorization: Bearer <token> "
List all incoming shares targeting your containers across all projects. Shows everything you are receiving from other source containers.
Name In Type Required Description realm_idquery string No Filter by realm ID. Alternative to using realm subdomain in URL
" message " : " All incoming shares retrieved successfully " ,
" id " : " 507f1f77bcf86cd799439011 " ,
" source_container_id " : " 507f1f77bcf86cd799439022 " ,
" source_path " : " /home/app/shared-data " ,
" target_container_id " : " 507f1f77bcf86cd799439033 " ,
" target_project_id " : null ,
" target_type " : " container " ,
" expires_at " : 1735689599 ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-15T10:30:00.000Z " ,
" updated_at " : " 2025-01-15T10:30:00.000Z "
" message " : " Authentication required "
await client . api . storageShares . listIncomingGlobalIterator ()
curl -X GET " https://api.hoody.icu/api/v1/storage/incoming " \
-H " Authorization: Bearer <token> "
Retrieve details of a single storage share by its ID.
Name In Type Required Description idpath string Yes Source container ID shareIdpath string Yes Share ID
" message " : " Storage share retrieved successfully " ,
" id " : " 507f1f77bcf86cd799439011 " ,
" source_container_id " : " 507f1f77bcf86cd799439022 " ,
" source_path " : " /home/app/shared-data " ,
" target_container_id " : " 507f1f77bcf86cd799439033 " ,
" target_project_id " : null ,
" target_type " : " container " ,
" alias " : " prod-data-share " ,
" description " : " Shared application data directory " ,
" expires_at " : 1735689599 ,
" expiry_notified " : false ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-15T10:30:00.000Z " ,
" updated_at " : " 2025-01-15T10:30:00.000Z "
" message " : " Authentication required "
" message " : " Insufficient permissions "
" message " : " Storage share not found "
await client . api . storageShares . get ( id , shareId )
curl -X GET " https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439022/storage/shares/507f1f77bcf86cd799439011 " \
-H " Authorization: Bearer <token> "
Create a new share. Share a directory from the source container with a specific target container (target_container_id) or with every container in a target project (target_project_id). Only one of those two targets may be supplied. The share is mounted automatically when created.
Name In Type Required Description idpath string Yes Source container ID
Field Type Required Description source_pathstring Yes Absolute path inside the source container to share. Character whitelist: a-z A-Z 0-9 / - _ .. System paths (/proc, /sys, /dev, /boot, /run, /var/run) and .. traversal are rejected. modestring Yes Mount mode. Allowed values: readonly, readwrite target_container_idstring No Target container ID for a 1:1 share. Mutually exclusive with target_project_id. target_project_idstring No Target project ID for a project-wide share (auto-mounts on all containers in the project). Mutually exclusive with target_container_id. aliasstring No Optional human-friendly alias (lowercase alphanumeric with hyphens/underscores, 3-63 chars). labelstring No Optional grouping label (lowercase alphanumeric with hyphens/underscores, 3-63 chars). descriptionstring No Optional free-form description (max 1000 chars). enabledboolean No Whether the share is mounted. Default: true. Disabled shares remain in the database but are not mounted. expires_atnumber No Unix timestamp (seconds) at which the share should auto-expire.
" message " : " Storage share created successfully " ,
" id " : " 507f1f77bcf86cd799439020 " ,
" source_container_id " : " 507f1f77bcf86cd799439012 " ,
" source_path " : " /data/shared " ,
" target_project_id " : " 507f1f77bcf86cd799439010 " ,
" target_container_id " : null ,
" target_type " : " project " ,
" alias " : " team-shared-data " ,
" description " : " Shared project files for team collaboration " ,
" expires_at " : 1738252800 ,
" expiry_notified " : false ,
" created_by " : " 507f1f77bcf86cd799439001 " ,
" created_at " : " 2025-01-29T15:00:00.000Z " ,
" updated_at " : " 2025-01-29T15:00:00.000Z "
" message " : " Invalid path provided. "
Error Code Title Description Resolution VALIDATION_ERRORInvalid input parameters One or more request parameters failed validation Check the error message for specific field requirements and correct your input INVALID_PATHInvalid Path The provided source or destination path is invalid. Kernel paths like /proc, /sys, /dev are not allowed. Provide a valid, non-kernel path for the storage share. SELF_SHARECannot Share to Self A container cannot share a directory with itself. Choose a different target container or project.
" message " : " Authentication required "
Error Code Title Description Resolution MISSING_TOKENAuthentication token missing No authentication token was provided in the request Include a valid JWT token in the Authorization header as Bearer <token> INVALID_TOKENInvalid authentication token The provided authentication token is malformed or invalid Obtain a new token by logging in again or using a valid auth token
" message " : " Insufficient permissions "
Error Code Title Description Resolution INSUFFICIENT_PERMISSIONSInsufficient permissions You do not have the required permissions to perform this action Contact the resource owner or administrator to request access
" message " : " Container not found "
Error Code Title Description Resolution CONTAINER_NOT_FOUNDContainer not found The requested container does not exist or you do not have permission to access it. Verify the container ID is correct and that you have access to the project it belongs to. RESOURCE_NOT_FOUNDResource not found The requested resource does not exist or has been deleted Verify the resource ID and ensure it exists
" message " : " Storage share already exists. "
Error Code Title Description Resolution SHARE_ALREADY_EXISTSShare Already Exists A share with the same source path and target already exists. Update the existing share or choose a different target.
" error " : " Too Many Requests " ,
" message " : " Rate limit exceeded "
Error Code Title Description Resolution RATE_LIMIT_EXCEEDEDRate limit exceeded You have exceeded the rate limit for this endpoint Wait before making additional requests, or upgrade your plan for higher limits
// 1:1 share with a specific target container
await client . api . storageShares . create ( id , {
source_path : ' /home/shared/documents ' ,
target_container_id : ' 507f1f77bcf86cd799439033 ' ,
description : ' Read-only access to team documentation '
// Project-wide share with expiration
await client . api . storageShares . create ( id , {
source_path : ' /opt/config ' ,
target_project_id : ' 507f1f77bcf86cd799439010 ' ,
curl -X POST " https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439012/storage/shares " \
-H " Authorization: Bearer <token> " \
-H " Content-Type: application/json " \
"source_path": "/home/shared/documents",
"target_container_id": "507f1f77bcf86cd799439033",
"label": "documentation",
"description": "Read-only access to team documentation"
Update properties of an existing share. Only the fields you include in the body are modified. To clear an optional field, pass null.
Name In Type Required Description idpath string Yes Source container ID shareIdpath string Yes Share ID
Field Type Required Description modestring No Mount mode. Allowed values: readonly, readwrite aliasstring No Alias (lowercase alphanumeric with hyphens/underscores, 3-63 chars). Pass null to remove. labelstring No Label (lowercase alphanumeric with hyphens/underscores, 3-63 chars). Pass null to remove. descriptionstring No Description (max 1000 chars). Pass null to remove. enabledboolean No Enable or disable the share. Disabled shares remain in the database but are not mounted. expires_atnumber No Unix timestamp (seconds) at which the share expires. Pass null to never expire.
" message " : " Storage share updated successfully " ,
" id " : " 507f1f77bcf86cd799439011 " ,
" source_container_id " : " 507f1f77bcf86cd799439022 " ,
" source_path " : " /home/app/shared-data " ,
" target_container_id " : " 507f1f77bcf86cd799439033 " ,
" target_project_id " : null ,
" target_type " : " container " ,
" description " : " Updated to read-write access " ,
" expiry_notified " : false ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-15T10:30:00.000Z " ,
" updated_at " : " 2025-01-15T14:45:00.000Z "
" message " : " Validation failed "
" message " : " Authentication required "
" message " : " Insufficient permissions "
" message " : " Storage share not found "
await client . api . storageShares . update ( id , shareId , {
description : ' Updated to read-write access ' ,
curl -X PATCH " https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439022/storage/shares/507f1f77bcf86cd799439011 " \
-H " Authorization: Bearer <token> " \
-H " Content-Type: application/json " \
"description": "Updated to read-write access"
Enable or disable mounting of an incoming share on a specific target container. This allows the receiving container owner to accept or reject an incoming share. A share appears in the target container’s /proc/mounts only when both the creator’s enabled flag and the receiver’s mount override are true.
Name In Type Required Description idpath string Yes Target container ID (receiver container) shareIdpath string Yes Share ID to toggle
Field Type Required Description mountboolean Yes true to accept and mount the share; false to reject or unmount it
" message " : " Share enabled for mounting successfully " ,
" id " : " 507f1f77bcf86cd799439011 " ,
" source_container_id " : " 507f1f77bcf86cd799439022 " ,
" source_path " : " /home/app/shared-data " ,
" target_container_id " : " 507f1f77bcf86cd799439033 " ,
" target_project_id " : null ,
" target_type " : " container " ,
" alias " : " prod-data-share " ,
" description " : " Shared application data directory " ,
" expires_at " : 1735689599 ,
" expiry_notified " : false ,
" created_by " : " 507f1f77bcf86cd799439044 " ,
" created_at " : " 2025-01-15T10:30:00.000Z " ,
" updated_at " : " 2025-01-15T14:45:00.000Z "
" id " : " 507f1f77bcf86cd799439099 " ,
" share_id " : " 507f1f77bcf86cd799439011 " ,
" container_id " : " 507f1f77bcf86cd799439033 " ,
" created_at " : " 2025-01-15T14:45:00.000Z " ,
" updated_at " : " 2025-01-15T14:45:00.000Z "
" error " : " VALIDATION_ERROR " ,
" message " : " This share does not target the specified container " ,
" share_id " : " 507f1f77bcf86cd799439011 " ,
" container_id " : " 507f1f77bcf86cd799439099 " ,
" target_container_id " : " 507f1f77bcf86cd799439033 " ,
" target_project_id " : null
" message " : " Authentication required "
" message " : " Insufficient permissions "
" message " : " Share not found "
// Accept an incoming share
await client . api . storageShares . toggleIncomingMount ( id , shareId , { mount : true })
// Reject an incoming share
await client . api . storageShares . toggleIncomingMount ( id , shareId , { mount : false })
curl -X PATCH " https://api.hoody.icu/api/v1/containers/507f1f77bcf86cd799439033/storage/incoming/507f1f77bcf86cd799439011/mount " \
-H " Authorization: Bearer <token> " \
-H " Content-Type: application/json " \
Remove a storage share by ID. Share IDs are globally unique so the source container ID is not required. The share is automatically unmounted from its targets.
Name In Type Required Description shareIdpath string Yes Share ID (globally unique, no container ID needed)
" message " : " Storage share deleted successfully "
" message " : " Authentication required "
" message " : " Insufficient permissions "
" message " : " Storage share not found "
await client . api . storageShares . delete ( shareId )
curl -X DELETE " https://api.hoody.icu/api/v1/storage/shares/507f1f77bcf86cd799439011 " \
-H " Authorization: Bearer <token> "