Connecter votre logiciel avec l’API
Créer une clé, choisir ses accès, et appeler les routes de l’API.
Avant de commencer
L’API permet à votre logiciel de recrutement de créer des campagnes, d’inviter des candidats et de lire leurs dossiers. Elle est incluse dans tous les packs.
Dans l’API, une campagne s’appelle interview et un entretien s’appelle session.
Le détail des champs de chaque route est dans la description OpenAPI (en anglais).
Créer une clé
Seuls le propriétaire et les administrateurs peuvent gérer les clés.
Ouvrez Accès API
La page est dans le menu du compte, ou à l’adresse Paramètres, Accès API.
Créez la clé
Créer une clé donne tous les accès. Personnaliser permet de choisir un nom, une date d’expiration et les accès.
Copiez la clé tout de suite
Elle commence par
dlv_. Minute ne garde pas la clé en clair : si vous la perdez, régénérez-la.
Vous pouvez avoir 10 clés actives au plus.
Tester sans risque : la clé de test
Choisissez le mode Test à la création. La clé commence par dlv_test_ et ne travaille que dans le projet « Bac à sable API (test) » de l’organisation ; une clé de production ne le voit jamais. Dans ce bac à sable, aucun crédit n’est consommé, aucun entretien vocal ou écrit ne démarre et aucune invitation n’est envoyée par e-mail.
Pour obtenir un entretien terminé et son dossier, publiez la campagne puis appelez POST /interviews/{id}/sessions (accès candidates:write) : la réponse fixe de chaque question et un dossier où chaque critère est « non observé ». Les webhooks de ces entretiens portent livemode: false.
Appeler l’API
Envoyez la clé dans l’en-tête Authorization. Les réponses sont en JSON, sous la forme { "data": … }.
curl https://VOTRE-ADRESSE/api/v1/interviews \
-H "Authorization: Bearer dlv_votre_cle"Une clé est limitée à 60 requêtes par minute. Au-delà, l’API répond 429 avec l’en-tête Retry-After.
Les listes de campagnes et d’entretiens se lisent page par page : limit (de 1 à 100, 20 par défaut) et cursor. La réponse contient cursor, qui vaut null à la dernière page.
Accès et routes
Chaque clé a des accès. Une route refuse la clé avec l’erreur 403 INSUFFICIENT_SCOPE si l’accès manque. Les chemins ci-dessous sont à ajouter à /api/v1.
campaigns:readCampagnes, lectureGET /interviews: liste des campagnesGET /interviews/{id}: une campagne, avec ses questionsGET /interviews/{id}/questions: ses questionsGET /usage: l’usage de l’organisation
campaigns:writeCampagnes, modificationPOST /interviews: créer une campagne (titleobligatoire)PATCH /interviews/{id}: modifier une campagneDELETE /interviews/{id}: archiver une campagnePOST /interviews/{id}/publish: publierPOST /interviews/{id}/questions: ajouter des questions (1 à 100)PATCH /questions/{id}etDELETE /questions/{id}: modifier ou supprimer une questionPOST /interviews/{id}/sessions/end: terminer des entretiens en cours
candidates:readCandidats, lectureGET /interviews/{id}/candidates: candidats d’une campagne
candidates:writeCandidats, invitation et modificationPOST /interviews/{id}/candidates: inviter des candidatsPATCH /interviews/{id}/candidates/{candidateId}: modifier un candidat
reports:readEntretiens et dossiers, lectureGET /interviews/{id}/sessions: entretiens d’une campagneGET /sessions/{id}: un entretien, avec ses messagesGET /sessions/{id}/report: le dossier d’un entretien
practices:readEntraînements, lectureGET /practices/{id}etGET /interviews/{id}/practices: répondent 410PILOT_UNAVAILABLE. Le coaching n’est pas disponible.
Exemple : inviter des candidats
Créez la campagne
curl -X POST https://VOTRE-ADRESSE/api/v1/interviews \ -H "Authorization: Bearer dlv_votre_cle" \ -H "Content-Type: application/json" \ -d '{"title": "Téléconseiller"}'Ajoutez les questions, puis publiez
Appelez
POST /interviews/{id}/questions, puisPOST /interviews/{id}/publish. La réponse contient l’adresse publique de la campagne.Invitez les candidats
Le corps est un objet, ou une liste de 1 à 500 objets.
nameest obligatoire ;email,phoneetnotessont facultatifs.curl -X POST https://VOTRE-ADRESSE/api/v1/interviews/ID/candidates \ -H "Authorization: Bearer dlv_votre_cle" \ -H "Content-Type: application/json" \ -d '[{"name": "Awa Ndiaye", "email": "[email protected]"}]'Chaque candidat créé a un champ
inviteUrl: c’est son lien personnel. Deux candidats qui ont la même adresse e-mail dans une requête n’en font qu’un. La campagne doit être publiée, sinon l’API répond 412.Lisez les dossiers
Appelez
GET /interviews/{id}/sessionspour lister les entretiens, puisGET /sessions/{id}/reportpour le dossier.
Terminer des entretiens : simulation par défaut
POST /interviews/{id}/sessions/end reçoit { "ids": [...], "dryRun": true }. Avec dryRun à true, ou absent, rien n’est terminé : la réponse indique seulement quels entretiens sont éligibles. Envoyez "dryRun": false pour les terminer, 100 identifiants au plus.
Être prévenu : les webhooks
Dans Paramètres, Accès API, ajoutez une adresse https:// et choisissez les événements : session.completed quand un entretien se termine, session.report_ready quand son dossier est prêt. Minute envoie un POST en JSON aux webhooks de tous les membres de l’organisation abonnés à l’événement.
{
"id": "identifiant de l’envoi",
"type": "session.report_ready",
"created": 1760000000,
"livemode": true,
"data": { "sessionId": "…", "interviewId": "…" }
}Le message ne contient que des identifiants : lisez le dossier avec GET /sessions/{id}/report. Vérifiez la signature avant de le traiter : X-Minute-Signature vaut v1= suivi du HMAC-SHA256 en hexadécimal de horodatage.corps, calculé avec le secret du webhook ; l’horodatage, en secondes, est dans X-Minute-Timestamp. Refusez un horodatage de plus de 5 minutes.
Répondez par un statut 2xx en moins de 10 secondes. Sinon Minute réessaie après 1 minute puis 10 minutes, 3 tentatives au plus. Le journal des derniers envois est sous la liste des webhooks ; Renvoyer relance un envoi avec le même id, que vous pouvez utiliser pour ignorer un doublon.
Les erreurs
Une erreur a la forme { "error": { "code": …, "message": … } }. Fiez-vous au code : le texte du message peut être en français ou en anglais.
| Statut | Code | Cause |
|---|---|---|
| 400 | BAD_REQUEST | Identifiant ou paramètres invalides. |
| 401 | UNAUTHORIZED | Clé absente, invalide, révoquée ou expirée. |
| 403 | INSUFFICIENT_SCOPE | La clé n’a pas l’accès demandé. |
| 404 | NOT_FOUND | Ressource introuvable pour votre organisation. |
| 409 | CONFLICT | Modification impossible dans l’état actuel. |
| 410 | PILOT_UNAVAILABLE | Fonction non disponible. |
| 412 | PRECONDITION_FAILED | Une condition manque, par exemple une campagne non publiée. |
| 413 | PAYLOAD_TOO_LARGE | Corps de requête trop gros. |
| 429 | RATE_LIMITED | Plus de 60 requêtes en une minute. |
| 500 | INTERNAL_ERROR | Erreur de Minute. Réessayez plus tard. |