API REST
Envoyez des fichiers, créez des collections et gérez les partages via HTTP. Toutes les réponses sont au format JSON ; aucune clé API n’est requise pour les envois anonymes.
Comment fonctionnent les envois
L’API storage.to alimente notre CLI, application desktop, uploader web, et tout client tiers que vous souhaitez créer. Le processus d’envoi se fait en trois étapes :
PUT vos octets directement vers l(es) URL(s) pré-signée(s). Les octets ne passent pas par nos serveurs.File et vous fournissons une URL partageable.Tous les endpoints ci-dessous sont relatifs à cette base. Exemple : POST /upload/init signifie POST https://storage.to/api/upload/init.
Authentification
Les envois anonymes fonctionnent sans authentification, mais avec des limites strictes. Les appels sans clé sont limités à 50 fichiers par 24 heures glissantes par appareil ou IP, plus les quotas de bande passante ci-dessous, et les fichiers expirent après 3 jours.
S'authentifier avec un compte gratuit débloque :
- Pas de plafond quotidien de fichiers
- Pas de quota de bande passante d'envoi
- Envois associés à votre compte (visibles à /dashboard)
- Fonctionnalités premium (fichiers permanents, stockage plus important)
- Modifications basées sur la propriété (supprimer, définir un mot de passe, modifier l’expiration) sans avoir besoin que le visitor-token corresponde
Limites en un coup d'œil
expiry_daysexpiry_daysIl n'y a pas de quotas mensuels : toutes les limites sont des fenêtres glissantes de 24 heures ou des limites par minute. L'offre gratuite n'a pas d'espace de stockage fixe : chaque fichier expire de lui-même, rien ne s'accumule donc contre un quota.
Prouver la propriété
/upload/init multipart, /upload/confirm, /file/reserve, /collection) renvoie un owner_token dans sa réponse. Le token est une preuve signée de propriété liée à cette ressource précise, indépendante de votre IP ou de votre token de visiteur. Les tokens durent aussi longtemps que la ressource, sont sûrs à conserver et n’expirent pas indépendamment. Un token perdu signifie perdre le contrôle de cette ressource (fichier/collection/envoi) — traitez-les comme des mots de passe locaux.# ou, en complément d'une session Bearer
X-Owner-Token: <token>
visitor_token. La CLI le stocke à ~/.config/storageto/token (voir Docs CLI).Pour les endpoints de mutation (suppression, définition du mot de passe, changement de l’expiration), la propriété est confirmée si soit le token du visiteur correspond à ou si la requête provient de la même IP que celle qui a créé le fichier. Les deux peuvent être perdus (cookies effacés, changements de réseau). À l’avenir, la preuve préférée est token du propriétaire.
Erreurs
Les erreurs suivent une structure cohérente : { "success": false, "error": "…" }
Limites de débit
Toutes les limites de débit sont par IP. Une réponse 429 inclut les en-têtes standards Retry-After, X-RateLimit-Limit et X-RateLimit-Remaining.
Quota de téléversement : Les clients anonymes ont deux plafonds en parallèle - 100 Go / 24 h par visitor token et 500 Go / 24 h par IP (le plafond IP capte le trafic sans token et les réseaux partagés). Dès qu’un plafond est dépassé, vous obtenez un 429 avec des détails. C’est un quota téléversement uniquement - les téléchargements sont illimités et non limités.
Téléverser
8 endpointsLe flux de téléversement en trois étapes pour n’importe quel fichier, y compris les fichiers de plus de 5 Go (multipart automatiquement). Si vous avez seulement besoin d’un téléversement rapide de type capture d’écran, regardez plutôt ShareX.
Démarrez un téléversement. Pour les fichiers >50 Mo, la réponse est un téléversement multipart (champ type: "multipart") ; sinon, un seul PUT pré-signé.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
filename | string · required | Nom de fichier original. Max 255 caractères. |
content_type | string · required | Type MIME. |
size | integer · required | Taille du fichier en octets. Min 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_..." }
Demande des URL supplémentaires pour les parties d’un upload multipart en cours. Utilisé quand /init a renvoyé moins d’URL que vous n’avez de parties (ou qu’elles ont expiré).
Corps de la requête
| Champ | Type | Description |
|---|---|---|
upload_id | string · required | L’ upload_id provenant de /init. |
part_numbers | array<int> · required | Numéros de parties pour lesquels obtenir des URL. |
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://..." } ] }
Finalise un upload multipart une fois que toutes les parties sont téléversées.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
upload_id | string · required | L’ upload_id provenant de /init. |
parts | array · required | Chaque entrée : { partNumber, etag } depuis la réponse de l’upload de la partie. |
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 }
Annule un upload multipart et nettoie toute donnée partielle.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
upload_id | string · required | L’upload à annuler. |
curl -X POST https://storage.to/api/upload/abort \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ..." }'
Confirme que l’upload est terminé. C’est à ce moment que nous créons l’enregistrement File et renvoyons l’URL partageable.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
filename | string · required | Nom de fichier original. |
size | integer · required | Taille du fichier en octets. |
content_type | string · required | Type MIME. |
r2_key | string · required | L’ r2_key provenant de /init. |
collection_id | string · optional | Ajouter à une collection. |
crc32 | integer · optional | Somme de contrôle CRC32 pour la vérification d’intégrité. |
file_id | string(9) · optional | Réalise (fulfil) un identifiant de fichier réservé précédemment créé. |
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_..." }
Réserve un identifiant de fichier et une URL partageable avant que les octets soient prêts. Pratique quand vous devez d’abord partager un lien, puis finaliser l’upload ensuite. La propriété est liée à votre token de visiteur + IP. Terminez l’upload plus tard avec /upload/init + /upload/confirm, en passant file_id à la confirmation.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
filename | string · optional | Nom de fichier fictif. Par défaut : "Pending". |
content_type | string · optional | Type MIME fictif. |
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_..." }
Équivalent en lot de /upload/init, optimisé pour l’uploader web. Démarre jusqu’à 250 fichiers en un seul aller-retour.
Utilisé en interne par l’uploader web. La plupart des clients devraient préférer /upload/init pour un seul fichier.
Équivalent en lot de /upload/confirm. Confirme de nombreux fichiers en un seul aller-retour.
Collections
9 endpointsUne collection regroupe plusieurs fichiers sous une seule URL de partage (/c/{id}). Jusqu’à 10 000 fichiers et 25 Go au total.
Créez une nouvelle collection. Ajoutez les fichiers ensuite en passant collection_id sur /upload/confirm.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
expected_file_count | integer · optional | Indication pour marquer automatiquement la collection comme prête une fois que tous les fichiers attendus ont été confirmés. |
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_..." }
Interroge l’état d’une collection. Marque aussi automatiquement la collection comme prête si tous les fichiers attendus ont été confirmés.
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" }
Marquez la collection comme prête au téléchargement. Pas généralement nécessaire — les collections deviennent automatiquement prêtes une fois que expected_file_count est atteint.
Supprime une collection et tous ses fichiers.
Définit un mot de passe pour la collection. Nécessite 4 à 100 caractères.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
password | string · required | 4–100 caractères. |
curl -X POST https://storage.to/api/collection/ABC123xyz/password \ -H "X-Visitor-Token: abc123" \ -d '{ "password": "hunter22" }'
Retire le mot de passe d’une collection.
Vérifie un mot de passe. Renvoie 200 en cas de succès, 401 si le mot de passe est incorrect.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
password | string · required |
Modifier l’expiration d’une collection.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
days | integer · optional | Dans 1 à 7 jours, mais jamais plus de 7 jours après l'envoi (ou l'expiration actuelle, si elle est plus tardive). Omettez ou null pour une durée permanente (premium uniquement). |
Définit une limite de téléchargements (burn-after-N-downloads). La collection est supprimée automatiquement une fois atteinte.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
max_downloads | integer · optional | 1–1000. Doit dépasser le nombre actuel de téléchargements. null pour supprimer la limite. |
Fichiers
8 endpointsTous les paramètres au niveau du fichier (mot de passe, expiration, max-downloads) reflètent les endpoints de la collection. Réservé au propriétaire.
Vérifie si un fichier est encore en attente de son upload.
{ "pending": false }
Supprime un fichier immédiatement.
Téléverse une image miniature pour un fichier vidéo ou image (utilisée sur la page de téléchargement). Max 2 Mo.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
thumbnail | image · required | Upload multipart. Max 2 Mo. |
{ "success": true, "thumbnail_url": "https://..." }
Définit un mot de passe pour un fichier. Nécessite 4 à 100 caractères.
Supprimer le mot de passe d’un fichier.
Vérifier le mot de passe d’un fichier.
Modifier l’expiration d’un fichier.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
days | integer · optional | Dans 1 à 7 jours, mais jamais plus de 7 jours après l'envoi (ou l'expiration actuelle, si elle est plus tardive). Omettez ou null pour une durée permanente (premium uniquement). |
Limiter le nombre total de téléchargements d’un fichier. Suppression automatique une fois atteint.
Authentification bureau
2 endpointsPour les clients connectés, comme l'application de bureau, qui disposent d'un jeton Bearer.
Retourne l’utilisateur authentifié.
curl https://storage.to/api/user \ -H "Authorization: Bearer <token>"
{ "id": 42, "name": "Ada", "email": "ada@example.com", "is_premium": true }
Révoquer le jeton d’accès actuel.
Divers
5 endpointsÉtat, quotas et télémétrie des clients.
Contrôle de disponibilité. Renvoie 200 avec { "status": "ok" } lorsque le worker de l'API répond.
{ "status": "ok" }
Flux d’activité en direct pour le globe de la page d’accueil. Mis en cache sur les serveurs edge.
Consommation actuelle du quota d’envoi pour l’appelant — utilisée par la CLI et l’application bureau pour afficher la capacité restante. La forme de la réponse diffère pour les utilisateurs authentifiés. Malgré le nom de l’URL, cela ne suit que les octets téléversement ; les téléchargements ne sont pas comptés.
{ "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" }
Envoyer un événement d’utilisation depuis la CLI ou l’application de bureau.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
app | string · required | desktop, cli ou web. |
version | string · optional | Version du client. |
event | string · required | Nom de l’événement, par ex. upload_complete. |
context | object · optional | Métadonnées supplémentaires. |
Envoyez un rapport d’erreur depuis la CLI ou l’application bureau. Déduplication côté serveur — maximum 10 fois la même erreur par heure.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
app | string · required | desktop, cli ou web. |
type | string · required | Classe/type d’erreur. |
message | string · required | Message d’erreur. |
stack | string · optional | Trace de la pile. |
version, os, os_version, arch, context | various · optional | Métadonnées de diagnostic. |