Install
Web server & CDN snippets
When DNS can't change, your server or CDN keeps serving the site and forwards only bot requests to Wrenda. The snippets below are generated by the same code the dashboard uses, with example.com as the domain — the wizard renders them with yours.
How it works
Every snippet does one thing: test the User-Agent against Wrenda's canonical bot pattern and, on a match, proxy the request to https://api.wrenda.ai/proxy/{your-domain}{path}. Wrenda then classifies the bot against your rules and applies optimize, pre-render, pass-through or block, exactly as it would in DNS proxy mode. Because the classification happens on Wrenda's side, the pasted pattern never needs updating when new crawlers appear — Wrenda's registry is updated centrally.
The snippets forward these headers so Wrenda can log and route correctly:
Host- Your domain — Wrenda uses it to find the domain record.
X-Forwarded-Host- The hostname the visitor requested.
User-Agent- The original crawler user agent, unchanged.
X-Real-IP- Best-effort visitor IP for logs. Wrenda only trusts the IP it sees at its own edge.
Server snippets
In the dashboard these are shown on the final wizard step for CDN Integration and Web Server Proxy, with your domain substituted. Replace example.com and <api key> if you copy from here.
Nginx
# Wrenda AI Crawler Proxy Configuration for example.com
# Add this to your Nginx configuration.
#
# Routes ALL bot traffic to Wrenda. Wrenda classifies the bot and applies
# the right action (optimize / pre-render / pass-through / block) based
# on routing templates configured in your dashboard.
# Detect bots that should be routed to Wrenda
map $http_user_agent $is_wrenda_crawler {
default 0;
"~*GPTBot|OAI-SearchBot|SearchGPT|ChatGPT-User|ChatGPT|ClaudeBot|Claude-Web|Claude-SearchBot|Claude-User|Anthropic-User-Agent|anthropic-ai|anthropic|Claude|Google-Extended|Gemini-Deep-Research|Gemini-Ai|Gemini-Pro|Bard|Googlebot|Google-InspectionTool|GoogleOther|AdsBot|Bingbot|BingPreview|msnbot|Copilot|PerplexityBot|Perplexity-User|PerplexityProxy|Perplexity|Meta-ExternalAgent|Meta-ExternalFetcher|FacebookBot|facebookexternalhit|Applebot-Extended|Applebot|Amazonbot|Bytespider|CCBot|cohere-ai|cohere|MistralAI-User|YouBot|YouChat|Diffbot|DuckAssistBot|DuckDuckBot|AI2Bot|Phind|img2dataset|omgilibot|omgili|YandexBot|Yandex|Baiduspider|Baidu|Slurp|SeznamBot|Sogou|Exabot|PetalBot|Timpibot|ia_archiver|Twitterbot|LinkedInBot|WhatsApp|Slackbot|TelegramBot|AhrefsBot|SemrushBot|MJ12bot|DotBot|Scrapy|peer39_crawler|crawler|crawl|spider|scrape|fetch|wget|curl|bot" 1;
}
server {
# ... your existing server configuration ...
location / {
# Forward bot traffic to Wrenda
if ($is_wrenda_crawler) {
proxy_pass https://api.wrenda.ai/proxy/example.com$request_uri;
proxy_set_header Host example.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Authorization "Bearer <api key>";
proxy_ssl_server_name on;
}
# Your existing configuration for non-bot traffic
# proxy_pass http://your-origin;
}
}Apache
# Wrenda AI Crawler Proxy Configuration for example.com
# Add this to your Apache VirtualHost or .htaccess.
# Requires: mod_proxy, mod_proxy_http, mod_rewrite, mod_headers
#
# Routes ALL bot traffic to Wrenda. Wrenda decides per-bot what to do
# based on routing templates configured in your dashboard.
RewriteEngine On
# Forward bot traffic to Wrenda
RewriteCond %{HTTP_USER_AGENT} (GPTBot|OAI-SearchBot|SearchGPT|ChatGPT-User|ChatGPT|ClaudeBot|Claude-Web|Claude-SearchBot|Claude-User|Anthropic-User-Agent|anthropic-ai|anthropic|Claude|Google-Extended|Gemini-Deep-Research|Gemini-Ai|Gemini-Pro|Bard|Googlebot|Google-InspectionTool|GoogleOther|AdsBot|Bingbot|BingPreview|msnbot|Copilot|PerplexityBot|Perplexity-User|PerplexityProxy|Perplexity|Meta-ExternalAgent|Meta-ExternalFetcher|FacebookBot|facebookexternalhit|Applebot-Extended|Applebot|Amazonbot|Bytespider|CCBot|cohere-ai|cohere|MistralAI-User|YouBot|YouChat|Diffbot|DuckAssistBot|DuckDuckBot|AI2Bot|Phind|img2dataset|omgilibot|omgili|YandexBot|Yandex|Baiduspider|Baidu|Slurp|SeznamBot|Sogou|Exabot|PetalBot|Timpibot|ia_archiver|Twitterbot|LinkedInBot|WhatsApp|Slackbot|TelegramBot|AhrefsBot|SemrushBot|MJ12bot|DotBot|Scrapy|peer39_crawler|crawler|crawl|spider|scrape|fetch|wget|curl|bot) [NC]
RewriteRule ^(.*)$ https://api.wrenda.ai/proxy/example.com/$1 [P,L]
# Proxy settings for Wrenda requests
ProxyPreserveHost Off
ProxyPassReverse / https://api.wrenda.ai/proxy/example.com/
# Forward required headers
RequestHeader set X-Forwarded-Host "%{HTTP_HOST}e"
RequestHeader set X-Real-IP "%{REMOTE_ADDR}e"
RequestHeader set Authorization "Bearer <api key>"
# Enable these Apache modules if not already enabled:
# a2enmod proxy proxy_http rewrite headersCaddy
# Wrenda AI Crawler Proxy Configuration for example.com
# Add this to your Caddyfile.
#
# Routes ALL bot traffic to Wrenda. Per-bot routing decisions happen
# server-side via routing templates in your dashboard.
example.com {
@wrenda_crawler {
header_regexp User-Agent (?i)(GPTBot|OAI-SearchBot|SearchGPT|ChatGPT-User|ChatGPT|ClaudeBot|Claude-Web|Claude-SearchBot|Claude-User|Anthropic-User-Agent|anthropic-ai|anthropic|Claude|Google-Extended|Gemini-Deep-Research|Gemini-Ai|Gemini-Pro|Bard|Googlebot|Google-InspectionTool|GoogleOther|AdsBot|Bingbot|BingPreview|msnbot|Copilot|PerplexityBot|Perplexity-User|PerplexityProxy|Perplexity|Meta-ExternalAgent|Meta-ExternalFetcher|FacebookBot|facebookexternalhit|Applebot-Extended|Applebot|Amazonbot|Bytespider|CCBot|cohere-ai|cohere|MistralAI-User|YouBot|YouChat|Diffbot|DuckAssistBot|DuckDuckBot|AI2Bot|Phind|img2dataset|omgilibot|omgili|YandexBot|Yandex|Baiduspider|Baidu|Slurp|SeznamBot|Sogou|Exabot|PetalBot|Timpibot|ia_archiver|Twitterbot|LinkedInBot|WhatsApp|Slackbot|TelegramBot|AhrefsBot|SemrushBot|MJ12bot|DotBot|Scrapy|peer39_crawler|crawler|crawl|spider|scrape|fetch|wget|curl|bot)
}
# Forward bot traffic to Wrenda
reverse_proxy @wrenda_crawler https://api.wrenda.ai {
header_up Host example.com
header_up X-Forwarded-Host {host}
header_up X-Real-IP {remote}
header_up Authorization "Bearer <api key>"
rewrite /proxy/example.com{uri}
}
# Your existing configuration for non-bot traffic
# reverse_proxy your-origin:port
}Cloudflare Worker
// Wrenda AI Crawler Proxy — Cloudflare Worker
// Deploy this worker and create a route for example.com/*
//
// This forwards ALL bot traffic to Wrenda. Wrenda then classifies the
// request and applies the right action (optimize / pre-render /
// pass-through / block) based on the routing templates you configure
// in your dashboard. You don't need to update this file when new AI
// crawlers emerge — Wrenda's bot list is updated server-side.
const WRENDA_BOT_PATTERN = /GPTBot|OAI-SearchBot|SearchGPT|ChatGPT-User|ChatGPT|ClaudeBot|Claude-Web|Claude-SearchBot|Claude-User|Anthropic-User-Agent|anthropic-ai|anthropic|Claude|Google-Extended|Gemini-Deep-Research|Gemini-Ai|Gemini-Pro|Bard|Googlebot|Google-InspectionTool|GoogleOther|AdsBot|Bingbot|BingPreview|msnbot|Copilot|PerplexityBot|Perplexity-User|PerplexityProxy|Perplexity|Meta-ExternalAgent|Meta-ExternalFetcher|FacebookBot|facebookexternalhit|Applebot-Extended|Applebot|Amazonbot|Bytespider|CCBot|cohere-ai|cohere|MistralAI-User|YouBot|YouChat|Diffbot|DuckAssistBot|DuckDuckBot|AI2Bot|Phind|img2dataset|omgilibot|omgili|YandexBot|Yandex|Baiduspider|Baidu|Slurp|SeznamBot|Sogou|Exabot|PetalBot|Timpibot|ia_archiver|Twitterbot|LinkedInBot|WhatsApp|Slackbot|TelegramBot|AhrefsBot|SemrushBot|MJ12bot|DotBot|Scrapy|peer39_crawler|crawler|crawl|spider|scrape|fetch|wget|curl|bot/i;
const WRENDA_PROXY_URL = 'https://api.wrenda.ai/proxy/example.com';
export default {
async fetch(request, env, ctx) {
const userAgent = request.headers.get('User-Agent') || '';
// Forward all bot traffic to Wrenda — let Wrenda decide what to do.
if (WRENDA_BOT_PATTERN.test(userAgent)) {
const url = new URL(request.url);
const wrendaUrl = WRENDA_PROXY_URL + url.pathname + url.search;
const wrendaRequest = new Request(wrendaUrl, {
method: request.method,
headers: new Headers({
'Host': 'example.com',
'User-Agent': userAgent,
'Accept': request.headers.get('Accept') || '*/*',
'X-Forwarded-For': request.headers.get('CF-Connecting-IP') || '',
'X-Forwarded-Host': url.hostname,
'X-Real-IP': request.headers.get('CF-Connecting-IP') || '',
'Authorization': 'Bearer <api key>'
})
});
return fetch(wrendaRequest);
}
// Non-bot traffic: pass through to origin untouched.
return fetch(request);
}
};Express.js
// Wrenda AI Crawler Proxy Middleware for Express.js
// npm install http-proxy-middleware
//
// Forwards ALL bot traffic to Wrenda. Per-bot routing decisions happen
// server-side via routing templates in your dashboard.
const { createProxyMiddleware } = require('http-proxy-middleware');
const WRENDA_BOT_PATTERN = /GPTBot|OAI-SearchBot|SearchGPT|ChatGPT-User|ChatGPT|ClaudeBot|Claude-Web|Claude-SearchBot|Claude-User|Anthropic-User-Agent|anthropic-ai|anthropic|Claude|Google-Extended|Gemini-Deep-Research|Gemini-Ai|Gemini-Pro|Bard|Googlebot|Google-InspectionTool|GoogleOther|AdsBot|Bingbot|BingPreview|msnbot|Copilot|PerplexityBot|Perplexity-User|PerplexityProxy|Perplexity|Meta-ExternalAgent|Meta-ExternalFetcher|FacebookBot|facebookexternalhit|Applebot-Extended|Applebot|Amazonbot|Bytespider|CCBot|cohere-ai|cohere|MistralAI-User|YouBot|YouChat|Diffbot|DuckAssistBot|DuckDuckBot|AI2Bot|Phind|img2dataset|omgilibot|omgili|YandexBot|Yandex|Baiduspider|Baidu|Slurp|SeznamBot|Sogou|Exabot|PetalBot|Timpibot|ia_archiver|Twitterbot|LinkedInBot|WhatsApp|Slackbot|TelegramBot|AhrefsBot|SemrushBot|MJ12bot|DotBot|Scrapy|peer39_crawler|crawler|crawl|spider|scrape|fetch|wget|curl|bot/i;
const wrendaProxy = createProxyMiddleware({
target: 'https://api.wrenda.ai',
changeOrigin: true,
pathRewrite: (path) => `/proxy/example.com${path}`,
onProxyReq: (proxyReq, req) => {
proxyReq.setHeader('Host', 'example.com');
proxyReq.setHeader('X-Forwarded-Host', req.headers.host || 'example.com');
proxyReq.setHeader('X-Real-IP', req.ip || req.connection.remoteAddress);
proxyReq.setHeader('Authorization', 'Bearer <api key>');
}
});
// Apply middleware BEFORE your routes
app.use((req, res, next) => {
const userAgent = req.headers['user-agent'] || '';
if (WRENDA_BOT_PATTERN.test(userAgent)) {
return wrendaProxy(req, res, next);
}
next();
});
// Your existing routes below...HAProxy
# Wrenda AI Crawler Proxy Configuration for HAProxy
# Add this to your HAProxy configuration.
#
# Forwards ALL bot traffic to Wrenda. Per-bot routing decisions happen
# server-side via routing templates in your dashboard.
frontend http_front
bind *:80
bind *:443 ssl crt /path/to/cert.pem
# Detect bots via the canonical Wrenda pattern
acl is_wrenda_bot hdr_reg(User-Agent) -i GPTBot|OAI-SearchBot|SearchGPT|ChatGPT-User|ChatGPT|ClaudeBot|Claude-Web|Claude-SearchBot|Claude-User|Anthropic-User-Agent|anthropic-ai|anthropic|Claude|Google-Extended|Gemini-Deep-Research|Gemini-Ai|Gemini-Pro|Bard|Googlebot|Google-InspectionTool|GoogleOther|AdsBot|Bingbot|BingPreview|msnbot|Copilot|PerplexityBot|Perplexity-User|PerplexityProxy|Perplexity|Meta-ExternalAgent|Meta-ExternalFetcher|FacebookBot|facebookexternalhit|Applebot-Extended|Applebot|Amazonbot|Bytespider|CCBot|cohere-ai|cohere|MistralAI-User|YouBot|YouChat|Diffbot|DuckAssistBot|DuckDuckBot|AI2Bot|Phind|img2dataset|omgilibot|omgili|YandexBot|Yandex|Baiduspider|Baidu|Slurp|SeznamBot|Sogou|Exabot|PetalBot|Timpibot|ia_archiver|Twitterbot|LinkedInBot|WhatsApp|Slackbot|TelegramBot|AhrefsBot|SemrushBot|MJ12bot|DotBot|Scrapy|peer39_crawler|crawler|crawl|spider|scrape|fetch|wget|curl|bot
# Forward bot traffic to Wrenda
use_backend wrenda_backend if is_wrenda_bot
# Default backend for non-bot traffic
default_backend origin_backend
backend wrenda_backend
option httpchk GET /health
http-request set-header Host example.com
http-request set-header X-Forwarded-Host %[req.hdr(Host)]
http-request set-header Authorization "Bearer <api key>"
http-request set-path /proxy/example.com%[path]
server wrenda api.wrenda.ai:443 ssl verify required ca-file /etc/ssl/certs/ca-certificates.crt
backend origin_backend
# Your origin server configuration
server origin your-origin:80CDN providers
For a CDN, Wrenda becomes an additional origin used only for bot traffic.
Cloudflare (zone stays proxied)
- Workers & Pages → Create → Hello World; replace the code with the Cloudflare Worker snippet above and deploy.
- In the zone: Workers Routes → Add route with the pattern
your-domain.com/*and select the worker. Routes bind a pattern to a script; there is no separate origin field — the script decides where to fetch from. - Verify with the curl below.
AWS CloudFront
- Origin domain
api.wrenda.ai- Origin path
/proxy/your-domain.com- Protocol
- HTTPS only
- Custom origin header
Authorization=Bearer <api key>- Behaviour
- Route bot user agents to this origin (a cache policy that forwards the User-Agent and Host headers, or a CloudFront Function that rewrites the request).
Fastly
Add api.wrenda.ai as a backend with the Host header set to your domain, then prepend the proxy path for bot requests:
set bereq.url = "/proxy/your-domain.com" + bereq.url;
set bereq.http.Authorization = "Bearer <api key>";KeyCDN
- Origin URL
https://api.wrenda.ai/proxy/your-domain.com- SSL
- Full (strict)
- Forward Host header
- Enabled
- Origin request header
Authorization: Bearer <api key>
Any other CDN
Configure a second origin at api.wrenda.ai with the path prefix /proxy/your-domain.com, forward the Host and User-Agent headers, add Authorization: Bearer <api key> as an origin request header, use TLS to the origin, and route only bot user agents to it. If your CDN can't route by user agent, contact support with the provider name and your domain.
Verify
Wrenda cannot see your server's configuration, so it can't confirm the forwarding for you. After you click Save & Verify with Crawl Tester the domain is marked configured and you land in Bot Testing pre-loaded with GPTBot/1.0 and your domain.
curl -I -H "User-Agent: GPTBot/1.0" "https://your-domain.com/"
curl -I -H "User-Agent: Googlebot/2.1" "https://your-domain.com/"X-Correlation-ID— the request was processed by Wrenda.X-Crawler-Action: optimize(orpre-render) — a crawler rule matched.X-AI-Optimized: truefor GPTBot in Active mode;X-Pre-Rendered: truefor Googlebot when a pre-render rule exists.- In Shadow mode,
X-Wrenda-Mode: shadowand the original content.
If none of these headers appear, your server isn't forwarding crawler traffic to Wrenda yet. A 401 means the Authorization header is missing or wrong.