Requête exemple
Réponse exemple
POST/v1/transfersCrée un transfert et renvoie des URL d'upload pré-signées pour y déposer les fichiers.Crée un nouveau transfert dans le workspace authentifié et renvoie des URL d'upload pré-signées, une par fichier déclaré. L'endpoint ne reçoit pas les octets des fichiers : vous lui transmettez seulement la liste des métadonnées (name, size, mime_type), il provisionne le transfert côté Coffrify puis vous renvoie des URL vers lesquelles votre client envoie ensuite directement le contenu (PUT). Comportement notable : le transfert est créé en statut initial (en attente d'upload) et n'apparaît pleinement actif qu'une fois les fichiers déposés ; chaque URL d'upload est accompagnée de ses headers obligatoires, qui peuvent inclure des en-têtes de chiffrement SSE-KMS si le chiffrement serveur est activé, sinon un simple Content-Type. La requête accepte indifféremment les clés en snake_case (recommandé) ou en camelCase historique.
Authentification
Requiert une clé API valide présentée via Authorization: Bearer cof_live_... (ou cof_test_, cof_rk_*, cof_mcp_*). La clé doit porter le scope transfers:write. Cet endpoint applique aussi l'idempotence : envoyez un en-tête Idempotency-Key unique pour pouvoir réémettre la même création sans risque de doublon.
Corps de la requête
Le corps doit être un objet JSON. Le seul champ strictement obligatoire est files, un tableau non vide ; tous les autres champs sont facultatifs et contrôlent la durée de vie, la protection et le comportement du transfert.
| Champ | Type | Requis | Description | ||||
|---|---|---|---|---|---|---|---|
| files | array<object> | Oui | Liste des fichiers à déposer (au moins un). Chaque entrée : name (string), size (number, octets), mime_type (string, défaut application/octet-stream). | files[].name | string | Oui | Nom du fichier ; sert aussi d'identifiant (file_id) dans la réponse upload_urls. |
| files[].size | number | Oui | Taille du fichier en octets, utilisée pour le provisioning et les quotas de plan. | ||||
| files[].mime_type | string | Non | Type MIME du fichier. Accepte aussi type. Défaut : application/octet-stream. | ||||
| expires_in_hours | number | Non | Durée de validité du lien en heures avant expiration automatique. | ||||
| max_downloads | number | Non | Nombre maximal de téléchargements autorisés avant blocage du lien. | ||||
| password | string | Non | Mot de passe protégeant le lien de partage. | ||||
| allow_download | boolean | Non | Autorise (ou non) le téléchargement direct des fichiers. | ||||
| auto_delete | boolean | Non | Supprime automatiquement le transfert après expiration ou épuisement des téléchargements. | ||||
| transfer_title | string | Non | Titre lisible du transfert. Accepte aussi title. | ||||
| notes | string | Non | Note libre attachée au transfert. Accepte aussi note. | ||||
| custom_slug | string | Non | Slug personnalisé pour l'URL de partage (sinon short_code généré). | ||||
| recipient | string | Non | Adresse e-mail du destinataire. Accepte aussi recipient_email. | ||||
| notify_opens | boolean | Non | Notifie l'expéditeur à chaque ouverture du lien. | ||||
| require_totp | boolean | Non | Exige un code TOTP pour accéder au transfert ; déclenche le retour d'un totp_secret. | ||||
| watermark_enabled | boolean | Non | Active un filigrane sur les fichiers prévisualisés. | ||||
| watermark_text | string | Non | Texte du filigrane appliqué. | ||||
| geo_allowlist | array<string> | Non | Liste de pays autorisés à accéder au transfert (codes pays). | ||||
| geo_blocklist | array<string> | Non | Liste de pays bloqués. | ||||
| scheduled_for | string (ISO 8601) | Non | Date/heure de publication programmée du transfert. | ||||
| encryption_mode | string | Non | Mode de chiffrement appliqué au transfert (impacte les headers d'upload). | ||||
| encryption_metadata | object | Non | Métadonnées de chiffrement (ex. contexte client pour le mode E2E). |
Réponse
Renvoie un statut 201 avec un objet contenant : transfer, l'enregistrement du transfert créé (id, short_code, transfer_title, status, expires_at, max_downloads, total_downloads, scan_status, encryption_mode, created_at) ; upload_urls, un tableau d'objets { file_id, url, headers } où file_id correspond au name du fichier, url est l'URL pré-signée vers laquelle envoyer le contenu, et headers les en-têtes obligatoires à inclure dans le PUT (Content-Type, et le cas échéant les en-têtes SSE-KMS) ; share_url, l'URL publique de partage (https://files.coffrify.com/<short_code>) ; et totp_secret, le secret TOTP renvoyé uniquement si require_totp est activé (sinon null).
Erreurs
| Code | Quand | Comment résoudre |
|---|---|---|
| validation_error (400) | Corps absent/non-objet, ou files[] manquant ou vide. | Envoyez un JSON valide avec au moins un fichier dans files. |
| missing_api_key (401) | En-tête Authorization absent. | Ajoutez Authorization: Bearer cof_live_.... |
| invalid_api_key (401) | Clé invalide, mauvais préfixe, ou rejetée par le provisioning amont. | Vérifiez la clé et son préfixe (cof_live_/cof_test_/cof_rk_*/cof_mcp_*). |
| scope_missing (403) | La clé n'a pas le scope transfers:write. | Émettez ou utilisez une clé portant le scope transfers:write. |
| forbidden (403) | Le workspace n'est pas autorisé à créer ce transfert (plan, quotas). | Vérifiez le plan du workspace et ses limites avant de réessayer. |
| rate_limited (429) | Quota de requêtes par minute dépassé. | Respectez les en-têtes X-RateLimit-* / Retry-After puis réessayez. |
| idempotency_conflict (409) | Même Idempotency-Key réutilisée avec un corps différent. | Utilisez une nouvelle clé d'idempotence pour une requête différente. |
| internal_error (500) | Échec amont de génération des URL d'upload ou erreur interne. | Réessayez ; si l'erreur persiste, contactez le support avec le request_id. |
Voir aussi
- GET
/v1/transfers: liste paginée des transferts du workspace (filtresstatus,search,folder_id,scan_status). - GET
/v1/transfers/{id}: récupère le détail d'un transfert existant. - POST
/v1/transfers/{id}/resolve: résout/finalise l'accès à un transfert (mot de passe, TOTP).