# Anfragelimits (https://webmetic.de/docs/api/anfragelimits)

Die acht Besuchs-Endpunkte von Visitor Intelligence beantworten eine Anfrage pro Sekunde je Endpunkt. Zum Beispiel ruft Ihr n8n-Workflow `/company-sessions` nacheinander für jede Ihrer Websites ab. Wenn er zwischen den Aufrufen eine Sekunde wartet, läuft er ohne Fehler durch. Die API hat kein Tages- oder Monatskontingent für Anfragen.

## Anfragelimit je Endpunkt [#anfragelimit-je-endpunkt]

Diese Endpunkte nehmen eine Anfrage pro Sekunde an: `/company-sessions`, `/company`, `/company_nace`, `/session`, `/session_user_data`, `/intensive-visits`, `/returning-visits` und `/new-visits`.

Das Limit gilt für jeden Endpunkt getrennt: Ein Aufruf von `/company` und einer von `/session` in derselben Sekunde stören sich nicht. Das Limit ist in allen Plänen gleich.

Die [Partner-API](https://webmetic.de/docs/partner/partner-api) hat eigene Limits pro Minute.

Enrichment (`/enrichment/*`), Ansprechpartner (`/contacts/*`) und Webhooks (`/webhooks`) haben derzeit kein Anfragelimit. Weil sich das ändern kann, bauen Sie die Wiederholung bei Status `429` in jede Integration ein. Beim Freischalten von Kontaktdaten begrenzen Ihre Credits die Menge, nicht die Zahl der Anfragen. Mehr dazu unter [Credits in der API](https://webmetic.de/docs/api/credits).

## Antwort bei Überschreitung [#antwort-bei-überschreitung]

Wenn Sie das Limit überschreiten, antwortet die API mit Status `429` und dem Fehlercode `RATE_LIMITED`. Der Header `Retry-After` nennt die Sekunden bis zum nächsten Versuch:

```http
HTTP/1.1 429 Too Many Requests
Retry-After: 1

{
  "detail": {
    "error": "RATE_LIMITED",
    "message": "Rate limit exceeded: 1 per 1 second. Wait and try again."
  }
}
```

Die abgelehnte Anfrage liefert keine Daten. Warten Sie die Sekunden aus `Retry-After` ab und senden Sie die Anfrage dann erneut. Bei den Besuchs-Endpunkten ist das eine Sekunde, und die Partner-API nennt den Wert ihres Minutenlimits. Alle Fehlercodes stehen unter [Fehler](https://webmetic.de/docs/api/fehler).

## Wiederholung mit Wartezeit [#wiederholung-mit-wartezeit]

Senden Sie Anfragen an denselben Endpunkt nacheinander, nicht parallel. Wenn die API trotzdem mit Status `429` antwortet, empfehlen wir diesen Ablauf:

1. **Anfrage senden**: Ihre Integration ruft den Endpunkt auf.
2. **Status prüfen**: Bei jedem Status außer 429 verarbeitet sie die Antwort.
3. **Warten**: Bei 429 wartet sie die Sekunden aus `Retry-After`. Wenn der Header fehlt, wartet sie eine Sekunde und danach jedes Mal doppelt so lange.
4. **Erneut senden**: Nach fünf Versuchen hört sie auf und meldet den Fehler.

Das Beispiel ruft `/company-sessions` mit diesem Ablauf ab:

```bash tab="cURL" tab-group="lang"
delay=1
for attempt in 1 2 3 4 5; do
  status=$(curl -s -D headers.txt -o response.json -w "%{http_code}" \
    "https://hub.webmetic.de/company-sessions?domain=ihre-website.de" \
    -H "Authorization: wmtc_IHR_API_SCHLUESSEL")
  if [ "$status" != "429" ] || [ "$attempt" -eq 5 ]; then break; fi
  retry_after=$(grep -i '^retry-after:' headers.txt | tr -dc '0-9')
  sleep "${retry_after:-$delay}" # Retry-After first, else the backoff
  delay=$((delay * 2)) # wait longer after each 429
done
```

```js tab="JavaScript" tab-group="lang"
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

async function fetchWithRetry(url, attempts = 5) {
  let delay = 1000;
  for (let i = 1; i <= attempts; i++) {
    const res = await fetch(url, {
      headers: { Authorization: 'wmtc_IHR_API_SCHLUESSEL' },
    });
    if (res.status !== 429 || i === attempts) return res;
    const retryAfter = Number(res.headers.get('Retry-After'));
    await sleep(retryAfter > 0 ? retryAfter * 1000 : delay); // Retry-After first, else the backoff
    delay *= 2; // wait longer after each 429
  }
}

const res = await fetchWithRetry(
  'https://hub.webmetic.de/company-sessions?domain=ihre-website.de',
);
```

```python tab="Python" tab-group="lang"
import time
import requests

def get_with_retry(url, params, attempts=5):
    delay = 1
    for attempt in range(1, attempts + 1):
        res = requests.get(
            url,
            params=params,
            headers={"Authorization": "wmtc_IHR_API_SCHLUESSEL"},
        )
        if res.status_code != 429 or attempt == attempts:
            return res
        retry_after = res.headers.get("Retry-After", "")
        time.sleep(int(retry_after) if retry_after.isdigit() else delay)  # Retry-After first, else the backoff
        delay *= 2  # wait longer after each 429

res = get_with_retry(
    "https://hub.webmetic.de/company-sessions",
    {"domain": "ihre-website.de"},
)
```

## Größenlimits [#größenlimits]

Neben dem Anfragelimit begrenzt die API, wie viel eine einzelne Anfrage umfasst:

| Bereich | Limit |
| --- | --- |
| Visitor Intelligence | `page_size` bis 10.000 Einträge je Seite, Seiten ab 1 |
| Ansprechpartner-Suche | `size` 10 bis 25 Treffer je Seite, Seiten ab 0 |
| Enrichment | Bis 5.000 Domains je Aufruf, `page_size` bis 10.000 Einträge je Seite |
| Webhooks je Konto | 50 über die API, 10 über das Dashboard. Beide Wege zählen zusammen |
| Eigene Header je Webhook | Bis 3 |
| Antwortzeit Ihres Servers bei Webhooks | 10 Sekunden |
| Wiederholung fehlgeschlagener Zustellungen | 3 Tage |

Wenn eine Anfrage ein Größenlimit überschreitet, antwortet die API mit Status `422` und `VALIDATION_ERROR`. Wenn Sie über das Limit des Kontos hinaus einen Webhook anlegen, antwortet die API mit Status `409` und `WEBHOOK_LIMIT_REACHED`.

## Nächste Schritte [#nächste-schritte]

- [Fehler](https://webmetic.de/docs/api/fehler): Alle Statuscodes und Fehlercodes der API mit der passenden Lösung.
- [Paginierung](https://webmetic.de/docs/api/paginierung): Große Ergebnisse Seite für Seite abrufen.
- [Webhooks](https://webmetic.de/docs/api/webhooks): Ereignisse empfangen, statt die API regelmäßig abzufragen.
