/api/v2/cdn/security-insights Account-level security report covering every CDN zone the caller owns: how much automated traffic the audience filter stopped (challenged requests that never completed verification, plus outright rejections), how many real visitors outside the audience passed verification, and how much trusted automated traffic (verified bots such as Google's indexer, payment webhooks, allowlisted services) was let through. Broken down per zone with top countries, challenged request paths, source IP addresses, trusted-traffic paths, the named services let through (search engines, AI crawlers, monitors) and hourly activity, correlated with each zone's configured audience filter. Includes a structured AI explanation in Swedish and English.
Reports are generated at most once per 24 hours per account and served from cache in between (status: "ready"). When the cached report is older than 24 hours it is returned immediately as status: "stale" and one background refresh starts; poll again shortly and refreshPending turns false when the new report is ready. pending means the first report is still being generated. A high challenged count is usually the expected result of a narrow audience filter, not an attack; totals.challengePassRatePercent shows how little of the challenged traffic was human. When truncated is true the counts are minimums.
read:cdnread:domains
Authenticate with an API key in the Authorization: Bearer <token> header.
Authorization Bearer <token> Accept application/json status string · enum required ready = report younger than 24h; stale = older report returned while a refresh runs; pending = first report generating; failed = no report and the last attempt failed; none = no eligible zones; unsupported = the CDN integration is unavailable.
ready stale pending failed none unsupported refreshPending boolean required True while a newer report is being generated in the background.
report object · nullable required The newest completed report, or null when none exists yet.
type string
· Example: https://developer.hostup.se/errors/invalid_request title string
· Example: Validation failed status integer
· Example: 400 detail string
· Example: The request body failed validation. code string
· Example: invalid_request Stable machine-readable code. Branch on this field, not on detail.
instance string
· Example: /api/v2/orders requestId string
· Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3 timestamp string
· Example: 2026-04-27T12:34:56.000Z errors array<object> Field-level validation errors when code is invalid_request.
errors[].pointer string required
· Example: /items/0/eppCode errors[].detail string required
· Example: `eppCode` is required for this transfer. errors[].code string required
· Example: missing_required extensions object type string
· Example: https://developer.hostup.se/errors/invalid_request title string
· Example: Validation failed status integer
· Example: 400 detail string
· Example: The request body failed validation. code string
· Example: invalid_request Stable machine-readable code. Branch on this field, not on detail.
instance string
· Example: /api/v2/orders requestId string
· Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3 timestamp string
· Example: 2026-04-27T12:34:56.000Z errors array<object> Field-level validation errors when code is invalid_request.
errors[].pointer string required
· Example: /items/0/eppCode errors[].detail string required
· Example: `eppCode` is required for this transfer. errors[].code string required
· Example: missing_required extensions object type string
· Example: https://developer.hostup.se/errors/invalid_request title string
· Example: Validation failed status integer
· Example: 400 detail string
· Example: The request body failed validation. code string
· Example: invalid_request Stable machine-readable code. Branch on this field, not on detail.
instance string
· Example: /api/v2/orders requestId string
· Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3 timestamp string
· Example: 2026-04-27T12:34:56.000Z errors array<object> Field-level validation errors when code is invalid_request.
errors[].pointer string required
· Example: /items/0/eppCode errors[].detail string required
· Example: `eppCode` is required for this transfer. errors[].code string required
· Example: missing_required extensions object type string
· Example: https://developer.hostup.se/errors/invalid_request title string
· Example: Validation failed status integer
· Example: 400 detail string
· Example: The request body failed validation. code string
· Example: invalid_request Stable machine-readable code. Branch on this field, not on detail.
instance string
· Example: /api/v2/orders requestId string
· Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3 timestamp string
· Example: 2026-04-27T12:34:56.000Z errors array<object> Field-level validation errors when code is invalid_request.
errors[].pointer string required
· Example: /items/0/eppCode errors[].detail string required
· Example: `eppCode` is required for this transfer. errors[].code string required
· Example: missing_required extensions object Retry-After seconds plus X-RateLimit-* headers. 10 fields type string
· Example: https://developer.hostup.se/errors/invalid_request title string
· Example: Validation failed status integer
· Example: 400 detail string
· Example: The request body failed validation. code string
· Example: invalid_request Stable machine-readable code. Branch on this field, not on detail.
instance string
· Example: /api/v2/orders requestId string
· Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3 timestamp string
· Example: 2026-04-27T12:34:56.000Z errors array<object> Field-level validation errors when code is invalid_request.
errors[].pointer string required
· Example: /items/0/eppCode errors[].detail string required
· Example: `eppCode` is required for this transfer. errors[].code string required
· Example: missing_required extensions object type string
· Example: https://developer.hostup.se/errors/invalid_request title string
· Example: Validation failed status integer
· Example: 400 detail string
· Example: The request body failed validation. code string
· Example: invalid_request Stable machine-readable code. Branch on this field, not on detail.
instance string
· Example: /api/v2/orders requestId string
· Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3 timestamp string
· Example: 2026-04-27T12:34:56.000Z errors array<object> Field-level validation errors when code is invalid_request.
errors[].pointer string required
· Example: /items/0/eppCode errors[].detail string required
· Example: `eppCode` is required for this transfer. errors[].code string required
· Example: missing_required extensions object https://cloud.hostup.se/api/v2/cdn/security-insights curl -X GET "https://cloud.hostup.se/api/v2/cdn/security-insights" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" {
"status": "ready",
"refreshPending": false,
"report": {
"windowStart": "2026-07-28T06:00:00.000Z",
"windowEnd": "2026-07-29T06:00:00.000Z",
"generatedAt": "2026-07-29T06:00:05.000Z",
"truncated": false,
"totals": {
"securityActionCount": 2398,
"managedChallengeCount": 2398,
"jsChallengeCount": 0,
"interactiveChallengeCount": 0,
"hardBlockCount": 0,
"solvedChallengeCount": 41,
"bypassedChallengeCount": 3,
"trustedSkipCount": 356,
"otherActionCount": 0,
"challengeCount": 2398,
"challengePassedCount": 44,
"stoppedRequestCount": 2354,
"challengePassRatePercent": 1.8
},
"previousSecurityActionCount": 2101,
"trendPercent": 14,
"topCountries": [
{
"countryCode": "US",
"count": 981
},
{
"countryCode": "DE",
"count": 512
}
],
"topPaths": [
{
"path": "/wp-login",
"count": 611
},
{
"path": "/xmlrpc",
"count": 402
}
],
"topIps": [
{
"ip": "203.0.113.7",
"count": 188
}
],
"actionCounts": [
{
"action": "managed_challenge",
"count": 2398
}
],
"sourceCounts": [
{
"source": "firewallCustom",
"count": 2398
}
],
"hourly": [
{
"hourStart": "2026-07-28T06:00:00.000Z",
"count": 96
}
],
"zones": [
{
"zoneId": "cdn_01hxa3b4c5d6e7f8g9h0j1k2m3",
"domain": "example.com",
"policy": {
"visitorProfileMode": "challenge",
"audienceCountries": [
"SE"
]
},
"totals": {
"securityActionCount": 2398,
"managedChallengeCount": 2398,
"jsChallengeCount": 0,
"interactiveChallengeCount": 0,
"hardBlockCount": 0,
"solvedChallengeCount": 41,
"bypassedChallengeCount": 3,
"trustedSkipCount": 356,
"otherActionCount": 0,
"challengeCount": 2398,
"challengePassedCount": 44,
"stoppedRequestCount": 2354,
"challengePassRatePercent": 1.8
},
"trendPercent": 14,
"topCountries": [
{
"countryCode": "US",
"count": 981
}
],
"topPaths": [
{
"path": "/wp-login",
"count": 611
}
],
"topIps": [
{
"ip": "203.0.113.7",
"count": 188
}
],
"actionCounts": [
{
"action": "managed_challenge",
"count": 2398
}
],
"sourceCounts": [
{
"source": "firewallCustom",
"count": 2398
}
],
"hourly": [
{
"hourStart": "2026-07-28T06:00:00.000Z",
"count": 96
}
],
"truncated": false,
"topTrustedPaths": [
{
"path": "/wp-json/wc/v3/webhooks",
"count": 214
}
],
"topTrustedBots": [
{
"bot": "Googlebot",
"category": "search",
"count": 148
},
{
"bot": "ClaudeBot",
"category": "ai",
"count": 25
},
{
"bot": "GPTBot",
"category": "ai",
"count": 11
}
]
}
],
"zoneFailures": [],
"ai": {
"status": "completed",
"severity": "normal",
"confidence": "high",
"languages": {
"sv": {
"headline": "2 354 automatiska besöksförsök stoppades – bara 1,8 % klarade verifieringen",
"summary": "Ditt målgruppsfilter för Sverige utmanade 2 398 besök utanför målgruppen. Endast 44 klarade verifieringen – riktiga besökare som släpptes in på ett par sekunder. Resten var automatiserad trafik som aldrig nådde din webbplats. Betrodda tjänster som Googles indexeringsbot släpptes förbi automatiskt.",
"observations": [
"Botarna försökte främst nå inloggningssidor, ett tecken på automatiska intrångsförsök som stoppades"
],
"recommendations": []
},
"en": {
"headline": "2,354 automated visit attempts were stopped — only 1.8% passed verification",
"summary": "Your Sweden audience filter challenged 2,398 visits from outside the audience. Only 44 passed verification — real visitors who were let in within a couple of seconds. The rest was automated traffic that never reached your site. Trusted services such as Google's indexing bot were let through automatically.",
"observations": [
"Bots mostly targeted login pages, a sign of automated intrusion attempts that were stopped"
],
"recommendations": []
}
}
},
"topTrustedPaths": [
{
"path": "/wp-json/wc/v3/webhooks",
"count": 214
},
{
"path": "/sitemap-index",
"count": 88
}
],
"topTrustedBots": [
{
"bot": "Googlebot",
"category": "search",
"count": 148
},
{
"bot": "ClaudeBot",
"category": "ai",
"count": 25
},
{
"bot": "GPTBot",
"category": "ai",
"count": 11
},
{
"bot": "OAI-SearchBot",
"category": "ai",
"count": 4
},
{
"bot": "UptimeRobot",
"category": "monitoring",
"count": 96
}
]
}
}