Skip to content

Connect object storage backends to the Hoody platform. Each endpoint registers a new storage backend with the appropriate cloud provider credentials and configuration. Use these endpoints to integrate providers like AWS S3, Azure Blob Storage, Google Cloud Storage, Backblaze B2, and many more.

All endpoints follow the same pattern: POST /api/v1/backends/{provider} with a JSON configuration body. On success the backend is registered and an ID is returned; on failure a validation error is returned.

Connect to an Amazon S3 backend. This endpoint also covers S3-compatible providers including AWS, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, GCS, HuaweiOBS, IBMCOS, IDrive, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Minio, Netease, Outscale, Petabox, RackCorp, Scaleway, SeaweedFS, Selectel, StackPath, Storj, Synology, TencentCOS, Wasabi, and Qiniu.

NameTypeRequiredDefaultDescription
endpointstringYes""Endpoint for S3 API. Required when using an S3 clone.
access_key_idstringNo""AWS Access Key ID. Leave blank for anonymous access or runtime credentials.
secret_access_keystringNo""AWS Secret Access Key. Leave blank for anonymous access or runtime credentials.
regionstringNo""Region to connect to. Leave blank if using an S3 clone without a region.
providerstringNo""Choose your S3 provider (e.g. AWS, Cloudflare, DigitalOcean, Minio, Wasabi, Other).
bucket_aclstringNo""Canned ACL used when creating buckets (private, public-read, public-read-write, authenticated-read).
aclstringNo""Canned ACL used when creating buckets and storing or copying objects.
chunk_sizestringNo"5242880"Chunk size used for multipart uploads (in bytes).
upload_cutoffstringNo"209715200"Cutoff for switching to chunked upload.
upload_concurrencyintegerNo4Concurrency for multipart uploads and copies.
copy_cutoffstringNo"4999610368"Cutoff for switching to multipart copy.
max_upload_partsintegerNo10000Maximum number of parts in a multipart upload.
force_path_stylebooleanNotrueIf true use path style access; if false use virtual hosted style.
env_authbooleanNofalseGet AWS credentials from runtime (environment variables or EC2/ECS metadata).
v2_authbooleanNofalseIf true use v2 authentication. Use only if v4 signatures do not work.
use_accelerate_endpointbooleanNofalseIf true use the AWS S3 accelerated endpoint.
use_dual_stackbooleanNofalseIf true use the AWS S3 dual-stack endpoint (IPv6 support).
requester_paysbooleanNofalseEnables requester pays option when interacting with the S3 bucket.
no_check_bucketbooleanNofalseDon’t attempt to check the bucket exists or create it.
disable_checksumbooleanNofalseDon’t store MD5 checksum with object metadata.
directory_markersbooleanNofalseUpload an empty object with trailing slash for new directories.
storage_classstringNo""Storage class for new objects (STANDARD, LINE, GLACIER, DEEP_ARCHIVE).
server_side_encryptionstringNo""Server-side encryption algorithm (AES256, aws:kms).
sse_kms_key_idstringNo""If using KMS, the ARN of the key.
session_tokenstringNo""An AWS session token.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/s3 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"endpoint": "s3.us-east-1.amazonaws.com",
"provider": "AWS",
"region": "us-east-1",
"access_key_id": "AKIAIOSFODNN7EXAMPLE",
"secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"description": "Production AWS S3 bucket"
}'

Connect to a Microsoft Azure Blob Storage backend.

NameTypeRequiredDefaultDescription
accountstringNo""Azure Storage Account Name. Leave blank to use SAS URL or Emulator.
keystringNo""Storage Account Shared Key. Leave blank to use SAS URL or Emulator.
sas_urlstringNo""SAS URL for container level access only.
tenantstringNo""ID of the service principal’s tenant. Required for service principal auth.
client_idstringNo""The ID of the client in use. Required for service principal auth.
client_secretstringNo""One of the service principal’s client secrets.
client_certificate_pathstringNo""Path to a PEM or PKCS12 certificate file including the private key.
client_certificate_passwordstringNo""Password for the certificate file.
endpointstringNo""Endpoint for the service. Leave blank normally.
public_accessstringNo""Public access level of a container ("", blob, container).
access_tierstringNo""Access tier of blob (hot, cool, cold, archive).
chunk_sizestringNo"4194304"Upload chunk size.
upload_concurrencyintegerNo16Concurrency for multipart uploads.
upload_cutoffstringNo""Cutoff for switching to chunked upload.
list_chunkintegerNo5000Size of blob list.
env_authbooleanNofalseRead credentials from runtime.
use_msibooleanNofalseUse a managed service identity to authenticate.
use_azbooleanNofalseUse the Azure CLI tool az for authentication.
use_emulatorbooleanNofalseUse local storage emulator if provided as ‘true’.
directory_markersbooleanNofalseUpload empty directory marker objects.
disable_checksumbooleanNofalseDon’t store MD5 checksum with object metadata.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/azureblob \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"account": "mystorageaccount",
"key": "base64encodedsharedkey==",
"description": "Production blob storage"
}'

