storage.* does. HTTP and SFTP use the same Storage namespace and ACL path, so a transfer receives exactly the access that its executing identity has in Storage.
HTTP
Use
api.httpCall() for external API requests, streamed request bodies, and streamed response targets.SFTP
Use
transport.sftpImport(), transport.sftpExport(), and transport.sftpCommands() for managed SFTP connections.One Storage authorization model
Every Storage source and target follows this rule:namespace beside the normal create-upload fields:
namespace for explorer. A provided namespace is not a permission grant: Storage validates its registered namespace policy, the current execution identity, restricted ancestors, and entry ACL. This applies equally to private/<userId>, agent workspaces, managed attachments, media, and reports. Read-only or managed namespaces still reject writes when their Storage policy says so.
HTTP streaming
Useapi.httpCall() to send an existing Storage file without buffering it in the component:
SFTP
The third argument is an active Secret name, normally a human-readable name such asSFTP_PRODUCTION. A UUID is also accepted. The Secret is resolved through its unique name index or primary key; credentials never enter low-code source.
Connection Secret formats
Password authentication may use flat JSON:hostKeyFingerprint: "SHA256:..." to JSON or ?hostKeyFingerprint=SHA256%3A... to the connection string. Automatic acceptance is stateless: it does not persist a known_hosts record.
Import and export
sftpImport() streams remote bytes into a direct Storage upload session and returns only after Storage finalizes the entry. sftpExport() reads through a short-lived Storage download URL. Neither direction buffers the complete file in low-code memory. sftpCommands() is for structured SFTP file operations such as listing, stat, rename, and cleanup; it is not a remote shell.
Choose the boundary
There is no
transport.http global today. HTTP is already a mature api.httpCall() surface; Transport currently adds the Secret-backed SFTP boundary.
