Aller au contenu principal

Référence des erreurs

Catalogue exhaustif des codes d'erreur retournés par l'API B2B, groupés par domaine fonctionnel.

Écriture inclusive

Les descriptions ci-dessous utilisent l'écriture inclusive (point médian) pour les références à des personnes (employé·e, votant·e, candidat·e). Les messages effectivement renvoyés par l'API sont actuellement inclusifs pour le domaine Employe (à parité avec le code source) ; les autres domaines sont en cours d'harmonisation côté serveur. Si vous matchez sur le contenu textuel d'un message, préférez le code d'erreur (colonne Code) qui est stable.

Format

Toutes les erreurs suivent le pattern ErrorOr<T> côté SDK. Format JSON (RFC 7807 ProblemDetails) côté HTTP :

{
"type": "Emploi.NotFound",
"title": "L'emploi n'existe pas.",
"status": 404,
"detail": "...",
"errors": { }
}

Côté SDK, utilisez :

if (result.IsError)
{
var err = result.FirstError;
var status = err.Metadata.GetValueOrDefault("StatusCode"); // int
var url = err.Metadata.GetValueOrDefault("Url"); // string
var body = err.Metadata.GetValueOrDefault("RawBody"); // string JSON
// err.Code, err.Description, err.Errors (validation)
}

Voir ApiError.ClientError.

Mapping des types Error → HTTP

Appliqué par B2BController.Problem :

Type ErrorCode HTTP
Error.Validation400 Bad Request
Error.NotFound404 Not Found
Error.Conflict409 Conflict
Error.Failure500 Internal Server Error
Autre500 par défaut

Également :

  • 401 Unauthorized — clé API manquante/invalide (voir authentication.md)
  • 403 Forbidden — module requis (MaCarteDeMembre / Votez) non activé sur le client

Résumé quantitatif

168 codes d'erreur distincts répartis ainsi :

HTTPTypeNombre
400Validation115 (68.5 %)
404NotFound35 (20.8 %)
409Conflict14 (8.3 %)
500Failure3 (1.8 %)
403Forbidden1 (0.6 %)

Par domaine : Formulaire 20 · Employé/Emploi 20 · Question/Vote 24 · Champ utilisateur 14 · Campagne 15 · Votant 11 · Demande d'adhésion 9 · Employeur/Syndicat 11 · Adhésion 6 · Courriel 4 · Objet consentement 2.


Employé et synchronisation

CodeHTTPDescriptionProduit par
Employe.PrenomRequis400Le prénom est requis.AddEmploye, validateurs Sync
Employe.NomRequis400Le nom est requis.AddEmploye, validateurs Sync
Employe.CourrielRequis400Le courriel est requis.AddEmploye, validateurs Sync
Employe.DateSignatureAdhesionInvalide500La date de signature de l'adhésion est invalide.Sync
Employe.NotFound404L'employé·e n'existe pas.DeleteEmploye, UpdateEmploye, EnvoyerFormulaires
Employe.EmployeurMustExist404L'employeur n'existe pas.Sync
Employe.CourrielExists409Un·e employé·e avec le courriel existe déjà.AddEmploye, Sync
Employe.Existing409Un·e employé·e avec cet identifiant externe existe déjà.AddEmploye
Employe.ChampUtilisateurInexistant404Le champ utilisateur n'existe pas.Validation champ
Employe.Courriel400Les courriels ne peuvent pas être identiques.Update employé·e
Employe.CourrielDejaValide400Le courriel est déjà valide.Validation courriel
Employe.InvalidData400Les données de l'employé·e sont invalides.EmployeSynchronizerV2

Emploi

CodeHTTPDescriptionProduit par
Emploi.NotFound404L'emploi n'existe pas.Queries emploi
Emploi.NotFoundByIdExterne404L'emploi n'existe pas.UpdateEmploi, DeleteEmploi, courriels
Emploi.NotFoundByIdUnique404L'emploi n'existe pas.Queries emploi
Emploi.DejaExistant409Un emploi existe déjà pour cet·te employé·e chez cet employeur.AddEmploi
Emploi.IdExterneDejaUtilise409Un emploi avec l'identifiant externe existe déjà.AddEmploi
Emploi.DateFinAvantDateDebut400La date de fin ne peut pas être antérieure à la date de début.AddEmploi, UpdateEmploi
Emploi.EmployeurImmutable400L'employeur ne peut pas être modifié. Créez un nouvel emploi pour un employeur différent.UpdateEmploi
Emploi.EmployeImmutable400L'employé·e ne peut pas être modifié·e.UpdateEmploi

