Certains transferts sensibles exigent qu'un collaborateur (ou une équipe) valide explicitement leur mise à disposition avant que les destinataires puissent télécharger les fichiers. L'API Coffrify expose trois endpoints complémentaires pour couvrir ce besoin : ajout d'approbateurs sur un transfert existant, décision directe (approuvé ou rejeté) sur le transfert lui-même, et gouvernance unifiée via la table coffrify_approval_requests qui applique le four-eyes principle et tient un journal d'audit signé. Ce guide parcourt le flux de bout en bout, des prérequis jusqu'à la gestion des cas d'erreur.
/v1/transfers/{id}/approversListe les approbateurs enregistrés pour un transfert donné.POST/v1/transfers/{id}/approversAjoute un approbateur au transfert et déclenche l'envoi d'un e-mail de notification avec des liens de décision en un clic.POST/v1/transfers/{id}/approveApprouve ou rejette directement un transfert dont approval_required est true. Met à jour approval_status, approved_at et notifie le propriétaire du transfert./v1/approvalsCrée une demande d'approbation gouvernée (four-eyes, owner-exempt, audit). Retourne la demande existante si un doublon pending existe déjà pour le même triplet (workspace, type, resource_id)./v1/approvals/{id}/decideTranche une demande pending (approve ou reject) avec vérification four-eyes, enregistrement d'audit et propagation automatique sur le transfert associé.Authentification et scopes requis
Les endpoints /v1/transfers/{id}/approvers et /v1/transfers/{id}/approve requièrent le scope transfers:manage. Les endpoints /v1/approvals (GET, POST) et /v1/approvals/{id}/decide requièrent le scope workspace:manage. Transmettez votre clé dans l'en-tête Authorization: Bearer <clé>. En sandbox utilisez un préfixe cof_test_…, en production cof_live_….
Corps des requêtes
POST /v1/transfers/{id}/approvers : ajout d'un approbateur.
| Champ | Type | Requis | Description |
|---|---|---|---|
| approver_email | string | Conditionnel | Adresse e-mail de l'approbateur. Au moins ce champ ou approver_user_id est obligatoire. |
| approver_user_id | string (uuid) | Conditionnel | Identifiant Coffrify de l'approbateur. Si seul ce champ est fourni, l'e-mail est résolu automatiquement depuis le profil. |
POST /v1/transfers/{id}/approve : décision sur le transfert.
| Champ | Type | Requis | Description |
|---|---|---|---|
| decision | string | Oui | Valeur acceptée : approved ou rejected. |
| note | string | Non | Message facultatif transmis au propriétaire du transfert et consigné dans approval_note. |
POST /v1/approvals : création d'une demande gouvernée.
| Champ | Type | Requis | Description |
|---|---|---|---|
| type | string | Oui | Type de la demande. Valeurs pour les transferts : transfer ou transfer_approval. Autres valeurs acceptées : capability_grant, workspace_delete, workspace_transfer, account_deletion, custom_domain, api_key_creation, data_export, data_purge, custom. |
| resource_id | string | Oui | Identifiant de la ressource concernée (ex. : l'id du transfert). |
| reason | string | Non | Motif de la demande, affiché aux approbateurs. |
| sensitivity | string | Non | Niveau de sensibilité : low, medium (défaut), high ou critical. |
| expires_at | string (ISO 8601) | Non | Date d'expiration de la demande. Sans valeur, la demande reste ouverte indéfiniment. |
| metadata | object | Non | Données contextuelles libres annexées à la demande. |
PATCH /v1/approvals/{id}/decide : décision sur une demande gouvernée.
| Champ | Type | Requis | Description |
|---|---|---|---|
| decision | string | Oui | Valeur acceptée : approve ou reject. |
| decision_reason | string | Conditionnel | Obligatoire lorsque decision vaut reject. Motif du refus consigné dans decision_note. |
| note | string | Non | Alias legacy de decision_reason, accepté en parallèle pour la rétrocompatibilité. |
Flux complet : ajout d'approbateur puis décision
Réponses types
Réponse de POST /v1/transfers/{id}/approvers (HTTP 200) : objet approbateur créé avec decision pending.
Réponse de POST /v1/transfers/{id}/approve (HTTP 200) : objet transfert complet avec les champs d'approbation mis à jour.
Réponse de POST /v1/approvals (HTTP 201) ou PATCH /v1/approvals/{id}/decide (HTTP 200) : objet ApprovalRecord.
Erreurs
| Code HTTP | Code API | Quand | Résolution |
|---|---|---|---|
| 400 | validation_error | decision absent ou invalide (approved/rejected attendu sur /approve, approve/reject attendu sur /decide) | Vérifiez la valeur exacte du champ decision. |
| 400 | validation_error | ni approver_email ni approver_user_id fourni sur POST /approvers | Passez au moins l'un des deux champs. |
| 400 | validation_error | type ou resource_id manquant sur POST /approvals | Les deux champs sont obligatoires. |
| 400 | validation_error | sensitivity hors de la liste (low, medium, high, critical) | Utilisez l'une des quatre valeurs autorisées. |
| 400 | validation_error | Clé API sans contexte utilisateur pour POST /approvals ou /decide | Utilisez une clé associée à un utilisateur (OAuth ou session). |
| 403 | forbidden | self_approval_forbidden : le demandeur tente d'approuver sa propre demande (four-eyes principle) | Faites appel à un autre utilisateur du workspace pour la décision. |
| 403 | forbidden | owner_exempt : la demande a été émise par le propriétaire du workspace | Le propriétaire est souverain, aucune approbation tierce n'est requise. |
| 404 | not_found | Transfer ou demande introuvable dans le workspace courant | Vérifiez l'identifiant et que la clé appartient au bon workspace. |
| 409 | conflict | already_decided : la demande a déjà un statut différent de pending | Consultez l'objet retourné pour connaître la décision déjà enregistrée. |
| 409 | conflict | duplicate_pending : une demande pending existe déjà pour le même triplet (workspace, type, resource_id) | L'API retourne la demande existante de façon idempotente. |
| 422 | validation_error | Le transfert ne possède pas approval_required = true sur POST /approve | Activez l'option d'approbation sur le transfert avant d'appeler cet endpoint. |
| 500 | internal_error | Erreur de base de données inattendue | Réessayez après quelques secondes. Contactez le support si le problème persiste. |
Voir aussi
- Créer et envoyer un transfert
- Lister et filtrer les transferts
- Gérer les membres et permissions d'un workspace
- Référence : POST /v1/transfers/{id}/approve
- Référence : POST /v1/transfers/{id}/approvers
- Référence : POST /v1/approvals
- Référence : PATCH /v1/approvals/{id}/decide