--- 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 } } } ```