Errors
All errors use one envelope:
{ "status": "error", "error": { "code": "not_found", "message": "File not found" } }Success is { "status": "ok", "data": { } } (data omitted when empty).
| HTTP | Code | Means |
|---|---|---|
| 400 | bad_file |
Missing/invalid file field, empty file, invalid base64 |
| 400 | bad_entry |
A log entry failed validation (whole batch rejected) |
| 400 | bad_query |
Bad query parameter, e.g. expiresAt in the past |
| 400 | protected |
Tried to delete the default log dataset |
| 401 | unauthorized |
Missing, invalid, expired or revoked token; bad presigned URL |
| 403 | forbidden |
Token lacks the scope; presigned URL already used |
| 403 | dataset_limit |
Plan dataset cap reached |
| 403 | quota_exceeded |
Storage cap reached on upload (also used for plan gates) |
| 404 | not_found |
File/log not found in your team — cross-team existence is never leaked |
| 413 | too_large |
Raw file over 100,000,000 bytes, buffered request over 8 MiB, or log batch over its size cap |
| 429 | quota_exceeded |
Log storage quota exceeded — batch rejected, nothing dropped silently |
| 500 | internal |
Our bug. The message is generic; report the time and path |
Branch on error.code, show error.message to users.