Reading data
Select fields, filter and sort results, paginate, and include related resources.
Every readable resource supports both a collection and an individual record request:
GET /api/core/organizations/{organization_id}/{resource}
GET /api/core/organizations/{organization_id}/{resource}/{id}
GET /api/core/organizations/{organization_id}/events/{event_id}/{resource}
GET /api/core/organizations/{organization_id}/events/{event_id}/{resource}/{id}
Selecting response fields
Response fields are selected by the token scope, not by each API call. There is no caller-controlled fields[...] parameter. To receive another field, ask an organization administrator to add it to Readable fields for that resource’s scope.
This matters when troubleshooting apparently incomplete responses: a valid response containing only id is possible when no other read fields are selected.
Filters
Filters are ordinary query parameters and use underscored names:
curl --get \
--url "https://api.brella.io/api/core/organizations/30/events/319986/leads" \
--header "Accept: application/vnd.brella.v4+json" \
--header "Brella-API-Access-Token: YOUR_TOKEN" \
--data-urlencode "sponsor_id=103705" \
--data-urlencode "created_from=2026-08-01T00:00:00Z" \
--data-urlencode "created_to=2026-08-31T23:59:59Z"
Only filters selected in the token scope are applied. Other resource-specific query parameters are ignored. The one exception is a filter declared as required by the resource: comparison_event_ids for organization event benchmarks is always required and applied.
Filter behavior:
- equality filters match the supplied value;
_fromfilters are inclusive lower bounds (>=);_tofilters are inclusive upper bounds (<=);- values may be scalars or arrays of scalar values;
- enum filters reject invalid enum values with
400; - nested objects are not valid filter values; and
- an unknown value handled by a custom filter may produce an empty result rather than an error, as noted in the relevant resource.
For multiple values, use repeated array parameters where supported, or the comma-separated format explicitly documented for benchmark comparison IDs:
?status[]=invited&status[]=joined
?comparison_event_ids=101,102,103
Sorting
Only abuse-reports currently declares named sorts:
?sort=latest_instance
?sort=report_count
Both are descending and use record ID as a stable tie-breaker. An unrecognized sort value leaves the normal ascending-ID order in place.
Pagination
Collection endpoints are paginated in ascending record-ID order unless a declared sort is used.
?page[number]=2&page[size]=50
- Default page size:
30 [may change prior to release] - Maximum page size:
100 - Values at or below zero use the default page size.
Pagination metadata is returned at the document level:
{
"meta": {
"total_count": 245,
"total_pages": 5,
"current_page": 2
}
}
Including related resources/ associations
Use a comma-separated include query parameter. The requested names are the underscored association names listed in this reference and must also be enabled in the scope:
?include=registrant,created_by_registrant,custom_fields
Without include, configured relationships are still represented by JSON:API linkage, but the related objects are not placed in the top-level included array. Unknown, unconfigured, and disallowed include names are ignored.
An association can have a different response name. For example, request include=created_by_registrant; the response relationship is created-by-registrant. Each included object contains id plus the association fields selected in the scope.
Nullable relationships are valid. For example, a lead can have created-by-registrant.data: null when it was created without a creator registrant, even if that association and all of its fields are correctly configured.