Spring til hovedindhold
Enrow API’et signalerer problemer med HTTP-statuskoder og en JSON-fejlbody. Denne guide forklarer fejlsvarformaterne, de mest almindelige fejl og hvordan du retter dem, samt hvordan du bygger pålidelig genforsøgslogik. Se den komplette liste over koder i Status codes.

Hvordan ser et fejlsvar ud?

De fleste Enrow API-fejl returnerer et simpelt JSON-objekt med et enkelt message-felt:
{
  "message": "Human-readable error description"
}
Den eneste undtagelse er en insufficient-credit (402)-fejl på single-endpoints (email/phone find single, verify single), som returnerer et reason-felt sammen med success:
{
  "reason": "Insufficient credits",
  "success": false
}
Fejlsvar indeholder aldrig felterne error, status eller retry_after. Læs HTTP-statuskoden for at forgrene din logik, og læs message (eller reason) for den menneskelæsbare beskrivelse.

Hvad er de mest almindelige fejl, og hvordan retter jeg dem?

Fejlene nedenfor dækker langt størstedelen af mislykkede anmodninger. Hver enkelt kommer med den svarbody, API’et returnerer, og rettelsen.

Hvorfor får jeg en 400 Bad Request?

En 400 betyder, at anmodningens payload er forkert udformet eller mangler en påkrævet parameter:
{
  "message": "both company_domain and company_name are absent, input payload needs at least one of them"
}
Rettelse: Kontrollér, at du angiver alle påkrævede parametre for endpointet. For eksempel kræver Find Single Email fullname plus enten company_domain eller company_name.

Hvorfor får jeg en 401 Unauthorized?

En 401 betyder, at API-nøglen mangler eller er ugyldig:
{
  "message": "This apikey is not valid"
}
Rettelse: Kontrollér, at API-nøglen er korrekt og sendes i x-api-key-headeren (ikke Authorization). Se Authentication for, hvordan du sender nøglen ved hver anmodning.

Hvorfor får jeg en 402 Insufficient Credits?

En 402 betyder, at kontoen ikke har nok credits til at køre anmodningen:
{
  "reason": "Insufficient credits",
  "success": false
}
bulk-endpoints returneres den samme 402 i stedet med den standardiserede { "message": "..." }-form. Rettelse: Tjek credit-saldoen på Dashboard eller via GET /account/info. Køb flere credits, eller opgradér abonnementet på enrow.io/pricing. Se Credits & billing for, hvordan credits forbruges pr. endpoint.

Hvorfor får jeg en 429 Rate Limit Exceeded?

En 429 betyder, at der blev sendt for mange anmodninger inden for et kort tidsrum:
{
  "message": "Too Many Requests"
}
Rettelse: Vent og prøv igen med eksponentiel backoff. Se Rate limits for grænserne pr. abonnement.

Hvorfor får jeg en 500 Internal Server Error?

En 500 betyder, at noget gik galt på Enrows side:
{
  "message": "An unexpected error occurred"
}
Rettelse: Prøv anmodningen igen med backoff. Hvis problemet fortsætter, kontakt api@enrow.io.

Hvordan håndterer jeg fejl i kode?

Tjek HTTP-statussen, før du parser succes-bodyen, og kast derefter en fejl, der bærer statuskoden, så din genforsøgslogik kan forgrene sig på den. message-feltet indeholder beskrivelsen for de fleste fejl, og reason indeholder den for single-endpoint-402-svar.
async function findEmail(contact) {
  const response = await fetch('https://api.enrow.io/email/find/single', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'x-api-key': process.env.ENROW_API_KEY
    },
    body: JSON.stringify(contact)
  });

  if (!response.ok) {
    const body = await response.json();
    const error = new Error(`Enrow API error ${response.status}: ${body.message || body.reason}`);
    error.status = response.status;
    throw error;
  }

  return await response.json();
}

Hvordan prøver jeg mislykkede anmodninger igen?

Prøv kun de fejl igen, der er værd at prøve igen — 429 og 5xx — og brug eksponentiel backoff mellem forsøgene. Klientfejl i 4xx-området (undtagen 429) signalerer et problem med selve anmodningen, så det hjælper ikke at prøve dem igen.
async function requestWithRetry(fn, maxRetries = 3, baseDelay = 1000) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await fn();
    } catch (error) {
      const isLastAttempt = attempt === maxRetries - 1;

      // Don't retry client errors (except rate limits)
      if (error.status >= 400 && error.status < 500 && error.status !== 429) {
        throw error;
      }

      if (isLastAttempt) throw error;

      const delay = baseDelay * Math.pow(2, attempt);

      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
}

Bedste praksis

  • Prøv ikke 4xx-fejl igen (undtagen 429) — ret anmodningen i stedet
  • Prøv 429-fejl igen — brug eksponentielle forsinkelser som backoff, før du prøver igen
  • Prøv 5xx-fejl igen — med eksponentiel backoff
  • Brug webhooks i stedet for polling for at undgå at ramme rate limits unødigt — se How webhooks work
  • Log fejl med kontekst — inkludér endpointet, parametrene og tidsstemplet til fejlfinding

FAQ

På single-endpoints (email/phone find single, verify single) returnerer en 402 { "reason": "Insufficient credits", "success": false }. På bulk-endpoints returnerer den samme 402 den standardiserede { "message": "..." }-form. Ved at læse både message og reason (som kodeeksemplerne gør) håndteres begge tilfælde.
Prøv 429-fejl (rate limit) og 5xx-fejl (server) igen med eksponentiel backoff. Prøv ikke andre 4xx-fejl igen, såsom 400, 401 eller 402 — de indikerer et problem med anmodningen, API-nøglen eller credit-saldoen, som det ikke alene kan løse at prøve igen.
Nej. Fejlsvar indeholder aldrig felterne retry_after, error eller status. Brug din egen eksponentielle backoff mellem genforsøg. Se Rate limits for de grænser, der gælder for dit abonnement.
For de fleste fejl er beskrivelsen i message-feltet. For en insufficient-credit-402 på et single-endpoint er den i stedet i reason-feltet. Forgren altid din logik på HTTP-statuskoden i stedet for at parse meddelelsesteksten.

Næste skridt

Status codes

Den komplette liste over HTTP-statuskoder og deres betydninger.

Rate limits

Forstå anmodningsgrænserne pr. abonnement for at undgå 429-fejl.

Authentication

Sådan sender du din API-nøgle i x-api-key-headeren.

Credits & billing

Se, hvordan credits forbruges for hvert endpoint.