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

# Webhook recrutement

> Envoyer une candidature dans votre pipeline de recrutement, avec les réponses du formulaire en note.

```text theme={null}
POST https://api.scaleflow.fr/webhooks/recruitment?endpoint_id=VOTRE_ENDPOINT_ID
```

Chaque appel crée un candidat à la première colonne du pipeline de recrutement, et dépose les réponses du formulaire en note sur sa fiche.

Même endpoint et même jeton que le [webhook leads](/webhooks/leads). L'URL complète est affichée dans **Réglages → Tags & Webhook**, section **Webhook recrutement**.

## Exemple

```bash theme={null}
curl -X POST "https://api.scaleflow.fr/webhooks/recruitment?endpoint_id=VOTRE_ENDPOINT_ID" \
  -H "Authorization: Bearer VOTRE_JETON" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Marie Martin",
    "email": "marie.martin@example.com",
    "phone": "+33698765432",
    "position": "Closer",
    "pipeline": "Recrutement closers",
    "source": "tally",
    "answers": {
      "Expérience en vente": "3 ans en B2C",
      "Disponibilité": "Immédiate"
    }
  }'
```

## Champs du corps

<ParamField body="email" type="string" required>
  E-mail du candidat. Sert à reconnaître une candidature déjà reçue.
</ParamField>

<ParamField body="name" type="string">
  Nom complet, découpé automatiquement en prénom et nom. **Obligatoire si `first_name` est absent.**
</ParamField>

<ParamField body="first_name" type="string">
  Prénom, à la place de `name`.
</ParamField>

<ParamField body="last_name" type="string">
  Nom.
</ParamField>

<ParamField body="phone" type="string">
  Téléphone (40 caractères maximum).
</ParamField>

<ParamField body="position" type="string">
  Poste visé (`Closer`, `Setter`…).
</ParamField>

<ParamField body="pipeline_id" type="string">
  Identifiant (UUID) du pipeline de recrutement. Prioritaire sur `pipeline`.
</ParamField>

<ParamField body="pipeline" type="string">
  Nom exact du pipeline de recrutement (sans tenir compte des majuscules).
</ParamField>

<ParamField body="source" type="string">
  Origine de la candidature (`tally`, `typeform`…). Par défaut : `webhook`.
</ParamField>

<ParamField body="answers" type="object">
  Réponses libres du formulaire, sous la forme `{ "Question": "réponse" }`. Chaque paire devient une ligne de la note déposée sur la fiche.
</ParamField>

Sans `pipeline_id` ni `pipeline`, la candidature va dans le pipeline de recrutement actif par défaut. Aucun pipeline n'est créé automatiquement.

## Candidat déjà reçu

Si un candidat avec le même e-mail existe déjà **dans le même pipeline**, aucune seconde fiche n'est créée : la nouvelle soumission est ajoutée en note sur la fiche existante, et la réponse vaut `"action": "existing"`.

## Réponse

<ResponseExample>
  ```json 200 theme={null}
  {
    "ok": true,
    "talent_id": "c4d5e6f7-0000-4000-8000-000000000000",
    "action": "created"
  }
  ```
</ResponseExample>

<ResponseField name="talent_id" type="string">
  Identifiant du candidat.
</ResponseField>

<ResponseField name="action" type="string">
  `created` : nouvelle fiche. `existing` : candidat déjà présent, note ajoutée.
</ResponseField>

## Erreurs

Les erreurs de ce webhook ont la forme :

```json theme={null}
{ "error": { "code": "not_found", "message": "Pipeline de recrutement introuvable." } }
```

| Code | `error.code` | Cause |
| - | - | - |
| 400 | `bad_request` | `endpoint_id` absent ou mal formé, JSON illisible, champ invalide (le détail est dans `error.details`), ou `answers` trop volumineux |
| 401 | `unauthorized` | jeton absent ou invalide |
| 404 | `not_found` | endpoint inconnu, ou pipeline demandé introuvable |
| 409 | `conflict` | plusieurs pipelines portent ce nom : utilisez `pipeline_id` |
| 422 | `unprocessable` | aucun pipeline de recrutement actif dans l'espace |
| 500 | `internal` | erreur interne, réessayez plus tard |

## Avec Tally ou Typeform

<Warning>
  Tally et Typeform n'envoient pas ce format nativement : Tally poste ses réponses sous `data.fields[]`, Typeform sous `form_response.answers[]`. Coller cette URL directement dans leurs réglages de webhook ne fonctionnera pas.
</Warning>

Passez par un intermédiaire qui remet les champs à plat (Make, Zapier, n8n) : le formulaire déclenche le scénario, et un module HTTP envoie le JSON ci-dessus à ScaleFlow, avec l'en-tête `Authorization: Bearer VOTRE_JETON`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.