curl --request GET \
--url https://server.promptwatch.com/api/v2/analytics/crawlers/trend \
--header 'X-API-Key: <api-key>'import requests
url = "https://server.promptwatch.com/api/v2/analytics/crawlers/trend"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://server.promptwatch.com/api/v2/analytics/crawlers/trend', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.promptwatch.com/api/v2/analytics/crawlers/trend",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://server.promptwatch.com/api/v2/analytics/crawlers/trend"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://server.promptwatch.com/api/v2/analytics/crawlers/trend")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/analytics/crawlers/trend")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"dates": [
"2026-03-14",
"2026-03-15"
],
"series": [
{
"name": "OpenAI GPTBot",
"data": [
2100,
2240
]
},
{
"name": "Perplexity Bot",
"data": [
980,
1012
]
}
]
}{
"error": "Bad Request",
"code": "DATE_RANGE_TOO_LARGE",
"message": "Date range cannot exceed 90 days"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}Crawler Activity Trends
Get crawler activity trends over time. If the crawlers query parameter is omitted, the response includes all verified AI crawler types that have data in the selected range; unverified fallback buckets (e.g. anthropic-claude-user-unverified) are only included when explicitly requested. Projects with no recorded crawler logs return empty dates and series.
curl --request GET \
--url https://server.promptwatch.com/api/v2/analytics/crawlers/trend \
--header 'X-API-Key: <api-key>'import requests
url = "https://server.promptwatch.com/api/v2/analytics/crawlers/trend"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://server.promptwatch.com/api/v2/analytics/crawlers/trend', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.promptwatch.com/api/v2/analytics/crawlers/trend",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://server.promptwatch.com/api/v2/analytics/crawlers/trend"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://server.promptwatch.com/api/v2/analytics/crawlers/trend")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/analytics/crawlers/trend")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"dates": [
"2026-03-14",
"2026-03-15"
],
"series": [
{
"name": "OpenAI GPTBot",
"data": [
2100,
2240
]
},
{
"name": "Perplexity Bot",
"data": [
980,
1012
]
}
]
}{
"error": "Bad Request",
"code": "DATE_RANGE_TOO_LARGE",
"message": "Date range cannot exceed 90 days"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}Authorizations
API key for authentication. Get yours from the Promptwatch dashboard under Settings > API Keys.
Query Parameters
Start date for analytics data (YYYY-MM-DD). Max range 90 days.
End date for analytics data (YYYY-MM-DD). Max range 90 days.
Filter by crawler(s). Repeat for multiple: crawlers=openai-gptbot&crawlers=perplexity-bot. Allowed: openai-gptbot, openai-searchbot, openai-chatgpt-user, openai-adsbot, anthropic-claudebot, anthropic-claude-user, anthropic-claude-user-unverified, anthropic-claude-search-bot, anthropic-claude-web, perplexity-bot, perplexity-user, cohere-ai, mistral-ai-user, mistral-ai-index, deepseek-bot, x-ai-grok-bot, x-ai-grok-search, x-ai-grok-deep-search, google-extended, google-mobile-agent, google-desktop-agent, meta-web-indexer, meta-external-agent, meta-external-fetcher, meta-facebook-bot. If omitted, only verified AI crawlers are included; unverified fallback buckets (e.g. anthropic-claude-user-unverified) are only included when explicitly requested.
openai-gptbot, openai-searchbot, openai-chatgpt-user, openai-adsbot, anthropic-claudebot, anthropic-claude-user, anthropic-claude-user-unverified, anthropic-claude-search-bot, anthropic-claude-web, perplexity-bot, perplexity-user, cohere-ai, mistral-ai-user, mistral-ai-index, deepseek-bot, x-ai-grok-bot, x-ai-grok-search, x-ai-grok-deep-search, google-extended, google-mobile-agent, google-desktop-agent, meta-web-indexer, meta-external-agent, meta-external-fetcher, meta-facebook-bot IANA timezone for date bucketing (e.g., 'America/Los_Angeles')
Filter by specific page path
Path matching mode: 'exact' for exact match, 'partial' for prefix match (default: 'partial')
exact, partial