Aller au contenu
javinfo

Erreurs

Codes d'état HTTP et corps d'erreur renvoyés par l'API javinfo.

Une requête en échec n'est jamais facturée. Vous payez les 200 uniquement.

Codes d'état

ÉtatSignification
400Mauvaise requête. Validation échouée (paramètre manquant, valeur hors plage, enum invalide), requête /query ou /idols sans q ni filtre, ou id de fournisseur inconnu.
401Clé API absente ou invalide.
402Crédit insuffisant. Retry-After vaut une heure, une indication pour les clients automatisés ; un rechargement débloque immédiatement. Voir facturation.
404Aucun résultat. Renvoyé par /movie, /random, /idols/{id}, /discover/similar, les recherches /analytics/idols/*, et /resolve, /resolve/provenance et /resolve/streams.
422/query uniquement : aucun fournisseur ne gère cette combinaison filtre/tri, le fournisseur épinglé non plus, ou vous avez dépassé la page 50 sans q. Voir Filtrage.
429Trop de requêtes : plafond par minute du compte, ou budget horaire des fournisseurs en direct. Attendez Retry-After.
503Un fournisseur épinglé (providers=) a dépassé son budget horaire. Désépinglez-le ou attendez Retry-After.
499Le client a fermé la requête avant la réponse d'un fournisseur.

/query ne renvoie jamais 404. Aucune correspondance donne un 200 avec count: 0 et un tableau results vide, sans frais : vérifiez count. Les recherches nommées (/idols/{id}, /discover/similar, resolve) renvoient 404 si le code ou l'interprète manque.

Corps d'erreur

Les erreurs des gestionnaires utilisent l'enveloppe oRPC : defined, code, status et message.

{
  "defined": false,
  "code": "NOT_FOUND",
  "status": 404,
  "message": "no title found for \"ZZZZ-99999\""
}

Un 400 ajoute data.issues, une entrée par règle échouée :

{
  "defined": false,
  "code": "BAD_REQUEST",
  "status": 400,
  "message": "Input validation failed",
  "data": {
    "issues": [
      {
        "expected": "string",
        "code": "invalid_type",
        "path": ["q"],
        "message": "Invalid input: expected string, received undefined"
      }
    ]
  }
}

422 : même enveloppe, status: 422, code: "BAD_REQUEST" :

{
  "defined": false,
  "code": "BAD_REQUEST",
  "status": 422,
  "message": "does not support sort \"rating\""
}

Les rejets au portail, avant le gestionnaire, sont plus courts :

{ "error": "invalid api key" }

Sans clé, la requête passe le portail et le gestionnaire la refuse avec le corps UNAUTHORIZED :

{
  "defined": false,
  "code": "UNAUTHORIZED",
  "status": 401,
  "message": "Unauthorized"
}

Le limiteur par minute utilise aussi la forme courte : { "error": "rate limit exceeded" }. Ne supposez pas code : décidez selon le statut et lisez le corps.

Patienter avant de réessayer

429, 402 et 503 portent Retry-After, en secondes. Respectez-le :

if ([429, 402, 503].includes(res.status)) {
  const wait = Number(res.headers.get('Retry-After') ?? 1);
  await new Promise((r) => setTimeout(r, wait * 1000));
}

Pour un 402, cette heure est indicative. Si quelqu'un est aux commandes, rechargez et réessayez.

Sur cette page