Connect to a Microsoft Azure Files backend.

NameTypeRequiredDefaultDescription
share_namestringNo""Azure Files Share Name. Required.
accountstringNo""Azure Storage Account Name.
keystringNo""Storage Account Shared Key.
connection_stringstringNo""Azure Files Connection String.
sas_urlstringNo""SAS URL.
tenantstringNo""ID of the service principal’s tenant.
client_idstringNo""The ID of the client in use.
client_secretstringNo""One of the service principal’s client secrets.
client_certificate_pathstringNo""Path to a PEM or PKCS12 certificate file.
client_certificate_passwordstringNo""Password for the certificate file.
endpointstringNo""Endpoint for the service.
chunk_sizestringNo"4194304"Upload chunk size.
upload_concurrencyintegerNo16Concurrency for multipart uploads.
max_stream_sizestringNo"10737418240"Max size for streamed files.
env_authbooleanNofalseRead credentials from runtime.
use_msibooleanNofalseUse a managed service identity to authenticate.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/azurefiles \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"account": "mystorageaccount",
"key": "base64encodedsharedkey==",
"share_name": "myshare"
}'

POST /api/v1/backends/google-cloud-storage

Section titled “POST /api/v1/backends/google-cloud-storage”

Connect to a Google Cloud Storage backend.

NameTypeRequiredDefaultDescription
service_account_filestringNo""Service Account Credentials JSON file path.
service_account_credentialsstringNo""Service Account Credentials JSON blob.
client_idstringNo""OAuth Client Id.
client_secretstringNo""OAuth Client Secret.
project_numberstringNo""Project number. Needed only for list/create/delete buckets.
bucket_aclstringNo""Access Control List for new buckets.
object_aclstringNo""Access Control List for new objects.
storage_classstringNo""Storage class for new objects.
locationstringNo""Location for newly created buckets.
endpointstringNo""Endpoint for the service.
env_authbooleanNofalseGet GCP IAM credentials from runtime.
anonymousbooleanNofalseAccess public buckets and objects without credentials.
bucket_policy_onlybooleanNofalseAccess checks should use bucket-level IAM policies.
decompressbooleanNofalseDecompress gzip encoded objects on download.
directory_markersbooleanNofalseUpload empty directory marker objects.
no_check_bucketbooleanNofalseDon’t attempt to check the bucket exists or create it.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/google-cloud-storage \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"service_account_file": "/path/to/service-account.json",
"project_number": "123456789012",
"description": "Production GCS bucket"
}'

Connect to a Backblaze B2 backend.

NameTypeRequiredDefaultDescription
accountstringYes""Account ID or Application Key ID.
keystringYes""Application Key.
endpointstringNo""Endpoint for the service.
download_urlstringNo""Custom endpoint for downloads (e.g. Cloudflare CDN).
chunk_sizestringNo"100663296"Upload chunk size.
upload_cutoffstringNo"209715200"Cutoff for switching to chunked upload.
upload_concurrencyintegerNo4Concurrency for multipart uploads.
copy_cutoffstringNo"4294967296"Cutoff for switching to multipart copy.
download_auth_durationintegerNo604800Time before public link authorization token expires (seconds).
lifecycleintegerNo0Days deleted files are kept when creating a bucket.
hard_deletebooleanNofalsePermanently delete files on remote removal.
versionsbooleanNofalseInclude old versions in directory listings.
disable_checksumbooleanNofalseDisable checksums for large files.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/b2 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"account": "005a0b5d8c4e5f60000000001",
"key": "K005abc123def456ghi789jkl012mno345pqr678stu",
"description": "Production B2 bucket"
}'

Connect to a Cloudinary backend.

