Site web — diffuser vos offres et recevoir les candidatures
Afficher les offres Marvin sur le site du client via un flux XML, et renvoyer les candidatures du site dans Marvin via l'API
Le canal « Site web » permet à un client Marvin de diffuser ses offres sur son propre site et d'y récupérer les candidatures directement dans Marvin. Cette page s'adresse au webmaster / intégrateur qui câble le site du client.
Vue d'ensemble
Deux briques indépendantes :
- Flux d'offres (public) — le site pull un flux XML des offres ouvertes et les affiche avec son propre template. Aucune clé requise.
- Envoi des candidatures (authentifié) — quand un visiteur postule sur le site, celui-ci POST la candidature à Marvin via une API protégée par une clé. La candidature remonte dans Marvin, rattachée à l'offre concernée.
Le flux et l'envoi de candidatures se câblent séparément : on peut très bien n'afficher que les offres, puis brancher l'apply dans un second temps.
- Base URL :
https://api.marvins.ai - Authentification (apply uniquement) : header
X-Marvin-Public-Key(voir Authentification)
Consommer le flux d'offres
GET https://api.marvins.ai/public/feeds/site-web/{slug}.xmlPublic, par slug — aucune clé. Le webmaster pull cette URL à intervalle régulier (au build, ou via un cron) et rend les offres avec son propre template.
Le {slug} et l'URL exacte sont fournis dans Marvin :
Configuration → Multidiffusion → carte « Site web » → bouton Configurer → champ « URL du flux à transmettre à votre webmaster ».
Format
Content-Type: text/xml; charset=utf-8Cache-Control: public, max-age=300(cache 5 min — vous pouvez pull aussi souvent que vous voulez)- Racine
<source>, un<job>par offre, valeurs en CDATA.
| Balise | Description |
|---|---|
title | Intitulé de l'offre |
date | Date de publication |
jobid | ⚠️ Identifiant de l'offre — à reporter dans l'URL de candidature |
url | Page de l'offre (lien « Voir l'offre » / « Postuler ») |
company | Nom de l'entreprise |
city | Ville |
state | Région / département |
country | Code pays ISO (FR…) |
description | Description de l'offre (HTML) |
salary | Rémunération |
jobtype | Type de contrat (permanent contract…) |
remotetype | Télétravail (Fully remote / Hybrid remote / No remote) |
| champs perso | Chaque champ personnalisé de l'offre, en balise au nom slugifié |
Exemple
<?xml version="1.0" encoding="UTF-8"?>
<source>
<job>
<title><![CDATA[Développeur React Senior (H/F)]]></title>
<date><![CDATA[2026-04-01]]></date>
<jobid><![CDATA[01919c41-7a2b-7c3d-8e4f-1a2b3c4d5e6f]]></jobid>
<url><![CDATA[https://www.acme-corp.com/carrieres/dev-react-senior]]></url>
<company><![CDATA[Acme Corp]]></company>
<city><![CDATA[Paris]]></city>
<state><![CDATA[Île-de-France]]></state>
<country><![CDATA[FR]]></country>
<description><![CDATA[<p>Nous cherchons un dev <b>React</b>…</p>]]></description>
<salary><![CDATA[55K - 75K]]></salary>
<jobtype><![CDATA[permanent contract]]></jobtype>
<remotetype><![CDATA[Hybrid remote]]></remotetype>
<niveau-d-etudes><![CDATA[Bac +5]]></niveau-d-etudes>
</job>
<!-- … un <job> par offre ouverte -->
</source>Conservez la valeur de jobid : c'est elle que vous passerez à l'API de candidature ({ID_OFFRE} ) pour rattacher chaque candidature à la bonne offre.
Envoyer les candidatures
Quand un visiteur soumet le formulaire de candidature de votre site, postez-le à :
POST https://api.marvins.ai/v1/public/careers/{slug}/jobs/{ID_OFFRE}/applyoù {ID_OFFRE} est le <jobid> lu dans le flux.
Authentification
Cet endpoint requiert une clé d'API candidatures dans le header :
X-Marvin-Public-Key: pk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxLa clé se génère dans Marvin :
Configuration → Multidiffusion → Site web → Configurer → « Générer une clé d'API candidatures ».
La clé pk_live_… est un secret côté serveur. Ne l'exposez jamais dans le code exécuté
par le navigateur (le POST de candidature doit partir de votre back-end). Elle n'est affichée
qu'une seule fois à la génération — copiez-la immédiatement.
Corps de la requête
Le corps peut être envoyé en multipart/form-data (recommandé, permet le CV)
ou en application/json (sans pièce jointe). Les noms de champs sont
identiques à Marvin V1.
| Champ | Type | Requis | Description |
|---|---|---|---|
firstName | string | oui | Prénom |
lastName | string | oui | Nom |
email | string | oui | Email du candidat |
phoneNumber | string | non | Téléphone |
linkedin | string | non | URL du profil LinkedIn |
motivationText | string | non | Message / lettre de motivation |
resume | file | non | CV (resume ou cv) — multipart requis |
| champs perso | — | non | Champs personnalisés de l'offre |
Exemple — multipart avec CV
curl -X POST \
"https://api.marvins.ai/v1/public/careers/acme-corp/jobs/01919c41-7a2b-7c3d-8e4f-1a2b3c4d5e6f/apply" \
-H "X-Marvin-Public-Key: pk_live_…" \
-F "firstName=Linda" \
-F "lastName=Kedin" \
-F "email=linda.kedin@example.com" \
-F "phoneNumber=+33612345678" \
-F "linkedin=https://www.linkedin.com/in/linda-kedin" \
-F "motivationText=Bonjour, je suis très intéressée par ce poste…" \
-F "resume=@/chemin/vers/cv-linda-kedin.pdf"Exemple — JSON sans CV
curl -X POST \
"https://api.marvins.ai/v1/public/careers/acme-corp/jobs/01919c41-7a2b-7c3d-8e4f-1a2b3c4d5e6f/apply" \
-H "X-Marvin-Public-Key: pk_live_…" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Linda",
"lastName": "Kedin",
"email": "linda.kedin@example.com",
"phoneNumber": "+33612345678",
"linkedin": "https://www.linkedin.com/in/linda-kedin",
"motivationText": "Bonjour, je suis très intéressée par ce poste…"
}'Réponses
| Statut | Cas |
|---|---|
201 | Candidature reçue — CV parsé, profil rattaché ou créé |
401 | Clé absente ou invalide |
403 | Scope manquant sur la clé |
410 | Offre retirée (n'est plus diffusée) |
422 | Champ requis manquant (firstName / lastName / email) |
Pour le détail des schémas et tester les requêtes, voir la Référence API — Careers (Public).
Checklist de bascule (client migré depuis Marvin V1)
Si le site consommait déjà le canal « Site web » de Marvin V1, l'intégration reste quasi identique — seules les URLs changent :
- Remplacer l'ancienne URL de flux V1 par la nouvelle URL
…/public/feeds/site-web/{slug}.xml. - Repointer le POST de candidature sur la nouvelle URL
…/v1/public/careers/{slug}/jobs/{ID_OFFRE}/apply. - Ajouter le header
X-Marvin-Public-Keysur le POST de candidature (nouveau en V2). - Vérifier que les noms de champs restent identiques à V1
(
firstName,lastName,email,resume…) — aucun renommage à prévoir.