---
title: "Aggregate Events"
openapi: "openapi POST /v1/events.aggregate"
---
import { DynamicParamField } from "/snippets/dynamic-param-field.jsx";
import { DynamicResponseField } from "/snippets/dynamic-response-field.jsx";
import { DynamicResponseExample } from "/snippets/dynamic-response-example.jsx";
Aggregate usage events by time period. Returns usage totals grouped by feature and optionally by a custom property.
## Working with Properties
When tracking events, you can attach custom properties that can later be used for grouping aggregations:
```typescript
// Track an event with properties
await autumn.track({
customerId: "cus_123",
featureId: "api_calls",
value: 1,
properties: {
model: "gpt-4",
source: "api",
region: "us-east"
}
});
```
You can then aggregate events grouped by any property using the `group_by` parameter:
```typescript
const result = await autumn.events.aggregate({
customerId: "cus_123",
featureId: "api_calls",
range: "7d",
groupBy: "properties.model" // Group by the "model" property
});
```
### Special Group By Operators
In addition to custom properties, you can group by built-in columns using `$`-prefixed operators:
- `$customer_id` -- Group results by customer ID. Useful when aggregating across all customers (i.e. no `customer_id` specified).
- `$entity_id` -- Group results by entity ID. Useful for seeing usage broken down per entity.
```typescript
// Aggregate across all customers, grouped by customer
const result = await autumn.events.aggregate({
featureId: "api_calls",
range: "7d",
groupBy: "$customer_id"
});
// Aggregate for a customer, grouped by entity
const result = await autumn.events.aggregate({
customerId: "cus_123",
featureId: "api_calls",
range: "7d",
groupBy: "$entity_id"
});
```
## Response Format
The response structure changes based on whether `group_by` is provided:
### Without `group_by` (Flat Response)
When no grouping is specified, `values` contains the aggregated sum for each feature:
```json
{
"list": [
{
"period": 1762905600000,
"values": {
"api_calls": 150,
"messages": 45
}
}
],
"total": {
"api_calls": { "count": 10, "sum": 150 },
"messages": { "count": 5, "sum": 45 }
}
}
```
### With `group_by` (Grouped Response)
When grouping is specified, `values` contains the total sum while `grouped_values` breaks down values by group:
```json
{
"list": [
{
"period": 1762905600000,
"values": {
"api_calls": 150
},
"grouped_values": {
"api_calls": {
"gpt-4": 100,
"gpt-3.5": 50
}
}
}
],
"total": {
"api_calls": { "count": 10, "sum": 150 }
}
}
```
The `grouped_values` field is only present when `group_by` is provided in the request.
### Body Parameters
Customer ID to aggregate events for
Entity ID to filter aggregated events for (e.g., per-seat or per-resource limits)
Feature ID(s) to aggregate events for
Property to group events by (e.g. "properties.region"), or "$customer_id" / "$entity_id" / "$plan_id" to group by those columns
Time range to aggregate events for. Either range or custom_range must be provided
Size of the time bins to aggregate events for. Defaults to hour if range is 24h, otherwise day
Custom time range to aggregate events for. If provided, range must not be provided
Filter events by property values, e.g. \{"model": "gpt-4", "region": "us"\}. Maximum 5 filters.
Maximum number of distinct group values to return per time bin when using group_by. Remaining values are bundled into an 'Other' bucket. Defaults to 9
### Response
Array of time periods with aggregated values
Unix timestamp (epoch ms) for this time period
Aggregated values per feature: \{ [featureId]: number \}
Values broken down by group (only present when group_by is used): \{ [featureId]: \{ [groupValue]: number \} \}
Total aggregations per feature. Keys are feature IDs, values contain count and sum.
Number of events for this feature
Sum of event values for this feature
```json 200
{
"list": [
{
"period": 1762905600000,
"values": {
"messages": 10,
"sessions": 3
}
},
{
"period": 1762992000000,
"values": {
"messages": 3,
"sessions": 12
}
}
],
"total": {
"messages": {
"count": 2,
"sum": 13
},
"sessions": {
"count": 2,
"sum": 15
}
}
}
```