curl --request POST \
--url https://app.voicehire.io/api/v1/campaigns/create \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data @- <<EOF
{
"job_title": "Développeur Full Stack Node.js/React",
"contract_type": "CDI",
"job_description": "Nous recherchons un développeur Full Stack passionné par les technologies web modernes.\n\nResponsabilités:\n- Développer des applications web avec Node.js et React\n- Participer à la conception de l'architecture\n- Collaborer avec l'équipe produit\n\nCompétences requises:\n- 3+ ans d'expérience\n- Maîtrise de Node.js, React\n- Bases de données SQL/NoSQL\n",
"client_name": "TechCorp SAS",
"enable_salary_question": true
}
EOF{
"campaign_id": "abc123",
"candidate_link": "https://app.voicehire.io/apply/abc123",
"status": "active",
"questions_generated": 6
}
Créer une campagne
Crée une nouvelle campagne de recrutement avec génération automatique ou personnalisation des questions, des messages et de la voix de l’agent IA
curl --request POST \
--url https://app.voicehire.io/api/v1/campaigns/create \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data @- <<EOF
{
"job_title": "Développeur Full Stack Node.js/React",
"contract_type": "CDI",
"job_description": "Nous recherchons un développeur Full Stack passionné par les technologies web modernes.\n\nResponsabilités:\n- Développer des applications web avec Node.js et React\n- Participer à la conception de l'architecture\n- Collaborer avec l'équipe produit\n\nCompétences requises:\n- 3+ ans d'expérience\n- Maîtrise de Node.js, React\n- Bases de données SQL/NoSQL\n",
"client_name": "TechCorp SAS",
"enable_salary_question": true
}
EOF{
"campaign_id": "abc123",
"candidate_link": "https://app.voicehire.io/apply/abc123",
"status": "active",
"questions_generated": 6
}
Corps de la requête
Champs requis
CDI- Contrat à durée indéterminéeCDD- Contrat à durée déterminéeStage- Convention de stageIntérim- Mission d’intérimContrat d'apprentissageContrat de professionnalisationFreelance- Mission freelance
Métadonnées (optionnel)
fr, en, esQuestions personnalisées (optionnel)
questions est fourni). Doit avoir la même longueur que questions.Valeurs possibles pour chaque poids : 0, 0.5, 1, 1.5, 2questions si fourni). Chaque élément est un booléen.Voix de l’agent IA (optionnel)
GET /api/v1/voices.Accepte soit un agent_id (voix par défaut VoiceHire) soit un voice_id (clone d’agence).Le drapeau is_voice_clone est déduit automatiquement côté backend.Toggles d’entretien (optionnel)
Non, Annuelles, Mensuelles, Horairesenable_engage = true.enable_recapJob = true.enable_close = true.Sélection automatique (optionnel)
8.0, 8.5, 9.0, 9.5, 10.0. null désactive.Test linguistique (optionnel)
none, english, spanish, italian, german, chinese, portuguese, arabiclanguage_test_mode != "none".Le backend la traduit automatiquement vers la langue cible via OpenAI.Réponse
{
"campaign_id": "abc123",
"candidate_link": "https://app.voicehire.io/apply/abc123",
"status": "active",
"questions_generated": 6
}
active à la création)Exemple de requête
curl -X POST https://app.voicehire.io/api/v1/campaigns/create \
-H "X-API-Key: vh_live_XXXXXXXXXXXXX" \
-H "Content-Type: application/json" \
-d '{
"job_title": "Développeur Full Stack",
"contract_type": "CDI",
"job_description": "Nous recherchons un développeur Full Stack expérimenté...",
"client_name": "TechCorp",
"language": "fr",
"questions": [
"Quelle est votre expérience avec React et Node.js ?",
"Avez-vous déjà travaillé en méthodologie Agile ?"
],
"question_weights": [2, 1.5],
"question_binary_evaluations": [false, true],
"enable_salary_question": "Annuelles",
"enable_close": true,
"close_message": "Merci pour votre temps, nous reviendrons vers vous sous 48h.",
"automatic_selection_threshold": 8.5
}'
import requests
response = requests.post(
"https://app.voicehire.io/api/v1/campaigns/create",
headers={
"X-API-Key": "vh_live_XXXXXXXXXXXXX",
"Content-Type": "application/json"
},
json={
"job_title": "Développeur Full Stack",
"contract_type": "CDI",
"job_description": "Nous recherchons un développeur Full Stack expérimenté...",
"client_name": "TechCorp",
"language": "fr",
"questions": [
"Quelle est votre expérience avec React et Node.js ?",
"Avez-vous déjà travaillé en méthodologie Agile ?"
],
"question_weights": [2, 1.5],
"question_binary_evaluations": [False, True],
"enable_salary_question": "Annuelles",
"enable_close": True,
"close_message": "Merci pour votre temps, nous reviendrons vers vous sous 48h.",
"automatic_selection_threshold": 8.5
}
)
const axios = require('axios');
const response = await axios.post(
'https://app.voicehire.io/api/v1/campaigns/create',
{
job_title: 'Développeur Full Stack',
contract_type: 'CDI',
job_description: 'Nous recherchons un développeur Full Stack expérimenté...',
client_name: 'TechCorp',
language: 'fr',
questions: [
'Quelle est votre expérience avec React et Node.js ?',
'Avez-vous déjà travaillé en méthodologie Agile ?'
],
question_weights: [2, 1.5],
question_binary_evaluations: [false, true],
enable_salary_question: 'Annuelles',
enable_close: true,
close_message: 'Merci pour votre temps, nous reviendrons vers vous sous 48h.',
automatic_selection_threshold: 8.5
},
{
headers: {
'X-API-Key': 'vh_live_XXXXXXXXXXXXX',
'Content-Type': 'application/json'
}
}
);
Codes d’erreur
| Code | code | Description |
|---|---|---|
| 400 | MISSING_REQUIRED_FIELDS | Champs requis manquants |
| 400 | INVALID_CONTRACT_TYPE | Type de contrat invalide |
| 400 | INVALID_LANGUAGE | Langue non supportée (utiliser fr, en ou es) |
| 400 | TOO_MANY_QUESTIONS | Plus de 10 questions fournies |
| 400 | MISSING_QUESTION_WEIGHTS | question_weights manquant alors que questions est fourni |
| 400 | WEIGHTS_MISMATCH | Longueur de question_weights différente de questions |
| 400 | INVALID_WEIGHT_VALUE | Poids hors de la plage [0, 0.5, 1, 1.5, 2] |
| 400 | BINARY_EVALUATIONS_MISMATCH | Longueur de question_binary_evaluations différente de questions |
| 400 | INVALID_AUTOMATIC_SELECTION_THRESHOLD | Seuil hors de la plage [8.0, 8.5, 9.0, 9.5, 10.0] |
| 400 | MESSAGE_TOO_LONG | Un message dépasse 350 caractères |
| 400 | INVALID_OVERRIDE_AGENT_ID | Voix introuvable ou non accessible par l’agence |
| 400 | CUSTOM_LANGUAGE_QUESTION_REQUIRES_TEST_MODE | custom_language_question fourni sans language_test_mode |
| 401 | INVALID_API_KEY / MISSING_API_KEY | Clé API manquante ou invalide |
| 402 | INSUFFICIENT_CREDITS | Crédits insuffisants pour créer une campagne |
Authorizations
Clé API au format vh_live_XXXXX
Body
Titre du poste
"Développeur Full Stack Node.js/React"
Type de contrat (aligné sur les valeurs du dashboard)
CDI, CDD, Stage, Intérim, Contrat d'apprentissage, Contrat de professionnalisation, Freelance "CDI"
Description détaillée du poste
"Nous recherchons un développeur Full Stack passionné...\n"
Informations complémentaires
"Stack technique Node.js, React, PostgreSQL"
Nom de l'entreprise cliente (optionnel, utilise le nom de l'agence par défaut)
"TechCorp SAS"
Langue de la campagne (agent vocal, emails, SMS, interface candidat)
fr, en, es "fr"
Questions personnalisées d'entretien. Si fourni, question_weights est requis.
10Poids de chaque question. Doit avoir la même longueur que questions.
0, 0.5, 1, 1.5, 2 Évaluation binaire (oui/non) par question. Doit avoir la même longueur que questions.
Format de la question sur les prétentions salariales
Non, Annuelles, Mensuelles, Horaires Demander si le candidat est en recherche active
Demander la date de disponibilité du candidat
Demander au candidat de se présenter
VoiceHire Engage — message d'accroche en début d'entretien (défaut hérité de l'agence)
Message personnalisé d'accroche (utilisé si enable_engage = true)
350Récap interview au candidat (défaut hérité de l'agence)
Récap offre au candidat (défaut hérité de l'agence)
Message personnalisé du récap offre (utilisé si enable_recapJob = true)
350VoiceHire Close — message de clôture (défaut hérité de l'agence)
Message personnalisé de clôture (utilisé si enable_close = true)
350Score minimum pour la sélection automatique des candidats. null désactive.
8, 8.5, 9, 9.5, 10 Voix de l'agent IA. Récupérer la liste via GET /api/v1/voices.
Accepte soit un agent_id (voix par défaut VoiceHire) soit un voice_id (clone d'agence).
Le drapeau is_voice_clone est déduit automatiquement côté backend.
Mode test linguistique pendant l'entretien
none, english, spanish, italian, german, chinese, portuguese, arabic Question additionnelle pour le test linguistique. Nécessite language_test_mode != "none".
Le backend la traduit automatiquement vers la langue cible.
Response
Campagne créée avec succès
Identifiant de la campagne créée
"CAMP-20250701-ABC123"
Lien à partager avec les candidats
"https://app.voicehire.io/apply/CAMP-20250701-ABC123"
Statut initial de la campagne
"active"
Nombre de questions générées
6
Source des questions (IA ou défaut)
ai, default "ai"

