API partenaires v1
Ce guide s’adresse aux ATS et job boards qui veulent diffuser des offres événementielles sur EventJobs, sans flux XML propriétaire.
Vous poussez et mettez à jour les offres en JSON Schema.org JobPosting (le même vocabulaire que Google Jobs sur le site). Chaque offre est en candidature native (formulaire EventJobs + webhook signé + CV) ou en redirect (bouton vers votre ATS, avec UTM).
Demandez une clé sandbox à EventJobs (partenaire trusted=false). Les offres restent en pending tant qu’un job de test n’est pas validé. Utilisez le contact de cette page si vous n’avez pas encore d’identifiants.
https://event.jobs/api/partner/v1
Ordre d’intégration : s’authentifier, upsert un JobPosting, choisir native ou redirect, puis vérifier le HMAC du webhook.
Authentification
Envoyez X-Api-Key et X-Api-Secret, ou Authorization Bearer {api_key}:{api_secret}. Clé inactive : 401 ; IP hors allowlist : 403 ; quota : 429 avec Retry-After.
X-Api-Key: {api_key}
X-Api-Secret: {api_secret}
Authorization: Bearer {api_key}:{api_secret}
curl -X POST https://event.jobs/api/partner/v1/jobs \
-H "X-Api-Key: YOUR_API_KEY" \
-H "X-Api-Secret: YOUR_API_SECRET" \
-H "Content-Type: application/json" \
-d @job.json
Upsert des offres
Créez ou mettez à jour les offres avec POST /jobs et identifier.value comme id ATS stable. PUT/DELETE utilisent le même id. DELETE clôture l’offre (status expired). GET /jobs liste vos offres ; can_read_all inclut aussi les autres offres actives.
{
"@type": "JobPosting",
"identifier": {
"value": "ATS-DEMO-1"
},
"title": "Régisseur plateau",
"description": "<p>Description HTML</p>",
"employmentType": "FULL_TIME",
"validThrough": "2026-12-31T23:59:59+01:00",
"hiringOrganization": {
"name": "Prod Events",
"sameAs": "https://prodevents.fr",
"email": "[email protected]"
},
"jobLocation": {
"address": {
"addressLocality": "Lyon",
"postalCode": "69001",
"addressCountry": "FR"
}
},
"extensions": {
"applyMode": "native",
"romeCode": "L1509",
"contractCode": "CDD",
"jobStart": "2026-10-01",
"jobEnd": "2026-10-15"
}
}
Candidature native ou redirect
Sans applyMode=redirect, la candidature reste sur EventJobs (défaut actuel). En redirect, le candidat ouvre votre formulaire ATS.
native
Défaut. Le candidat postule sur EventJobs. Vous recevez application.created, puis GET le CV.
redirect
Le candidat ouvre votre formulaire ATS. EventJobs ajoute les UTM. Les candidatures restent dans l’ATS, pas le Kanban EventJobs.
Le apply_url de SyncResponse est toujours la fiche EventJobs avec ?source={slug}, pas l’URL ATS. Les UTM sont ajoutés à l’URL ATS stockée sans dupliquer les paramètres existants.
{
"extensions": {
"applyMode": "redirect",
"applyUrl": "https://ats.example/apply/JOB-42"
}
}
Webhooks de candidature
Si webhook_url est défini, EventJobs POST application.created avec X-EventJobs-Signature (HMAC-SHA256 du corps brut). Reliez l’offre via data.job.external_id.
download_url est une URL de l’API partenaires. Téléchargez le fichier avec les mêmes identifiants. Pas d’URL publique de CV ni de PDF dans le webhook.
L’admin peut envoyer event ping vers votre webhook_url pour tester le HMAC. Ignorez ping dans l’ATS : ce n’est pas une candidature.
Vérifiez X-EventJobs-Signature sur le corps brut (pas un JSON re-sérialisé).
Les webhooks sont mis en file avec retries. En production, lancer un worker de queue ; QUEUE_CONNECTION=sync ne relance pas.
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $webhookSecret);
hash_equals($expected, $header); // X-EventJobs-Signature
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', webhookSecret).update(rawBody).digest('hex');
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(header));
SLA d’intégration
- Upsert
- L’upsert est idempotent sur (external_source, external_id) issu de identifier.value.
- DELETE
- DELETE clôture l’offre (status expired) ; la ligne n’est pas supprimée physiquement.
- Webhook
- application.created est mis en file avec 3 retries (10 s / 60 s / 180 s). En production, un worker de queue est requis (pas QUEUE_CONNECTION=sync).
- CV
- Les CV se téléchargent avec GET /applications/{id}/resume et les identifiants partenaires. Pas d’URL de fichier publique.
- Sandbox
- Les partenaires non trusted (sandbox) créent des offres pending jusqu’à activation trusted ou publication du job de test.
- apply_url
- Le apply_url de SyncResponse est la fiche EventJobs (?source=slug), pas l’URL du formulaire ATS.
- Kanban
- EventJobs ne synchronise pas le Kanban ni application.updated. L’apply native n’envoie que application.created.
Spécification OpenAPI
https://event.jobs/developers/openapi.yaml · https://event.jobs/developers/postman.json