---
title: "Aggregate Events"
openapi: "openapi POST /v1/events.aggregate"
---
import { DynamicParamField } from "/components/dynamic-param-field.jsx";
import { DynamicResponseField } from "/components/dynamic-response-field.jsx";
import { DynamicResponseExample } from "/components/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
});
```
## 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
Feature ID(s) to aggregate events for
Property to group events by. If provided, each key in the response will be an object with distinct groups as the keys
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
### 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
}
}
}
```