NameTypeRequiredDefaultDescription
cloud_namestringYes""Cloudinary Environment Name.
api_keystringYes""Cloudinary API Key.
api_secretstringYes""Cloudinary API Secret.
upload_prefixstringNo""API endpoint for environments outside the US.
upload_presetstringNo""Upload Preset to select asset manipulation on upload.
eventually_consistent_delayintegerNo0Wait time in seconds for eventual consistency.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/cloudinary \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"cloud_name": "my-cloud",
"api_key": "123456789012345",
"api_secret": "abcdefghijklmnopqrstuvwxyz12",
"upload_preset": "my-preset"
}'

Connect to an ImageKit.io backend.

NameTypeRequiredDefaultDescription
endpointstringYes""ImageKit.io URL endpoint from the developer dashboard.
public_keystringYes""ImageKit.io public key.
private_keystringYes""ImageKit.io private key.
only_signedbooleanNofalseSet to true if Restrict unsigned image URLs is enabled in the dashboard.
upload_tagsstringNo""Tags to add to uploaded files (e.g. tag1,tag2).
versionsbooleanNofalseInclude old versions in directory listings.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/imagekit \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"endpoint": "https://ik.imagekit.io/myimagekitid",
"public_key": "public_abc123",
"private_key": "private_xyz789"
}'

Connect to an Akamai NetStorage backend.

NameTypeRequiredDefaultDescription
hoststringYes""Domain+path of NetStorage host. Format: &lt;domain&gt;/<internal folders>.
accountstringYes""NetStorage account name.
secretstringYes""NetStorage account secret/G2O key.
protocolstringNo"https"Protocol to use (http or https).
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/netstorage \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"host": "example-nsu.akamaihd.net/1234",
"account": "myaccount",
"secret": "my-secret-key"
}'

Connect to an Oracle Cloud Infrastructure Object Storage backend.

NameTypeRequiredDefaultDescription
providerstringYes"env_auth"Choose your Auth Provider.
namespacestringYes""Object storage namespace.
regionstringYes""Object storage Region.
compartmentstringNo""Compartment OCID, needed for listing buckets.
endpointstringNo""Endpoint for Object storage API.
config_filestringNo"~/.oci/config"Path to OCI config file.
config_profilestringNo"Default"Profile name inside the oci config file.
chunk_sizestringNo"5242880"Chunk size for uploading.
upload_cutoffstringNo"209715200"Cutoff for switching to chunked upload.
upload_concurrencyintegerNo10Concurrency for multipart uploads.
copy_cutoffstringNo"4999610368"Cutoff for switching to multipart copy.
copy_timeoutintegerNo60Timeout for copy operation in seconds.
max_upload_partsintegerNo10000Maximum number of parts in a multipart upload.
storage_tierstringNo"Standard"Storage class (Standard, InfrequentAccess, Archive).
attempt_resume_uploadbooleanNofalseAttempt to resume previously started multipart upload.
leave_parts_on_errorbooleanNofalseAvoid calling abort upload on failure.
no_check_bucketbooleanNofalseDon’t attempt to check the bucket exists or create it.
disable_checksumbooleanNofalseDon’t store MD5 checksum with object metadata.
sse_customer_algorithmstringNo""If using SSE-C, the encryption algorithm (AES256).
sse_kms_key_idstringNo""If using your own master key in vault, the OCID.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/oracleobjectstorage \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"provider": "user_principal_auth",
"namespace": "my-namespace",
"region": "us-ashburn-1",
"compartment": "ocid1.compartment.oc1..example"
}'

Connect to a QingCloud Object Storage backend.

NameTypeRequiredDefaultDescription
access_key_idstringNo""QingStor Access Key ID. Leave blank for anonymous access or runtime credentials.
secret_access_keystringNo""QingStor Secret Access Key.
endpointstringNo""Endpoint URL for QingStor API. Defaults to https://qingstor.com:443.
zonestringNo""Zone to connect to (pek3a, sh1a, gd2a).
chunk_sizestringNo"4194304"Chunk size for uploading.
upload_cutoffstringNo"209715200"Cutoff for switching to chunked upload.
upload_concurrencyintegerNo1Concurrency for multipart uploads.
connection_retriesintegerNo3Number of connection retries.
env_authbooleanNofalseGet QingStor credentials from runtime.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/qingstor \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"access_key_id": "QINGSTOR_ACCESS_KEY",
"secret_access_key": "QINGSTOR_SECRET_KEY",
"zone": "pek3a"
}'

Connect to an Internet Archive backend.