Employeur et syndicat

Employeur

CodeHTTPDescriptionProduit par
Employeur.NotFound404L'employeur n'existe pas.UpdateEmployeur, DeleteEmployeur, AddEmploi
Employeur.Existing409L'employeur existe déjà.AddEmployeur
Employeur.NomDuplique409Un employeur avec le nom existe déjà.AddEmployeur, UpdateEmployeur
Employeur.NomRequis400Le nom de l'employeur est requis.Validateurs employeur

Syndicat

CodeHTTPDescriptionProduit par
Syndicat.NotFound404Le syndicat n'existe pas.Queries syndicat
Syndicat.NomDejaUtilise409Un syndicat avec le nom existe déjà.Commandes syndicat
Syndicat.IdExterneDejaUtilise409Un syndicat avec l'identifiant externe existe déjà.Commandes syndicat
Syndicat.NomRequis400Le nom du syndicat est requis.Validateurs syndicat
Syndicat.HasEmployeurs400Le syndicat ne peut pas être supprimé car il contient des employeurs.DeleteSyndicat
Syndicat.HasAdhesions400Le syndicat ne peut pas être supprimé car il contient des adhésions.DeleteSyndicat
Syndicat.AucunSyndicatPourClient404Aucun syndicat n'est configuré pour ce client.Init syndicat

Adhésion

CodeHTTPDescriptionProduit par
Adhesion.NotFound404L'adhésion n'existe pas.Queries adhésion
Adhesion.ForEmployeNotFound404L'adhésion pour l'employé·e n'existe pas.Queries adhésion
Adhesion.InvalidState400L'adhésion est dans un état invalide.Opérations adhésion
Adhesion.LinkedToActiveCampaign409Impossible de supprimer une adhésion liée à un·e votant·e dans une campagne active.DeleteAdhesion*
Adhesion.HasPayments409Impossible de supprimer une adhésion liée à un paiement.DeleteAdhesion*
Adhesion.HasPaymentAuthorizations409Impossible de supprimer une adhésion liée à une autorisation de paiement.DeleteAdhesion*

Demande d'adhésion (conciliation)

CodeHTTPDescriptionProduit par
DemandeAdhesion.NotFound404La demande d'adhésion n'existe pas.Rejeter, Confirmer
DemandeAdhesion.EmployeurInexistant404L'employeur n'existe pas.Queries demande
DemandeAdhesion.StatutInvalidePourAccepter409Le statut de la demande d'adhésion est invalide pour accepter.Confirmer
DemandeAdhesion.StatutInvalidePourRejet409Le statut de la demande d'adhésion est invalide pour un rejet.Rejeter
DemandeAdhesion.StatutInvalidePourFusion409Le statut est invalide pour fusionner.Commandes fusion
DemandeAdhesion.StatutInvalidePourModification409Le statut est invalide pour une modification.Commandes modif
DemandeAdhesion.StatutInvalidePourRemiseEnAttente409Le statut est invalide pour une remise en attente.Commandes remise en attente
DemandeAdhesion.AcceptationInterditeSansSupportAdhesionPublique409Le système de mission du client ne prend pas en charge l'adhésion publique.Acceptation
DemandeAdhesion.ConfirmationInterditeSansSystemeDeMissionActif409La confirmation requiert que le système de mission soit activé.Confirmer

Voir le flux complet dans guides/employee-sync.md §5.


Courriel

CodeHTTPDescriptionProduit par
Courriel.BadEmailAddress400Le courriel est mal formé ou invalide.Validateurs courriel
Courriel.NotAssociatedWithEmployee400Le courriel n'est ni le courriel principal ni le courriel alternatif de l'employé·e.EnvoyerFormulaire, EnvoyerDerniereCarteMembre
Courriel.RateLimitExceeded500Trop de courriels envoyés. Veuillez réessayer plus tard.EnvoyerCourrielTransactionnel
Courriel.ContentTooLarge400Le contenu du courriel ne peut pas dépasser la limite.Service courriel

