Overview
Section titled “Overview”WebDAV-compatible file operations let standard WebDAV clients (Nextcloud, ownCloud, Cyberduck, macOS Finder, Windows Explorer) interact with Hoody container files. These endpoints speak the WebDAV HTTP verbs (OPTIONS, COPY, MOVE, LOCK, UNLOCK, PROPFIND, PROPPATCH) on top of the regular file storage. Use them when you want native OS or third-party WebDAV client integration rather than the higher-level REST file APIs.
Capability discovery
Section titled “Capability discovery”OPTIONS /{path}
Section titled “OPTIONS /{path}”Returns supported HTTP methods and WebDAV compliance class. WebDAV clients call this first to discover server capabilities (RFC 4918 §10.1).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
path | path | string | Yes | File or directory path to inspect |
curl -X OPTIONS "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents" \ -H "Authorization: Bearer <token>"await client.files.webdav.getOptions("documents");Capability discovery. Returns no body; advertised methods and DAV class live in headers.
{ "description": "Capability discovery (RFC 4918 §10.1). Returns no body; advertised methods and DAV class live in headers."}| Header | Type | Description |
|---|---|---|
Allow | string | Comma-separated list of supported HTTP methods. WebDAV-root paths advertise the full WebDAV verb set; /api/v1/* paths advertise the simple HTTP set. |
DAV | string | WebDAV compliance class. Set to 1 on WebDAV-root OPTIONS responses; absent on /api/v1/* OPTIONS responses. |
MS-Author-Via | string | Authoring-protocol hint for Microsoft WebDAV clients. Set to DAV on WebDAV-root OPTIONS responses. |
Connect a WebDAV client
Section titled “Connect a WebDAV client”GET /{path}?type=webdav
Section titled “GET /{path}?type=webdav”Connect a WebDAV client (Nextcloud, ownCloud, etc.) to a container’s file store. The client supplies the remote WebDAV server coordinates; Hoody returns the file content or directory listing.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
path | path | string | Yes | Path within the Hoody container |
type | query | string | Yes | Must be webdav |
server | query | string | Yes | Remote WebDAV server hostname |
user | query | string | No | WebDAV username |
pass | query | string | No | WebDAV password |
webdav_path | query | string | No | WebDAV endpoint path (default: /) |
curl -X GET "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/remote.php/dav/files/alice/Documents?type=webdav&server=nextcloud.example.com&user=alice&pass=secret123&webdav_path=/remote.php/dav" \ -H "Authorization: Bearer <token>"await client.files.webdav.access( "remote.php/dav/files/alice/Documents", { type: "webdav", server: "nextcloud.example.com", user: "alice", pass: "secret123", webdav_path: "/remote.php/dav" });File content or directory listing.
{ "description": "File content or directory listing"}Copy and move
Section titled “Copy and move”COPY /{path}
Section titled “COPY /{path}”WebDAV COPY: copy a file or directory to a new location specified by the Destination header.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
path | path | string | Yes | Source file or directory path |
Destination | header | string | Yes | Destination URL for the copy |
Depth | header | string | No | Copy depth: 0 (file only) or infinity (recursive for directories). Default: infinity |
curl -X COPY "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents/report.pdf" \ -H "Authorization: Bearer <token>" \ -H "Destination: https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/archive/report-backup.pdf" \ -H "Depth: 0"await client.files.webdav.copyResource( "documents/report.pdf", { Destination: "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/archive/report-backup.pdf", Depth: "0" });Resource copied successfully.
{ "description": "Resource copied successfully"}Resource overwritten at destination.
{ "description": "Resource overwritten at destination"}Copy not allowed.
{ "success": false, "error": "You do not have permission to copy this resource"}Source resource not found.
{ "description": "Source resource not found"}Destination parent does not exist.
{ "description": "Destination parent does not exist"}MOVE /{path}
Section titled “MOVE /{path}”WebDAV MOVE: move or rename a file or directory. Requires both upload and delete permissions on the source.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
path | path | string | Yes | Source file or directory path |
Destination | header | string | Yes | Destination URL for the move |
curl -X MOVE "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents/draft.md" \ -H "Authorization: Bearer <token>" \ -H "Destination: https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents/final.md"await client.files.webdav.moveResource( "documents/draft.md", { Destination: "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents/final.md" });Resource moved successfully.
{ "description": "Resource moved successfully"}Resource overwritten at destination.
{ "description": "Resource overwritten at destination"}Move not allowed (requires upload and delete permissions).
{ "success": false, "error": "Move requires both upload and delete permissions"}Source resource not found.
{ "description": "Source resource not found"}Destination parent does not exist.
{ "description": "Destination parent does not exist"}Locking (compatibility stubs)
Section titled “Locking (compatibility stubs)”LOCK /{path}
Section titled “LOCK /{path}”Returns a lock token. The optional application/xml body follows the standard WebDAV lock-info schema.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
path | path | string | Yes | File path to lock |
Depth | header | string | No | 0 or infinity |
Request Body
Section titled “Request Body”Optional. Content-Type: application/xml. The schema is open (no documented fields).
curl -X LOCK "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents/report.pdf" \ -H "Authorization: Bearer <token>" \ -H "Depth: 0" \ -H "Content-Type: application/xml" \ -d '<?xml version="1.0" encoding="utf-8"?>
</D:lockscope> </D:locktype> mailto:alice@example.com</D:href></D:owner></D:lockinfo>'await client.files.webdav.lockResource( "documents/report.pdf", { Depth: "0" });Lock token issued (compatibility only). Body is application/xml.
<?xml version="1.0" encoding="utf-8"?>
opaquelocktoken:abc123-def456</D:href></D:locktoken> </D:locktype> </D:lockscope> </D:activelock> </D:lockdiscovery></D:prop>File not found.
{ "description": "File not found"}UNLOCK /{path}
Section titled “UNLOCK /{path}”Releases a previously issued lock token. No-op compatibility stub.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
path | path | string | Yes | File path to unlock |
Lock-Token | header | string | Yes | Lock token to release |
curl -X UNLOCK "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents/report.pdf" \ -H "Authorization: Bearer <token>" \ -H "Lock-Token: <opaquelocktoken:abc123-def456>"await client.files.webdav.unlockResource( "documents/report.pdf", { "Lock-Token": "<opaquelocktoken:abc123-def456>" });Lock released (no-op).
{ "description": "Lock released (no-op)"}Resource not found.
{ "description": "Resource not found"}Properties
Section titled “Properties”PROPFIND /{path}
Section titled “PROPFIND /{path}”Retrieve WebDAV properties for a file or directory. Returns XML with resource type, size, modification date, ETag, and more. The Depth header controls recursion into directories.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
path | path | string | Yes | File or directory path |
Depth | header | string | No | Depth of property retrieval: 0 (resource only), 1 (immediate children), infinity (recursive). Default: 1 |
Request Body
Section titled “Request Body”Optional. Content-Type: application/xml. Standard PROPFIND XML body specifying which properties to retrieve.
curl -X PROPFIND "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents" \ -H "Authorization: Bearer <token>" \ -H "Depth: 1" \ -H "Content-Type: application/xml" \ -d '<?xml version="1.0" encoding="utf-8"?>
</D:prop></D:propfind>'await client.files.webdav.propfindResource( "documents", { Depth: "1" });Multi-Status response with resource properties in WebDAV XML format.
<?xml version="1.0" encoding="utf-8"?>
/documents/</D:href>
</D:resourcetype> Mon, 15 Jan 2026 09:30:00 GMT</D:getlastmodified> </D:prop> HTTP/1.1 200 OK</D:status> </D:propstat> </D:response>
/documents/report.pdf</D:href>
482190</D:getcontentlength> Wed, 08 Jan 2026 14:12:33 GMT</D:getlastmodified> "a1b2c3d4e5f6"</D:getetag> </D:prop> HTTP/1.1 200 OK</D:status> </D:propstat> </D:response></D:multistatus>Resource not found.
{ "description": "Resource not found"}PROPPATCH /{path}
Section titled “PROPPATCH /{path}”Modify properties on a file. Returns a 207 Multi-Status response describing which properties were set or removed.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
path | path | string | Yes | File path to update |
Request Body
Section titled “Request Body”Required. Content-Type: application/xml. Standard PROPPATCH XML body with set/remove instructions.
curl -X PROPPATCH "https://proj_a8f3e2-ctn_5d9c1b-files-1.us-east-1.containers.hoody.icu/documents/report.pdf" \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/xml" \ -d '<?xml version="1.0" encoding="utf-8"?>
reviewed</Z:custom-tag> </D:prop> </D:set></D:propertyupdate>'await client.files.webdav.proppatchResource("documents/report.pdf");Multi-Status response confirming property changes.
<?xml version="1.0" encoding="utf-8"?>
/documents/report.pdf</D:href>
</D:prop> HTTP/1.1 200 OK</D:status> </D:propstat> </D:response></D:multistatus>File not found.
{ "description": "File not found"}