Skip to content

Erreurs

Toutes les erreurs retournees par l'API suivent un format unifie.

Format d'erreur

json
{
  "status": "error",
  "code": "CODE_ERREUR",
  "description": "Message d'erreur lisible",
  "errors": ["detail1", "detail2"],
  "upstream": { ... }
}
ChampTypePresenceDescription
statusstringToujoursToujours "error"
codestringToujoursCode machine (voir table ci-dessous)
descriptionstringToujoursMessage lisible
errorsarrayVALIDATION_ERRORListe des erreurs de validation par champ
upstreamobjectUPSTREAM_ERRORBody brut retourne par l'API OPCO

Codes d'erreur

CodeHTTPRetryableDescription
VALIDATION_ERROR400NonParametres ou body invalides
HTTP_ERROR403NonHeader X-API-KEY manquant ou authentification echouee
NOT_FOUND404NonRessource introuvable (OPCO, dossier, job, webhook, sync)
NOT_SUPPORTED501NonEndpoint non supporte par cet OPCO
UPSTREAM_ERRORVariableSelon codeErreur retournee par l'API OPCO sous-jacente
TIMEOUT504OuiL'API OPCO n'a pas repondu dans le delai imparti
NETWORK_ERROR502OuiErreur reseau lors de la communication avec l'OPCO
INTERNAL_ERROR500NonErreur interne inattendue

Detail par code

VALIDATION_ERROR (400)

Erreur de validation des parametres de requete ou du body JSON. Le champ errors contient le detail par champ.

json
{
  "status": "error",
  "code": "VALIDATION_ERROR",
  "description": "Invalid request parameters",
  "errors": [
    "cerfa.employeur.siret: Required",
    "cerfa.contrat.dateDebutContrat: Invalid date"
  ]
}

Exemples de causes :

  • Champ requis manquant
  • Format de date invalide
  • Enum non reconnue
  • Parametres de recherche incompatibles (ex: numeroInterne + numeroExterne)

NOT_FOUND (404)

La ressource demandee n'existe pas, ou n'est pas accessible pour ce tenant.

json
{
  "status": "error",
  "code": "NOT_FOUND",
  "description": "Job '550e8400-...' introuvable"
}

NOT_SUPPORTED (501)

L'endpoint n'est pas supporte par l'OPCO demande (chaque OPCO a ses propres capacites).

json
{
  "status": "error",
  "code": "NOT_SUPPORTED",
  "description": "Endpoint 'GET /cfakeyinfo' non supporté par atlas"
}

UPSTREAM_ERROR (variable)

L'API OPCO a retourne une erreur. Le code HTTP est celui retourne par l'OPCO. Le champ upstream contient le body brut de l'OPCO.

json
{
  "status": "error",
  "code": "UPSTREAM_ERROR",
  "description": "OPCO returned 400",
  "upstream": {
    "errors": [
      { "code": 1234, "description": "SIRET inconnu" }
    ]
  }
}

Retryable si le code HTTP OPCO est 429, 503 ou >= 500.

TIMEOUT (504)

L'API OPCO n'a pas repondu dans le delai imparti. Retryable.

json
{
  "status": "error",
  "code": "TIMEOUT",
  "description": "OPCO request timed out after 30000ms"
}

NETWORK_ERROR (502)

Erreur reseau (DNS, connexion refusee, etc.). Retryable.

json
{
  "status": "error",
  "code": "NETWORK_ERROR",
  "description": "Network error: ECONNREFUSED"
}

INTERNAL_ERROR (500)

Erreur interne non prevue. Non retryable. Si persistante, contacter le support.

json
{
  "status": "error",
  "code": "INTERNAL_ERROR",
  "description": "An unexpected error occurred"
}

Strategie de retry

Pour les erreurs retryables (UPSTREAM_ERROR 429/5xx, TIMEOUT, NETWORK_ERROR) :

  1. Jobs asynchrones : retries automatiques geres par Opcovia (BullMQ, backoff exponentiel)
  2. Requetes synchrones : le client doit gerer ses propres retries avec backoff exponentiel

Backoff recommande : 1s, 2s, 4s, 8s (max 4 tentatives).