Intégrations ATS · Gratuit

Connectez votre ATS à OpenPro.

Vos offres publiées, mises à jour et retirées automatiquement. Sans ressaisie, sans développement, sans frais.

Compatible

Votre ATS est déjà prêt.

Trois façons

Branchez-vous comme vous voulez.

Recruteur, éditeur d’ATS ou multidiffuseur : chacun son chemin, le même résultat.

30 secondes

Collez un lien

Le lien de votre page carrière ou de votre flux XML, RSS ou JSON. OpenPro reconnaît l’ATS et vous montre vos offres avant de connecter.

  • jobs.lever.co/acme
  • boards.greenhouse.io/acme
  • acme.teamtailor.com
  • carrieres.acme.fr/offres.xml
  • ATS détecté automatiquement
  • Aperçu de vos offres avant de valider
  • Synchronisation chaque jour
  • Offre disparue de votre ATS : fermée automatiquement

Coller mon lien

Temps réel

API OpenPro

Pour les éditeurs d’ATS et les multidiffuseurs. Une clé API par entreprise, et vos offres vivent sur OpenPro à la seconde.

  • PUT /jobs/REQ-2041 → 201 "published"
  • DELETE /jobs/REQ-2038 → 200 "withdrawn"
  • Créer, mettre à jour, retirer une offre
  • Ou envoyer toute la liste en un appel
  • JSON ou flux XML, vos noms de champs
  • 600 requêtes par minute

Lire la documentation

Flux sortant

Flux sortant

OpenPro publie aussi ses offres pour les agrégateurs d’emploi, au format XML d’Indeed, à jour en continu.

api.openpro.ai/feeds/jobs.xml

  • Toutes les offres en ligne, rien d’autre
  • Format Indeed XML, le standard des agrégateurs
  • Une offre fermée disparaît du flux

Format Indeed XML · mis à jour en continu

Documentation

API OpenPro pour ATS

Une API REST sobre : une clé par entreprise, l’identifiant de l’offre dans votre ATS, du JSON. Vos offres sont créées, mises à jour et retirées en temps réel.

Démarrer

URL de base https://api.openpro.ai/api/v1/ats

  1. Dans OpenPro, ouvrez Connecter mon ATS, onglet API pour éditeurs d’ATS, et générez une clé. Elle s’affiche une seule fois : gardez-la en lieu sûr.
  2. Envoyez-la à chaque appel dans l’en-tête Authorization: Bearer opk_… (ou X-OpenPro-Key).
  3. Vérifiez-la avec GET /me : vous voyez votre entreprise et vos compteurs d’offres.

Générer ma clé API

curl
curl https://api.openpro.ai/api/v1/ats/me \
        -H "Authorization: Bearer opk_votre_cle"
Réponse 200
{
        "success": true,
        "data": {
          "connection_id": 128,
          "company": { "id": 42, "name": "Exemple SA" },
          "offers": { "live": 18, "pending": 2, "withdrawn": 5 }
        }
      }

Endpoints

Tous les chemins partent de l’URL de base. Une offre est désignée par id, son identifiant dans votre ATS : pas d’identifiant OpenPro à stocker.

MéthodeChemin
GET/me Vérifier la clé, voir l’entreprise et ses compteurs
PUT/jobs/{id} Créer ou mettre à jour une offre (201 / 200)
POST/jobs Même chose, avec « id » dans le corps
DELETE/jobs/{id} Retirer une offre : elle est fermée sur OpenPro
GET/jobs?per_page=100&page=1 Lister vos offres et leur statut
GET/jobs/{id} Lire le statut d’une offre
PUT/jobs Envoyer la liste complète : les absentes sont retirées

Créer ou mettre à jour une offre

PUT /jobs/{id} crée l’offre si elle n’existe pas (201), la met à jour sinon (200), y compris une offre déjà en ligne. Envoyez-la à chaque changement : l’appel est idempotent. Seuls id et title sont obligatoires.

curl
curl -X PUT https://api.openpro.ai/api/v1/ats/jobs/REQ-2041 \
        -H "Authorization: Bearer opk_votre_cle" \
        -H "Content-Type: application/json" \
        -d '{
          "title": "Comptable H/F",
          "location": { "city": "Nantes", "postal_code": "44000" },
          "contract_type": "CDI",
          "salary": { "min": 2300, "max": 2600, "currency": "EUR", "period": "month", "basis": "net" },
          "work_hours": { "start": "09:00", "end": "17:30" }
        }'
