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.

URL de base de l’API 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.

HTTP
X-Api-Key: {api_key}
X-Api-Secret: {api_secret}

Authorization: Bearer {api_key}:{api_secret}
cURL
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.

JSON POST /jobs
{
    "@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.

JSON applyMode
{
    "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.

PHP
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $webhookSecret);
hash_equals($expected, $header); // X-EventJobs-Signature
Node
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