Requête exemple
Réponse exemple
POST/v1/transfers/{id}/cloneCrée une copie active d'un transfert existant en réutilisant ses fichiers d'origine.Duplique le transfert identifié par {id} dans le même workspace. Le clone reçoit un nouveau `short_code` (et donc une nouvelle URL de partage), un compteur total_downloads remis à 0, et un statut active. Le comportement le plus notable est que les fichiers d'origine sont réutilisés tels quels : aucune ré-upload n'est effectuée, les objets de stockage (Scaleway) sont partagés via le même storage_path. Cela rend le clonage instantané, même pour des transferts volumineux. La plupart des attributs du transfert source sont recopiés (titre, notes, protection par mot de passe et hash, max_downloads, filigrane, listes géographiques, mode de chiffrement).
La date d'expiration est recalculée. Par défaut, le clone reprend la durée de vie d'origine (intervalle created_at → expires_at du source), sauf si expires_in_hours est fourni. Cette durée est ensuite plafonnée à la rétention maximale autorisée par le plan du workspace (retention_days du produit Stripe associé), avec un minimum de 24 heures. Le champ cloned_from du clone référence l'id du transfert source.
Authentification
Cette route requiert une clé API valide avec le scope transfers:write. Une clé sans ce scope reçoit une erreur 403 scope_missing. Le transfert source est résolu strictement dans le workspace de la clé (workspace_id), ce qui empêche de cloner un transfert appartenant à un autre workspace.
Corps de la requête
Le corps est optionnel : un POST sans corps clone le transfert en reprenant ses paramètres d'origine.
| Champ | Type | Requis | Description |
|---|---|---|---|
| expires_in_hours | number | Non | Durée de vie du clone en heures. Forcée à un minimum de 1, puis plafonnée à la rétention maximale du plan. Si omis, la durée du transfert d'origine est réutilisée. |
| custom_slug | string | Non | Slug personnalisé pour le short_code. Mis en minuscules, nettoyé (seuls a-z, 0-9 et le tiret sont conservés) et tronqué à 24 caractères. Utilisé uniquement s'il fait au moins 2 caractères après nettoyage ; sinon un code aléatoire de 10 caractères est généré. En cas de collision avec un short_code existant, un code aléatoire est tiré (jusqu'à 5 tentatives). |
Réponse
Réponse 201 (__status: 201). L'objet transfer contient les champs du clone : id, short_code, transfer_title, status (active), expires_at, max_downloads, total_downloads (0), encryption_mode et created_at. Au niveau racine, share_url donne l'URL de partage publique (https://files.coffrify.com/{short_code}), cloned_from rappelle l'id du source, et reused_files indique le nombre de fichiers réutilisés depuis l'original.
Erreurs
| Code | Quand | Résolution |
|---|---|---|
| 400 validation_error | L'identifiant de transfert est absent de l'URL. | Vérifier que l'URL est bien de la forme /v1/transfers/{id}/clone avec un id non vide. |
| 401 missing_api_key | En-tête Authorization absent. | Envoyer Authorization: Bearer cof_live_... (ou cof_test_...). |
| 401 invalid_api_key | Clé invalide, mal formée ou non reconnue. | Vérifier le format et la validité de la clé API. |
| 403 scope_missing | La clé n'a pas le scope transfers:write. | Émettre ou utiliser une clé incluant le scope transfers:write. |
| 404 not_found | Aucun transfert avec cet id dans le workspace de la clé. | Vérifier l'id et que le transfert appartient bien au workspace authentifié. |
| 429 rate_limited | Quota de requêtes par minute du workspace dépassé (endpoint write). | Attendre la valeur de l'en-tête Retry-After avant de réessayer. |
| 500 internal_error | Erreur de lecture du source ou d'insertion du clone côté base. | Réessayer ; si l'erreur persiste, contacter le support avec le request_id. |
Voir aussi
- POST /v1/transfers — créer un nouveau transfert avec upload de fichiers.
- GET /v1/transfers/{id} — récupérer le détail d'un transfert (source ou clone).
- DELETE /v1/transfers/{id} — supprimer un transfert (attention aux fichiers partagés via le clonage).