Limity żądań

Każdy request do API FourA przechodzi przez rate limiting. Napotkasz dwa rodzaje limitów: współbieżność (jednoczesne requesty) i RPM (requesty na minutę). Oba są egzekwowane dla poszczególnych usług.

Jak działa rate limiting

API egzekwuje limity na dwóch poziomach:

  1. Globalny limit API: dotyczy wszystkich requestów, niezależnie od endpointu. Ta weryfikacja odbywa się jako pierwsza.
  2. Limit dla usługi: dotyczy osobno każdego endpointu (single, proxy, browser). Ta weryfikacja jest uruchamiana tylko wtedy, gdy globalny limit zostanie zaliczony.

Jeśli globalny limit zostanie przekroczony, weryfikacja dla poszczególnych usług nie zostanie uruchomiona. Request musi przejść obie kontrole, zanim trafi do backendu.

Każdy poziom śledzi dwie metryki:

  • Współbieżność: ile requestów działa w tym samym czasie.
  • RPM: ile requestów wysłałeś w ciągu ostatnich 60 sekund.

Odpowiedzi rate limit

Gdy przekroczysz limit, API zwraca odpowiedź JSON z Twoim aktualnym zużyciem i obowiązującymi limitami.

429: Przekroczono RPM

{
  "error": "Rate limit exceeded",
  "status": 429,
  "service": "single",
  "retryAfter": 5,
  "current": {
    "concurrency": 12,
    "rpm": 3000
  },
  "limits": {
    "maxConcurrency": 500,
    "maxRpm": 3000
  }
}

Wysłałeś zbyt wiele requestów w ciągu ostatniej minuty. Odczekaj czas wskazany w retryAfter przed wysłaniem kolejnych.

503: Przekroczono współbieżność

{
  "error": "Service at capacity",
  "status": 503,
  "service": "proxy",
  "retryAfter": 2,
  "current": {
    "concurrency": 500,
    "rpm": 1200
  },
  "limits": {
    "maxConcurrency": 500,
    "maxRpm": 3000
  }
}

Zbyt wiele requestów działa jednocześnie. Część z Twoich wcześniejszych requestów jeszcze się nie zakończyła.

Usługa wyłączona

Gdy usługa jest tymczasowo wyłączana z powodu prac konserwacyjnych, API zwraca kod 503 z innym komunikatem o błędzie:

{
  "error": "Service disabled",
  "status": 503,
  "retryAfter": 60
}

To nie jest rate limit. Usługa jest tymczasowo niedostępna. Sprawdź wartość retryAfter i spróbuj ponownie po upływie tej liczby sekund. Zazwyczaj problem ustępuje w ciągu kilku minut.

Nie myl tego z błędem 503 dotyczącym współbieżności. Odpowiedź „Service disabled” nie będzie zawierać pól current ani limits.

Pola odpowiedzi

Pole Typ Opis
error string Czytelny dla człowieka komunikat o błędzie
status number Kod statusu HTTP (429 lub 503)
service string Usługa, która osiągnęła limit: single, proxy, browser lub api
retryAfter number Zalecany czas oczekiwania w sekundach przed ponowną próbą
current.concurrency number Twoja aktualna liczba aktywnych requestów
current.rpm number Twoje requesty w ciągu ostatnich 60 sekund
limits.maxConcurrency number Maksymalna dozwolona liczba jednoczesnych requestów
limits.maxRpm number Maksymalna dozwolona liczba requestów na minutę

Obsługa rate limitów

Użyj pola retryAfter, aby zaimplementować mechanizm backoff:

import requests
import time

def fetch(url, max_retries=5):
    for attempt in range(max_retries):
        resp = requests.post(
            "https://eu.api.foura.ai/api/single/",
            headers={
                "X-API-Key": "YOUR_API_KEY",
                "Content-Type": "application/json"
            },
            json={"method": "GET", "url": url}
        )

        if resp.status_code in (429, 503):
            data = resp.json()
            wait = data.get("retryAfter", 5)
            time.sleep(wait)
            continue

        return resp

    raise Exception("Max retries exceeded")

Wskazówki

  • Sprawdzaj pola current w odpowiedziach rate limit, aby zrozumieć swoje wzorce zużycia.
  • Jeśli regularnie przekraczasz limity współbieżności, zmniejsz liczbę równoległych requestów.
  • Jeśli przekraczasz limity RPM, dodaj niewielkie opóźnienie między requestami lub rozłóż je w czasie.
  • Wartość retryAfter różni się w zależności od typu limitu: 2 sekundy dla współbieżności, 5 sekund dla RPM.
  • Odpowiedź „Service disabled” oznacza trwające prace konserwacyjne. Nie wysyłaj ciągłych requestów do endpointu.

Powiązane

Aktualizacja: 15 kwietnia 2026