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 link

Authentication

All API requests require a key in the Authorization header.

Authorization: Bearer sk_your_api_key_here

Create 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-sdk

Initialise

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 operations

Generate 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 link

Example 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

TrialProTeam
Duration14 daysMonthlyMonthly
Storage2 GB25 GB100 GB
API keys15Unlimited
Share links10UnlimitedUnlimited
MCP server
Team members115
PriceFree$10/mo$28/mo

Questions? Email support@strovio.xyz or start your free trial to get full API access.