'search', self::CATEGORY_TRAINING => 'ai-train', self::CATEGORY_AGENT => 'ai-input', ]; /** Bumped whenever the bundled bot list below changes. Display-only. */ const REGISTRY_VERSION = '2026.09.1'; /** * Get the full bot list, filterable by third parties. * * @return array */ public static function get_bots(): array { return apply_filters( 'adminoptim_ai_bot_registry', self::bundled_bots() ); } /** * Bundled, hand-maintained bot list. * * @return array */ private static function bundled_bots(): array { return [ // -- Search -- [ 'user_agent' => 'Googlebot', 'category' => self::CATEGORY_SEARCH, 'operator' => 'Google', 'verified' => true, ], [ 'user_agent' => 'Bingbot', 'category' => self::CATEGORY_SEARCH, 'operator' => 'Microsoft', 'verified' => true, ], [ 'user_agent' => 'DuckDuckBot', 'category' => self::CATEGORY_SEARCH, 'operator' => 'DuckDuckGo', 'verified' => true, ], [ 'user_agent' => 'Applebot', 'category' => self::CATEGORY_SEARCH, 'operator' => 'Apple', 'verified' => true, ], [ 'user_agent' => 'OAI-SearchBot', 'category' => self::CATEGORY_SEARCH, 'operator' => 'OpenAI', 'verified' => true, ], // -- Agent -- [ 'user_agent' => 'ChatGPT-User', 'category' => self::CATEGORY_AGENT, 'operator' => 'OpenAI', 'verified' => true, ], [ 'user_agent' => 'PerplexityBot', 'category' => self::CATEGORY_AGENT, 'operator' => 'Perplexity', 'verified' => true, ], [ 'user_agent' => 'Claude-User', 'category' => self::CATEGORY_AGENT, 'operator' => 'Anthropic', 'verified' => true, ], // -- Training -- [ 'user_agent' => 'GPTBot', 'category' => self::CATEGORY_TRAINING, 'operator' => 'OpenAI', 'verified' => true, ], [ 'user_agent' => 'Google-Extended', 'category' => self::CATEGORY_TRAINING, 'operator' => 'Google', 'verified' => true, ], [ 'user_agent' => 'CCBot', 'category' => self::CATEGORY_TRAINING, 'operator' => 'Common Crawl', 'verified' => false, ], [ 'user_agent' => 'Bytespider', 'category' => self::CATEGORY_TRAINING, 'operator' => 'ByteDance', 'verified' => false, ], [ 'user_agent' => 'anthropic-ai', 'category' => self::CATEGORY_TRAINING, 'operator' => 'Anthropic', 'verified' => true, ], [ 'user_agent' => 'cohere-ai', 'category' => self::CATEGORY_TRAINING, 'operator' => 'Cohere', 'verified' => true, ], [ 'user_agent' => 'Diffbot', 'category' => self::CATEGORY_TRAINING, 'operator' => 'Diffbot', 'verified' => false, ], [ 'user_agent' => 'omgili', 'category' => self::CATEGORY_TRAINING, 'operator' => 'Webz.io', 'verified' => false, ], [ 'user_agent' => 'omgilibot', 'category' => self::CATEGORY_TRAINING, 'operator' => 'Webz.io', 'verified' => false, ], ]; } /** * Get bots belonging to a single category. * * @param string $category One of the CATEGORY_* constants. * @return array */ public static function get_by_category( string $category ): array { return array_values( array_filter( self::get_bots(), fn( $bot ) => $bot['category'] === $category ) ); } }