# Grenzen und Fehler

## Ihr Tarif

Jeder Beleg, den Ocost liest, zählt einmal gegen den Monat Ihres Unternehmens. Erneut geschickte Bytes und Suchen zählen nicht. [Einstellungen › Tarif](https://app.ocost.io/settings/plan) zeigt den bisherigen Monat. Jede Antwort auf `POST /public/v1/files` sagt in `X-Ocost-Documents-Left`, was übrig ist.

Am Limit speichert Ocost eine Datei trotzdem. Es antwortet `not_read` mit `reason: "limit"` und `renews_on`. Ocost liest die Datei von selbst, sobald der Monat sich erneuert oder der Tarif wächst.

## Ratenlimits

Jeder Schlüssel hat je Berechtigung ein Limit pro Minute:

| Berechtigung | Aufrufe pro Minute |
| --- | --- |
| `documents:write` | 120 |
| `documents:read` | 600 |
| `search:read` | 60 |
| `figures:read` | 120 |
| `exports:write` | 10 |

Über einem Limit antwortet Ocost `429 urn:ocost:key:rate` mit `Retry-After` in Sekunden. Von einer Adresse bekommen 30 falsche Schlüssel pro Minute `401`, mehr bekommen `429`.

Alle Schlüssel einer Adresse teilen sich ein äußeres Limit: 50 Anfragen pro Sekunde, Spitzen bis 200, und 100 gleichzeitig offen. Darüber kommt ein `429` als einfacher Text mit `Retry-After` zurück. Halten Sie sich an wenige gleichzeitige Anfragen, und verteilen Sie einen Stapel über seine Minute.

## Größen

| Was | Grenze |
| --- | --- |
| Eine Datei | 25 MB, vor dem Lesen abgelehnt mit `413 urn:ocost:file:too_large` |
| Ein langes PDF | Nur seine ersten Seiten werden gelesen. `pages_read` sagt, wie viele. |
| Eine Suche | `q` bis 200 Zeichen, `limit` bis 50, `offset` bis 250 |
| Eine MCP-Anfrage | 4 MB. Schlüssel mit `documents:write` dürfen das Base64 einer Datei schicken. Darüber `413`. |

## Fehler

Fehler sind RFC-9457-Problems mit `Content-Type: application/problem+json`. Verzweigen Sie nach `status` und `type`. `detail` ist Englisch für Ihre Logs und kann sich ändern.

```json
{
  "type": "urn:ocost:key:scope",
  "title": "Forbidden",
  "status": 403,
  "detail": "This key lacks the scope documents:write.",
  "instance": "/public/v1/files"
}
```

| Typ | Status | Bedeutung |
| --- | --- | --- |
| `urn:ocost:key:invalid` | 401 | Kein Schlüssel, oder ein falscher, widerrufener oder abgelaufener. |
| `urn:ocost:key:scope` | 403 | Dem Schlüssel fehlt die Berechtigung. |
| `urn:ocost:key:rate` | 429 | Zu viele Aufrufe. Warten Sie `Retry-After`. |
| `urn:ocost:file:too_large` | 413 | Die Datei ist größer als 25 MB. |
| `urn:ocost:file:format` | 415 | Ein Format, das Ocost nicht liest. |
| `urn:ocost:file:reading` | 409 | Die Datei wird gerade gelesen. Löschen Sie sie später. |
| `urn:ocost:file:kept` | 409 | Dieselben Bytes liegen dort, wo Schlüssel sie nicht sehen, etwa im eigenen Upload einer Person. Nichts ändert sich. |
| `urn:ocost:file:linked` | 409 | Ocost braucht die Datei noch. Löschen Sie sie in Ocost, sobald nichts sie mehr braucht. |
| `about:blank` | 404 | Keine solche Datei und kein solcher Beleg, oder die eines anderen Unternehmens. |
| `about:blank` | 422 | Ungültige Felder, jedes in `errors[]` mit seinem `loc`. |
| `about:blank` | 503 | Versuchen Sie es gleich noch einmal. |

Eine Datei ohne Header `Content-Length` bekommt `411`.

## Wiederholen

| Antwort | Was tun |
| --- | --- |
| `429`, `5xx` | Warten Sie `Retry-After`, oder pausieren Sie 1, 2, 4 Sekunden und so weiter, höchstens eine Minute. |
| `401` | Halten Sie an und sagen Sie es einer Person. Der Schlüssel muss ersetzt werden. |
| Jedes andere `4xx` | Schicken Sie dieselbe Anfrage nicht erneut. |

Eine Datei erneut zu schicken ist sicher, denn dieselben Bytes sind dieselbe Datei. Erneutes Löschen ist ebenso sicher und ergibt `404`.

## Ihre Daten

Ocost läuft in der EU. Originale, Gelesenes und der Suchindex bleiben, bis Sie die Datei löschen oder Ihr Unternehmen gelöscht wird. Belege trainieren nie ein Modell.
