Un transfert est l'unité centrale de Coffrify : il regroupe un ou plusieurs fichiers chiffrés (AES-256-GCM côté stockage), une date d'expiration, un quota de téléchargements et un lien de partage unique. Ce guide vous montre comment créer votre premier transfert via l'API, obtenir les URLs d'upload présignées, déposer vos fichiers sur l'objet de stockage, puis récupérer le lien public à partager. Le flux complet repose sur trois étapes : POST /v1/transfers (création), PUT vers les URLs présignées (upload), et lecture du champ share_url dans la réponse.
/v1/transfersCrée un transfert et retourne les URLs d'upload présignées pour chaque fichier déclaré.GET/v1/transfers/{id}Récupère les détails d'un transfert existant ainsi que la liste de ses fichiers.DELETE/v1/transfers/{id}Supprime définitivement un transfert et ses fichiers.Authentification
Toutes les requêtes de création ou de lecture de transferts exigent une clé API transmise dans l'en-tête Authorization: Bearer <clé>. Le scope requis est transfers:write pour la création et la suppression, et transfers:read pour la liste et la lecture. Pour générer des URLs de téléchargement côté administration (sans incrémenter le compteur), le scope transfers:download est nécessaire. Créez ou consultez vos clés dans la console Coffrify.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
| files | array | Oui | Tableau d'objets { name, size, mime_type? }. Au moins un élément. |
| files[].name | string | Oui | Nom du fichier tel qu'il sera affiché au destinataire. |
| files[].size | integer | Oui | Taille en octets. Doit correspondre au fichier réel uploadé. |
| files[].mime_type | string | Non | Type MIME (ex. application/pdf). Défaut : application/octet-stream. |
| expires_in_hours | integer | Non | Durée de vie en heures. Si omis, la valeur par défaut du plan s'applique. |
| max_downloads | integer | Non | Nombre maximum de téléchargements autorisés. Sandbox : plafonné à 5. |
| password | string | Non | Mot de passe de protection du lien de partage (haché côté serveur). |
| transfer_title | string | Non | Titre lisible du transfert, affiché dans la console et au destinataire. |
| notes | string | Non | Note ou message joint au transfert. |
| recipient | string | Non | Adresse e-mail du destinataire (déclenche l'envoi d'une notification). |
| notify_opens | boolean | Non | Si true, une notification est envoyée à chaque ouverture du lien. |
| require_totp | boolean | Non | Si true, génère un secret TOTP renvoyé dans totp_secret. |
| allow_download | boolean | Non | Si false, les fichiers sont consultables mais non téléchargeables. |
| auto_delete | boolean | Non | Si true, le transfert est supprimé après le premier téléchargement. |
| custom_slug | string | Non | Slug personnalisé pour l'URL de partage (ex. mon-contrat-2026). |
| watermark_enabled | boolean | Non | Active le tatouage numérique sur les fichiers visualisés. |
| watermark_text | string | Non | Texte du tatouage numérique (email, identifiant...). |
| geo_allowlist | array | Non | Codes pays ISO 3166-1 alpha-2 autorisés (ex. ["FR","DE"]). |
| geo_blocklist | array | Non | Codes pays ISO 3166-1 alpha-2 bloqués. |
| scheduled_for | string | Non | Date ISO 8601 d'activation différée du transfert. |
| encryption_mode | string | Non | Mode de chiffrement. Valeur par défaut : chiffrement géré par Coffrify (AES-256-GCM). |
| folder_id | string | Non | Identifiant du dossier cible dans la console. |
Exemples d'appel
Réponse
En cas de succès, l'API retourne un HTTP 201 avec l'objet suivant. Le champ upload_urls contient une entrée par fichier déclaré : vous devez effectuer un PUT vers chaque url avec les en-têtes headers fournis. Le champ share_url est le lien public prêt à être transmis au destinataire.
Récupérer un transfert existant
Après avoir uploadé vos fichiers, vous pouvez vérifier l'état du transfert (notamment le scan_status mis à jour par l'antivirus asynchrone) via GET /v1/transfers/{id}. La réponse inclut le champ files avec les métadonnées de chaque fichier (id, file_name, file_size, file_type, created_at).
Obtenir une URL de téléchargement admin
Pour récupérer un fichier côté serveur (agent, automatisation, archivage) sans passer par le lien public ni incrémenter le compteur total_downloads, utilisez POST /v1/transfers/{id}/download-url. Le scope requis est transfers:download. Vous pouvez cibler un fichier précis via file_id, ou omettre ce champ pour obtenir une URL par fichier. Le paramètre expires_in_seconds contrôle la durée de validité de l'URL présignée (60 à 86400 secondes, défaut 3600).
Idempotence
L'API Coffrify supporte l'idempotence sur les requêtes POST. Envoyez un en-tête Idempotency-Key: <uuid> unique par tentative logique. Si la même clé est rejouée dans la fenêtre de validité, vous recevez la réponse originale avec l'en-tête X-Coffrify-Idempotent-Replay: true, sans créer de doublon. C'est indispensable en cas de timeout réseau ou de retry automatique dans votre pipeline.
Erreurs
| HTTP | Code d'erreur | Quand | Résolution |
|---|---|---|---|
| 400 | validation_error | Corps absent ou files[] vide. | Vérifiez que le body est un objet JSON valide contenant un tableau files non vide. |
| 401 | missing_api_key | En-tête Authorization absent. | Ajoutez Authorization: Bearer cof_test_… à la requête. |
| 401 | invalid_api_key | Clé mal formée ou révoquée. | Vérifiez la clé dans la console. Préfixes valides : cof_test_, cof_live_, cof_sandbox_. |
| 401 | expired_api_key | Clé expirée. | Générez une nouvelle clé dans les paramètres de l'espace de travail. |
| 403 | scope_missing | La clé ne possède pas le scope transfers:write (ou transfers:read / transfers:download). | Éditez les scopes de la clé ou créez-en une nouvelle avec les scopes requis. |
| 403 | ip_not_allowed | L'IP appelante n'est pas dans la liste d'autorisation de la clé. | Ajoutez l'IP dans les paramètres de la clé API. |
| 404 | not_found | Transfert introuvable ou appartenant à un autre environnement. | Vérifiez l'ID et l'environnement de la clé utilisée (sandbox vs live/test). |
| 410 | not_found | Transfert supprimé (status deleted). | Le transfert a été supprimé et ne peut plus être accédé. |
| 422 | validation_error | Sandbox : dépassement des limites (10 fichiers, 10 Mo/fichier). | Réduisez la taille ou le nombre de fichiers, ou passez en live. |
| 429 | rate_limited | Quota de requêtes dépassé pour l'espace de travail. | Respectez les en-têtes X-RateLimit-Remaining et Retry-After. |
| 429 | rate_limited | Sandbox : 25 transferts par 24 h dépassés. | Attendez la remise à zéro ou passez en environnement live/test. |
| 500 | internal_error | Erreur interne du serveur. | Notez le request_id dans la réponse et contactez le support. |
| 503 | internal_error | Credentials Scaleway manquants sur ce déploiement. | Vérifiez la configuration des variables d'environnement du déploiement. |
Voir aussi
- Référence POST /v1/transfers
- Référence GET /v1/transfers/{id}
- Référence DELETE /v1/transfers/{id}
- Référence POST /v1/transfers/{id}/download-url
- Premiers pas avec l'API
- Gestion des dossiers
- Webhooks : être notifié des événements
- Rate limits et quotas
- Gestion des erreurs