Cache counters for verified search-engine crawlers
Auth: Authorization: Bearer nsin_… or X-Api-Key: nsin_… — see API keys.
The cache section restricted to requests from verified search-engine crawlers (Googlebot, Bingbot, Applebot, DuckDuckBot, YandexBot) — the traffic the domain's bot cache serves — split per crawler. A spoofed User-Agent never counts: "verified" is the edge's own verdict against the operator's published IP ranges or reverse DNS. With the bot cache off the numbers show what crawlers get from the ordinary cache, which is the baseline the feature improves.
Query parameters
- domainstringrequiredquery
The domain name (for example
example.com). These endpoints take the domain as a query parameter rather than a path segment. - periodstringquery
Time window, ending now. Time series are bucketed by minute for
1h, by hour up to48h, and by day for7dand30d. Buckets are cut on Asia/Tehran (UTC+03:30) boundaries and emitted as UTC instants, so an hourly bucket starts at:30UTC. An unrecognised value falls back to24h.One of:"1h""3h""6h""12h""24h""48h""7d""30d"Default:"24h" - hostnamestringquery
Narrow to one subdomain. Matches the exact host, any subdomain of it, or a bare label — so
example.commatchesapi.example.com, andapimatchesapi.example.com, butexammatches neither. - pathstringquery
Narrow to a URL path prefix.
Responses
200Crawler cache counters.
Content type: application/json
- requestsinteger
Requests from verified search-engine crawlers.
- hitsinteger
Crawler requests answered from the bot cache.
- missesinteger
Crawler requests that missed it.
- bypassinteger
Crawler requests that bypassed it.
- hit_ratenumber
hits / (hits + misses)as a percentage;0with no cache lookups. - by_kindarray of object
The same counters per crawler, busiest first.
Item fields
- kindstring
- requestsinteger
- hitsinteger
- missesinteger
- bypassinteger
- hit_ratenumber
{
"requests": 0,
"hits": 0,
"misses": 0,
"bypass": 0,
"hit_rate": 0,
"by_kind": [
{
"kind": "googlebot",
"requests": 0,
"hits": 0,
"misses": 0,
"bypass": 0,
"hit_rate": 0
}
]
}400The domain query parameter is missing.
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "domain is required"
}401Missing, malformed, revoked or expired API key. (A valid key whose
account has been deactivated gets 403 account is inactive instead.)
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "invalid API key"
}402The domain has no active plan at all, so no plan feature is available
on it. Buy or renew a plan for the domain. (A plan that is active but
does not include the feature answers 403 instead.)
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "This domain does not have an active plan."
}403The domain's plan does not include the feature this endpoint needs
(monitoring for most sections, logs for raw and top-N request data).
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "read-only API key"
}404No such domain, or it is not visible to this account. Domains you cannot access are reported as not found rather than forbidden.
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "read-only API key"
}429The key exceeded its request budget (300 requests per minute by default).
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "rate limit exceeded"
}503Either the analytics backend is temporarily unreachable (retry; no data
is lost), or the answer is still being computed. The per-domain
sections and the cached account-wide views (domains-overview,
global-summary, global-summary/peak, requests-compare,
bandwidth-overview, nodes-overview) wait at most about 25 seconds
for their query; past that they answer 503 with pending: true and
a Retry-After header, while the query keeps running and caches its
result, so the retry is served from that cache instead of starting the
same scan again. Identical concurrent requests share one computation.
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
- pendingboolean
truewhen the query is still running rather than failing. Retry afterRetry-Afterseconds.
{
"error": "analytics unavailable"
}Example request
curl -X GET "https://api.nsin.ir/analytics/bot-cache?domain=example.com" \
-H "Authorization: Bearer $NSIN_API_KEY"