# Errors, debugging, and limits

> Handle structured failures, correlate request IDs, and keep prototype usage within predictable limits.

Human-readable version: https://agsemble.com/docs/errors-and-limits

## Structured errors

- 400: a required or malformed parameter
- 401: missing, malformed, expired, or rotated API key
- 404: a resource is outside the authenticated tenant
- 429: monthly fair-use allowance or issuance limit reached
- 502/503: provider or dependency unavailable

```json
{
  "error": {
    "code": "field_not_found",
    "message": "The requested field was not found.",
    "param": "field_id"
  },
  "request_id": "req_..."
}
```

## Request activity

GET /api/v1/request-logs returns recent request IDs, methods, paths, status codes, durations, and provider-cache status. Query strings, bodies, authorization values, and response payloads are not stored.

## Sandbox limits

- 5 field slots; one connected field up to 25 ha uses one slot
- Larger fields use another slot per 25 ha, and each MultiPolygon component is counted separately
- 10,000 requests and 2,000 writes per UTC month as technical fair-use guards
- Five sandbox creations per network per UTC day
- Seven days of tenant-scoped request activity

> **Check measured usage:** GET /api/v1/usage returns field-slot use, monthly fair-use allowances, provider refresh activity, period boundaries, and the request ID. Editing a saved boundary changes its slot use; seeded fixture fields do not consume slots.
