Get request metrics per hour or day
Returns requests, bytes, status classes, error rate and latency for each bucket that has requests, oldest first. Without filters it reads the hourly or daily aggregates at any range length, and those reads count whole hours or UTC days, from the one that holds startDate through the last one that starts before endDate. With granularity=daily and a tz other than UTC on a range of 30 days or less, those reads count local days instead. They start at the local midnight of the day holding startDate and run through the last hour that starts before endDate. A country, city, IP or ASN filter makes it read the raw access log rows, which go back only ANALYTICS_RAW_RETENTION_DAYS days, 180 by default. On that filtered path tz sets local days at any range length. totalGeoEvents is always 0 here, and /api/v1/analytics/geo-time-series has the geo series.
session<token>Session cookie authentication.
startDate?|Start of the range, inclusive, as ISO 8601 with a timezone, such as 2026-11-01T00:00:00Z. Requires endDate; omit with window.
endDate?|End of the range, exclusive, as ISO 8601 with a timezone, such as 2026-11-02T00:00:00Z. Requires startDate; omit with window.
window?|A rolling window ending now, such as 15m, 24h or 7d, up to 365 days. Use positive whole minutes, hours or days. Cannot be combined with explicit time bounds.
granularity?|hourly or daily buckets. Leave it out to get hourly buckets for ranges up to 30 days and daily buckets for longer ones.
"hourly""daily"nullcountryCode?array<string>|Keep only these countries, as uppercase two-letter ISO 3166-1 codes such as NO. Repeat the parameter to pass more than one.
city?array<string>|Keep only these cities, by the exact name GeoIP gives, such as Oslo. Repeat the parameter to pass more than one.
ipAddress?array<string>|Keep only these client IPs. Repeat the parameter to pass more than one. A value that is not an IP gets a 400.
ipAddressNotIn?array<string>|Leave out these client IPs. Repeat the parameter to pass more than one. A value that is not an IP gets a 400.
asnIn?array<integer>|Keep only these autonomous system numbers, such as 13335. Repeat the parameter to pass more than one. Rows without ASN data are left out.
asnNotIn?array<integer>|Leave out these autonomous system numbers. Repeat the parameter to pass more than one. Rows without ASN data stay in.
tz?|An IANA timezone such as Europe/Oslo. Daily buckets then start at midnight in that zone for ranges of 30 days or less, and longer ranges keep UTC days unless the endpoint's description says otherwise. Hourly buckets ignore it, so on ranges that get hourly buckets it changes nothing. An unknown zone gets a 400. Defaults to UTC.
Request fulfilled, document follows
application/json- response
Request metrics per bucket, oldest first. Buckets without requests are left out.
data*array<>endDate*stringThe request's endDate, echoed as ISO 8601.
granularity*stringThe bucket size used, hourly or daily.
startDate*stringThe request's startDate, echoed as ISO 8601.
curl -X GET 'https://geometrikks.example.com/api/v1/analytics/time-series?startDate=2026-11-01T00%3A00%3A00Z&endDate=2026-11-02T00%3A00%3A00Z&tz=Europe%2FOslo'{ "data": [ { "avgRequestTime": 0, "errorRate": 0, "maxRequestTime": 0, "p50RequestTime": 0, "p95RequestTime": 0, "p99RequestTime": 0, "status2xx": 0, "status3xx": 0, "status4xx": 0, "status5xx": 0, "timedRequests": 0, "timestamp": "string", "totalBytesSent": 0, "totalGeoEvents": 0, "totalRequests": 0 } ], "endDate": "string", "granularity": "string", "startDate": "string"}Get the traffic summary for a time range GET
Returns request, byte, status class, latency and geo event totals for the range. With `comparePrevious` it adds the period of the same length that ends just before `startDate`, which stays null unless the range and that period each have requests or geo events. Ranges over 24 hours read the hourly aggregates, or the daily ones above 30 days. Those reads count whole hours or UTC days, from the one that holds `startDate` through the last one that starts before `endDate`. The unique IP and country counts are then estimates, and `/api/v1/analytics/live-summary` gives exact figures.
Get running totals of requests, events and bytes GET
Returns one point per bucket with the requests, geo events and bytes sent so far, oldest first. Buckets are hours for ranges up to 30 days and UTC days above, and hours or days without traffic have no point. Ranges up to 24 hours count the raw rows of the exact range, and `granularity` reads `raw` for them. Longer ranges read the aggregates, which count whole hours or UTC days, from the one that holds `startDate` through the last one that starts before `endDate`.