{"id":385678,"date":"2026-10-13T17:36:21","date_gmt":"2026-10-13T17:36:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/rupt-fraud-and-abuse-prevention\/"},"modified":"2026-10-13T17:36:13","modified_gmt":"2026-10-13T17:36:13","slug":"rupt-fraud-and-abuse-prevention","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/rupt-fraud-and-abuse-prevention\/","author":20968463,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.1","stable_tag":"2.1.1","tested":"7.1.3","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Rupt: Fraud and abuse prevention","header_author":"Rupt","header_description":"Know which users and agents you can trust. Stop fake accounts, bots, account takeover, and account sharing on your WordPress site.","assets_banners_color":"2d8cfe","last_updated":"2026-10-13 17:36:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.rupt.dev\/docs\/v3\/integrations\/wordpress-account-sharing-prevention\/","header_author_uri":"https:\/\/www.rupt.dev","rating":0,"author_block_rating":0,"active_installs":0,"downloads":78,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.1":{"tag":"2.1.1","author":"ahmedrupt","date":"2026-10-13 17:36:13","revision":3744561}},"upgrade_notice":{"2.0.0":"<p>Requires a Rupt v3 client ID. Your existing client ID keeps working, but settings moved to Settings \u2192 Rupt and you need at least one policy in the Rupt dashboard for challenges to fire.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3744561,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3744561,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3744561,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3744561,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3744561,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.1.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[257402,22770,132861,1932,600],"plugin_category":[54,58],"plugin_contributors":[286525],"plugin_business_model":[],"class_list":["post-385678","plugin","type-plugin","status-publish","hentry","plugin_tags-account-sharing","plugin_tags-bot-detection","plugin_tags-fraud-prevention","plugin_tags-membership","plugin_tags-security","plugin_category-security-and-spam-protection","plugin_category-user-management","plugin_contributors-ahmedrupt","plugin_committers-ahmedrupt"],"banners":{"banner":"https:\/\/ps.w.org\/rupt-fraud-and-abuse-prevention\/assets\/banner-772x250.png?rev=3744561","banner_2x":"https:\/\/ps.w.org\/rupt-fraud-and-abuse-prevention\/assets\/banner-1544x500.png?rev=3744561","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/rupt-fraud-and-abuse-prevention\/assets\/icon.svg?rev=3744561","icon":"https:\/\/ps.w.org\/rupt-fraud-and-abuse-prevention\/assets\/icon.svg?rev=3744561","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Rupt is a fraud and abuse prevention platform. It identifies the device, browser, and person behind every account on your site, works out how much you can trust them, and challenges the ones you can't.<\/p>\n\n<p>WordPress hands you accounts and nothing else. It cannot tell a paying member from a bot, a stolen login from the real owner, or one password quietly making the rounds in a group chat. This plugin closes that gap.<\/p>\n\n<h4>What it protects<\/h4>\n\n<ul>\n<li><strong>Onboarding.<\/strong> Fake signups, disposable and invalid emails, bots, multi-accounting, and ban evasion, caught at registration.<\/li>\n<li><strong>Login.<\/strong> Account takeover and credential stuffing, caught when a stranger signs into a real member's account.<\/li>\n<li><strong>Content.<\/strong> Account sharing, paywall bypass, and scraping, caught on every page view.<\/li>\n<li><strong>Payments.<\/strong> Card testing, risky transactions, and coupon abuse, on any checkout action you choose to evaluate.<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<p>The plugin reports what happens on your site. Your policies, which live in the Rupt dashboard rather than here, decide what to do about it. A policy has a trigger (the event it runs on) and a verdict (allow, challenge, or deny).<\/p>\n\n<p>Rupt scores every event against the device, browser, IP, email, phone, and behavior behind it. When a policy fires, Rupt runs a challenge (SMS, email, or biometric) and signs the device out if it fails.<\/p>\n\n<h4>What the plugin sends<\/h4>\n\n<ul>\n<li><code>access<\/code> on every front-end page view by a signed-in user.<\/li>\n<li><code>login<\/code> on the first page a user loads after signing in.<\/li>\n<li><code>signup<\/code> on the first page a newly registered user loads.<\/li>\n<li>Any custom action you queue from PHP or fire from JavaScript.<\/li>\n<\/ul>\n\n<h4>Custom actions<\/h4>\n\n<p>Queue an evaluation from PHP and it runs on the next page the user loads:<\/p>\n\n<pre><code>rupt_evaluate('purchase', ['metadata' =&gt; ['order_id' =&gt; $order_id]]);\n<\/code><\/pre>\n\n<p>Or run one immediately from JavaScript:<\/p>\n\n<pre><code>window.rupt.evaluate('purchase', { metadata: { order_id: '1234' } });\n<\/code><\/pre>\n\n<h4>Filters<\/h4>\n\n<ul>\n<li><code>rupt_should_run<\/code>: return false to skip Rupt on a request.<\/li>\n<li><code>rupt_load_for_visitors<\/code>: return true to load the script for signed-out visitors.<\/li>\n<li><code>rupt_user_metadata<\/code>: change the metadata attached to the signed-in user.<\/li>\n<li><code>rupt_loader_config<\/code>: change the whole loader config before it is printed.<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>This plugin sends data to Rupt, a third-party fraud and abuse prevention service, so that Rupt can identify the devices and people using each account.<\/p>\n\n<p>The plugin loads a script from <code>cdn.rupt.dev<\/code> on your front end. That script sends the signed-in user's WordPress user ID, email address, display name, roles, optional phone number, page URL, and device and browser characteristics to the Rupt API at <code>ap3.rupt.dev<\/code> (or the API domain you set in <strong>Settings \u2192 Rupt<\/strong>) on page views, logins, and registrations.<\/p>\n\n<p>Service provided by Rupt: <a href=\"https:\/\/www.rupt.dev\/terms\">terms of service<\/a>, <a href=\"https:\/\/www.rupt.dev\/privacy\">privacy policy<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Go to <strong>Settings \u2192 Rupt<\/strong> and paste the client ID from your <a href=\"https:\/\/app.rupt.dev\">Rupt dashboard<\/a>. Use a production client ID on a live site.<\/li>\n<li>Create at least one policy in your <a href=\"https:\/\/app.rupt.dev\/policies\">policies dashboard<\/a>. Without a policy every evaluation comes back <code>allow<\/code> and nobody is ever challenged.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20does%20this%20actually%20catch%3F\"><h3>What does this actually catch?<\/h3><\/dt>\n<dd><p>Whatever your policies look for. Rupt supplies the signals: how many devices an account touches, whether two of them are active at once, whether the browser is automated, whether the email is disposable, whether the IP is a datacenter or VPN, whether the signup looks like the last twelve signups. You decide which combinations are worth challenging.<\/p><\/dd>\n<dt id=\"does%20this%20stop%20password%20sharing%20on%20wordpress%3F\"><h3>Does this stop password sharing on WordPress?<\/h3><\/dt>\n<dd><p>Yes. Rupt recognizes the devices behind each account, so when two people use one login it sees concurrent sessions on unrelated devices. A policy on the <code>access<\/code> trigger challenges the extra viewer and signs the device out if it fails.<\/p><\/dd>\n<dt id=\"does%20it%20stop%20fake%20signups%20and%20bots%3F\"><h3>Does it stop fake signups and bots?<\/h3><\/dt>\n<dd><p>Yes. The <code>signup<\/code> trigger runs before a new account has done anything, with the full fingerprint of the browser that registered it. Policies there catch disposable emails, automated browsers, and people registering their fifth account from the same device.<\/p><\/dd>\n<dt id=\"does%20it%20stop%20account%20takeover%3F\"><h3>Does it stop account takeover?<\/h3><\/dt>\n<dd><p>Yes. The <code>login<\/code> trigger sees whether the device signing in has ever been on the account before, and where in the world the last session was. A login from an unrecognized device on the other side of the planet is exactly what a policy should challenge.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20change%20my%20theme%20or%20login%20form%3F\"><h3>Do I need to change my theme or login form?<\/h3><\/dt>\n<dd><p>No. The plugin reads the signed-in WordPress user on its own and hooks into <code>wp_login<\/code> and <code>user_register<\/code>.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20and%20membership%20plugins%3F\"><h3>Does it work with WooCommerce and membership plugins?<\/h3><\/dt>\n<dd><p>Yes. Anything that creates a real WordPress user and signs it in is covered, including WooCommerce, MemberPress, Restrict Content Pro, and LearnDash.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20a%20page%20cache%3F\"><h3>Does it work with a page cache?<\/h3><\/dt>\n<dd><p>The plugin sets <code>DONOTCACHEPAGE<\/code> on pages it runs on, which every major caching plugin honors. Most caches skip signed-in users anyway.<\/p><\/dd>\n<dt id=\"where%20does%20a%20signed-out%20device%20end%20up%3F\"><h3>Where does a signed-out device end up?<\/h3><\/dt>\n<dd><p>At your home page, or at the <strong>After logout URL<\/strong> you set in <strong>Settings \u2192 Rupt<\/strong>. Pointing it at a signup or pricing page turns a sign-out into an upgrade prompt.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Readme and header updates for the WordPress.org directory: tested up to WordPress 7.1, license header matches the readme (GPLv2 or later), Plugin URI points at the setup guide.<\/li>\n<li>The loader script URL carries the plugin version so browsers pick up a fresh copy after an update.<\/li>\n<li>Sign-out redirects use wp_safe_redirect(), with the After logout URL's host allowed so off-site pricing pages keep working.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Rewritten for the Rupt v3 API.<\/li>\n<li>Adds <code>login<\/code> and <code>signup<\/code> evaluations alongside page-view <code>access<\/code>, so the plugin covers account takeover and fake signups, not just account sharing.<\/li>\n<li>Adds custom actions through <code>rupt_evaluate()<\/code> in PHP and <code>window.rupt.evaluate()<\/code> in JavaScript.<\/li>\n<li>Moves settings from the General page to their own <strong>Settings \u2192 Rupt<\/strong> page.<\/li>\n<li>Signs devices out through a nonce-protected endpoint instead of an unguarded URL.<\/li>\n<li>Adds an API domain setting for sites that proxy Rupt through their own domain.<\/li>\n<li>Removes the v2 <code>window.Rupt.attach()<\/code> global. Use <code>window.rupt.evaluate()<\/code> instead.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added a phone number meta key setting and a dedicated logout route.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Know which users and agents you can trust. Stop fake accounts, bots, account takeover, and account sharing on your WordPress site.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/385678","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=385678"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ahmedrupt"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=385678"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=385678"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=385678"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=385678"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=385678"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=385678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}