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
| État | Signification |
|---|---|
400 | Mauvaise 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. |
401 | Clé API absente ou invalide. |
402 | Crédit insuffisant. Retry-After vaut une heure, une indication pour les clients automatisés ; un rechargement débloque immédiatement. Voir facturation. |
404 | Aucun 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. |
429 | Trop de requêtes : plafond par minute du compte, ou budget horaire des fournisseurs en direct. Attendez Retry-After. |
503 | Un fournisseur épinglé (providers=) a dépassé son budget horaire. Désépinglez-le ou attendez Retry-After. |
499 | Le 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.