Campagne (module Votez)

CodeHTTPDescriptionProduit par
Campagne.NotFound404La campagne est introuvable.UpdateCampagne, PublierCampagne, DeleteCampagne
Campagne.NotFoundBySlug404La campagne est introuvable.Queries slug
Campagne.TransitionNonPermise400Transition d'état non permise.Transitions d'état
Campagne.DejaArchive400La campagne est déjà archivée.Opérations campagne
Campagne.AucuneQuestion400La campagne doit avoir au moins une question.PublierCampagne
Campagne.VoteNonOuvert400Le vote n'est pas ouvert.Opérations vote
Campagne.VoteTermine400Le vote est terminé. L'envoi de masse n'est plus permis.Envoi de masse
Campagne.OuvertureVoteApresFermeture400L'ouverture du vote doit précéder la fermeture.Planification
Campagne.SlugDejaUtilise409Le slug est déjà utilisé.AddCampagne
Campagne.VotantsOntVote409Impossible de supprimer les votant·e·s car certain·e·s ont déjà voté.Suppression votant·e·s
Campagne.ResetNonPermis400La réinitialisation n'est pas permise pour une campagne archivée.Reset
Campagne.SimulationFeatureDisabled403Les actions de débogage sont désactivées pour ce client.Opérations debug
Campagne.DepublierAvecVotes400Impossible de dépublier la campagne car des votes ont été enregistrés.DepublierCampagne
Campagne.SupprimerAvecVotes409Impossible de supprimer la campagne car des votes ont été enregistrés.DeleteCampagne
Campagne.NomDejaUtilise409Une campagne avec le nom interne existe déjà.AddCampagne

Question, option, vote

CodeHTTPDescriptionProduit par
Question.NotFound404La question est introuvable.Queries question
Question.AbstentionNonPermise400L'abstention n'est pas permise pour cette question.Validation vote
Question.AbstentionAvecReponses400L'abstention ne peut pas être combinée avec des réponses.Validation vote
Question.TropPeuDeReponses400Le nombre de réponses est insuffisant.Validation vote
Question.TropDeReponses400Le nombre maximum de réponses est dépassé.Validation vote
Question.ReponseInvalide400Une réponse sélectionnée est invalide.Validation vote
Question.DejaRepondu400Cette question a déjà été répondue.Validation vote
Question.MinReponsesNegatif400Le minimum de réponses ne peut pas être négatif.Création question
Question.MaxReponsesTropBas400Le maximum de réponses doit être au moins 1.Création question
Question.MinSuperieurMax400Le minimum de réponses ne peut pas être supérieur au maximum.Création question
Question.OptionTexteRequis400Le texte est requis pour l'option.AddOption
Question.OptionCandidatRequis400Le·la candidat·e est requis·e pour l'option.AddOption
Question.CandidatIntrouvable404Le·la candidat·e est introuvable.AddOption
Question.TypeQuestionIncompatible400Le type d'option ne correspond pas au type de question.AddOption
Question.OptionTexteVide400Le texte de l'option ne peut pas être vide.Validation option
Question.CandidatIdVide400L'identifiant du·de la candidat·e ne peut pas être vide.Validation option
Question.OptionIntrouvable404L'option de réponse est introuvable.Queries option
Question.ADesVotes409La question ne peut pas être supprimée car elle a des votes.DeleteQuestion
Question.OrdreIdsDupliques400La liste de réordonnancement contient des identifiants en double.ReorderQuestions
Question.OrdreIdsManquants400La liste de réordonnancement doit contenir tous les identifiants de questions.ReorderQuestions
Question.QuestionObligatoireManquante400Une réponse est requise pour cette question obligatoire.Validation vote
Question.ModificationRestrictionsInterdite400Les restrictions ne peuvent pas être modifiées lorsque le vote est ouvert.UpdateQuestion
Question.PosteRequisPourElection400Un poste est requis pour une question de type élection.Création question
Question.NomDejaUtilise409Une question avec ce nom existe déjà dans cette campagne.Création question

Votant et liste électorale

