Un transfert Coffrify est un conteneur chiffré (AES-256-GCM côté serveur, optionnel E2E) qui regroupe un ou plusieurs fichiers derrière un lien de partage unique de la forme https://files.coffrify.com/<short_code>. La création se fait en deux phases distinctes : (1) vous appelez POST /v1/transfers pour créer le transfert et obtenir des URLs de téléversement présignées par Scaleway S3, (2) vous uploadez directement chaque fichier sur son URL présignée via un simple PUT. Une fois l'upload confirmé, vous pouvez envoyer le lien au destinataire ou déclencher l'envoi de l'e-mail de notification depuis l'API.
/v1/transfersCrée un transfert et renvoie les URLs de téléversement présignées pour chaque fichier déclaré.GET/v1/transfers/{id}Récupère les métadonnées complètes d'un transfert ainsi que la liste de ses fichiers.POST/v1/transfers/{id}/emailEnvoie (ou renvoie) l'e-mail de partage à un destinataire.Authentification
Tous les appels doivent inclure votre clé API dans l'en-tête Authorization: Bearer <cle>. Pour créer ou modifier un transfert, la clé doit posséder le scope transfers:write. Pour lire la liste ou les détails, le scope transfers:read suffit. Pour générer des URLs de téléchargement signées côté administration, le scope transfers:download est requis. Les clés de test commencent par cof_test_…, les clés de production par cof_live_… et les clés sandbox par cof_sandbox_…. L'environnement de la clé détermine l'isolation des données : une clé cof_sandbox_… ne voit et ne crée que des transferts sandbox, plafonnés à 10 Mo par fichier, 10 fichiers par transfert et 25 transferts par 24 heures.
Corps de la requête, POST /v1/transfers
Seul le tableau files est obligatoire : chaque entrée déclare le name, la size en octets et, idéalement, le mime_type. Tous les autres champs sont facultatifs et activent des options de sécurité ou de cycle de vie (mot de passe, expiration, plafond de téléchargements, restrictions géographiques, chiffrement de bout en bout). Vous pouvez donc commencer avec une requête minimale, puis ajouter les options au besoin.
| Champ | Type | Requis | Description |
|---|---|---|---|
| files | array | Oui | Liste des fichiers à inclure. Chaque objet doit contenir name (string), size (integer, octets) et optionnellement mime_type (string, défaut : application/octet-stream). |
| transfer_title | string | Non | Titre affiché sur la page de partage et dans les e-mails. |
| expires_in_hours | integer | Non | Durée de vie en heures. Plafonnée par le plan (ex. 168 h = 7 jours sur le plan Free). |
| max_downloads | integer | Non | Nombre maximal de téléchargements avant expiration automatique. En sandbox, plafonné à 5. |
| password | string | Non | Mot de passe de protection (minimum 4 caractères). Active is_password_protected. |
| recipient | string | Non | Adresse e-mail du destinataire principal. Déclenche l'envoi d'un e-mail de notification à la création. |
| notes | string | Non | Message libre affiché sur la page de partage. |
| allow_download | boolean | Non | Autorise ou bloque le téléchargement direct (défaut : true). |
| auto_delete | boolean | Non | Supprime le transfert automatiquement après le premier téléchargement. |
| custom_slug | string | Non | Personnalise le short_code (alphanumérique, tirets, 4-32 caractères). |
| notify_opens | boolean | Non | Envoie une notification au propriétaire à chaque ouverture du lien. |
| require_totp | boolean | Non | Impose un code TOTP à usage unique en plus de l'éventuel mot de passe. |
| watermark_enabled | boolean | Non | Active un filigrane textuel sur les aperçus de documents. |
| watermark_text | string | Non | Texte du filigrane (utilisé si watermark_enabled est true). |
| geo_allowlist | array | Non | Codes pays ISO 3166-1 autorisés (ex. ["FR","DE"]). Si non nul, bloque tous les autres pays. |
| geo_blocklist | array | Non | Codes pays ISO 3166-1 bloqués. |
| scheduled_for | string | Non | Date ISO 8601 d'activation différée du transfert. |
| encryption_mode | string | Non | Mode de chiffrement : server (AES-256-GCM serveur, défaut) ou e2e (chiffrement de bout en bout, clé gérée côté client). |
| encryption_metadata | object | Non | Métadonnées de chiffrement E2E (clé publique X25519, nonce). Requis si encryption_mode est e2e. |
Exemple complet en quatre étapes
L'exemple ci-dessous déroule un partage complet en quatre appels : (1) créer le transfert et récupérer les URLs présignées, (2) téléverser le fichier directement sur le stockage via un PUT, (3) vérifier le statut du transfert, puis (4) envoyer l'e-mail de partage au destinataire. Les quatre onglets réalisent exactement la même chose dans votre langage.
Le point clé est la séparation en deux temps : l'API ne reçoit jamais vos fichiers, elle vous renvoie des URLs présignées sur lesquelles vous téléversez vous-même. Dès que le PUT de l'étape 2 réussit, le fichier est disponible derrière share_url et le lien peut être transmis.
Réponse, POST /v1/transfers (201 Created)
La réponse de création contient trois éléments à retenir : upload_urls, le ou les liens présignés à utiliser immédiatement pour le téléversement ; share_url, le lien public à transmettre au destinataire ; et transfer.id, l'identifiant à réutiliser pour toutes les opérations suivantes.
Réponse, GET /v1/transfers/{id} (200 OK)
La lecture d'un transfert reflète son état courant. Surveillez scan_status (pending puis clean une fois l'analyse antivirus terminée) et total_downloads, qui s'incrémente à chaque téléchargement jusqu'au plafond max_downloads.
Réponse, POST /v1/transfers/{id}/email (202 Accepted)
L'envoi d'e-mail est asynchrone : l'API répond 202 Accepted avec un delivery_status à sent dès que le message est pris en charge. Vous pouvez relancer cet appel autant de fois que nécessaire pour notifier d'autres destinataires.
Erreurs
La plupart des erreurs sont soit des problèmes de validation du corps de requête (400 et 422), soit d'authentification ou de scope (401 et 403). Le tableau ci-dessous indique, pour chaque cas, quand il survient et comment le corriger.
| HTTP | Code | Quand | Résolution |
|---|---|---|---|
| 400 | validation_error | files[] absent ou vide, ou champ malformé (ex. until non ISO 8601). | Vérifiez que files est un tableau non vide et que chaque objet contient name et size. |
| 401 | missing_api_key | En-tête Authorization absent. | Ajoutez Authorization: Bearer cof_live_… à chaque requête. |
| 401 | invalid_api_key | Clé inconnue, révoquée ou mal formée. | Vérifiez la clé dans la console Coffrify. Jamais de préfixe autre que cof_test_…, cof_live_… ou cof_sandbox_…. |
| 403 | scope_missing | La clé ne possède pas le scope requis (transfers:write ou transfers:read). | Régénérez la clé avec les bons scopes ou contactez l'administrateur du workspace. |
| 404 | not_found | Identifiant de transfert introuvable dans ce workspace (isolation par environnement incluse). | Vérifiez que id est correct et que la clé appartient au même environnement (live/test/sandbox). |
| 410 | not_found | Transfert marqué deleted. | Le transfert a été supprimé. Créez-en un nouveau ou utilisez /v1/transfers/{id}/clone. |
| 422 | validation_error | En mode sandbox : taille fichier > 10 Mo ou > 10 fichiers par transfert. | Réduisez la taille ou le nombre de fichiers pour les tests sandbox. |
| 429 | rate_limited | Quota par minute dépassé pour ce workspace, ou > 25 transferts sandbox en 24 h. | Respectez l'en-tête Retry-After renvoyé par l'API. |
| 503 | internal_error | Credentials Scaleway manquants sur ce déploiement (endpoint /download-url). | Contactez le support Coffrify. |
Voir aussi
- Obtenir une URL de téléchargement signée
- Cloner ou étendre un transfert
- Approuver un transfert (workflow)
- Créer un transfert avec options avancées
- Agent de transfert automatique
- Lire les codes d'erreur API
- Référence : POST /v1/transfers
- Référence : GET /v1/transfers/{id}
- Référence : POST /v1/transfers/{id}/email