# Rate-Limits und Header

> Rate-Limits für Anfragen pro API-Schlüssel, die Antwort-Header zum Rate-Limit, retry-after bei 429 und 503 sowie die weiteren Header, die die Fileverity-API setzt.

Quelle: https://fileverity.com/de/docs/rate-limits

Jeder API-Schlüssel kann 120 Anfragen pro Minute senden. Das Limit wird in Ein-Minuten-Fenstern gezählt und gilt für jeden Endpunkt, auch für Anfragen, die einen Fehler zurückgeben. Ist ein Fenster ausgeschöpft, erhalten weitere Anfragen `429` mit dem Code `rate_limited`, bis das Fenster zurückgesetzt wird.

Sie brauchen höhere Limits oder Mengenpreise? [Vertrieb kontaktieren](https://fileverity.com/de/kontakt).

## Rate-Limit-Header

Jede Antwort auf eine authentifizierte Anfrage enthält den Stand Ihres Fensters:

| Header | Bedeutung |
| --- | --- |
| `x-ratelimit-limit-requests` | Zulässige Anfragen pro Fenster. |
| `x-ratelimit-remaining-requests` | Verbleibende Anfragen im aktuellen Fenster. |
| `x-ratelimit-reset-requests` | Sekunden, bis das Fenster zurückgesetzt wird. |
| `retry-after` | Nur bei `429` mit dem Code `rate_limited` und bei `503` mit dem Code `service_unavailable`. Sekunden, die bis zur nächsten Anfrage zu warten sind. `pending_files_limit` (ebenfalls `429`) enthält ihn nicht. |

Anfragen, die wegen eines fehlenden oder ungültigen Schlüssels abgelehnt werden (`401`), enthalten diese Header nicht.

**retry-after beachten: JavaScript**

```javascript
async function call(url, init) {
  for (let attempt = 0; attempt < 5; attempt++) {
    const response = await fetch(url, init);
    if (response.status !== 429) return response;
    const wait = Number(response.headers.get("retry-after")) || 1;
    await new Promise((resolve) => setTimeout(resolve, wait * 1000));
  }
  throw new Error("Rate limited");
}
```

**retry-after beachten: Python**

```python
import time

def call(method, url, **kwargs):
    for attempt in range(5):
        response = requests.request(method, url, **kwargs)
        if response.status_code != 429:
            return response
        time.sleep(int(response.headers.get("retry-after", 1)))
    raise RuntimeError("Rate limited")
```

Verteilen Sie Lastspitzen über die Zeit, bevorzugen Sie [Webhooks](https://fileverity.com/de/docs/webhooks.md) gegenüber engen Polling-Schleifen und nutzen Sie `Prefer: wait` bei [Analysen](https://fileverity.com/de/docs/analyses.md), statt abzufragen. Ist die Kapazität ausgelastet, gibt `POST /analyses` `503 service_unavailable` mit `retry-after` zurück; siehe [Wenn der Dienst ausgelastet ist](https://fileverity.com/de/docs/analyses.md#busy).

## Weitere Antwort-Header

| Header | Wo | Bedeutung |
| --- | --- | --- |
| `x-request-id` | Jede Antwort | Die Anfrage-ID, auch im Antworttext bei Fehlern. |
| `cache-control: no-store` | Jede Antwort | API-Antworten werden nie zwischengespeichert. |
| `preference-applied` | `POST /analyses` | `wait=N`, wenn Ihr Header `Prefer` berücksichtigt wurde. |
| `idempotent-replayed` | POST-Endpunkte | `true`, wenn die Antwort eine gespeicherte, erneut ausgelieferte Antwort ist. Siehe [Idempotenz](https://fileverity.com/de/docs/idempotency.md). |
| `x-evidence-included` | `GET /analyses/{id}/report.pdf` | `false`, wenn die Dokumentbelege bereits abgelaufen sind und das PDF sie weglässt. |

## Header, die Sie senden

- `Authorization: Bearer <key>`: erforderlich. Siehe [Authentifizierung und Schlüssel](https://fileverity.com/de/docs/authentication.md).
- `Content-Type: application/json` für JSON-Anfragetexte; `multipart/form-data` für Uploads über `POST /files`.
- `Idempotency-Key`: optional, bei POST-Anfragen.
- `Prefer: wait=N`: optional, bei `POST /analyses`.

Beispiel: `curl -i https://api.fileverity.com/v1/models -H "Authorization: Bearer $FILEVERITY_API_KEY"` zeigt alle Antwort-Header an.

