> ## Documentation Index
> Fetch the complete documentation index at: https://docs.voicehire.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Modifier une campagne

> Met à jour les champs fournis d'une campagne existante. Tous les champs sont optionnels.

## Paramètres

<ParamField path="campaign_id" type="string" required>
  Identifiant unique de la campagne
</ParamField>

## Corps de la requête

Tous les champs sont optionnels — seuls les champs fournis dans le payload sont modifiés. Si `questions` est fourni, l'ensemble des questions est remplacé (et `question_weights` devient obligatoire).

### Métadonnées

<ParamField body="job_title" type="string">
  Titre du poste à pourvoir
</ParamField>

<ParamField body="contract_type" type="string">
  Type de contrat (mêmes valeurs que la création)
</ParamField>

<ParamField body="job_description" type="string">
  Description détaillée du poste
</ParamField>

<ParamField body="additional_info" type="string">
  Informations complémentaires
</ParamField>

<ParamField body="client_name" type="string">
  Nom de l'entreprise cliente
</ParamField>

<ParamField body="language" type="string">
  Langue de la campagne (`fr`, `en`, `es`)
</ParamField>

### Voix de l'agent IA

<ParamField body="override_agent_id" type="string">
  Nouvel ID de voix. Récupérer la liste via [`GET /api/v1/voices`](/api-reference/account/list-voices).

  Passer `null` réinitialise sur la voix par défaut de la langue de la campagne.
</ParamField>

### Questions

<ParamField body="questions" type="array">
  Liste de questions (max 10). Si fourni, remplace **toutes** les questions existantes.
</ParamField>

<ParamField body="question_weights" type="array">
  Poids de chaque question (`0`, `0.5`, `1`, `1.5`, `2`). Requis si `questions` est fourni.
</ParamField>

<ParamField body="question_binary_evaluations" type="array">
  Évaluation binaire (oui/non) par question.
</ParamField>

### Toggles d'entretien

<ParamField body="enable_salary_question" type="string">
  `Non`, `Annuelles`, `Mensuelles` ou `Horaires`
</ParamField>

<ParamField body="enable_job_search_question" type="boolean" />

<ParamField body="enable_availability_question" type="boolean" />

<ParamField body="enable_introduction_question" type="boolean" />

<ParamField body="enable_engage" type="boolean" />

<ParamField body="enable_recapInterview" type="boolean" />

<ParamField body="enable_recapJob" type="boolean" />

<ParamField body="enable_close" type="boolean" />

### Messages personnalisés

<ParamField body="engage_message" type="string">
  Message d'accroche (350 caractères max). Passer `null` ou chaîne vide pour le retirer.
</ParamField>

<ParamField body="close_message" type="string">
  Message de clôture (350 caractères max).
</ParamField>

<ParamField body="recap_job_message" type="string">
  Message de récap offre (350 caractères max).
</ParamField>

### Sélection automatique

<ParamField body="automatic_selection_threshold" type="number">
  `8.0`, `8.5`, `9.0`, `9.5`, `10.0`, ou `null` pour désactiver.
</ParamField>

### Test linguistique

<ParamField body="language_test_mode" type="string">
  `none`, `english`, `spanish`, `italian`, `german`, `chinese`, `portuguese`, `arabic`.

  Passer `none` efface aussi `custom_language_question`.
</ParamField>

<ParamField body="custom_language_question" type="string">
  Question additionnelle (traduite automatiquement). Nécessite `language_test_mode != "none"`.
</ParamField>

## Réponse

<ResponseExample>
  ```json theme={null}
  {
    "campaign_id": "abc123",
    "updated_at": "2026-04-30T14:23:11.123456"
  }
  ```
</ResponseExample>

<ResponseField name="campaign_id" type="string" required>
  Identifiant de la campagne modifiée
</ResponseField>

<ResponseField name="updated_at" type="string" required>
  Timestamp ISO 8601 de la mise à jour
</ResponseField>

## Exemples

