Most content protection plugins disable right click in the browser. Scrapers and AI crawlers don’t click or copy: they download the raw HTML, read the REST API and the feeds, or drive a (headless) browser. ScrapeLock works on the server, where automated copying actually happens, and leaves real visitors, customers and search engines alone.
- Runs on your own server. No account and no API key needed, and no visitor data sent anywhere by default. It downloads public IP lists; only if you turn on CDN blocking does it send the IPs it blocks to your own Cloudflare or Bunny account, with your API token (see External services).
- Starts in Monitor only. For its first 7 days a new install blocks nobody: requests that would be refused are logged as “Would block”, so you can see what it would do and adjust before it enforces. You can switch Monitor only on again at any time.
What it stops, and what it cannot
Who
Result
How
AI training crawlers that say who they are (GPTBot, ClaudeBot, CCBot, Bytespider…)
Stopped
Bot list, 403
Fake Googlebot or Bingbot
Stopped
Official IP lists plus reverse and forward DNS
Fast scrapers from one IP (IPv6: one /64)
Stopped
Per-IP limits and temporary blocks
Scanners asking for .env, .git or backups
Stopped (optional)
Ban on the first probe
Scrapers spread over many IPs
Slowed
Data center limit, surge email, Emergency Mode
Headless browsers on home connections
Slowed
Human check, bot trap, limits
Copying by hand, screenshots, logged-in scraping
Cannot be stopped
Watermark, source link and TDM leave traces
Attackers who can run PHP on your server
Out of scope
No plugin can stop them
Whatever a visitor sees has already reached their device, so nothing stops a determined human. ScrapeLock closes the automated routes and leaves traces.
Who it is for
- Publishers, recipe, course and news sites: block AI training but stay in AI search, keep post text out of the REST API, GraphQL and full-text RSS, TDM opt-out.
- WooCommerce shops: limits for the product catalogue (Store API too), cart actions and coupon attempts, private feeds for price comparison sites and Google Merchant.
- Photographers: watermarks with the clean originals kept, hotlink rules for Nginx, Apache and Cloudflare.
- Directories and listing sites: page, search and “page not found” limits, a stricter limit for data centers.
- Agencies: presets, settings export and import, WP-CLI and Site Health.
Bots and crawlers
- Real search engines vs. fakes. Googlebot, Bingbot, Applebot and Yandex are verified against their official IP lists and with reverse + forward DNS. Real crawlers are never limited or blocked; fakes get a 403.
- AI training vs. AI search. Training crawlers (GPTBot, ClaudeBot, CCBot, Google-Extended, Bytespider and more) are blocked. AI search assistants (OAI-SearchBot, ChatGPT-User, PerplexityBot, Claude-SearchBot and more) can be allowed with one option and are verified with their official IP lists, so your site still appears in AI answers with a link.
- robots.txt gets the AI crawler lines, Content Signals and the Disallow line of an invisible bot trap that catches bots ignoring it. robots.txt, llms.txt and llms-full.txt are never blocked.
- Generic HTTP libraries (curl, python-requests and the like, used by apps and integrations) pass by default; a strict option blocks them too, and the Log has an “Always allow this User-Agent” button.
- Optional blocking of headless browsers and of scripts that copy a browser’s User-Agent but not its headers. A carefully disguised automated browser is not detected this way; the limits, the human check and the bot trap still apply to it.
- New in 3.5, optional (off by default): ban scanners on their first request for .env, .git, wp-config.php backups, database dumps and backup archives.
Limits and blocks
- Per-IP limits for pages, searches, REST / GraphQL, “page not found” (404) requests, sitemaps, visitors from data centers and, with WooCommerce, cart actions and coupon attempts (IPv6: per /64). Verified search engines and real shoppers are not affected.
- 3.5: an anonymous request for a long list from the REST API (posts, pages, products) counts more toward the REST limit: 2 above 20 items per page, 3 above 50. Lists of up to 20 items and logged-in users count as before, and the WooCommerce cart and checkout are not counted. JSON 429 answers (REST API, GraphQL, cart) also carry
retry_after, the seconds of their Retry-After header.
- IPs that keep exceeding the limits are blocked for a while, optionally also at Cloudflare or Bunny CDN (“Test connection” checks the token, the zone and the permissions).
- Emergency Mode: stricter limits for 1 hour to 3 days, then your settings return on their own. When traffic suddenly jumps, ScrapeLock emails you a one-click button to start it.
- Optional human check without a captcha: visitors who have not scrolled, tapped or typed get a stricter page limit.
- Optional country rules, from Cloudflare’s or Bunny CDN’s country header or the free DB-IP Lite database.
- Optional pre-cache check (the bot list, the limits and the blocks also apply to pages served by WP Super Cache, W3 Total Cache, Cache Enabler, WP Rocket and the like) and early check (stops known bots and blocked IPs before the theme and the other plugins load).
- Always-blocked IPs / CIDR and referrers, usernames hidden from visitors, and trusted proxies (Cloudflare, Bunny CDN, your own), so the real IP cannot be spoofed.
Feeds, API and server rules
- Post, page and product text hidden from the REST API, WPGraphQL and full-text RSS for visitors: the routes scrapers use instead of the HTML.
- RSS with a short excerpt only, or disabled; with full text, an optional “The post … first appeared on …” line.
- Private XML feeds (Skroutz, BestPrice, Google Merchant, ERP) with a token in a header or the URL; only its hash is stored, it can be rotated with a grace period, and each feed has statistics.
- Optional: hide the REST API map and the versions of WordPress, PHP and the plugins, turn off XML-RPC pingbacks, list the REST routes open to anyone.
- Ready-made Nginx, Apache and Cloudflare rules for your own site, so cached pages and static files are protected too.
Check, test and tune
- Check a request (3.5, Log tab): pick GPTBot, a fake Googlebot, curl, python-requests, a browser without browser headers, a real browser or your own request, or type an IP, User-Agent and address. ScrapeLock shows whether it would allow, block or limit it, why, and where it is set. Nothing is counted, logged or blocked. Copy-ready curl lines let you test for real from another computer, and the card lists what it does not simulate (the 404 limit, the cart, the early and pre-cache checks, the bot trap).
- Staff are exempt while logged in (by default), so the admin bar reminds you: test in a private window.
- Site Health warns about settings that do not work as intended. New in 3.5: it checks that crawlers really get ScrapeLock’s robots.txt lines (a robots.txt file in the site’s root replaces the one WordPress makes) and shows the lines to paste, that ScrapeLock’s private folders cannot be read from the web, whether your text is still open through the REST API, full-text feeds or WPGraphQL while copy protection is on, and whether another plugin does the same job. These tests only fetch addresses of your own site and never write robots.txt.
- Settings that explain themselves (3.5): rejected IP lines are named after saving, unsaved changes are flagged, defaults are labelled, options that may affect visitors or SEO are tagged, and “Off” status pills link to their setting.
- Presets (Balanced, Strict, Maximum) with undo, settings export and import, and a block log with a 24-hour summary and automatic deletion.
- WP-CLI:
wp scrapelock status, block, unblock, blocked, emergency, log, check --ip=<ip> (what ScrapeLock would answer, without side effects), settings and lockdown status.
- Abilities API (WordPress 6.9+) for administrators: read the summary, block or unblock an IP and start Emergency Mode from an AI agent or MCP client. None of them unlocks Lockdown.
On the page and images
- Block right click, copy, drag and common shortcuts, or allow copying with the source link appended. Text selection stays allowed by default, because blocking it also stops screen readers’ “read selection” and translation tools.
- Printing with the page link at the bottom, or no printing; optional page blur on screenshot shortcuts; no framing by other sites.
- AI opt-out declaration (TDM): header, meta,
/.well-known/tdmrep.json, noai.
- Watermark in a corner, the centre or repeated diagonally, optionally on the full-size image too; otherwise visitors get the largest watermarked size, also in the WooCommerce zoom, lightbox and Store API. The clean original is kept, so the watermark can always be removed. Product images are not watermarked by default, because Google Merchant Center rejects them.
Lockdown
- Freeze the site with a code from your authenticator app (Google Authenticator, Microsoft Authenticator, Authy and the like). While it is locked, nobody can change plugins, themes, WordPress core, users, roles or settings from wp-admin, the REST API or XML-RPC, not even an administrator or someone who stole a password.
- Administrators are frozen completely. Shop managers and other staff roles you do not tick keep their work (orders, products, coupons, posts, media), but not the rights that could take over the site. Visitors and customers browse, order, pay, register and comment as usual.
- Also enforced against code: a bug in another plugin cannot be used to activate plugins, change the site address or the admin email, add an administrator or unlock the lock. Code that can run its own PHP on your server can get around any plugin, ScrapeLock included.
- Sealed: the lock is signed with the keys in wp-config.php and kept outside the database (a guard file, a lock file, or a line in wp-config.php), so SQL injection in another plugin cannot unlock the site. Settings changed in the database are put back.
- File integrity: every PHP, .htaccess and .user.ini file is fingerprinted and checked every hour while locked, and WordPress and the plugins from WordPress.org are compared with their official checksums. New or changed files are emailed to you and shown in Site Health; optional quarantine.
- Unlock for 15 minutes to 2 hours for yourself only, or until you lock it again; every lock and unlock is logged and emailed. Ten one-time recovery codes for a lost phone. The QR code is drawn in your browser and the secret is stored encrypted, never sent anywhere.
External services
ScrapeLock downloads public lists of IP addresses, only for the features that use them. Each download is a plain GET request for a public file, made from your server by WordPress (User-Agent “ScrapeLock/version”). No data about your site, your content or your visitors is sent, and the request does not include your site address; as with any download, the provider sees your server’s IP address. The lists are stored in your database (or, for the country database, in uploads/scrapelock-geo) and checked on your server. They are data, not code or assets: no script, style, font or image is ever loaded from these addresses.
- Google crawler IP ranges, to tell real Googlebot from fakes. Downloaded once a day while protection is enabled, from https://developers.google.com/static/search/apis/ipranges/googlebot.json, https://developers.google.com/static/search/apis/ipranges/special-crawlers.json and https://developers.google.com/static/search/apis/ipranges/user-triggered-fetchers-google.json. Provided by Google LLC: Terms of service, Privacy policy.
- Bing crawler IP ranges, to tell real Bingbot from fakes. Downloaded once a day while protection is enabled, from https://www.bing.com/toolbox/bingbot.json. Provided by Microsoft Corporation: Terms of service, Privacy policy.
- Cloudflare IP ranges, to read the real visitor IP only from Cloudflare. Downloaded once a day only when “Real visitor IP” reads the CF-Connecting-IP or X-Forwarded-For header and “Trust Cloudflare addresses” is on, from https://api.cloudflare.com/client/v4/ips. Provided by Cloudflare, Inc.: Terms of service, Privacy policy.
- Bunny CDN edge server addresses, to read the real visitor IP and country only from Bunny CDN. Downloaded once a day only when “Trust Bunny CDN addresses” is on and “Real visitor IP” reads the X-Real-IP or X-Forwarded-For header, or country rules are set, from https://bunnycdn.com/api/system/edgeserverlist and https://bunnycdn.com/api/system/edgeserverlist/IPv6. Provided by BunnyWay d.o.o. (bunny.net): Terms of service, Privacy policy.
- OpenAI bot IP ranges (OAI-SearchBot, ChatGPT-User), to tell the real bots from fakes. Downloaded once a day only when “Allow AI search engines and assistants” and “Verify AI search bots” are on, from https://openai.com/searchbot.json and https://openai.com/chatgpt-user.json. Provided by OpenAI: Terms of use, Privacy policy.
- Perplexity bot IP ranges (PerplexityBot, Perplexity-User), to tell the real bots from fakes. Downloaded once a day only when “Allow AI search engines and assistants” and “Verify AI search bots” are on, from https://www.perplexity.com/perplexitybot.json and https://www.perplexity.com/perplexity-user.json. Provided by Perplexity AI, Inc.: Terms of service, Privacy policy.
- Anthropic bot IP ranges (Claude-SearchBot, Claude-User), to tell the real bots from fakes. Downloaded once a day only when “Allow AI search engines and assistants” and “Verify AI search bots” are on, from https://claude.com/crawling/bots.json. Provided by Anthropic PBC: Terms of service, Privacy policy.
- DB-IP Lite country database, to apply the country rules. Downloaded once a month only when “Download the free country database” is on, from https://download.db-ip.com/free/dbip-country-lite-YYYY-MM.csv.gz (the current or the previous month). Lookups happen on your server. Licensed under CC BY 4.0 (“IP Geolocation by DB-IP”). Provided by db-ip.com: Terms of service, Privacy policy, License.
The five data center lists below are used only for the “Data center limit” (Bots and limits), a stricter page limit for visitors that come from cloud servers rather than from home or mobile connections. Each one is downloaded once a day only while protection is enabled and “Data center limit” is above 0 (set it to 0 to turn the lists off). They are JSON or CSV data files fetched by your server with wp_remote_get(); nothing from these hosts is ever loaded in your visitors’ browsers.
- Amazon Web Services IP ranges (only the EC2 servers are used), from https://ip-ranges.amazonaws.com/ip-ranges.json. Provided by Amazon Web Services, Inc.: Terms, Privacy policy.
- Google Cloud IP ranges, from https://www.gstatic.com/ipranges/cloud.json, the address where Google publishes the list. Provided by Google LLC: Terms of service, Privacy policy.
- Oracle Cloud IP ranges, from https://docs.oracle.com/en-us/iaas/tools/public_ip_ranges.json. Provided by Oracle Corporation: Terms of use, Privacy policy.
- DigitalOcean IP ranges, from https://digitalocean.com/geo/google.csv. Provided by DigitalOcean, LLC: Terms of service, Privacy policy.
- Akamai Cloud (Linode) IP ranges, from https://geoip.linode.com/. Provided by Akamai Technologies, Inc.: Terms of service, Privacy policy.
Lockdown’s file check also compares WordPress and the plugins hosted on WordPress.org with their official checksums. This happens when you lock the site or press “Check now” on the Lockdown tab, and then at most once …