Marvin · Developers

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 :

  1. Flux d'offres (public) — le site pull un flux XML des offres ouvertes et les affiche avec son propre template. Aucune clé requise.
  2. 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}.xml

Public, 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-8
  • Cache-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.
BaliseDescription
titleIntitulé de l'offre
dateDate de publication
jobid⚠️ Identifiant de l'offre — à reporter dans l'URL de candidature
urlPage de l'offre (lien « Voir l'offre » / « Postuler »)
companyNom de l'entreprise
cityVille
stateRégion / département
countryCode pays ISO (FR…)
descriptionDescription de l'offre (HTML)
salaryRémunération
jobtypeType de contrat (permanent contract…)
remotetypeTélétravail (Fully remote / Hybrid remote / No remote)
champs persoChaque 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}/apply

{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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

La 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.

ChampTypeRequisDescription
firstNamestringouiPrénom
lastNamestringouiNom
emailstringouiEmail du candidat
phoneNumberstringnonTéléphone
linkedinstringnonURL du profil LinkedIn
motivationTextstringnonMessage / lettre de motivation
resumefilenonCV (resume ou cv) — multipart requis
champs persononChamps 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

StatutCas
201Candidature reçue — CV parsé, profil rattaché ou créé
401Clé absente ou invalide
403Scope manquant sur la clé
410Offre retirée (n'est plus diffusée)
422Champ 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-Key sur 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.

On this page