<CodeGroup>
  ```bash cURL theme={null}
  # Activer le message de clôture
  curl -X PATCH https://app.voicehire.io/api/v1/campaigns/abc123 \
    -H "X-API-Key: vh_live_XXXXXXXXXXXXX" \
    -H "Content-Type: application/json" \
    -d '{
      "enable_close": true,
      "close_message": "Merci pour votre temps, nous reviendrons vers vous sous 48h."
    }'
  ```

  ```bash cURL (remplacer les questions) theme={null}
  curl -X PATCH https://app.voicehire.io/api/v1/campaigns/abc123 \
    -H "X-API-Key: vh_live_XXXXXXXXXXXXX" \
    -H "Content-Type: application/json" \
    -d '{
      "questions": [
        "Quelle est votre expérience avec Node.js ?",
        "Préférez-vous le télétravail ou le présentiel ?"
      ],
      "question_weights": [2, 1],
      "question_binary_evaluations": [false, true]
    }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.patch(
      "https://app.voicehire.io/api/v1/campaigns/abc123",
      headers={
          "X-API-Key": "vh_live_XXXXXXXXXXXXX",
          "Content-Type": "application/json"
      },
      json={
          "automatic_selection_threshold": 9.0,
          "enable_close": True,
          "close_message": "Merci pour votre temps !"
      }
  )
  ```

  ```javascript Node.js theme={null}
  const axios = require('axios');

  const response = await axios.patch(
    'https://app.voicehire.io/api/v1/campaigns/abc123',
    {
      automatic_selection_threshold: 9.0,
      enable_close: true,
      close_message: 'Merci pour votre temps !'
    },
    {
      headers: {
        'X-API-Key': 'vh_live_XXXXXXXXXXXXX',
        'Content-Type': 'application/json'
      }
    }
  );
  ```
</CodeGroup>

## Notes importantes

* Pour changer uniquement le statut (`active`/`paused`/`completed`), utiliser plutôt [`PATCH /campaigns/{campaign_id}/status`](/api-reference/campaigns/update-campaign-status).
* Si `questions` est fourni, **toutes** les questions existantes sont remplacées (pas de patch partiel sur les questions).
* Le drapeau `is_voice_clone` est toujours déduit automatiquement depuis `override_agent_id`, vous ne devez pas l'envoyer.

## Codes d'erreur

| Code | `code`                                             | Description                                              |
| ---- | -------------------------------------------------- | -------------------------------------------------------- |
| 400  | `INVALID_CONTRACT_TYPE`                            | Type de contrat invalide                                 |
| 400  | `INVALID_LANGUAGE`                                 | Langue non supportée                                     |
| 400  | `INVALID_OVERRIDE_AGENT_ID`                        | Voix introuvable ou non accessible                       |
| 400  | `WEIGHTS_MISMATCH` / `BINARY_EVALUATIONS_MISMATCH` | Tableau de poids/évaluations incohérent                  |
| 400  | `MESSAGE_TOO_LONG`                                 | Message > 350 caractères                                 |
| 401  | `INVALID_API_KEY` / `MISSING_API_KEY`              | Clé API invalide                                         |
| 404  | `CAMPAIGN_NOT_FOUND`                               | Campagne introuvable ou n'appartenant pas à votre agence |


## OpenAPI

````yaml PATCH /api/v1/campaigns/{campaign_id}
openapi: 3.0.3
info:
  title: VoiceHire API
  description: >
    API REST pour automatiser les campagnes de recrutement avec VoiceHire.


    ## Authentification


    L'API utilise une authentification par clé API. Vous devez inclure votre clé
    API dans l'en-tête `X-API-Key` de chaque requête.


    ```

    X-API-Key: vh_live_XXXXXXXXXXXXX

    ```


    ## Format des réponses


    Toutes les réponses sont au format JSON. Les erreurs suivent un format
    standardisé :


    ```json

    {
      "error": {
        "code": "ERROR_CODE",
        "message": "Description de l'erreur",
        "details": {}
      }
    }

    ```


    ## Limites


    - Les numéros de téléphone doivent être des numéros français (06 ou 07)

    - Maximum 100 candidats par requête d'ajout

    - Les campagnes génèrent automatiquement 6 questions d'entretien
  version: 1.0.0
  contact:
    name: Support VoiceHire
    email: support@voicehire.io
    url: https://www.voicehire.io
