{"openapi":"3.1.0","info":{"title":"RecruitEasy Public API","version":"1.0.0","summary":"Offres d'emploi publiques, contenu editorial et tarifs.","description":"Surface publique et anonyme de RecruitEasy, l'ATS bilingue canadien.\n\nCes endpoints ne demandent aucune authentification et servent les donnees deja visibles sur www.recruiteasy.ca : offres publiees, articles, feuille de route, tarifs.\n\nLes operations qui touchent aux candidats, aux candidatures ou a une organisation exigent un jeton et ne sont pas decrites ici : elles sont propres a chaque client. Voir `securitySchemes` pour les portees.","contact":{"name":"RecruitEasy","url":"https://www.recruiteasy.ca/en/contact"},"license":{"name":"Proprietary","url":"https://www.recruiteasy.ca/en/terms"}},"servers":[{"url":"https://recruiteasy-api-v2.azurewebsites.net/api","description":"Production"}],"externalDocs":{"description":"Guide integrations et API","url":"https://www.recruiteasy.ca/en/features/api-integrations"},"tags":[{"name":"Jobs","description":"Offres d'emploi publiees."},{"name":"Content","description":"Blog, feuille de route, journal des versions."},{"name":"Billing","description":"Formules publiques."}],"paths":{"/OffreEmploi/GetPublicOffres":{"get":{"operationId":"listPublicJobOffers","tags":["Jobs"],"summary":"Lister les offres publiees","description":"Retourne les offres d'emploi publiees et visibles publiquement, toutes organisations confondues. Aucune authentification. Utiliser cet endpoint pour decouvrir les postes ouverts avant d'en demander le detail.","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1},"description":"Page demandee, a partir de 1."},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Nombre d'elements par page, 100 au maximum."}],"responses":{"200":{"description":"Page d'offres publiees.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedJobOffers"}}}},"500":{"description":"Erreur interne.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/OffreEmploi/GetPublicDetails/{id}":{"get":{"operationId":"getPublicJobOffer","tags":["Jobs"],"summary":"Detail d'une offre publiee","description":"Retourne le detail complet d'une offre publiee : description, competences requises, lieu, type de contrat et mention d'usage de l'IA quand l'employeur y est soumis (ESA Ontario).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identifiant de l'offre, tel que retourne par listPublicJobOffers."}],"responses":{"200":{"description":"Offre trouvee.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOffer"}}}},"404":{"description":"Aucune offre publiee pour cet identifiant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/BlogEngagement/posts":{"get":{"operationId":"listBlogPosts","tags":["Content"],"summary":"Lister les articles du blog","description":"Articles publies sur le recrutement, les tendances d'embauche au Canada et les bonnes pratiques ATS. Bilingue FR-CA / EN-CA.","responses":{"200":{"description":"Liste d'articles.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlogPost"}}}}}}}},"/BlogEngagement/posts/{slug}":{"get":{"operationId":"getBlogPost","tags":["Content"],"summary":"Lire un article","description":"Contenu complet d'un article a partir de son slug localise.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug de l'article. Les slugs different entre FR et EN."}],"responses":{"200":{"description":"Article trouve.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPost"}}}},"404":{"description":"Aucun article pour ce slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/Roadmap":{"get":{"operationId":"listRoadmapFeatures","tags":["Content"],"summary":"Feuille de route publique","description":"Fonctionnalites livrees, en cours et prevues, avec le nombre de votes.","responses":{"200":{"description":"Liste des elements de feuille de route.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RoadmapItem"}}}}}}}},"/Roadmap/changelog":{"get":{"operationId":"listChangelog","tags":["Content"],"summary":"Journal des versions","description":"Notes de version, de la plus recente a la plus ancienne.","responses":{"200":{"description":"Entrees du journal.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChangelogEntry"}}}}}}}},"/Subscription/Plans":{"get":{"operationId":"listSubscriptionPlans","tags":["Billing"],"summary":"Formules d'abonnement","description":"Formules publiques avec leur prix et leurs quotas. Tarification forfaitaire avec credits IA, sans facturation par utilisateur. Essai de 14 jours sans carte sur chaque formule.","responses":{"200":{"description":"Liste des formules.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Jeton JWT obtenu via POST /Auth/login. Requis pour toute operation propre a une organisation. Duree de vie : 1 heure."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Code stable, lisible par une machine. Ne change pas entre deux versions.","example":"resource_not_found"},"message":{"type":"string","description":"Message lisible par un humain, en anglais.","example":"The requested job offer does not exist."},"hint":{"type":"string","description":"Piste de resolution quand elle existe : quoi corriger, ou regarder.","example":"Check the identifier against GET /OffreEmploi/GetPublicOffres."},"status":{"type":"integer","example":404}}}}},"PaginatedJobOffers":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/JobOffer"}},"total":{"type":"integer","description":"Nombre total d'offres publiees."},"page":{"type":"integer"},"pageSize":{"type":"integer"},"totalPages":{"type":"integer"},"hasNext":{"type":"boolean"},"hasPrevious":{"type":"boolean"}}},"JobOffer":{"type":"object","required":["id","jobTitle"],"properties":{"id":{"type":"string"},"jobTitle":{"type":"string","description":"Intitule du poste."},"company":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"salary":{"type":"string","nullable":true},"contractType":{"type":"string","nullable":true,"description":"Permanent, Part-time, Temporary, Contract, Internship."},"workType":{"type":"string","nullable":true,"description":"on-site, hybrid ou remote."},"datePost":{"type":"string","format":"date-time","nullable":true},"aiDisclosure":{"type":"string","nullable":true,"description":"Mention d'usage de l'IA dans le tri des candidatures. Generee automatiquement pour les employeurs soumis a l'ESA ontarien."}}},"BlogPost":{"type":"object","required":["slug","title"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"excerpt":{"type":"string","nullable":true},"locale":{"type":"string","enum":["fr","en"]},"publishedAt":{"type":"string","format":"date-time","nullable":true}}},"RoadmapItem":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","description":"shipped, in_progress ou planned."},"votes":{"type":"integer"}}},"ChangelogEntry":{"type":"object","required":["title"],"properties":{"title":{"type":"string"},"body":{"type":"string","nullable":true},"releasedAt":{"type":"string","format":"date-time","nullable":true}}},"Plan":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string","description":"Solo, Equipe, Business ou Enterprise."},"priceMonthly":{"type":"number","nullable":true},"currency":{"type":"string","nullable":true,"description":"USD ou CAD."},"aiCredits":{"type":"integer","nullable":true},"maxUsers":{"type":"integer","nullable":true}}}}}}