Strovio Docs
File storage that just works. Upload, organize, share, and build on top of Strovio using the REST API, TypeScript SDK, or MCP server.
Quick start
Sign up at strovio.xyz/signup, then go to Dashboard → Developer to create an API key.
Upload a file in 3 lines
import { StrovioClient } from "strovio-sdk";
const client = new StrovioClient({ apiKey: "sk_..." });
const file = await client.upload("./photo.jpg", { access: "public" });
console.log(file.publicUrl); // instant CDN linkAuthentication
All API requests require a key in the Authorization header.
Authorization: Bearer sk_your_api_key_hereCreate and manage keys at Dashboard → Developer → API Keys. Your plan determines how many keys you can have.
REST API
Base URL: https://strovio.xyz/api/v1
Upload a file
Two-step process: get a presigned PUT URL, then upload directly to S3.
POST /api/v1/files/presign-put
{
"key": "invoice-2026.pdf",
"contentType": "application/pdf",
"size": 204800,
"access": "private" // "public" | "private"
}
// Response
{
"putUrl": "https://s3.strovio.xyz/...",
"s3Key": "uploads/{userId}/private/invoice-2026.pdf"
}Then PUT the file bytes directly:
PUT {putUrl}
Content-Type: application/pdf
Content-Length: 204800
<file bytes>Confirm upload
POST /api/v1/files/complete
{
"key": "uploads/{userId}/private/invoice-2026.pdf",
"name": "invoice-2026.pdf",
"size": 204800,
"mimeType": "application/pdf",
"access": "private"
}List files
GET /api/v1/files
GET /api/v1/files?folder=designs
// Response
{
"files": [
{
"key": "uploads/{userId}/public/logo.png",
"name": "logo.png",
"size": 44032,
"access": "public",
"publicUrl": "https://s3.strovio.xyz/...",
"createdAt": "2026-05-31T..."
}
]
}Get a presigned download URL (private files)
GET /api/v1/files/{encodedKey}?expiresIn=3600
// Response
{
"url": "https://s3.strovio.xyz/...?X-Amz-Expires=3600&..."
}Delete a file
DELETE /api/v1/files/{encodedKey}Large file uploads
For big files, use a multipart upload so no single request has to carry the whole body (which reverse proxies often reject). Strovio splits the file into 3 MiB parts, each with its own presigned URL. Supported up to 512 MB per file.
Using the SDK? You don't need any of this, client.upload() automatically switches to multipart for anything over 1 MiB. The steps below are only for the raw REST API.
1. Start the multipart upload
POST /api/v1/files/multipart/start
{
"key": "video.mp4",
"contentType": "video/mp4",
"size": 134217728, // total bytes
"access": "private"
}
// Response
{
"uploadId": "2~abc...",
"s3Key": "uploads/{userId}/private/video.mp4",
"bucket": "strovio-media",
"parts": [
{ "partNumber": 1, "url": "https://s3.strovio.xyz/...", "contentLength": 3145728 },
{ "partNumber": 2, "url": "https://s3.strovio.xyz/...", "contentLength": 3145728 }
// ...one per 3 MiB chunk
]
}2. PUT each part, keep its ETag
Upload each chunk to its url. The response ETag header for each part is required to finish.
PUT {parts[i].url}
<chunk bytes>
// Capture the ETag response header for each part.3. Complete the upload
POST /api/v1/files/multipart/complete
{
"s3Key": "uploads/{userId}/private/video.mp4",
"uploadId": "2~abc...",
"key": "video.mp4",
"contentType": "video/mp4",
"access": "private",
"parts": [
{ "PartNumber": 1, "ETag": "\"...\"" },
{ "PartNumber": 2, "ETag": "\"...\"" }
]
}TypeScript SDK
Install from npm:
npm install strovio-sdkInitialise
import { StrovioClient } from "strovio-sdk";
const client = new StrovioClient({
apiKey: process.env.STROVIO_API_KEY,
// baseUrl: "https://strovio.xyz" // default
});Upload
// From a file path (Node.js)
const file = await client.upload("./photo.jpg", {
access: "public", // or "private"
name: "photo.jpg", // optional override
});
// file.publicUrl — CDN link (if access: "public")
// file.key — S3 key for later operationsGenerate a private download URL
const url = await client.getDownloadUrl(file.key, {
expiresIn: 3600, // seconds
});List files
const files = await client.listFiles({ folder: "assets" });Delete
await client.deleteFile(file.key);MCP server
The Strovio MCP server lets any AI agent (Claude, Cursor, Codex) upload and manage files directly. Available on Pro and Team plans.
Add to Claude Code
claude mcp add-json -s user strovio '{
"command": "npx",
"args": ["strovio-mcp@latest"],
"env": {
"STROVIO_API_KEY": "sk_your_key_here"
}
}'Tools exposed
strovio_upload_file Upload a file, returns URL
strovio_list_files List files, optionally by folder
strovio_delete_file Delete a file by key
strovio_get_download_url Get a presigned URL for a private file
strovio_create_share Create a permanent share linkExample agent prompt
"Upload the file at /tmp/report.pdf to Strovio as private
and give me a download link valid for 24 hours."Share links
Permanent share links are stable URLs that always serve a fresh presigned URL under the hood. The link never expires, but you can revoke it from the dashboard.
POST /api/files/share
{ "key": "uploads/{userId}/private/invoice.pdf" }
// Response
{ "token": "abc123", "url": "https://strovio.xyz/share/abc123" }Plan limits
| Trial | Pro | Team | |
|---|---|---|---|
| Duration | 14 days | Monthly | Monthly |
| Storage | 2 GB | 25 GB | 100 GB |
| API keys | 1 | 5 | Unlimited |
| Share links | 10 | Unlimited | Unlimited |
| MCP server | — | ✓ | ✓ |
| Team members | 1 | 1 | 5 |
| Price | Free | $10/mo | $28/mo |
Questions? Email support@strovio.xyz or start your free trial to get full API access.