---
title: "Responses and errors"
description: "Understand JSON:API responses, status codes, and rate limits."
lastModified: "2026-08-21"
---

## Collection response

```json
{
  "data": [
    {
      "id": "3898",
      "type": "lead",
      "attributes": {
        "event-id": 319986,
        "sponsor-ids": [103705],
        "notes": "Requested a product demo"
      },
      "relationships": {
        "registrant": {
          "data": { "id": "77881", "type": "event-registrant" }
        }
      }
    }
  ],
  "meta": {
    "total_count": 1,
    "total_pages": 1,
    "current_page": 1
  }
}
```

## Individual response with an included relationship

```json
{
  "data": {
    "id": "3898",
    "type": "lead",
    "attributes": {
      "event-id": 319986,
      "created-by-registrant-id": null
    },
    "relationships": {
      "created-by-registrant": {
        "data": null
      }
    }
  }
}
```

If the relationship is non-null and requested through `include`, its resource appears in `included`:

```json
{
  "included": [
    {
      "id": "77882",
      "type": "event-registrant",
      "attributes": {
        "external-id": "CRM-42",
        "first-name": "Avery",
        "last-name": "Lee",
        "email": "avery@example.com"
      }
    }
  ]
}
```

JSON:API `type` values are normally singular resource names. Analytics, statistics, and benchmarks retain their collective resource name as their type.

## Error response

General errors use:

```json
{
  "errors": [
    {
      "title": "Missing required filter: comparison_event_ids"
    }
  ]
}
```

Model validation errors may also contain a source pointer:

```json
{
  "errors": [
    {
      "title": "Name can't be blank",
      "source": { "pointer": "/sponsor/name" }
    }
  ]
}
```

| Status | Meaning |
| :---- | :---- |
| `400 Bad Request` | Wrong URL level, conflicting event/organization ID, malformed scalar/array value, invalid date, or missing required filter. |
| `403 Forbidden` | Missing, expired, wrong-context, or unknown token; disabled scope; missing permission; or disallowed action. |
| `404 Not Found` | Unknown resource, missing scope, event/record outside scope, restricted record, or foreign/missing related record. |
| `422 Unprocessable Content` | A model or business rule rejected the write, or an analytics request exceeded a protected dataset limit. |
| `429 Too Many Requests` | Rate limit exceeded. Respect the `Retry-After` header. |

By default, Core requests are limited to 100 requests per configured period per token and 500 per configured period per IP; the default period is 60 seconds. Brella may configure different production limits.
