Foutstructuur

Alle fouten volgen dezelfde JSON-structuur:

{
  "error": "Message lisible par un humain",
  "code": "CODE_MACHINE_LISIBLE"
}

Het veld error is een tekst in natuurlijke taal, geschikt om te loggen of aan gebruikers te tonen. Het veld code is een stabiele, machineleesbare identifier, bedoeld voor programmatische foutafhandeling.

HTTP-statuscodes

HTTPBetekenis
400Bad Request - misvormde JSON of ongeldige parameter
401Unauthorized - ontbrekende of ongeldige API-sleutel
403Forbidden - de sleutel is geldig, maar het account heeft niet het vereiste abonnement
404Not Found - de resource bestaat niet of behoort tot een ander account
422Unprocessable Entity - geldige JSON, maar een bedrijfsregel wordt geschonden
429Too Many Requests - snelheidslimiet overschreden
500Internal Server Error - onverwachte serverfout

Foutcodes

HTTPcodeBeschrijving
401MISSING_API_KEYGeen API-sleutel meegegeven in de aanvraag
401INVALID_API_KEYSleutel niet gevonden in de database of ingetrokken
403PLAN_REQUIREDHet account heeft geen Agency-abonnement
404NOT_FOUNDResource niet gevonden of behoort niet tot het geauthenticeerde account
422VALIDATION_ERRORDe aanvraagbody heeft de schemavalidatie niet doorstaan
422LIMIT_REACHEDPlanlimiet bereikt (bijv. maximumaantal merken)
422LIMIT_EXCEEDEDResourcelimiet bereikt (bijv. avatarlimiet van het abonnement)
422QUOTA_EXCEEDEDOnvoldoende credits om de gevraagde campagne te starten
409CONFLICTEr bestaat al een resource met dezelfde unieke identifier
429RATE_LIMITEDLimiet van 60 aanvr./min per sleutel overschreden
500INTERNAL_ERROROnverwachte serverfout

Details over de snelheidslimiet

De limiet is 60 aanvragen per minuut per API-sleutel, gehandhaafd via een Redis-teller met een glijdend venster. Bij overschrijding:

  • HTTP-status: 429
  • Antwoordheader: Retry-After: 60
  • Code in de body: RATE_LIMITED

De limiter is permissief bij een storing - als Redis tijdelijk niet beschikbaar is, worden alle aanvragen toegestaan in plaats van geblokkeerd.

Foutafhandeling

const res = await fetch("https://mentova.ai/api/v1/brands", {
  headers: { "X-API-Key": "mtv_live_votre_cle" },
});

if (!res.ok) {
  const { error, code } = await res.json();

  if (res.status === 429) {
    const retryAfter = res.headers.get("Retry-After");
    console.error(`Limite de débit atteinte. Réessayez dans ${retryAfter}s`);
  } else if (code === "QUOTA_EXCEEDED") {
    console.error("Crédits insuffisants :", error);
  } else {
    console.error(`Erreur API [${code}] :`, error);
  }
}