REST API
Envie arquivos, crie coleções e gerencie compartilhamentos via HTTP. Todas as respostas são em JSON; não é necessária uma chave de API para uploads anônimos.
Como funcionam os carregamentos
A API do storage.to alimenta nosso CLI, app de desktop, enviador web e qualquer cliente de terceiros que você queira criar. O fluxo de envio tem três etapas:
PUT seus bytes diretamente na(s) URL(s) pré-assinada(s). Os bytes não passam pelos nossos servidores.File e entregamos uma URL compartilhável.Todos os endpoints abaixo são relativos a esta base. Exemplo: POST /upload/init significa POST https://storage.to/api/upload/init.
Autenticação
Uploads anônimos funcionam sem autenticação, mas com limites rígidos. Chamadas sem chave são limitadas a 50 arquivos por 24 horas por dispositivo ou IP, além das cotas de banda abaixo, e os arquivos expiram após 3 dias.
Autenticar com uma conta gratuita desbloqueia:
- Sem limite diário de arquivos
- Sem quota de largura de banda de envio
- Uploads vinculados à sua conta (visível em /dashboard)
- Recursos premium (arquivos permanentes, mais armazenamento)
- Mutations baseadas em propriedade (excluir, definir senha, alterar validade) sem precisar do match do visitor-token
Limites num relance
expiry_daysexpiry_daysNão há quotas mensais: todos os limites são janelas móveis de 24 horas ou limites por minuto. O plano gratuito não tem espaço de armazenamento fixo: cada ficheiro expira por si só, pelo que nada se acumula contra uma quota.
Provar a propriedade
/upload/init multipart, /upload/confirm, /file/reserve, /collection) retorna um owner_token na resposta. O token é uma prova de propriedade assinada, vinculada a esse recurso específico, independente do seu IP ou do token do visitante. Os tokens duram enquanto o recurso existir, são seguros para persistir e não expiram de forma independente. Um token perdido significa perder o controle desse recurso (arquivo/coleção/envio) - trate-os como senhas locais.# ou, juntamente com uma sessão Bearer
X-Owner-Token: <token>
visitor_token. O CLI o armazena em ~/.config/storageto/token (veja Documentação da CLI).Para endpoints de mutação (delete, definir senha, alterar validade), a propriedade é confirmada se ou o token do visitante corresponder a ou a requisição vier do mesmo IP que criou o arquivo. Ambos podem ser perdidos (cookies apagados, mudanças de rede). O token do proprietário é a prova preferida daqui pra frente.
Erros
Os erros seguem um formato consistente: { "success": false, "error": "…" }
Limites de taxa
Todos os limites de taxa são por IP. Uma resposta 429 inclui os cabeçalhos padrão Retry-After, X-RateLimit-Limit e X-RateLimit-Remaining.
Cota de upload: clientes anônimos têm dois limites em paralelo - 100 GB / 24 h por visitor token e 500 GB / 24 h por IP (o limite de IP captura tráfego sem token e redes compartilhadas). Quando qualquer um for excedido, você recebe um 429 com detalhes. Isso é apenas uma cota de upload - downloads são ilimitados e sem limitação.
Upload
8 endpointsO fluxo de upload em três etapas para qualquer arquivo, incluindo arquivos acima de 5 GB (multipart automático). Se você só precisa de um upload rápido no estilo de captura de tela, veja ShareX.
Inicie um upload. Para arquivos >50 MB, a resposta é um upload multipart (campo type: "multipart"); caso contrário, um único PUT presignado.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
filename | string · required | Nome original do arquivo. Máx. 255 caracteres. |
content_type | string · required | Tipo MIME. |
size | integer · required | Tamanho do arquivo em bytes. Mín. 1. |
curl -X POST https://storage.to/api/upload/init \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "filename": "report.pdf", "content_type": "application/pdf", "size": 2202009 }'
{ "success": true, "type": "single", "upload_url": "https://r2.cloudflarestorage.com/...signed...", "headers": { "Host": ["..."] }, "r2_key": "uuid-abc123" }
{ "success": true, "type": "multipart", "upload_id": "01HXYZ...", "r2_key": "uuid-abc123", "part_size": 33554432, "total_parts": 4, "initial_urls": { "1": "https://...", "2": "https://..." }, "owner_token": "owner_v1_..." }
Solicita URLs adicionais das partes para um upload multipart em andamento. Usado quando /init retornou menos URLs do que você tem partes (ou elas expiraram).
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
upload_id | string · required | O upload_id de /init. |
part_numbers | array<int> · required | Números das partes para obter URLs. |
curl -X POST https://storage.to/api/upload/parts \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ...", "part_numbers": [3, 4] }'
{ "success": true, "part_urls": [ { "partNumber": 3, "url": "https://..." }, { "partNumber": 4, "url": "https://..." } ] }
Finaliza um upload multipart assim que todas as partes forem enviadas.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
upload_id | string · required | O upload_id de /init. |
parts | array · required | Cada entrada: { partNumber, etag } da resposta do envio da parte. |
curl -X POST https://storage.to/api/upload/complete-multipart \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ...", "parts": [ { "partNumber": 1, "etag": "\"abc...\"" }, { "partNumber": 2, "etag": "\"def...\"" } ] }'
{ "success": true }
Cancele um upload multipart e limpe qualquer dado parcial.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
upload_id | string · required | O upload a ser interrompido. |
curl -X POST https://storage.to/api/upload/abort \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ..." }'
Confirme que o upload foi concluído. É quando criamos o registro File e retornamos a URL compartilhável.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
filename | string · required | Nome original do arquivo. |
size | integer · required | Tamanho do arquivo em bytes. |
content_type | string · required | Tipo MIME. |
r2_key | string · required | O r2_key de /init. |
collection_id | string · optional | Anexar a uma coleção. |
crc32 | integer · optional | Soma de verificação CRC32 para verificação de integridade. |
file_id | string(9) · optional | Concluir um ID de arquivo reservado previamente. |
curl -X POST https://storage.to/api/upload/confirm \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "filename": "report.pdf", "size": 2202009, "content_type": "application/pdf", "r2_key": "uuid-abc123" }'
{ "success": true, "file": { "id": "FQxyz1234", "url": "https://storage.to/FQxyz1234", "filename": "report.pdf", "size": 2202009, "human_size": "2.1 MB", "expires_at": "2026-04-15T12:00:00Z" }, "owner_token": "owner_v1_..." }
Reserve um ID de arquivo e uma URL compartilhável antes os bytes ficarem prontos. Útil quando você precisa entregar um link primeiro e concluir o upload depois. A propriedade fica vinculada ao seu token de visitante + IP. Finalize o upload mais tarde com /upload/init + /upload/confirm, passando file_id para confirmar.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
filename | string · optional | Nome de arquivo de exemplo. Padrão: "Pending". |
content_type | string · optional | Tipo MIME de exemplo. |
curl -X POST https://storage.to/api/file/reserve \ -H "X-Visitor-Token: abc123"
{ "success": true, "file": { "id": "FQxyz1234", "url": "https://storage.to/FQxyz1234", "expires_at": "2026-04-12T18:00:00Z" }, "owner_token": "owner_v1_..." }
Equivalente em lote de /upload/init, otimizado para o uploader web. Inicia até 250 arquivos em uma única ida e volta.
Usado internamente pelo uploader web. A maioria dos clientes deve preferir o /upload/init de arquivo único.
Equivalente em lote de /upload/confirm. Confirma muitos arquivos em uma única ida e volta.
Coleções
9 endpointsUma coleção agrupa vários arquivos sob uma única URL de compartilhamento (/c/{id}). Até 10.000 arquivos e 25 GB no total.
Crie uma nova coleção. Anexe arquivos depois passando collection_id em /upload/confirm.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
expected_file_count | integer · optional | Dica para marcar automaticamente a coleção como pronta assim que todos os arquivos esperados forem confirmados. |
curl -X POST https://storage.to/api/collection \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "expected_file_count": 3 }'
{ "success": true, "collection": { "id": "ABC123xyz", "url": "https://storage.to/c/ABC123xyz", "expires_at": "2026-04-15T12:00:00Z" }, "owner_token": "owner_v1_..." }
Verifica o estado de uma coleção. Também marca automaticamente a coleção como pronta se todos os arquivos esperados tiverem sido confirmados.
curl https://storage.to/api/collection/ABC123xyz/status
{ "success": true, "files": [ /* file objects: id, url, filename, size, ... */ ], "is_uploading": false, "file_count": 3, "expected_file_count": 3, "total_size": 6291456, "human_total_size": "6 MB" }
Marque a coleção como pronta para download. Normalmente não é necessário - as coleções ficam automaticamente prontas quando expected_file_count é atingido.
Exclua uma coleção e todos os seus arquivos.
Defina uma senha na coleção. Requer 4–100 caracteres.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
password | string · required | 4–100 caracteres. |
curl -X POST https://storage.to/api/collection/ABC123xyz/password \ -H "X-Visitor-Token: abc123" \ -d '{ "password": "hunter22" }'
Remover a senha de uma coleção.
Verifique uma senha. Retorna 200 em caso de sucesso, 401 em caso de senha incorreta.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
password | string · required |
Altere a expiração de uma coleção.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
days | integer · optional | De 1 a 7 dias a partir de agora, mas nunca mais de 7 dias após o envio (ou a expiração atual, se for posterior). Omita ou null para permanente (apenas premium). |
Defina um limite de downloads (burn-after-N-downloads). A coleção é excluída automaticamente quando atingir o limite.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
max_downloads | integer · optional | 1–1000. Deve exceder a contagem atual de downloads. null para remover o limite. |
Arquivos
8 endpointsTodas as configurações no nível do arquivo (senha, expiração, max-downloads) espelham os endpoints da coleção. Apenas o proprietário.
Verifique se um arquivo ainda está aguardando o upload.
{ "pending": false }
Exclua um arquivo imediatamente.
Envie uma imagem de miniatura para um arquivo de vídeo ou imagem (usada na página de download). Máx. 2 MB.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
thumbnail | image · required | Upload multipart. Máx. 2 MB. |
{ "success": true, "thumbnail_url": "https://..." }
Defina uma senha em um arquivo. Requer 4–100 caracteres.
Remova a senha de um arquivo.
Verifique a senha de um arquivo.
Altere a expiração de um arquivo.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
days | integer · optional | De 1 a 7 dias a partir de agora, mas nunca mais de 7 dias após o envio (ou a expiração atual, se for posterior). Omita ou null para permanente (apenas premium). |
Limite o total de downloads de um arquivo. Apaga automaticamente quando atingir o limite.
Autenticação no desktop
2 endpointsPara clientes com sessão iniciada, como a aplicação de ambiente de trabalho, que têm um token Bearer.
Retorne o usuário autenticado.
curl https://storage.to/api/user \ -H "Authorization: Bearer <token>"
{ "id": 42, "name": "Ada", "email": "ada@example.com", "is_premium": true }
Revogue o token de acesso atual.
Diversos
5 endpointsEstado, quotas e telemetria de clientes.
Verificação de disponibilidade. Devolve 200 com { "status": "ok" } quando o worker da API está a responder.
{ "status": "ok" }
Stream ao vivo de atividades para o globo da página inicial. Armazenado em cache na borda.
Uso atual da cota de upload do solicitante - usado pela CLI e pelo app de desktop para mostrar a capacidade restante. A estrutura da resposta muda para usuários autenticados. Apesar do nome da URL, isso rastreia apenas bytes de upload; downloads não são contabilizados.
{ "success": true, "authenticated": false, "has_token": true, "limit_bytes": 107374182400, "limit_gb": 100, "used_bytes": 12345678, "used_gb": 0.01, "remaining_bytes": 107361836722, "remaining_gb": 99.99, "window_hours": 24 }
{ "success": true, "authenticated": true, "plan": "premium" }
Envie um evento de uso pela CLI ou pelo app de desktop.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
app | string · required | desktop, cli ou web. |
version | string · optional | Versão do cliente. |
event | string · required | Nome do evento, por exemplo upload_complete. |
context | object · optional | Metadados extras. |
Envie um relatório de erro pela CLI ou pelo app de desktop. Deduplicado no servidor - no máximo 10 do mesmo erro por hora.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
app | string · required | desktop, cli ou web. |
type | string · required | Classe/tipo do erro. |
message | string · required | Mensagem do erro. |
stack | string · optional | Rastreamento (stack trace). |
version, os, os_version, arch, context | various · optional | Metadados de diagnóstico. |