{"id":364882,"date":"2026-09-09T09:15:12","date_gmt":"2026-09-09T09:15:12","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/otterlyai-agent-analytics\/"},"modified":"2026-09-09T08:59:43","modified_gmt":"2026-09-09T08:59:43","slug":"otterlyai-agent-analytics","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/otterlyai-agent-analytics\/","author":23561367,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"trunk","tested":"7.1","requires":"5.0","requires_php":"7.2","requires_plugins":null,"header_name":"OtterlyAI Agent Analytics","header_author":"OtterlyAI","header_description":"Reports every AI crawler and bot request to OtterlyAI Agent Analytics. Handled server-side by WordPress.","assets_banners_color":"","last_updated":"2026-09-09 08:59:43","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/otterly.ai","rating":0,"author_block_rating":0,"active_installs":0,"downloads":36,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":[],"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":[],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2353,232,4866,12928,1955],"plugin_category":[36],"plugin_contributors":[279895],"plugin_business_model":[],"class_list":["post-364882","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-analytics","plugin_tags-bots","plugin_tags-crawlers","plugin_tags-logs","plugin_category-analytics","plugin_contributors-otterlyai","plugin_committers-otterlyai"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/otterlyai-agent-analytics.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>AI assistants read your site. OtterlyAI Agent Analytics shows you which ones, how often, and which pages they take.<\/p>\n\n<p>This plugin is the WordPress data source for that. It watches incoming requests, and whenever one comes from a known AI agent \u2014 GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Bytespider, CCBot and around forty more \u2014 it reports that single request to OtterlyAI.<\/p>\n\n<p>It is handled entirely server-side by WordPress:<\/p>\n\n<ul>\n<li>No JavaScript is added to your pages, so nothing slows down for your visitors and nothing can be blocked by an ad blocker.<\/li>\n<li>The report is sent after the response has already gone out, so a page never waits on it.<\/li>\n<li>Ordinary human traffic is never reported. Only requests whose User-Agent matches a bundled AI-agent signature.<\/li>\n<\/ul>\n\n<p>You need an OtterlyAI account and an Agent Analytics key. Enter it under Settings \u2192 OtterlyAI and press Save and validate.<\/p>\n\n<h4>External service<\/h4>\n\n<p>This plugin sends data to OtterlyAI Agent Analytics (https:\/\/analytics.otterly.ai), a service operated by OtterlyAI. Nothing is sent until a site administrator saves an Agent Analytics key.<\/p>\n\n<p>When something is sent: only for a request whose User-Agent matches one of the AI-agent signatures bundled with the plugin.<\/p>\n\n<p>What is sent, for such a request \u2014 exactly five fields:<\/p>\n\n<ol>\n<li>the requested URL,<\/li>\n<li>the matched User-Agent string,<\/li>\n<li>the timestamp of the request,<\/li>\n<li>the referer, if the request had one,<\/li>\n<li>the HTTP response status the server returned for the request.<\/li>\n<\/ol>\n\n<p>What is not sent: No IP address is collected or transmitted \u2014 the plugin does not read any IP header at all. No cookies. No visitor, user or account data. No page content. Nothing at all for ordinary visitor traffic.<\/p>\n\n<p>The key itself is also sent, as an HTTP Authorization header, to authenticate the report and to check the key when you press Save and validate.<\/p>\n\n<p>Service terms: https:\/\/otterly.ai\/terms\nPrivacy policy: https:\/\/otterly.ai\/privacy<\/p>\n\n<h4>The AI agent list<\/h4>\n\n<p>The list of AI-agent signatures is bundled with the plugin, not fetched from anywhere. It is kept current by publishing new plugin versions here, so updating the plugin is how you get newly-appeared crawlers.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin transmits request metadata for AI-agent traffic only, as listed under \"External service\" above. It stores one option in your database, containing your Agent Analytics key and the result of its last validation. That option is readable only by administrators, is never exposed to visitors or through the REST API, and is deleted when the plugin is uninstalled.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>In OtterlyAI, sign in and open General \u2192 Data sources.<\/li>\n<li>Add WordPress as a logs provider for this site's domain, and copy the Agent Analytics key it shows you.<\/li>\n<li>In WordPress, open Settings \u2192 OtterlyAI, paste the key, and press Save and validate.<\/li>\n<\/ol>\n\n<p>The status turns to Connected once OtterlyAI has confirmed the key. From then on, AI-agent requests are reported automatically.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20find%20my%20agent%20analytics%20key%3F\"><h3>Where do I find my Agent Analytics key?<\/h3><\/dt>\n<dd><p>In OtterlyAI, under General \u2192 Data sources: add WordPress as a logs provider and copy the key it gives you. The key is shown once, so copy it before you close the dialog.<\/p><\/dd>\n<dt id=\"is%20this%20the%20same%20as%20my%20otterlyai%20rest%20api%20key%3F\"><h3>Is this the same as my OtterlyAI REST API key?<\/h3><\/dt>\n<dd><p>No. The Agent Analytics key belongs to the WordPress data source and can only be used to report crawler requests. Your public REST API key is separate and is not used by this plugin.<\/p><\/dd>\n<dt id=\"does%20it%20collect%20my%20visitors%27%20ip%20addresses%3F\"><h3>Does it collect my visitors' IP addresses?<\/h3><\/dt>\n<dd><p>No. The plugin never reads an IP header and never sends one.<\/p><\/dd>\n<dt id=\"it%20says%20%22not%20verified%22.%20what%20does%20that%20mean%3F\"><h3>It says \"Not verified\". What does that mean?<\/h3><\/dt>\n<dd><p>Your key was saved, but no usable answer came back, so nothing is known about the key either way. Reporting stays active, because the key is probably fine. Press Save and validate again later to confirm it.<\/p>\n\n<p>Common causes: a temporary network problem, an outbound firewall on your host, or the OtterlyAI validation service being briefly unavailable. The plugin deliberately reports this as \"Not verified\" rather than blaming your key, because a problem on our side must never look like a bad key.<\/p><\/dd>\n<dt id=\"it%20says%20otterlyai%20rejected%20my%20key.\"><h3>It says OtterlyAI rejected my key.<\/h3><\/dt>\n<dd><p>The key is wrong, incomplete, or its data source was deleted in OtterlyAI. Copy it again from General \u2192 Data sources. While a key is rejected, the plugin stops reporting rather than repeatedly sending requests that will be refused.<\/p><\/dd>\n<dt id=\"it%20says%20%22domain%20mismatch%22.\"><h3>It says \"Domain mismatch\".<\/h3><\/dt>\n<dd><p>Every Agent Analytics key belongs to one domain \u2014 the data source it was created for. The key you entered belongs to a different domain than this site, so crawler visits recorded here would be filed under that other domain, where you would never see them.<\/p>\n\n<p>The key is not saved in this case, so nothing is reported until you enter the right one. In OtterlyAI, open General \u2192 Data sources, add WordPress as a data source for this site's own domain, and use the key it gives you.<\/p><\/dd>\n<dt id=\"it%20says%20%22domain%20not%20verified%22.\"><h3>It says \"Domain not verified\".<\/h3><\/dt>\n<dd><p>OtterlyAI could not tell which domain this site is, so it did not save the key. Nothing is wrong with the key itself.<\/p>\n\n<p>WordPress normally includes the site address in the requests it makes to other services. Something on this site is removing or rewriting it \u2014 most often a security or performance plugin that edits outgoing request headers, or a host that strips them. Disable that behaviour for outgoing requests and press Save and validate again.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>No. Detection is a substring check against a bundled list, and the report is sent on the <code>shutdown<\/code> hook \u2014 after the response has already been delivered \u2014 without waiting for a reply.<\/p><\/dd>\n<dt id=\"how%20do%20i%20stop%20it%3F\"><h3>How do I stop it?<\/h3><\/dt>\n<dd><p>Open Settings \u2192 OtterlyAI, tick \"Remove the saved key and stop reporting\", and save. Deactivating or deleting the plugin also stops it, and deleting it removes the stored key. Disabling the data source in OtterlyAI revokes the key on the server side.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Reports now include the HTTP response status of the request, so pages an AI agent could not fetch are separated from pages that were served.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release. Configure your Agent Analytics key from Settings \u2192 OtterlyAI, with server-side reporting of AI crawler requests.<\/li>\n<\/ul>","raw_excerpt":"Reports every AI crawler and bot request on your site to OtterlyAI Agent Analytics. Runs server-side, in the background.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/364882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=364882"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/otterlyai"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=364882"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=364882"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=364882"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=364882"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=364882"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=364882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}