Use any S3 client.
Access your dosya.dev files with AWS CLI, boto3, rclone, or any S3-compatible tool. Drop-in replacement with zero code changes.
Generate S3 Keys
Settings > API Keys > S3 Configure Client
endpoint: dosya.dev/s3 Use S3 Commands
aws s3 ls, cp, sync ... Connect with S3 credentials
Generate S3 credentials from your API key in dashboard settings. Uses standard AWS Signature V4 authentication.
https://dosya.dev/s3
DOSYA_XXXXXXXXXXXXXXXX
your_s3_secret_key
us-east-1
ws_your_workspace_id
Required (forcePathStyle: true)
Configure AWS CLI
Set up the AWS CLI with your dosya.dev S3 credentials. Works with AWS CLI v2.
# Configure AWS CLI with your dosya.dev S3 credentials
$ aws configure
AWS Access Key ID: DOSYA_XXXXXXXXXXXXXXXX
AWS Secret Access Key: your_s3_secret_key
Default region name: us-east-1
Default output format: json
# Set the custom endpoint (add to ~/.aws/config or use --endpoint-url)
$ export AWS_ENDPOINT_URL=https://dosya.dev/s3 Use with AWS CLI
The object operations your tools actually use work as they do against S3: list, upload, download, copy, delete, and multipart. Point the client at our endpoint, turn on path-style addressing, and your existing code keeps working. Bucket lifecycle operations are the exception - see Limitations below.
# List all buckets (workspaces)
$ aws --endpoint-url https://dosya.dev/s3 s3 ls
# List files in a workspace
$ aws --endpoint-url https://dosya.dev/s3 s3 ls s3://ws_your_workspace_id/
# List files in a subfolder
$ aws --endpoint-url https://dosya.dev/s3 s3 ls s3://ws_your_workspace_id/Documents/ # Upload a single file
$ aws --endpoint-url https://dosya.dev/s3 s3 cp \
./report.pdf s3://ws_your_workspace_id/Documents/report.pdf
# Upload an entire folder
$ aws --endpoint-url https://dosya.dev/s3 s3 cp \
./my-folder/ s3://ws_your_workspace_id/my-folder/ --recursive
# Sync a local directory (upload only new/changed files)
$ aws --endpoint-url https://dosya.dev/s3 s3 sync \
./backups/ s3://ws_your_workspace_id/backups/ # Download a single file
$ aws --endpoint-url https://dosya.dev/s3 s3 cp \
s3://ws_your_workspace_id/Documents/report.pdf ./report.pdf
# Download an entire folder
$ aws --endpoint-url https://dosya.dev/s3 s3 cp \
s3://ws_your_workspace_id/Documents/ ./docs/ --recursive # Delete a file
$ aws --endpoint-url https://dosya.dev/s3 s3 rm \
s3://ws_your_workspace_id/old-file.txt
# Copy a file within a workspace
$ aws --endpoint-url https://dosya.dev/s3 s3 cp \
s3://ws_your_workspace_id/report.pdf \
s3://ws_your_workspace_id/Archive/report-backup.pdf
# Move a file (copy + delete)
$ aws --endpoint-url https://dosya.dev/s3 s3 mv \
s3://ws_your_workspace_id/temp.txt \
s3://ws_your_workspace_id/Archive/temp.txt Use with any S3 SDK
Works with every language that has an S3 SDK. Just point the endpoint to dosya.dev.
// Node.js / TypeScript with @aws-sdk/client-s3
import { S3Client, ListObjectsV2Command, PutObjectCommand } from "@aws-sdk/client-s3";
import { readFileSync } from "fs";
const client = new S3Client({
endpoint: "https://dosya.dev/s3",
region: "us-east-1",
credentials: {
accessKeyId: "DOSYA_XXXXXXXXXXXXXXXX",
secretAccessKey: "your_s3_secret_key",
},
forcePathStyle: true,
});
// List files
const list = await client.send(new ListObjectsV2Command({
Bucket: "ws_your_workspace_id",
Prefix: "Documents/",
}));
// Upload a file
await client.send(new PutObjectCommand({
Bucket: "ws_your_workspace_id",
Key: "Documents/report.pdf",
Body: readFileSync("./report.pdf"),
})); # Python with boto3
import boto3
client = boto3.client("s3",
endpoint_url="https://dosya.dev/s3",
aws_access_key_id="DOSYA_XXXXXXXXXXXXXXXX",
aws_secret_access_key="your_s3_secret_key",
region_name="us-east-1",
)
# List files
response = client.list_objects_v2(
Bucket="ws_your_workspace_id",
Prefix="Documents/",
)
# Upload a file
client.upload_file(
"./report.pdf",
"ws_your_workspace_id",
"Documents/report.pdf",
) Use with rclone
Configure dosya.dev as an S3-compatible rclone remote for sync, mount, and backup.
# rclone.conf
[dosya-s3]
type = s3
provider = Other
access_key_id = DOSYA_XXXXXXXXXXXXXXXX
secret_access_key = your_s3_secret_key
endpoint = https://dosya.dev/s3
force_path_style = true
# Then use like any other rclone remote
$ rclone ls dosya-s3:ws_your_workspace_id/
$ rclone copy ./backups dosya-s3:ws_your_workspace_id/backups/
$ rclone sync ./docs dosya-s3:ws_your_workspace_id/docs/ Third-party S3 clients
Use any S3-compatible GUI client. Here are the connection details.
# Cyberduck / Mountain Duck / WinSCP
1. Protocol: Amazon S3
2. Server: dosya.dev
3. Port: 443
4. Path: /s3
5. Access Key ID: DOSYA_XXXXXXXXXXXXXXXX
6. Secret Key: your_s3_secret_key Supported operations
Core S3 API operations for managing objects and multipart uploads.
ListBuckets List all workspaces you have access to.
ListObjectsV2 List files with prefix, delimiter, and pagination support.
GetObject Download files with ETag and conditional request support.
HeadObject Get file metadata without downloading the body.
PutObject Upload files. Intermediate folders are created automatically.
DeleteObject Delete files (soft-delete). Idempotent - always returns 204.
CopyObject Duplicate files on the server without downloading.
Multipart Upload Upload large files in parts. Create, upload parts, complete or abort.
HeadBucket Check if a workspace exists and you have access.
API key scopes
Permission mapping
| Operation | read | upload | full |
|---|---|---|---|
| ListBuckets | ✓ | ✓ | ✓ |
| ListObjectsV2 | ✓ | ✕ | ✓ |
| GetObject (download) | ✓ | ✕ | ✓ |
| HeadObject | ✓ | ✕ | ✓ |
| PutObject (upload) | ✕ | ✓ | ✓ |
| DeleteObject | ✕ | ✕ | ✓ |
| CopyObject | ✕ | ✕ | ✓ |
| Multipart Upload | ✕ | ✓ | ✓ |
Limitations & notes
| Path style only | Virtual-hosted bucket style is not supported. Use path style (forcePathStyle: true). |
| Bucket = Workspace | S3 bucket names are your workspace IDs (ws_xxx). You cannot create or delete buckets. |
| Auto-create folders | Uploading to a/b/c.txt automatically creates folders a/ and a/b/ if needed. |
| Locked files | Files locked via the dashboard cannot be modified or deleted via S3. |
| Rate limiting | An abuse ceiling on request rate, on every plan: 600 requests per minute per user, 1,200 per minute per IP. It is not a usage quota and nothing is billed against it. Free credentials additionally carry the 60/minute fair-use limit, which binds first. |
| Separate credentials | S3 credentials are generated separately from your API key (dos_xxx). |
| Upload scope is write-only | A key scoped to upload can PutObject and run multipart uploads, but ListObjectsV2, GetObject and HeadObject all answer 403 AccessDenied. It is a drop box, not a read-write credential. Use read or full to download. |