CodeHTTPDescriptionProduit par
Votant.NotFound404Le·la votant·e est introuvable.Queries votant
Votant.CodeAccesNotFound404Aucun·e votant·e n'a été trouvé·e avec ce code d'accès.Validation code d'accès
Votant.EstRadie400Le·la votant·e est radié·e.Autorisation vote
Votant.PasDeDroitDeVote400Le·la votant·e n'a pas le droit de vote.Autorisation vote
Votant.DejaRadie400Le·la votant·e est déjà radié·e.RadierVotant
Votant.CourrielDejaUtilise409Ce courriel est déjà utilisé pour cette campagne.UpsertVotant
Votant.CourrielAlternatifDejaUtilise409Ce courriel alternatif est déjà utilisé pour cette campagne.UpsertVotant
Votant.IdentifiantDejaUtilise409Cet identifiant est déjà utilisé pour cette campagne.UpsertVotant
Votant.ADesVotes400Le·la votant·e a déjà voté et ne peut pas être supprimé·e.DeleteVotant
Votant.ADejaVote400Le·la votant·e a déjà voté et ne peut pas être modifié·e.UpsertVotant
Votant.CodeAccesGenerationFailed500Impossible de générer un code d'accès unique après plusieurs tentatives.Création votant·e

Champs utilisateur

CodeHTTPDescriptionProduit par
ChampUtilisateur.NotFound404Champ utilisateur introuvable.UpdateChampUtilisateur, DeleteChampUtilisateur
ChampUtilisateur.NomExiste400Le nom existe déjà.AddChampUtilisateur
ChampUtilisateur.EmployeurIntrouvable400Employeur introuvable.Assignation
ChampUtilisateur.EmployeursIntrouvables400Employeurs introuvables.SetEmployeurs
ChampUtilisateur.PasTypeChoix409Le champ utilisateur n'est pas de type choix.Update choix
ChampUtilisateur.ChoixExiste400Le choix existe déjà pour ce champ utilisateur.Création choix
ChampUtilisateur.ChoixInvalide400La valeur n'est pas un choix valide pour le champ.Validation champ
ChampUtilisateur.InUse400Le champ utilisateur est utilisé par un ou plusieurs choix.Suppression
ChampUtilisateur.ChoixNotFound404Choix introuvable pour le champ.Queries choix
ChampUtilisateur.BoolInvalide400La valeur n'est pas un booléen valide pour le champ.Validation champ
ChampUtilisateur.MaxLengthTropGrand400La longueur maximale ne peut pas dépasser la limite.Création
ChampUtilisateur.DateInvalide400La date est invalide pour le champ.Validation champ
ChampUtilisateur.TypeChampInvalide400Le type de champ est invalide.Update
ChampUtilisateur.Introuvable400Un ou plusieurs champs utilisateurs sont introuvables.Validation

Formulaire

CodeHTTPDescriptionProduit par
Formulaire.NotFound404Le formulaire n'existe pas.Queries formulaire
Formulaire.TemplateEmpty400Le formulaire n'a pas de template de courriel pour le lien.Envoi courriel
Formulaire.NomRequis400Le nom du formulaire est requis.Validateurs
Formulaire.RouteRequise400La route du formulaire est requise.Validateurs
Formulaire.CouleurPrincipaleRequise400La couleur principale est requise.Validateurs
Formulaire.CouleurSecondaireRequise400La couleur secondaire est requise.Validateurs
Formulaire.TitreSectionRequis400Le titre de la section est requis.Validateurs
Formulaire.RemerciementRequis400Le message de remerciement est requis.Validateurs
Formulaire.PaiementRequiertVerifEtAdhesion400Le paiement nécessite les sections Vérification et Adhésion.Validateurs
Formulaire.MontantPaiementRequis400Un montant de paiement supérieur à zéro est requis.Validateurs
Formulaire.TemplateCourrielIncoherent400Le sujet et le message doivent être tous deux fournis ou vides.Validateurs
Formulaire.CourrielSoumissionRequis400Le sujet et le message du courriel de confirmation sont requis.Validateurs
Formulaire.SectionRequisePourFormulairePublic400La section ne peut pas être désactivée sur un formulaire public.Validateurs
Formulaire.SectionRequisePourPaiement400La section est requise tant que le paiement est activé.Validateurs
Formulaire.DemissionRequiertAdhesion400La section Démission nécessite la section Adhésion.Validateurs
Formulaire.AdhesionRequisePourDemission400La section Adhésion ne peut pas être désactivée si Démission est active.Validateurs
Formulaire.DoitEtrePersonnalise400Le formulaire doit être de type personnalisé pour être envoyé par courriel.Envoi courriel
Formulaire.RouteAlreadyExists400Un formulaire avec cette route existe déjà.Création
Formulaire.ChampsUtilisateursReservesAuxGeneriques400Les champs utilisateurs ne peuvent être configurés que sur formulaire générique.Validateurs
Formulaire.ProprieteMembreIntrouvable400Une ou plusieurs propriétés de membre n'existent pas pour ce client.Validateurs