NameTypeRequiredDefaultDescription
access_key_idstringNo""IAS3 Access Key. Leave blank for anonymous access.
secret_access_keystringNo""IAS3 Secret Key. Leave blank for anonymous access.
endpointstringNo"https://s3.us.archive.org"IAS3 Endpoint.
front_endpointstringNo"https://archive.org"Host of InternetArchive Frontend.
wait_archiveintegerNo0Timeout for waiting on server’s processing tasks (seconds).
disable_checksumbooleanNotrueDon’t ask the server to test against MD5 checksum.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/internetarchive \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"access_key_id": "my-access-key",
"secret_access_key": "my-secret-key",
"description": "Archive.org collection"
}'

Connect to a Sia Decentralized Cloud backend.

NameTypeRequiredDefaultDescription
api_urlstringNo"http://127.0.0.1:9980"Sia daemon API URL.
api_passwordstringNo""Sia Daemon API Password.
user_agentstringNo"Sia-Agent"Siad User Agent.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/sia \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"api_url": "http://127.0.0.1:9980",
"api_password": "my-sia-password"
}'

Connect to a Storj Decentralized Cloud Storage backend.

NameTypeRequiredDefaultDescription
providerstringNo"existing"Choose an authentication method (existing or new).
satellite_addressstringNo"us1.storj.io"Satellite address (us1.storj.io, eu1.storj.io, ap1.storj.io).
api_keystringNo""API key.
passphrasestringNo""Encryption passphrase.
access_grantstringNo""Access grant.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/storj \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"provider": "existing",
"satellite_address": "us1.storj.io",
"api_key": "my-storj-api-key",
"passphrase": "my-encryption-passphrase"
}'

Connect to a Tardigrade Decentralized Cloud Storage backend (legacy Storj branding).

NameTypeRequiredDefaultDescription
providerstringNo"existing"Choose an authentication method (existing or new).
satellite_addressstringNo"us1.storj.io"Satellite address (us1.storj.io, eu1.storj.io, ap1.storj.io).
api_keystringNo""API key.
passphrasestringNo""Encryption passphrase.
access_grantstringNo""Access grant.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/tardigrade \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"provider": "existing",
"satellite_address": "us1.storj.io",
"api_key": "my-tardigrade-api-key",
"passphrase": "my-encryption-passphrase"
}'

Connect to an OpenStack Swift backend. This endpoint covers Rackspace Cloud Files, Blomp Cloud Storage, Memset Memstore, and OVH.

NameTypeRequiredDefaultDescription
userstringNo""User name to log in (OS_USERNAME).
keystringNo""API key or password (OS_PASSWORD).
authstringNo""Authentication URL for server (OS_AUTH_URL).
user_idstringNo""User ID to log in (v3 auth).
tenantstringNo""Tenant name (OS_TENANT_NAME or OS_PROJECT_NAME).
tenant_idstringNo""Tenant ID (OS_TENANT_ID).
tenant_domainstringNo""Tenant domain (v3 auth).
domainstringNo""User domain (v3 auth).
regionstringNo""Region name (OS_REGION_NAME).
storage_urlstringNo""Storage URL (OS_STORAGE_URL).
auth_tokenstringNo""Auth Token from alternate authentication (OS_AUTH_TOKEN).
application_credential_idstringNo""Application Credential ID.
application_credential_namestringNo""Application Credential Name.
application_credential_secretstringNo""Application Credential Secret.
auth_versionintegerNo0AuthVersion (1, 2, or 3).
endpoint_typestringNo"public"Endpoint type (public, internal, admin).
storage_policystringNo""Storage policy for new containers ("", pcs, pca).
chunk_sizestringNo"5368709120"Files above this size will be chunked.
env_authbooleanNofalseGet swift credentials from environment variables.
no_chunkbooleanNofalseDon’t chunk files during streaming upload.
no_large_objectsbooleanNofalseDisable support for static and dynamic large objects.
leave_parts_on_errorbooleanNofalseAvoid calling abort upload on failure.
fetch_until_empty_pagebooleanNofalseWhen paginating, always fetch unless an empty page is received.
partial_page_fetch_thresholdintegerNo0Fetch if current page is within this percentage of the limit.
descriptionstringNo""Description of the remote.
Terminal window
curl -X POST https://api.hoody.com/api/v1/backends/swift \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"user": "myuser",
"key": "mypassword",
"auth": "https://auth.cloud.ovh.net/v3",
"tenant": "mytenant",
"region": "GRA1"
}'