Réponse 201
{
        "success": true,
        "data": {
          "id": "REQ-2041",
          "status": "published",
          "title": "Comptable H/F",
          "openpro_url": "https://openpro.ai/work/4240",
          "updated_at": "2026-10-22T09:30:00.000000Z"
        }
      }

Retirer une offre

DELETE /jobs/{id} retire l’offre : elle est fermée sur OpenPro et n’accepte plus de candidatures.

curl
curl -X DELETE https://api.openpro.ai/api/v1/ats/jobs/REQ-2041 \
        -H "Authorization: Bearer opk_votre_cle"

Envoyer la liste complète

PUT /jobs reçoit toutes vos offres ouvertes en un appel, en JSON {"jobs": [...]} ou en flux XML (Content-Type: application/xml). Les offres absentes de la liste sont retirées. Jusqu’à 5 000 offres par appel.

curl · JSON
curl -X PUT https://api.openpro.ai/api/v1/ats/jobs \
        -H "Authorization: Bearer opk_votre_cle" \
        -H "Content-Type: application/json" \
        -d '{
          "jobs": [
            { "id": "REQ-2041", "title": "Comptable H/F", "location": { "city": "Nantes" } },
            { "id": "REQ-2042", "title": "Assistant RH H/F", "location": { "city": "Rennes" } }
          ]
        }'
Réponse 200
{
        "success": true,
        "data": { "found": 2, "new": 1, "updated": 1, "removed": 3 }
      }

Format d’une offre

Du JSON simple. Le HTML est accepté dans description. Plus l’offre est précise, mieux elle est présentée : salaire, horaires et planning la font passer devant.

offre.json
{
        "id": "REQ-2041",
        "title": "Comptable H/F",
        "description": "<p>Rejoignez notre équipe finance…</p>",
        "url": "https://carrieres.exemple.fr/offres/2041",
        "apply_url": "https://carrieres.exemple.fr/offres/2041/postuler",
        "company": "Exemple SA",
        "location": { "city": "Nantes", "postal_code": "44000", "country": "FR" },
        "contract_type": "CDI",
        "salary": { "min": 2300, "max": 2600, "currency": "EUR", "period": "month", "basis": "net" },
        "weekly_hours": 35,
        "work_hours": { "start": "09:00", "end": "17:30", "lunch_start": "12:30", "lunch_end": "13:30" },
        "weekly_schedule": {
          "monday": "desk", "tuesday": "desk", "wednesday": "remote",
          "thursday": "desk", "friday": "desk", "saturday": "off", "sunday": "off"
        },
        "remote": "hybrid",
        "department": "Finance",
        "missions": ["Tenir la comptabilité fournisseurs", "Préparer les clôtures mensuelles"],
        "requirements": ["Bac+2 en comptabilité", "Maîtrise d’Excel"],
        "benefits": ["Tickets restaurant", "Mutuelle prise en charge à 70 %"],
        "images": ["https://carrieres.exemple.fr/photos/equipe-finance.jpg"]
      }
ChampDescription
id string requisIdentifiant de l’offre dans votre ATS, 190 caractères au plus.
title string requisIntitulé du poste.
description stringTexte ou HTML : il est nettoyé et mis en forme.
url urlPage de l’offre sur votre site carrière.
apply_url urlLien de candidature de votre site.
company stringEntreprise qui recrute.
location objectcity, postal_code, country (code ISO, ex. FR). Une simple chaîne est acceptée.
contract_type stringCDI, CDD, Stage, Alternance, Freelance, Interim — ou permanent, fixed-term, internship, apprenticeship, contractor, temporary.
salary objectmin, max, currency (EUR), period (hour | day | month | year), basis (gross | net).
weekly_hours numberHeures par semaine, ex. 35.
work_hours objectstart, end, lunch_start, lunch_end au format HH:MM.
weekly_schedule objectmonday … sunday : desk (sur site), remote (télétravail) ou off.
remote stringonsite, hybrid ou remote.
department stringService ou équipe.
missions string[]Missions principales, 12 au plus.
requirements string[]Profil recherché, 12 au plus.
benefits string[]Avantages, 12 au plus.
images string[]Vos photos de l’offre (équipe, locaux), en https, 5 au plus : elles illustrent l’offre sur OpenPro à la place d’une image générée.