Objet de consentement

CodeHTTPDescriptionProduit par
ObjetConsentement.NotFound404L'objet de consentement n'existe pas.Queries
ObjetConsentement.Existing409L'objet de consentement existe déjà.Création

Erreurs transverses du SDK

Erreurs générées par le SDK lui-même (pas par le serveur) :

CodeHTTP/SourceDescription
MCM.CantReachApiErreur réseau localeImpossible de joindre MCM (timeout, DNS, TLS)
MCM.DeserializeRéponse non parseableJSON reçu mais incompréhensible par le SDK (mise à jour SDK requise)
MCM.ClientError.{statusCode}Tout code 4xx/5xx non typé par le serveurErreur HTTP brute quand le body n'est pas un ProblemDetails standard

Chaque erreur porte les métadonnées StatusCode, StatusName, Url, RawBody — voir ApiError.cs.


Erreurs de validation FluentValidation

La majorité des codes 400 Validation proviennent de validateurs FluentValidation dans les handlers. Quand plusieurs règles échouent, toutes les erreurs sont accumulées dans la réponse :

{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"Prenom": ["Le prénom est requis."],
"Courriel": ["Le courriel est mal formé ou invalide."]
}
}

Côté SDK, vous retrouvez les champs dans Error.Metadata["RawBody"] ou en parsant directement si vous gérez la réponse HTTP.


Clés de métadonnées courantes

Certaines erreurs incluent des métadonnées pour donner du contexte :

CodeClés de métadonnées
Emploi.NotFoundidExterne
Employe.NotFoundid, idExterne, idUnique
ChampUtilisateur.NotFoundid, nom
Votant.CourrielDejaUtilisecourriel
Campagne.SlugDejaUtiliseslug
Question.TropPeuDeReponsesmin
Question.TropDeReponsesmax
Syndicat.HasEmployeurscount
Syndicat.HasAdhesionscount

Gestion recommandée

var result = await employesClient.AddEmploye(dto);
if (result.IsError)
{
var err = result.FirstError;

switch (err.Code)
{
case "Employe.Existing":
case "Employe.CourrielExists":
// Dédup de votre côté — lire l'existant
break;

case "Employe.EmployeurMustExist":
// Créer l'employeur manquant puis relancer
break;

case string c when c.StartsWith("MCM.ClientError.5"):
case "MCM.CantReachApi":
// Erreur transitoire — retry avec backoff
break;

default:
// Log + alerte
logger.LogError("B2B {Code}: {Msg}", err.Code, err.Description);
break;
}
}

Voir idempotency.md §2 pour la stratégie complète de retry.


Notes d'implémentation

  1. Isolation par client : toutes les queries filtrent par ClientId (injecté depuis la clé API) pour garantir le cloisonnement multi-locataire. Un NotFound peut donc masquer un contrôle d'autorisation (la ressource existe pour un autre client).

  2. Sync partiel : ISyncClient.Sync ne retourne pas d'erreur globale pour les échecs individuels. Inspectez B2BSyncResult.Erreurs par entité.

  3. Transitions d'état : les demandes d'adhésion ont une machine à états ; certaines transitions ne sont valides que depuis un statut précis (ATransfererConfirmee, etc.).

  4. Suppression bloquée : de nombreux endpoints Delete* retournent 409 Conflict si des enfants actifs existent. Nettoyer d'abord les enfants.

  5. Unicité : les *DejaUtilise reflètent des contraintes d'unicité côté DB. Ne reposez pas dessus pour de la déduplication de votre côté — vérifiez avant création quand possible.


Voir aussi