Référence APICréer un transfert
POST/v1/transfers

Créer un transfert

Crée un transfert chiffré et renvoie les URL d'upload présignées pour chaque fichier.

2 min de lectureTélécharger en PDF

Requête exemple

"{\"files\":[{\"name\":\"contrat-q3.pdf\",\"size\":482133,\"mime_type\":\"application/pdf\"},{\"name\":\"annexe.xlsx\",\"size\":91204,\"mime_type\":\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"}],\"transfer_title\":\"Dossier client Q3\",\"expires_in_hours\":72,\"max_downloads\":5,\"password\":\"Soleil-2026\",\"recipient\":\"client@exemple.fr\",\"notify_opens\":true,\"allow_download\":true,\"auto_delete\":true,\"require_totp\":false}"

Réponse exemple

"{\"transfer\":{\"id\":\"a3f1c9e2-7b4d-4e88-9c12-0f6b2a1d5e90\",\"short_code\":\"k7Qz9R\",\"transfer_title\":\"Dossier client Q3\",\"status\":\"pending\",\"expires_at\":\"2026-06-08T14:30:00.000Z\",\"max_downloads\":5,\"total_downloads\":0,\"scan_status\":\"pending\",\"encryption_mode\":\"sse-s3\",\"created_at\":\"2026-06-05T14:30:00.000Z\"},\"upload_urls\":[{\"file_id\":\"contrat-q3.pdf\",\"url\":\"https://storage.coffrify.com/upload/a3f1c9e2/contrat-q3.pdf?X-Amz-Signature=...\",\"headers\":{\"Content-Type\":\"application/octet-stream\"}},{\"file_id\":\"annexe.xlsx\",\"url\":\"https://storage.coffrify.com/upload/a3f1c9e2/annexe.xlsx?X-Amz-Signature=...\",\"headers\":{\"Content-Type\":\"application/octet-stream\"}}],\"share_url\":\"https://files.coffrify.com/k7Qz9R\",\"totp_secret\":null}"
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.

ChampTypeRequisDescription
filesarray<object>OuiListe des fichiers à déposer (au moins un). Chaque entrée : name (string), size (number, octets), mime_type (string, défaut application/octet-stream).files[].namestringOuiNom du fichier ; sert aussi d'identifiant (file_id) dans la réponse upload_urls.
files[].sizenumberOuiTaille du fichier en octets, utilisée pour le provisioning et les quotas de plan.
files[].mime_typestringNonType MIME du fichier. Accepte aussi type. Défaut : application/octet-stream.
expires_in_hoursnumberNonDurée de validité du lien en heures avant expiration automatique.
max_downloadsnumberNonNombre maximal de téléchargements autorisés avant blocage du lien.
passwordstringNonMot de passe protégeant le lien de partage.
allow_downloadbooleanNonAutorise (ou non) le téléchargement direct des fichiers.
auto_deletebooleanNonSupprime automatiquement le transfert après expiration ou épuisement des téléchargements.
transfer_titlestringNonTitre lisible du transfert. Accepte aussi title.
notesstringNonNote libre attachée au transfert. Accepte aussi note.
custom_slugstringNonSlug personnalisé pour l'URL de partage (sinon short_code généré).
recipientstringNonAdresse e-mail du destinataire. Accepte aussi recipient_email.
notify_opensbooleanNonNotifie l'expéditeur à chaque ouverture du lien.
require_totpbooleanNonExige un code TOTP pour accéder au transfert ; déclenche le retour d'un totp_secret.
watermark_enabledbooleanNonActive un filigrane sur les fichiers prévisualisés.
watermark_textstringNonTexte du filigrane appliqué.
geo_allowlistarray<string>NonListe de pays autorisés à accéder au transfert (codes pays).
geo_blocklistarray<string>NonListe de pays bloqués.
scheduled_forstring (ISO 8601)NonDate/heure de publication programmée du transfert.
encryption_modestringNonMode de chiffrement appliqué au transfert (impacte les headers d'upload).
encryption_metadataobjectNonMé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 }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

CodeQuandComment 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 (filtres status, 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).