La route POST /v1/transfers crée un transfert et retourne les URL d'upload pré-signées pour chaque fichier. Une fois les fichiers déposés sur ces URL, le transfert devient actif et le lien de partage est utilisable. Les options avancées, expiration sur mesure, mot de passe, nombre de téléchargements maximum et circuit d'approbation, se configurent dès la création ou se mettent à jour via des routes dédiées.
/v1/transfersCrée un nouveau transfert et retourne les URL d'upload pré-signées.GET/v1/transfers/{id}Récupère les détails complets d'un transfert, y compris la liste de ses fichiers.PUT/v1/transfers/{id}/passwordDéfinit ou remplace le mot de passe d'un transfert existant.POST/v1/transfers/{id}/extendRepousse la date d'expiration d'un transfert dans la limite du plan souscrit.POST/v1/transfers/{id}/approversAjoute un approbateur à un transfert soumis à validation et lui envoie un e-mail de notification.POST/v1/transfers/{id}/approveApprouve ou rejette un transfert en attente de validation.Authentification
Toutes les routes ci-dessus requièrent une clé API transmise dans l'en-tête Authorization: Bearer <clé>. Utilisez une clé de test (cof_test_…) pour vos intégrations hors-production ou une clé sandbox (cof_sandbox_…) pour les simulations complètes. En production, utilisez une clé live (cof_live_…). Le scope requis varie selon la route : transfers:write pour créer, modifier le mot de passe ou prolonger ; transfers:manage pour gérer les approbateurs et rendre des décisions d'approbation.
Corps de la requête, POST /v1/transfers
Le corps accepte de nombreuses options avancées (mot de passe, expiration, TOTP, approbation, restrictions). Seul files est obligatoire. Le tableau ci-dessous détaille les champs.
| Champ | Type | Requis | Description |
|---|---|---|---|
| files | array | Oui | Liste des fichiers à inclure. Chaque objet doit contenir name (string), size (number, octets) et optionnellement mime_type (string). |
| transfer_title | string | Non | Titre lisible du transfert, affiché aux destinataires. |
| expires_in_hours | number | Non | Durée de validité en heures à partir de la création. Plafonné par le plan. Ex. : 72 pour 3 jours. |
| password | string | Non | Mot de passe de protection (4 caractères minimum). Le hash SHA-256 est stocké, jamais la valeur en clair. |
| max_downloads | number | Non | Nombre maximum de téléchargements autorisés. En environnement sandbox, plafonné à 5. |
| allow_download | boolean | Non | Autoriser ou non le téléchargement direct (défaut true). |
| auto_delete | boolean | Non | Supprimer automatiquement le transfert après le premier téléchargement. |
| notes | string | Non | Message ou note libre jointe au transfert. |
| custom_slug | string | Non | Slug personnalisé pour l'URL de partage (doit être unique dans le workspace). |
| recipient | string | Non | Adresse e-mail du destinataire principal. |
| notify_opens | boolean | Non | Envoyer une notification à l'expéditeur à chaque ouverture du lien. |
| require_totp | boolean | Non | Exiger un code TOTP pour accéder au transfert (plan compatible requis). |
| watermark_enabled | boolean | Non | Activer le filigrane sur les fichiers consultables. |
| watermark_text | string | Non | Texte du filigrane si watermark_enabled est true. |
| geo_allowlist | array | Non | Codes pays ISO 3166-1 alpha-2 autorisés (ex. ["FR","BE"]). |
| geo_blocklist | array | Non | Codes pays ISO 3166-1 alpha-2 bloqués. |
| scheduled_for | string | Non | Date ISO 8601 à partir de laquelle le transfert devient actif. |
| encryption_mode | string | Non | Mode de chiffrement souhaité. AES-256-GCM est le mode client-side zero-knowledge. |
| encryption_metadata | object | Non | Métadonnées de chiffrement nécessaires au mode zero-knowledge (clé publique, nonce, etc.). |
Exemples d'appel
L'exemple ci-dessous crée un transfert avec plusieurs options de sécurité activées. Choisissez votre langage.
Réponse
Le champ totp_secret est non-null uniquement si require_totp: true a été passé et que le plan le permet. Les URL d'upload expirent après 15 minutes : effectuez l'upload immédiatement après la création du transfert.
Gérer l'approbation
Lorsque le champ approval_required est activé sur un transfert, le destinataire ne peut télécharger les fichiers qu'après validation d'un approbateur. Ajoutez un approbateur via POST /v1/transfers/{id}/approvers en passant approver_email ou approver_user_id. Un e-mail de demande d'approbation est envoyé automatiquement. L'approbateur (ou un administrateur via l'API) rend ensuite sa décision via POST /v1/transfers/{id}/approve avec decision: "approved" ou decision: "rejected" et un champ note optionnel. Ce flux nécessite le scope transfers:manage.
Erreurs
Les erreurs portent sur une validation du corps (option incompatible avec le plan) ou un scope manquant. Le tableau ci-dessous indique la résolution.
| Code HTTP | Code API | Quand | Résolution |
|---|---|---|---|
| 400 | validation_error | Corps absent, files[] vide, mot de passe trop court (< 4 caractères), champ until invalide ou ni hours ni until fourni pour /extend. | Vérifiez les champs obligatoires et les contraintes de format décrites ci-dessus. |
| 401 | invalid_api_key | Clé API absente, mal formée ou révoquée. | Vérifiez l'en-tête Authorization et l'état de la clé dans votre tableau de bord. |
| 403 | scope_missing | La clé ne possède pas le scope requis (transfers:write ou transfers:manage). | Régénérez la clé avec les scopes appropriés ou utilisez une clé avec des permissions plus larges. |
| 404 | not_found | Le transfert n'existe pas dans le workspace ou est inaccessible depuis l'environnement de la clé. | Vérifiez l'identifiant du transfert et l'environnement de la clé (test/live/sandbox). |
| 410 | not_found | Le transfert a été supprimé (status: deleted). | Le transfert est définitivement supprimé. Créez-en un nouveau si nécessaire. |
| 422 | validation_error | En sandbox : plus de 10 fichiers ou fichier dépassant 10 Mo par transfert. Ou tentative d'approbation d'un transfert ne nécessitant pas d'approbation. | Respectez les limites sandbox ou vérifiez que approval_required est activé sur le transfert. |
| 429 | rate_limited | En sandbox : limite de 25 transferts par 24 h atteinte. | Attendez la fin de la fenêtre de 24 h ou utilisez votre environnement live. |
| 500 | internal_error | Erreur interne (base de données, edge function, etc.). | Réessayez avec un backoff exponentiel. Si l'erreur persiste, contactez le support en fournissant le request_id de la réponse. |
Voir aussi
- Lister et filtrer les transferts
- Prolonger l'expiration d'un transfert
- Gérer le mot de passe d'un transfert
- Référence API : POST /v1/transfers
- Référence API : POST /v1/transfers/{id}/approve
- Référence API : POST /v1/transfers/{id}/approvers