Rate Limiting

Forstå og optimer dit API-forbrug

Oversigt

Rate limits beskytter API'en mod misbrug og sikrer stabil performance for alle brugere. Hver API-nøgle har specifikke grænser baseret på din plan.

Hvorfor Rate Limits?

Rate Limit Niveauer

Forskellige planer har forskellige rate limits:

Starter Plan

  • 60 anmodninger pr. minut
  • 1,000 anmodninger pr. time
  • 10,000 anmodninger pr. dag

Professional Plan

  • 300 anmodninger pr. minut
  • 5,000 anmodninger pr. time
  • 50,000 anmodninger pr. dag

Enterprise Plan

  • 1,000+ anmodninger pr. minut
  • 20,000+ anmodninger pr. time
  • 200,000+ anmodninger pr. dag

Enterprise limits er tilpasselige baseret på dine behov

Har du brug for højere limits? Opgrader din plan

Rate Limit Headers

Hver API response inkluderer headers der viser din aktuelle rate limit status:

Eksempel Headers

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1704297600

Beregn tid til reset

// PHP
$reset = $headers['X-RateLimit-Reset'];
$secondsUntilReset = $reset - time();
echo "Rate limit resets in {$secondsUntilReset} seconds";

// JavaScript
const reset = parseInt(headers['x-ratelimit-reset']);
const secondsUntilReset = reset - Math.floor(Date.now() / 1000);
console.log(`Rate limit resets in ${secondsUntilReset} seconds`);

Håndtering af 429 Too Many Requests

Når du overskrider rate limit, får du en 429 respons:

429 Response Format

HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1704297660

{
  "success": false,
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded. Try again in 60 seconds."
  }
}

Retry-After Header

429 responses inkluderer en Retry-After header der fortæller dig hvor mange sekunder du skal vente før du prøver igen.

Retry Strategier

Exponential Backoff

Vent progressivt længere mellem retries (1s, 2s, 4s, 8s...)

Respektér Retry-After

Brug altid Retry-After headeren hvis den er til stede

Implementér Jitter

Tilføj tilfældig variation til retry delays for at undgå thundering herd

Max Retries

Sæt en maksimal retry grænse (f.eks. 3-5 forsøg)

Best Practices

Følg disse best practices for at holde dig inden for rate limits:

Overvåg rate limit headers

Tjek altid X-RateLimit-Remaining headeren og sænk farten når den bliver lav.

Implementér rate limiting client-side

Begræns dine egne anmodninger proaktivt i stedet for at vente på 429 fejl.

Brug webhooks i stedet for polling

I stedet for at lave gentagne GET requests, brug webhooks til realtids notifikationer.

Batch anmodninger hvor muligt

Nogle endpoints understøtter batch operations - brug dem til at reducere antal requests.

Cache API responses

Cache data der ikke ændrer sig ofte (produkter, kategorier, indstillinger).

Optimer pagination

Hent kun de sider du har brug for. Brug per_page parameteren fornuftigt.

Undgå unødvendige requests

Hent kun data du rent faktisk har brug for. Undgå at hente samme data flere gange.

Brug konditionelle requests

Brug If-Modified-Since eller If-None-Match headers når understøttet.

Kodeeksempler

Eksempler på hvordan du håndterer rate limiting i forskellige sprog:

PHP med Retry Logic

function makeApiRequest($url, $apiKey, $maxRetries = 3) {
    $attempt = 0;

    while ($attempt < $maxRetries) {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => ["Authorization: Bearer {$apiKey}"],
            CURLOPT_HEADER => true,
        ]);

        $response = curl_exec($ch);
        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $headers = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);

        curl_close($ch);

        if ($statusCode === 429) {
            // Extract Retry-After header
            preg_match('/Retry-After:\s*(\d+)/i', $headers, $matches);
            $retryAfter = $matches[1] ?? pow(2, $attempt);

            error_log("Rate limited. Retrying after {$retryAfter}s");
            sleep($retryAfter);
            $attempt++;
            continue;
        }

        return json_decode($body, true);
    }

    throw new Exception('Max retries exceeded');
}

Node.js med Exponential Backoff

async function makeApiRequest(url, apiKey, maxRetries = 3) {
  let attempt = 0;

  while (attempt < maxRetries) {
    try {
      const response = await fetch(url, {
        headers: { 'Authorization': `Bearer ${apiKey}` }
      });

      if (response.status === 429) {
        const retryAfter = parseInt(
          response.headers.get('retry-after') || Math.pow(2, attempt)
        );

        console.log(`Rate limited. Retrying after ${retryAfter}s`);
        await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
        attempt++;
        continue;
      }

      return await response.json();
    } catch (error) {
      console.error('Request failed:', error);
      attempt++;
    }
  }

  throw new Error('Max retries exceeded');
}

Python med Rate Limit Tracking

import requests
import time

def make_api_request(url, api_key, max_retries=3):
    attempt = 0
    headers = {'Authorization': f'Bearer {api_key}'}

    while attempt < max_retries:
        response = requests.get(url, headers=headers)

        if response.status_code == 429:
            retry_after = int(
                response.headers.get('retry-after', 2 ** attempt)
            )

            print(f'Rate limited. Retrying after {retry_after}s')
            time.sleep(retry_after)
            attempt += 1
            continue

        response.raise_for_status()
        return response.json()

    raise Exception('Max retries exceeded')

Overvågning af API Forbrug

Hold styr på dit API forbrug:

Admin Panel Dashboard

Se API forbrug statistik i admin panelet under Settings → API Keys.

API Request Logs

Gennemse detaljeret request log med timestamps, endpoints, og statuskoder.

Alerts

Konfigurer email alerts når du nærmer dig dit rate limit (Enterprise feature).

Response Headers

Log rate limit headers fra hver response til at tracke forbrug over tid.

Fejlfinding

Almindelige rate limit problemer og løsninger:

Konsistente 429 fejl

Problem: Du får altid 429 errors selv med få requests.

Løsning:

  • Tjek om du har flere processer/workers der deler samme API key
  • Kontrollér at du respekterer Retry-After headers
  • Overvej at opgradere din plan for højere limits

Bursty trafik patterns

Problem: Du har perioder med mange requests efterfulgt af stilhed.

Løsning:

  • Implementér en request queue med rate limiting
  • Spred requests jævnt over tid i stedet for bursts
  • Brug background jobs med controlled concurrency

Multi-tenant applications

Problem: Alle dine brugere deler samme API key og limit.

Løsning:

  • Opret separate API keys pr. kunde (Enterprise feature)
  • Implementér din egen rate limiting pr. bruger
  • Prioritér kritiske operations over nice-to-have features

Næste Trin

Udforsk relaterede emner:

Fejlhåndtering

Lær at håndtere alle API fejlkoder, ikke bare 429

Fejlhåndtering

Webhooks

Reducer API calls ved at bruge webhooks i stedet for polling

Webhooks

Autentificering

Forstå hvordan rate limits gælder pr. API key

Autentificering

Kodeeksempler

Se mere avancerede eksempler på rate limit handling

Kodeeksempler