Vos noms de champs, tels quels.

Pas besoin de tout renommer : les noms usuels, en anglais comme en français, sont compris.

  • job_title
  • intitule
  • reference
  • ville
  • code_postal
  • salaire
  • remuneration
  • type_contrat
  • entreprise
  • teletravail
  • lien_candidature

Statuts d’une offre

Chaque réponse donne le status de l’offre sur OpenPro, et son adresse publique openpro_url dès qu’elle est en ligne.

processing
Reçue, en cours de traitement (quelques secondes).
published
En ligne sur OpenPro : openpro_url est renseignée.
draft
En brouillon : le recruteur la relit avant publication.
closed
Fermée sur OpenPro.
withdrawn
Retirée par votre ATS (DELETE ou absente de la liste complète).
declined
Écartée par le recruteur dans OpenPro.

Erreurs et limites

Une erreur répond toujours success: false avec un error.code stable et un message en français. Limite : 600 requêtes par minute et par clé.

HTTPerror.code
401invalid_api_key Clé absente, invalide ou révoquée.
404not_found Aucune offre avec cet id sur cette connexion.
422invalid_payload Offre refusée : le détail par champ est dans error.fields.
423connection_paused La connexion est en pause côté OpenPro.
429— Plus de 600 requêtes par minute avec cette clé : réessayez après le délai de l’en-tête Retry-After.
429too_many_refused_keys Plus de 30 clés refusées en une minute depuis votre adresse : patientez une minute.
Réponse 422
{
        "success": false,
        "error": {
          "code": "invalid_payload",
          "message": "Offre refusée : corrigez les champs indiqués.",
          "fields": { "title": "Intitulé obligatoire (champ \"title\")." }
        }
      }

Transparence

Les offres transparentes passent devant.

OpenPro met en avant les offres qui annoncent le salaire, les horaires, le planning et le lieu. Renseignez salary et work_hours : votre offre se démarque.

Comptable H/F

Exemple SA

Nantes (44000) · CDI · Hybride

  • Salaire 2 300 – 2 600 € net / mois
  • Horaires 9:00 – 17:30 · pause 12:30 – 13:30 · 35 h

Planning

  • Lundi : Sur site
  • Mardi : Sur site
  • Mercredi : Télétravail
  • Jeudi : Sur site
  • Vendredi : Sur site
  • Samedi : Repos
  • Dimanche : Repos

Questions

Les réponses, sans détour.

Est-ce gratuit ?

Oui. Connecter votre ATS, par lien, par l’API ou par flux, est gratuit et sans engagement. Vos offres sont publiées sur OpenPro sans frais.

En combien de temps mes offres apparaissent-elles ?

Par lien, l’aperçu s’affiche en quelques secondes et la première synchronisation démarre dès que vous connectez, puis chaque jour. Par l’API, une offre est traitée en temps réel, en quelques secondes.

Où arrivent les candidatures ?

Les candidats postulent sur OpenPro, en vidéo s’ils le souhaitent. Vous recevez chaque candidature dans OpenPro et par email : rien à changer dans votre façon de recruter.

Que faites-vous de nos données ?

OpenPro lit uniquement les offres publiées sur votre page carrière ou envoyées par votre outil : aucune donnée candidat de votre ATS. Les données sont hébergées dans l’Union européenne, conformément au RGPD.

Comment retirer une offre ?

Retirez-la de votre ATS : elle est fermée sur OpenPro à la synchronisation suivante. Par l’API, appelez DELETE /jobs/{id} ou envoyez une liste complète sans elle. Vous pouvez aussi la fermer dans OpenPro.

Puis-je relire les offres avant leur publication ?

Oui. Désactivez « Publier automatiquement » à la connexion : les offres arrivent en brouillon et vous les publiez quand vous voulez.

Mon ATS n’est pas dans la liste ?

S’il publie un flux XML, RSS ou JSON, collez son adresse. S’il sait appeler une API, une clé suffit. Sinon, écrivez-nous : on le branche avec vous.

Vos offres, partout où sont les candidats.

Connectez votre ATS en 30 secondes. Gratuit.

OpenPro (openpro.ai), édité par TADA — aucun lien avec OpenPro ERP (openpro.com).