Get traffic analytics

Returns the traffic metrics of your account over a time window: requests by DataDome status, by origin and by threat, the responses DataDome returned, slider and device check outcomes, and contact form submissions. Metrics can be bucketed by time and split by root domain, domain, endpoint or AI agent. Access. The endpoint is available to accounts on an Enterprise Bot Protect plan that have the Trend Reports feature. Any other account gets 403 with the error TREND_REPORTS_NOT_ENABLED, whatever the API key. The API key identifies one account, and every metric returned belongs to that account.Authentication. Send the API key in the x-api-key header. Rate limit. 5 requests per minute per API key. Above it the endpoint returns 429 with a Retry-After header. A request spends the budget once access is granted and before its parameters are checked: a 400 uses one request of the budget, a 403 does not. Time window. from is included and to is excluded. Both are optional: without to the window ends now, and without from it starts 24 hours before to. from must be within the last 24 months and not in the future. A to in the future is treated as now. Send dates as ISO 8601 with seconds and an offset or Z, for example 2026-09-08T15:00:00Z. Fractional seconds are rejected. Every timestamp in the response has the same format, rendered in the requested timezone. Realtime horizon. meta.realtimeHorizon marks where the data source changes. Before the horizon, metrics come from aggregated trend report data, in hourly steps. They are final. From the horizon onward, metrics are computed from real-time logs, to the second. They are provisional: slider and device check outcomes are recorded after the request, so the same query run later can return higher counts. Request boundaries that fall before the horizon are rounded out to the full hour. Always read the horizon from meta.realtimeHorizon, and label your reports with meta.from and meta.to. DDoS traffic. Requests stopped by DDoS Protect during an attack are included in requestsCount and requestsByThreat.ddos. They are not tied to a domain, endpoint or AI agent, so they don't appear in queries that filter or split by those dimensions, or in agentic scope. In that case, the sum of the split buckets can be lower than the unfiltered total. Buckets and pagination. interval sets the time bucket (hour, day or month). Without it, the whole window is one bucket. splitBy adds one dimension per value, and each dimension multiplies the number of buckets. Day and month buckets follow the calendar of timezone. The first and last bucket are clamped to the window, so they can be shorter than interval. Buckets with no traffic are left out, so a window without traffic returns data: []. Buckets are ordered by time, then by the dimensions in the order given in splitBy. Pagination applies only with interval or splitBy. Otherwise the response holds at most one bucket and meta.hasMore is false. When meta.hasMore is true, send meta.nextCursor back as cursor with every other parameter unchanged (limit may change). A cursor expires after 1 hour. An expired cursor, or one sent with other parameters, is rejected with 400 INVALID_CURSOR. The last page has hasMore: false and no nextCursor. Agentic traffic. Agentic scope is on when agenticOnly=true, when aiAgents is set, or when splitBy contains aiAgent. In agentic scope every metric counts AI agent traffic only, meta.query.agenticScope is true, and every bucket carries requestsByIntent. Its values never exceed requestsCount and can sum to less when a request's detected intent is not one of its keys. With splitBy=aiAgent, each bucket carries aiAgentUuid. A null value groups the traffic of agents that are not AI agents of your account. Warnings. An endpoints or aiAgents value that is a valid UUID but matches nothing on your account does not fail the request. It is listed in meta.warnings, with the code UNKNOWN_ENDPOINT_UUID or UNKNOWN_AI_AGENT_UUID, and it matches no traffic. meta.warnings is absent when there is nothing to report. rootDomains and domains are not checked: a value that matches nothing returns no traffic and no warning.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…

What this endpoint returns

The Traffic Analytics endpoint returns the traffic metrics of your account over a time window. It gives requests by DataDome status, by origin, and by threat, the responses DataDome returned, and slider and device check outcomes.

Send your API key in the x-api-key header only.

Rate limiting

This endpoint accepts 5 requests per minute, per API key. Requests beyond that receive a 429 with the X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Retry-After, and Retry-After headers.

Query Params
date-time

Start of the window, included. ISO 8601 date and time with seconds and an offset or Z, for example 2026-09-28T00:00:00Z. Fractional seconds are rejected. Must be within the last 24 months and not in the future. Defaults to to minus 24 hours. Floored to the hour when older than the realtime horizon.

date-time

End of the window, excluded. Same format as from, and strictly later than it. Defaults to now. A value in the future is treated as now. Ceiled to the hour when older than the realtime horizon.

string
enum

Time bucket size. Without it, the metrics of the whole window are returned in one bucket, which is the way to poll a short recent window.

Allowed:
string
Defaults to UTC

Canonical IANA time zone name, for example Europe/Paris; aliases such as US/Eastern are rejected. Places day and month bucket boundaries and renders every timestamp of the response. Hour buckets cover the same instants in any zone; only their labels change. The offset from UTC must be a whole number of hours over the whole window, so zones such as Asia/Kolkata are rejected with INVALID_TIMEZONE_OFFSET. A daylight saving change inside the window is accepted.

splitBy
array of strings, unique
length ≤ 4

Comma-separated dimensions to split the metrics by, in addition to interval. Any combination of distinct values is accepted, and their order sets the order of the dimension fields and of the buckets. aiAgent turns agentic scope on.

rootDomains
array of strings

Comma-separated root domains to filter on. Values are not checked: one that matches nothing returns no traffic.

rootDomains
domains
array of strings

Comma-separated domains to filter on. Values are not checked: one that matches nothing returns no traffic.

domains
endpoints
array of uuids

Comma-separated endpoint UUIDs to filter on. A value that is not a UUID is rejected with INVALID_ENDPOINT_UUID. A UUID that matches no endpoint of your account is reported in meta.warnings and matches no traffic.

endpoints
aiAgents
array of uuids

Comma-separated AI agent UUIDs to filter on. Turns agentic scope on. A value that is not a UUID is rejected with INVALID_AI_AGENT_UUID. A UUID that matches no AI agent of your account is reported in meta.warnings and matches no traffic.

aiAgents
boolean
Defaults to false

Set to true to count agentic traffic only, across all AI agents. Only the exact value true turns it on; any other value is ignored, never rejected. Redundant when aiAgents is set or splitBy contains aiAgent.

integer
1 to 10000
Defaults to 1000

Maximum number of buckets per page.

string

Opaque cursor of the next page, taken from meta.nextCursor of the previous response. Send every other parameter unchanged; only limit may change. Expires 1 hour after it was issued. Omit it for the first page.

Responses

Language
Credentials
Header
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json