servers:
  - url: https://app.voicehire.io
    description: Production
  - url: http://localhost:8080
    description: Développement local
security:
  - ApiKeyAuth: []
tags:
  - name: Campagnes
    description: Gestion des campagnes de recrutement
  - name: Candidats
    description: Gestion des candidats
  - name: Compte
    description: Informations du compte
paths:
  /api/v1/campaigns/{campaign_id}:
    patch:
      tags:
        - Campagnes
      summary: Modifier une campagne
      description: >
        Met à jour les champs fournis d'une campagne existante. Tous les champs
        sont optionnels.

        Si `questions` est fourni, l'ensemble des questions est remplacé (et
        `question_weights`

        devient obligatoire).
      operationId: updateCampaign
      parameters:
        - name: campaign_id
          in: path
          required: true
          description: Identifiant de la campagne
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CampaignUpdateRequest'
            examples:
              toggle_close_message:
                summary: Activer le message de clôture
                value:
                  enable_close: true
                  close_message: Merci pour votre temps, nous reviendrons vers vous sous 48h.
              update_questions:
                summary: Remplacer les questions
                value:
                  questions:
                    - Quelle est votre expérience avec Node.js ?
                    - Préférez-vous le télétravail ou le présentiel ?
                  question_weights:
                    - 2
                    - 1
                  question_binary_evaluations:
                    - false
                    - true
              change_voice:
                summary: Changer la voix de l'agent
                value:
                  override_agent_id: agent_xxx
      responses:
        '200':
          description: Campagne mise à jour
          content:
            application/json:
              schema:
                type: object
                properties:
                  campaign_id:
                    type: string
                  updated_at:
                    type: string
                    format: date-time
        '400':
          description: Données invalides
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Campagne non trouvée
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    CampaignUpdateRequest:
      type: object
      description: >
        Modification d'une campagne existante. Tous les champs sont optionnels —
        seuls les champs

        fournis sont modifiés. Si `questions` est fourni, `question_weights` est
        obligatoire et

        l'ensemble des questions est remplacé.
      properties:
        job_title:
          type: string
        contract_type:
          type: string
          enum:
            - CDI
            - CDD
            - Stage
            - Intérim
            - Contrat d'apprentissage
            - Contrat de professionnalisation
            - Freelance
        job_description:
          type: string
        additional_info:
          type: string
        client_name:
          type: string
        language:
          type: string
          enum:
            - fr
            - en
            - es
        questions:
          type: array
          maxItems: 10
          items:
            type: string
        question_weights:
          type: array
          items:
            type: number
            enum:
              - 0
              - 0.5
              - 1
              - 1.5
              - 2
        question_binary_evaluations:
          type: array
          items:
            type: boolean
        enable_salary_question:
          type: string
          enum:
            - Non
            - Annuelles
            - Mensuelles
            - Horaires
        enable_job_search_question:
          type: boolean
        enable_availability_question:
          type: boolean
        enable_introduction_question:
          type: boolean
        enable_engage:
          type: boolean
        engage_message:
          type: string
          maxLength: 350
          nullable: true
        enable_recapInterview:
          type: boolean
        enable_recapJob:
          type: boolean
        recap_job_message:
          type: string
          maxLength: 350
          nullable: true
        enable_close:
          type: boolean
        close_message:
          type: string
          maxLength: 350
          nullable: true
        automatic_selection_threshold:
          type: number
          enum:
            - 8
            - 8.5
            - 9
            - 9.5
            - 10
          nullable: true
        override_agent_id:
          type: string
          nullable: true
        language_test_mode:
          type: string
          enum:
            - none
            - english
            - spanish
            - italian
            - german
            - chinese
            - portuguese
            - arabic
        custom_language_question:
          type: string
          nullable: true
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Code d'erreur machine-readable
              example: MISSING_API_KEY
            message:
              type: string
              description: Message d'erreur human-readable
              example: API key is required
            details:
              type: object
              description: Détails supplémentaires sur l'erreur
              additionalProperties: true
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: Clé API au format vh_live_XXXXX

````