{"id":309318,"date":"2026-05-17T19:17:51","date_gmt":"2026-05-17T19:17:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/reportedip-hive\/"},"modified":"2026-05-18T19:40:01","modified_gmt":"2026-05-18T19:40:01","slug":"reportedip-hive","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/reportedip-hive\/","author":23494167,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.3.4","stable_tag":"1.3.4","tested":"6.9.4","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"ReportedIP Hive Light","header_author":"Patrick Schlesinger","header_description":"Lightweight brute-force login protection with optional community-powered IP reputation checks.","assets_banners_color":"","last_updated":"2026-05-18 19:40:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/reportedip-hive\/","header_author_uri":"https:\/\/reportedip.de","rating":0,"author_block_rating":0,"active_installs":0,"downloads":77,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.2":{"tag":"1.3.2","author":"reportedip","date":"2026-05-17 19:20:34"},"1.3.3":{"tag":"1.3.3","author":"reportedip","date":"2026-05-17 19:22:05"},"1.3.4":{"tag":"1.3.4","author":"reportedip","date":"2026-05-18 19:40:01"}},"upgrade_notice":{"1.3.4":"<p>Bug fixes: restores the design-system header\/footer on the Settings, Blocked IPs and Whitelist sub-pages (regression from 1.3.2) and stops the API report queue from filling with duplicates during a sustained brute-force.<\/p>","1.3.3":"<p>Hygiene fix: stops the GitHub-Actions deployment from copying the <code>.git<\/code> directory into the wp.org SVN. No functional changes.<\/p>","1.3.2":"<p>Renames the user-facing plugin title to ReportedIP Hive Light. Slug, text domain, options and database tables are unchanged \u2014 no migration required.<\/p>","1.3.1":"<p>Removes the DONOTCACHE* defines from the block-response path and fixes three legal-notice URLs in the readme.<\/p>","1.3.0":"<p>Adds long-term defended-attacks statistics (24 h \/ 7 d \/ 30 d \/ all time) to the dashboard.<\/p>","1.2.0":"<p>Adds a dashboard with stats, queue status, and a per-hour API quota tracker.<\/p>","1.1.0":"<p>Adds an IP whitelist, a setup wizard, and design-system polish. Schema\nmigrates automatically on activation.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.2","1.3.3","1.3.4"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Connection tab \u2014 operation mode, access key, reverse-proxy header.","2":"Protection tab \u2014 thresholds and the progressive block ladder.","3":"Privacy tab \u2014 cache durations, queue retention, uninstall behaviour.","4":"Blocked IPs \u2014 admin list table with bulk-unblock action.","5":"Empty state \u2014 what new installs see before any IPs are blocked."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2439,1174,1192,602,600],"plugin_category":[38,54],"plugin_contributors":[263280],"plugin_business_model":[],"class_list":["post-309318","plugin","type-plugin","status-publish","hentry","plugin_tags-brute-force","plugin_tags-firewall","plugin_tags-ip-blocking","plugin_tags-login","plugin_tags-security","plugin_category-authentication","plugin_category-security-and-spam-protection","plugin_contributors-reportedip","plugin_committers-reportedip"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/reportedip-hive.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>ReportedIP Hive Light protects WordPress logins against brute-force and password-spray attacks. It is intentionally focused: a per-IP attempt counter, a progressive block ladder, and an optional community lookup. No bloat, no dashboards, no upsell.<\/p>\n\n<p><strong>Two operating modes<\/strong><\/p>\n\n<ul>\n<li><strong>Local Shield (default).<\/strong> Counts failed logins per IP and blocks attackers based on configurable thresholds. The plugin makes zero outbound network requests in this mode \u2014 all data stays on your server.<\/li>\n<li><strong>Community Network (optional).<\/strong> When you enter a free Community Access Key from reportedip.de, the plugin additionally checks the source IP against the reportedip.de community database during login attempts and shares blocked IPs back to the community. Both calls are clearly disclosed in the settings UI.<\/li>\n<\/ul>\n\n<p><strong>How it works<\/strong><\/p>\n\n<ul>\n<li><code>wp_login_failed<\/code> increments a per-IP counter using an atomic upsert (no race conditions under concurrent attacks).<\/li>\n<li>When the counter exceeds your threshold, the IP is blocked for a duration drawn from a progressive ladder (5 min \u2192 15 min \u2192 30 min \u2192 24 h \u2192 48 h \u2192 7 days).<\/li>\n<li><code>wp_authenticate_user<\/code> short-circuits known-bad IPs before the WordPress core authentication runs.<\/li>\n<li>Cache plugins (WP Rocket, W3 Total Cache, WP Super Cache, LiteSpeed) are honoured via the HTTP 403 status plus explicit <code>Cache-Control: no-store, no-cache, must-revalidate, max-age=0<\/code> and <code>Pragma: no-cache<\/code> headers on the block page.<\/li>\n<\/ul>\n\n<p><strong>Privacy<\/strong><\/p>\n\n<ul>\n<li>IP addresses are processed for the legitimate purpose of network security (GDPR Art. 6(1)(f)).<\/li>\n<li>Usernames are stored only as a SHA-256 hash, salted with <code>wp_salt()<\/code>. Plain-text usernames are never persisted or transmitted.<\/li>\n<li>In Local Shield mode, no data leaves your server. In Community Network mode, only the IP, hashed username, event type, and timestamp are sent \u2014 no domain, no contact details, no traffic data.<\/li>\n<\/ul>\n\n<p><strong>For developers<\/strong><\/p>\n\n<ul>\n<li>Filters: <code>reportedip_hive_is_whitelisted<\/code>, <code>reportedip_hive_get_client_ip<\/code>, <code>reportedip_hive_event_category_map<\/code>, <code>reportedip_hive_api_endpoint<\/code>.<\/li>\n<li>Actions: <code>reportedip_hive_log<\/code>, <code>reportedip_hive_ip_blocked<\/code>, <code>reportedip_hive_report_queued<\/code>.<\/li>\n<\/ul>\n\n<p>A free Community Access Key is available at reportedip.de. The plugin works without one in Local Shield mode.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin can connect to the ReportedIP API at <code>https:\/\/reportedip.de<\/code>. All\nexternal requests are <strong>opt-in only<\/strong> \u2014 they are made exclusively when (a) a\n\"Community Access Key\" has been entered in the plugin settings and (b) the\n\"Operation Mode\" is set to \"Community Network\". The default mode is \"Local\nShield\", which performs zero external requests.<\/p>\n\n<h4>Endpoint 1: IP-reputation lookup<\/h4>\n\n<ul>\n<li>URL: <code>https:\/\/reportedip.de\/wp-json\/reportedip\/v2\/check?ip={ip}<\/code><\/li>\n<li>HTTP verb: GET<\/li>\n<li>Auth header: <code>X-Key: {your-access-key}<\/code><\/li>\n<li>Trigger: a login attempt reaches <code>wp_authenticate_user<\/code><\/li>\n<li>Timeout: 2 seconds (fail-open \u2014 login proceeds when the API does not respond)<\/li>\n<li>Data sent: only the source IP address of the current login attempt<\/li>\n<li>Data NOT sent: usernames, passwords, cookies, server identifiers, domain name<\/li>\n<\/ul>\n\n<h4>Endpoint 2: Blocked-IP report<\/h4>\n\n<ul>\n<li>URL: <code>https:\/\/reportedip.de\/wp-json\/reportedip\/v2\/report<\/code><\/li>\n<li>HTTP verb: POST (JSON body)<\/li>\n<li>Auth header: <code>X-Key: {your-access-key}<\/code><\/li>\n<li>Trigger: a brute-force \/ spray threshold has been exceeded; the report is\nqueued in the database and dispatched by a 15-minute cron job<\/li>\n<li>Data sent: the offending IP, an integer category ID for the threat type,\nand a short human-readable comment (e.g. \"5 failed logins in 15 minutes\")<\/li>\n<li>Data NOT sent: usernames in plain text, passwords, full request bodies,\ndomain name, contact information<\/li>\n<\/ul>\n\n<h4>Endpoint 3: Access-key verification<\/h4>\n\n<ul>\n<li>URL: <code>https:\/\/reportedip.de\/wp-json\/reportedip\/v2\/verify-key<\/code><\/li>\n<li>HTTP verb: GET<\/li>\n<li>Auth header: <code>X-Key: {entered-key}<\/code><\/li>\n<li>Trigger: an administrator clicks \"Test connection\" in the plugin settings<\/li>\n<li>Data sent: only the access key under verification<\/li>\n<\/ul>\n\n<h4>Hashing of submitted usernames<\/h4>\n\n<p>When a brute-force attempt is detected and the failing username is recorded\nlocally, the plugin stores <code>sha256( username + wp_salt() )<\/code> only \u2014 never the\nplain text. The salted hash is also what would be transmitted with a report,\npreventing recipients from recovering the original username.<\/p>\n\n<h4>Service provider<\/h4>\n\n<ul>\n<li>Operator: Patrick Schlesinger, Germany<\/li>\n<li>Service URL: <a href=\"https:\/\/reportedip.de\">reportedip.de<\/a><\/li>\n<li>Legal notice (Impressum): <a href=\"https:\/\/reportedip.de\/impressum\/\">reportedip.de\/impressum<\/a><\/li>\n<li>Terms of use: <a href=\"https:\/\/reportedip.de\/nutzungsbedingungen\/\">reportedip.de\/nutzungsbedingungen<\/a><\/li>\n<li>Privacy policy: <a href=\"https:\/\/reportedip.de\/datenschutzerklaerung\/\">reportedip.de\/datenschutzerklaerung<\/a><\/li>\n<li>Source code: <a href=\"https:\/\/github.com\/reportedip\/reportedip-hive-light\">github.com\/reportedip\/reportedip-hive-light<\/a><\/li>\n<li>Contact: <a href=\"mailto:1@reportedip.de\">1@reportedip.de<\/a><\/li>\n<\/ul>\n\n<p>You can switch back to Local Shield mode at any time in <em>Settings \u2192 ReportedIP\nHive \u2192 Connection<\/em>. Doing so stops all external traffic immediately.<\/p>\n\n<h3>Bundled assets<\/h3>\n\n<p>This plugin ships every stylesheet and script it needs inside the plugin\nfolder. <strong>No CDN, no Google Fonts, no remote stylesheets, no remote scripts\nare loaded<\/strong> \u2014 every asset URL begins with the plugin's own\n    wp-content\/plugins\/reportedip-hive\/ path.<\/p>\n\n<p>The full list of bundled, locally-served assets:<\/p>\n\n<ul>\n<li><code>assets\/css\/design-system.css<\/code> \u2014 design tokens and components used on\nevery plugin admin page.<\/li>\n<li><code>assets\/css\/admin.css<\/code> \u2014 admin-page overrides on top of the design\nsystem.<\/li>\n<li><code>assets\/css\/wizard.css<\/code> \u2014 standalone styles for the first-run setup\nwizard.<\/li>\n<li><code>assets\/js\/admin.js<\/code> \u2014 handles tab switching and the AJAX\n\"Test connection\" button. Its only network call is <code>fetch()<\/code> against\nWordPress' own <code>admin-ajax.php<\/code> (same origin); no third-party endpoint\nis contacted.<\/li>\n<li>Inline SVG icons (the shield logo, the menu icon, and trust-badge\nglyphs) are emitted from PHP via <code>wp_kses()<\/code> with an explicit allow-list\n\u2014 no <code>&lt;img&gt;<\/code> element points at an external host.<\/li>\n<\/ul>\n\n<p>The complete list of files distributed in the WordPress.org ZIP is\nvisible at <em>Plugins \u2192 Plugin File Editor<\/em> once the plugin is installed.<\/p>\n\n<h3>Third-party services and licences<\/h3>\n\n<ul>\n<li><strong>GPLv2 (or later) licence text<\/strong> is bundled with the plugin in the\n  LICENSE file at the plugin root and is also referenced from the\nplugin header (<code>License URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html<\/code>).<\/li>\n<li><strong>No third-party PHP, JavaScript, or CSS libraries are bundled<\/strong> with\nthe plugin. There is no Composer <code>vendor\/<\/code> directory, no jQuery copy,\nno minified third-party bundle. WordPress itself supplies any global\nscripts (<code>jquery<\/code>, <code>wp-list-table<\/code>, etc.) and the plugin only depends\non WordPress core APIs.<\/li>\n<li>The only external HTTP service the plugin can talk to is the\n  https:\/\/reportedip.de\/wp-json\/reportedip\/v2\/ API, and only when the\nadministrator has explicitly enabled Community Network mode \u2014 see\nthe \"External services\" section above for the full data flow.<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<ul>\n<li>IP addresses are processed under GDPR Art. 6(1)(f) (legitimate interest in network security).<\/li>\n<li>Usernames are stored as a salted SHA-256 hash; plain-text values are never persisted or transmitted.<\/li>\n<li>In Local Shield mode (default) no data leaves your server.<\/li>\n<li>In Community Network mode the data listed above is sent to reportedip.de.<\/li>\n<li>Data retention is configurable in <em>Settings \u2192 Privacy<\/em>. The default attempt window is 15 minutes; the API queue retention is 7 days.<\/li>\n<li>Activate \"Delete all data on uninstall\" in <em>Settings \u2192 Privacy<\/em> to remove all plugin tables and options when the plugin is deleted.<\/li>\n<\/ul>\n\n<h3>Disclaimer<\/h3>\n\n<p>ReportedIP Hive Light is provided \"as is\", without warranty of any kind, express or\nimplied, including but not limited to warranties of merchantability, fitness\nfor a particular purpose, and non-infringement. The author shall not be liable\nfor any claim, damages, or other liability arising from the use of this\nsoftware (this is the standard GPLv2-or-later disclaimer; see the LICENSE\nfile for the full text).<\/p>\n\n<p>The plugin provides defense-in-depth against brute-force and password-spray\nlogin attacks. It does <strong>not<\/strong> replace strong passwords, two-factor\nauthentication, server-level firewalls, or web-application firewalls. No\nsingle security measure offers a 100 % guarantee against compromise. You\nremain responsible for the overall security posture of your WordPress site.<\/p>\n\n<p>The optional Community Network mode forwards data to the third-party service\noperated at https:\/\/reportedip.de \u2014 see the \"External services\" section\nabove for the full data flow. Site operators that enable Community Network\nmode are responsible for assessing the lawful basis under their applicable\ndata-protection regime (in the EU, GDPR Art. 6(1)(f) \u2014 legitimate interest\nin network security \u2014 typically applies) and for updating their own privacy\npolicy accordingly.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>reportedip-hive<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install via <em>Plugins \u2192 Add New<\/em>.<\/li>\n<li>Activate the plugin from the WordPress <em>Plugins<\/em> screen.<\/li>\n<li>Go to <em>ReportedIP Hive Light \u2192 Settings<\/em> and review the Connection \/ Protection \/ Privacy tabs.<\/li>\n<\/ol>\n\n<p>The plugin is functional out of the box in Local Shield mode \u2014 no configuration required.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20get%20a%20community%20access%20key%3F\"><h3>How do I get a Community Access Key?<\/h3><\/dt>\n<dd><p>Register at reportedip.de. The Community Access Key tier is free.<\/p><\/dd>\n<dt id=\"can%20i%20use%20the%20plugin%20without%20an%20access%20key%3F\"><h3>Can I use the plugin without an access key?<\/h3><\/dt>\n<dd><p>Yes. The default mode is Local Shield, which uses only your site's data and does not contact any external service. The plugin remains fully functional.<\/p><\/dd>\n<dt id=\"will%20the%20plugin%20lock%20me%20out%20of%20my%20own%20site%3F\"><h3>Will the plugin lock me out of my own site?<\/h3><\/dt>\n<dd><p>It might, if you fail logins repeatedly from your own IP. To recover, either wait until the block expires or delete the row from the <code>wp_reportedip_hive_blocked<\/code> database table (e.g. via phpMyAdmin or WP-CLI: <code>wp db query \"DELETE FROM wp_reportedip_hive_blocked WHERE ip_address = 'YOUR_IP'\"<\/code>).<\/p><\/dd>\n<dt id=\"how%20do%20i%20unblock%20my%20own%20ip%20from%20the%20admin%20ui%3F\"><h3>How do I unblock my own IP from the admin UI?<\/h3><\/dt>\n<dd><p>Visit <em>ReportedIP Hive Light \u2192 Blocked IPs<\/em>, select the row, and choose \"Unblock selected\" from the bulk actions menu.<\/p><\/dd>\n<dt id=\"what%20data%20does%20the%20plugin%20send%20to%20reportedip.de%3F\"><h3>What data does the plugin send to reportedip.de?<\/h3><\/dt>\n<dd><p>In Community Network mode only: the IP address, a SHA-256 hash of the submitted username (salted with <code>wp_salt()<\/code>), an integer category ID for the event type, and an optional comment. Plain-text usernames, passwords, domains, or contact details are never transmitted. See the \"External services\" section for full details.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20protect%20application%20passwords%3F\"><h3>Does the plugin protect Application Passwords?<\/h3><\/dt>\n<dd><p>No. This release protects standard <code>wp-login.php<\/code> logins. Application Passwords use a separate authentication path that is not currently monitored.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20login%20forms%3F\"><h3>Does it work with WooCommerce login forms?<\/h3><\/dt>\n<dd><p>Yes. WooCommerce uses the standard <code>wp_login_failed<\/code> action, which the plugin listens to. WooCommerce login attempts are counted alongside regular login attempts.<\/p><\/dd>\n<dt id=\"my%20site%20is%20behind%20cloudflare.%20are%20real%20ips%20detected%3F\"><h3>My site is behind Cloudflare. Are real IPs detected?<\/h3><\/dt>\n<dd><p>Set <em>Trusted Proxy Header<\/em> in <em>Settings \u2192 Connection<\/em> to <code>CF-Connecting-IP<\/code>. Only enable this when your reverse proxy reliably overrides the header on every incoming request \u2014 otherwise the header can be spoofed.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Restore the design-system CSS frame on the Settings, Blocked IPs and\nWhitelist sub-pages. The 1.3.2 display rename changed the WordPress\nsubmenu hook suffix from <code>reportedip-hive_page_*<\/code> to\n  reportedip-hive-light_page_*, but the enqueue gate still matched the\nold prefix and silently skipped the asset enqueue. Hook suffixes are\nnow captured from the menu-API return values so the gate stays\ncorrect regardless of the menu title.<\/li>\n<li>Stop the API report queue from filling with duplicates during a\nsustained brute-force. <code>wp_login_failed<\/code> now short-circuits when the\nsource IP is already blocked, and <code>queue_api_report<\/code> deduplicates\nagainst any open (<code>pending<\/code> or <code>processing<\/code>) report for the same IP.\nOne incident yields exactly one outbound community report instead of\none per retry; the block-escalation ladder no longer steps on every\nattempt against an already-locked door.<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>Add <code>.git<\/code> to <code>.distignore<\/code> so the GitHub-Actions deployment no longer\ncopies the repository's Git metadata directory into the wp.org SVN.\nThe 1.3.2 release accidentally shipped a <code>trunk\/.git\/<\/code> and\n  tags\/1.3.2\/.git\/; both have been removed from SVN.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Rename the user-facing plugin title to <strong>ReportedIP Hive Light<\/strong> in the\nWordPress plugin listing, the wp.org listing, the admin menu, the setup\nwizard, the welcome notice, and the privacy-policy suggestion. Plugin\nslug, text domain, class prefix, option keys and database tables are\nunchanged \u2014 display-name only, no migration.<\/li>\n<li>Add a GitHub source-code link to the <code>Service provider<\/code> section of the\nreadme and convert the existing reportedip.de URLs to Markdown links so\nthe wp.org renderer turns them into clickable anchors.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Remove the <code>DONOTCACHEPAGE<\/code> \/ <code>DONOTCACHEDB<\/code> \/ <code>DONOTCACHEOBJECT<\/code> defines\nfrom the block-response path. The HTTP 403 status plus explicit\n  Cache-Control: no-store and <code>Pragma: no-cache<\/code> headers continue to\ninstruct WP Rocket, W3 Total Cache, WP Super Cache and LiteSpeed not to\ncache the block page.<\/li>\n<li>Fix the legal-notice URLs in <code>readme.txt<\/code> to point at the canonical\nImpressum, Nutzungsbedingungen and Datenschutzerklaerung pages on\nreportedip.de.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Add long-term \"Defended attacks\" statistics to the dashboard with\nrolling-window block counts for the last 24 hours, last 7 days, last\n30 days, and all time.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Add a Dashboard landing page (Settings \u2192 ReportedIP Hive) with 4 stat\ncards (active blocks, blocks last 24 h, attempts last 24 h, whitelist\nsize), an operation-mode summary, the report-queue status (pending \/\nprocessing \/ completed \/ failed), and a recent-activity list.<\/li>\n<li>Track outbound API calls per rolling 1-hour window and visualise the\nquota with a progress bar on the dashboard. When the configured maximum\nis reached, IP-reputation lookups are skipped (login still proceeds \u2014\nfail-open) until the window resets.<\/li>\n<li>Settings, Blocked IPs and Whitelist are now sub-pages of the new\nDashboard.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Add an IP whitelist with optional CIDR ranges, expiry, and a dedicated\nadmin page (Settings \u2192 ReportedIP Hive \u2192 Whitelist).<\/li>\n<li>Add a 4-step setup wizard that runs on first activation (Welcome \u2192\nOperation mode \u2192 Protection \u2192 Done).<\/li>\n<li>Replace the WordPress default \"Settings saved\" notice with a design-system\nalert rendered immediately under the page header.<\/li>\n<li>Polish admin chrome \u2014 branded shield logo, three iconed trust badges\n(Security Focused \/ GDPR Compliant \/ Made in Germany), better contrast on\nthe welcome notice.<\/li>\n<li>Hide the Community Access Key card unless the operation mode is set to\nCommunity Network.<\/li>\n<li>Schema bumped to v1.1.0 (idempotent migration on activation).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Lightweight brute-force login protection with optional community-powered IP reputation checks.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/309318","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=309318"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/reportedip"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=309318"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=309318"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=309318"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=309318"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=309318"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=309318"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}