OpenBotAuth helps publishers control automated access from AI crawlers and agents. It verifies requests using RFC 9421 HTTP Message Signatures (via a configurable verifier) and applies per-site or per-post policies like allow, deny, teaser previews, and 402 payment-required responses. It also publishes AI-friendly endpoints like llms.txt, a JSON feed, and per-post Markdown.
Instead of blocking all bots or allowing unrestricted access, you can:
OpenBotAuth provides machine-readable endpoints for AI systems:
Configure which post types to include (posts, pages, or custom types) and set the feed limit (up to 500 items). All data is served locally from your WordPress database. No external tracking or telemetry. Only published, non-password-protected posts are exposed.
This plugin connects to an external verifier service. When a signed bot request is received, the plugin sends the following data to your configured verifier URL via wp_remote_post:
Privacy protection: Sensitive headers (cookies, authorization, proxy-authorization, www-authenticate) are NEVER forwarded, even if present in the request. If a bot’s signature covers a sensitive header, verification will fail with a clear error.
No WordPress user accounts or personal data is transmitted. Only the headers explicitly covered by the bot’s signature are forwarded to enable cryptographic verification. Note that the URL may include query parameters depending on your site’s structure.
You can:
* Use the hosted verifier at https://verifier.openbotauth.org/verify
* Self-host the verifier service (see documentation)
* The verifier service may log requests server-side depending on your configuration
Analytics are local-only. Decision counts (allow/teaser/deny/pay/rate_limit) and bot traffic observations (User-Agent based) are stored in your WordPress database. No analytics data is sent to external servers.
For more information, please review our Terms of Service and Privacy Policy.
openbotauth_policy
Modify policy before applying:
add_filter('openbotauth_policy', function($policy, $post) {
if ($post->post_type === 'premium') {
$policy['price_cents'] = 1000;
}
return $policy;
}, 10, 2);
openbotauth_verified
Triggered when a bot is verified:
add_action('openbotauth_verified', function($agent, $post) {
error_log("Bot {$agent['jwks_url']} accessed post {$post->ID}");
}, 10, 2);
openbotauth_payment_required
Triggered when 402 is returned:
add_action('openbotauth_payment_required', function($agent, $post, $price) {
// Track payment requests
}, 10, 3);
openbotauth_should_serve_llms_txt
Disable llms.txt endpoint (e.g., when using Yoast):
add_filter('openbotauth_should_serve_llms_txt', '__return_false');
openbotauth_should_serve_feed
Disable JSON feed endpoint:
add_filter('openbotauth_should_serve_feed', '__return_false');
openbotauth_should_serve_markdown
Disable markdown endpoints:
add_filter('openbotauth_should_serve_markdown', '__return_false');
openbotauth_feed_item
Modify feed items:
add_filter('openbotauth_feed_item', function($item, $post) {
$item['custom_field'] = get_post_meta($post->ID, 'my_field', true);
return $item;
}, 10, 2);
openbotauth_markdown_content
Post-process markdown output:
add_filter('openbotauth_markdown_content', function($markdown, $post) {
return $markdown . "\n\n---\nCopyright notice here";
}, 10, 2);