Traffic to one of the caller's domains over a time range: hourly requests and bytes, the busiest paths, and status codes. Byte figures include a fixed per-response header estimate, since the edge logs only response bodies.
Parameters
domain
string
Required
The registered hostname. Must belong to the caller.
from
string
datetime
Optional
Inclusive lower bound. Defaults to 30 days ago.
to
string
datetime
Optional
Exclusive upper bound. Defaults to now.
topPaths
integer
Optional
How many of the busiest paths to return.
topRecords
integer
Optional
How many record versions to return. A domain republished often has many, so this is a top N, not the full history.
Output
application/jsonbuckets
array
Required
Hourly buckets, oldest first.
bytesBilled
integer
Required
Total bytes billed over the range.
bytesBilledToVisitors
integer
Required
The part of bytesBilled that signed-in visitors paid instead of the owner. Zero unless the domain uses the visitor payer policy.
domain
string
Required
No description available.
headerEstimateBytes
integer
Required
The fixed per-response header estimate added to each logged body size. Every byte figure here is estimated by this much per response.
records
array
Optional
Which versions of the site record served the traffic, heaviest first. Limited to topRecords, so a frequently republished domain may have versions not listed. Absent if the deployment does not report it.
refusals
object
Optional
What the bandwidth allowance refused over the range, and what serving it would have cost. Absent if the deployment does not report it.
statuses
array
Required
Requests by status code, with the crawler share.
topPaths
array
Required
The busiest paths over the range.
Errors
InvalidDomain
Not a valid, non-reserved, public-suffix-safe domain. Unlike DomainNotFound, the input is not a hostname at all. DomainNotFound
No such domain, or it does not belong to the caller. Both cases get the same error, so it cannot be used to check whether a domain exists. AnalyticsDisabled
No analytics store is configured, so no traffic was recorded. Try It
Requests are sent directly from your browser. Some servers may block requests due to CORS.
View raw schema
{
"description": "Traffic to one of the caller's domains over a time range: hourly requests and bytes, the busiest paths, and status codes. Byte figures include a fixed per-response header estimate, since the edge logs only response bodies.",
"errors": [
{
"description": "Not a valid, non-reserved, public-suffix-safe domain. Unlike DomainNotFound, the input is not a hostname at all.",
"name": "InvalidDomain"
},
{
"description": "No such domain, or it does not belong to the caller. Both cases get the same error, so it cannot be used to check whether a domain exists.",
"name": "DomainNotFound"
},
{
"description": "No analytics store is configured, so no traffic was recorded.",
"name": "AnalyticsDisabled"
}
],
"output": {
"encoding": "application/json",
"schema": {
"properties": {
"buckets": {
"description": "Hourly buckets, oldest first.",
"items": {
"description": "One hour of a domain's traffic.",
"properties": {
"botRequests": {
"description": "How many of requests came from crawlers. This is part of requests, not added to it. Bytes are not split this way. Absent if the deployment does not report it; show that as unknown, not as zero.",
"type": "integer"
},
"bucket": {
"description": "Start of the hour.",
"format": "datetime",
"type": "string"
},
"bytesBilled": {
"description": "Body bytes plus the per-response header estimate.",
"type": "integer"
},
"bytesBody": {
"description": "Response body bytes, as logged by the edge.",
"type": "integer"
},
"requests": {
"description": "Responses in the hour.",
"type": "integer"
}
},
"required": [
"bucket",
"requests",
"bytesBody",
"bytesBilled"
],
"type": "object"
},
"type": "array"
},
"bytesBilled": {
"description": "Total bytes billed over the range.",
"type": "integer"
},
"bytesBilledToVisitors": {
"description": "The part of bytesBilled that signed-in visitors paid instead of the owner. Zero unless the domain uses the visitor payer policy.",
"type": "integer"
},
"domain": {
"type": "string"
},
"headerEstimateBytes": {
"description": "The fixed per-response header estimate added to each logged body size. Every byte figure here is estimated by this much per response.",
"type": "integer"
},
"records": {
"description": "Which versions of the site record served the traffic, heaviest first. Limited to topRecords, so a frequently republished domain may have versions not listed. Absent if the deployment does not report it.",
"items": {
"description": "One published version and the traffic it served.",
"properties": {
"bytesBilled": {
"description": "Billed bytes.",
"type": "integer"
},
"firstSeen": {
"description": "The first response in the range served from this version.",
"format": "datetime",
"type": "string"
},
"lastSeen": {
"description": "The last response in the range served from this version. With firstSeen, it shows how long the version served, so byte figures can be compared across versions. Absent when unknown; show that as still serving.",
"format": "datetime",
"type": "string"
},
"recordCid": {
"description": "The site record the serving snapshot was built from.",
"format": "cid",
"type": "string"
},
"requests": {
"description": "Responses.",
"type": "integer"
}
},
"required": [
"recordCid",
"firstSeen",
"requests",
"bytesBilled"
],
"type": "object"
},
"type": "array"
},
"refusals": {
"description": "What the bandwidth allowance refused over the range, and what serving it would have cost. Absent if the deployment does not report it.",
"properties": {
"estimatedBytes": {
"description": "What serving those responses would have cost the owner. Absent unless the deployment records it, because a refused response has no logged body size.",
"type": "integer"
},
"requests": {
"description": "Responses refused because the payer's allowance for the period ran out. Matches the 402 count in statuses.",
"type": "integer"
}
},
"required": [
"requests"
],
"type": "object"
},
"statuses": {
"description": "Requests by status code, with the crawler share.",
"items": {
"description": "One status code's share of requests and bytes.",
"properties": {
"botRequests": {
"description": "How many of those came from crawlers. Crawler traffic is billed: it is real egress, and not billing it would reward faking a user agent.",
"type": "integer"
},
"bytesBilled": {
"description": "Billed bytes.",
"type": "integer"
},
"requests": {
"description": "Responses with this status.",
"type": "integer"
},
"status": {
"description": "The HTTP status.",
"type": "integer"
}
},
"required": [
"status",
"requests",
"bytesBilled",
"botRequests"
],
"type": "object"
},
"type": "array"
},
"topPaths": {
"description": "The busiest paths over the range.",
"items": {
"description": "One path and its traffic.",
"properties": {
"bytesBilled": {
"description": "Billed bytes.",
"type": "integer"
},
"path": {
"description": "The request path.",
"type": "string"
},
"requests": {
"description": "Responses.",
"type": "integer"
}
},
"required": [
"path",
"requests",
"bytesBilled"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"domain",
"bytesBilled",
"bytesBilledToVisitors",
"headerEstimateBytes",
"buckets",
"topPaths",
"statuses"
],
"type": "object"
}
},
"parameters": {
"properties": {
"domain": {
"description": "The registered hostname. Must belong to the caller.",
"maxLength": 253,
"type": "string"
},
"from": {
"description": "Inclusive lower bound. Defaults to 30 days ago.",
"format": "datetime",
"type": "string"
},
"to": {
"description": "Exclusive upper bound. Defaults to now.",
"format": "datetime",
"type": "string"
},
"topPaths": {
"default": 20,
"description": "How many of the busiest paths to return.",
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"topRecords": {
"default": 20,
"description": "How many record versions to return. A domain republished often has many, so this is a top N, not the full history.",
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [
"domain"
],
"type": "params"
},
"type": "query"
}