{"id":371100,"date":"2026-09-20T11:03:47","date_gmt":"2026-09-20T11:03:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/reading-tracker\/"},"modified":"2026-10-21T13:03:40","modified_gmt":"2026-10-21T13:03:40","slug":"ango-scroll-analytics","status":"publish","type":"plugin","link":"https:\/\/zul.wordpress.org\/plugins\/ango-scroll-analytics\/","author":23448427,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.14.0","stable_tag":"1.14.0","tested":"7.1.3","requires":"6.8","requires_php":"7.4","requires_plugins":null,"header_name":"AnGo Scroll Analytics","header_author":"Andrew Golubev","header_description":"Scroll-depth tracking for posts and pages, with a dashboard by day, month and article.","assets_banners_color":"","last_updated":"2026-10-21 13:03:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/ango-scroll-analytics\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":10,"downloads":986,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.10.0":{"tag":"1.10.0","author":"andrewgolubev","date":"2026-10-09 19:22:29","revision":3737243},"1.11.0":{"tag":"1.11.0","author":"andrewgolubev","date":"2026-10-14 10:11:03","revision":3745965},"1.12.0":{"tag":"1.12.0","author":"andrewgolubev","date":"2026-10-14 14:42:33","revision":3746634},"1.13.0":{"tag":"1.13.0","author":"andrewgolubev","date":"2026-10-20 14:11:05","revision":3756885},"1.14.0":{"tag":"1.14.0","author":"andrewgolubev","date":"2026-10-21 13:03:40","revision":3758395},"1.2.0":{"tag":"1.2.0","author":"andrewgolubev","date":"2026-09-20 11:03:22","revision":3704154},"1.2.1":{"tag":"1.2.1","author":"andrewgolubev","date":"2026-09-20 12:18:21","revision":3704235},"1.3.0":{"tag":"1.3.0","author":"andrewgolubev","date":"2026-09-21 10:09:53","revision":3705321},"1.4.0":{"tag":"1.4.0","author":"andrewgolubev","date":"2026-09-21 10:33:13","revision":3705386},"1.5.0":{"tag":"1.5.0","author":"andrewgolubev","date":"2026-09-22 08:42:08","revision":3706894},"1.6.0":{"tag":"1.6.0","author":"andrewgolubev","date":"2026-09-23 12:20:53","revision":3709305},"1.7.0":{"tag":"1.7.0","author":"andrewgolubev","date":"2026-10-04 21:19:26","revision":3727826},"1.8.0":{"tag":"1.8.0","author":"andrewgolubev","date":"2026-10-06 06:31:01","revision":3730115},"1.8.1":{"tag":"1.8.1","author":"andrewgolubev","date":"2026-10-06 13:26:45","revision":3730885},"1.9.0":{"tag":"1.9.0","author":"andrewgolubev","date":"2026-10-07 19:29:48","revision":3733244}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3704194,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3704194,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3704194,"resolution":false,"location":"assets","locale":false}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.10.0","1.11.0","1.12.0","1.13.0","1.14.0","1.2.0","1.2.1","1.3.0","1.4.0","1.5.0","1.6.0","1.7.0","1.8.0","1.8.1","1.9.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3711262,"resolution":"1","location":"assets","locale":"","width":1682,"height":1213}},"screenshots":{"1":"The Readability dashboard: the filter bar, visits \/ average scroll \/ median cards, the percentile list (\"X% of visitors scrolled at least to Y% of the article\"), and the visits-plus-average-scroll trend chart."}},"plugin_section":[262246],"plugin_tags":[232,307,12158,63224,521],"plugin_category":[36],"plugin_contributors":[281692],"plugin_business_model":[],"class_list":["post-371100","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-analytics","plugin_tags-engagement","plugin_tags-readability","plugin_tags-scroll-depth","plugin_tags-statistics","plugin_category-analytics","plugin_contributors-andrewgolubev","plugin_committers-andrewgolubev"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/ango-scroll-analytics\/assets\/icon.svg?rev=3704194","icon":"https:\/\/ps.w.org\/ango-scroll-analytics\/assets\/icon.svg?rev=3704194","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ango-scroll-analytics\/assets\/screenshot-1.png?rev=3711262","caption":"The Readability dashboard: the filter bar, visits \/ average scroll \/ median cards, the percentile list (\"X% of visitors scrolled at least to Y% of the article\"), and the visits-plus-average-scroll trend chart."}],"raw_content":"<!--section=description-->\n<p>AnGo Scroll Analytics records how far visitors scroll through your content and displays the results on a dedicated \"Readability\" screen in wp-admin. It answers the question a pageview count cannot: did anyone actually read past the first screen?<\/p>\n\n<p>Unlike heavy external analytics suites or heatmap SaaS tools, AnGo Scroll Analytics runs 100% natively on your server. There are no external scripts, no cookies, no third-party data sharing, and no complex event setups.<\/p>\n\n<h4>Why site owners and developers choose AnGo<\/h4>\n\n<ul>\n<li>Smart \"Load-and-Die\" Bot Filtering: automated hits (bots, scrapers, and Slack\/Discord link previews) load the page and vanish instantly at 0% scroll. AnGo detects and excludes these zero-time visits by default so your reading averages stay accurate \u2014 and the Visits card always shows how many were left out.<\/li>\n<li>Privacy-First &amp; Cookie-Free (GDPR friendly): stores zero personal data, sets no cookies, and never logs raw IP addresses (only a temporary hash is used for the spam rate limit).<\/li>\n<li>Ad-Blocker Resilient: neutral file and endpoint naming (scroll-depth.js and \/wp-json\/ango\/v1\/depth) that matched none of the EasyList, EasyPrivacy, uBlock Origin and AdGuard filter lists at the last check \u2014 and the FAQ explains why those names must stay plain.<\/li>\n<li>100% Local &amp; Self-Contained: the admin charts are powered by a locally bundled Chart.js build. Neither your front end nor wp-admin makes external CDN requests.<\/li>\n<li>Every Public Content Type Tracked: posts, pages, WooCommerce products and custom post types from any plugin are measured the moment they exist \u2014 media attachments are the one exception, and a filter trims any type you don't want counted.<\/li>\n<li>Clean Database Citizenship: logged-in administrators and authors are ignored by default so you don't pollute your own stats, and deleting the plugin removes its custom table and options completely \u2014 zero leftover database bloat.<\/li>\n<\/ul>\n\n<h4>What the Readability dashboard shows<\/h4>\n\n<ul>\n<li>Flexible date filtering \u2014 any custom range (the last 30 days by default), grouped by day or by month \u2014 plus a Device filter (All devices \/ Mobile \/ Tablet \/ Desktop) that narrows the whole dashboard to one class of visitor, because a phone flick reaches 100% far cheaper than a desktop scroll.<\/li>\n<li>At-a-glance summary cards: total visits (with the count of excluded bot\/preview hits), average scroll depth %, and median.<\/li>\n<li>A full percentile breakdown \u2014 5\/10\/25\/50\/75\/90\/100, phrased in plain English (\"X% of visitors scrolled at least to Y% of the article\") \u2014 with a Reach \/ Classical switch between \"how far did readers actually get\" and the standard PERCENTILE.INC percentiles users know from Excel.<\/li>\n<li>A visual trend chart: reading depth as a line against traffic volume as bars, over time.<\/li>\n<li>A sortable per-article table: title, content type, visits, average scroll and a seven-column sortable Percentiles group per article (the 50% column is the median), with a live \"Search articles\" box and a # column numbering the current view.<\/li>\n<li>A lightweight, server-rendered \"Readability brief\" widget on the Dashboard home screen: the same numbers for the last 7 days at a glance.<\/li>\n<\/ul>\n\n<h4>How it works under the hood<\/h4>\n\n<p>The tracking script loads on the single page of every public post type and measures depth through the scrollable height of the document \u2014 not the share of the article visible on screen, so a page that fits on one screen records 100%.<\/p>\n\n<ol>\n<li>Initial arrival: a visit is registered as soon as the page loads. A visitor who reads the top screen without scrolling still gets a row, with 0%.<\/li>\n<li>Efficient beacons: data is sent to the server only when reading progress actually advances (checked every 5 seconds), and when the visitor leaves the page or switches tabs (via navigator.sendBeacon, or fetch with keepalive). A failed send is retried at the next check. Each beacon also carries a coarse device class \u2014 mobile, tablet or desktop, computed in the visitor's browser; no user-agent string is collected.<\/li>\n<li>One row per visit: each visit occupies a single row in {prefix}_ango_visits, updated as the reader gets further down the page. A new tab or a new session is a new visit.<\/li>\n<\/ol>\n\n<h4>Performance &amp; scale<\/h4>\n\n<p>Designed for small-to-medium blogs and content sites: the statistics are computed on the fly with direct SQL queries, and the REST endpoint is rate-limited to 60 requests per minute per IP hash (changeable via the ango_rate_limit filter). Without a persistent object cache each beacon costs two lightweight options-table queries \u2014 a spam brake, not a firewall. At hundreds of thousands of visits, transient caching or cron-based aggregation is worth adding; a typical blog does not need it.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In wp-admin go to Plugins \u2192 Add New \u2192 Upload Plugin.<\/li>\n<li>Choose the downloaded archive (ango-scroll-analytics-1.14.0.zip), click \"Install Now\", then \"Activate\".<\/li>\n<li>On activation the plugin creates its table in the database, {prefix}_ango_visits (wp_ango_visits with the default prefix). If the schema changes in a later version, the table is brought up to date the next time wp-admin is opened (dbDelta).<\/li>\n<li>A \"Readability\" entry appears in the left-hand menu \u2014 the dashboard lives there.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20visits%20with%20no%20scrolling%20really%20count%3F\"><h3>Do visits with no scrolling really count?<\/h3><\/dt>\n<dd><p>Yes. Every arrival is a row, including the ones with 0% scroll: the percentiles describe all arrivals, not only those who read to the end. That is a deliberate decision, not lost data.<\/p>\n\n<p>The dashboard does distinguish two kinds of zero-scroll visits. A visit that sent nothing after the initial page-load beacon (max_scroll 0 and time on page 0) is \"load-and-die\" \u2014 on a live site those are usually bots, crawlers and link previews, not people. They are excluded from the statistics by default (the Visits card shows how many were left out), while a person who loaded the page and stayed without scrolling \u2014 time on page above zero \u2014 always counts. The checkbox in the filter bar turns the exclusion off.<\/p><\/dd>\n<dt id=\"is%20the%20tracking%20endpoint%20public%3F\"><h3>Is the tracking endpoint public?<\/h3><\/dt>\n<dd><p>Yes \u2014 it has to be, because visitors are not logged in. POST \/wp-json\/ango\/v1\/depth is limited to 60 requests per minute per IP; the limit is changed through the ango_rate_limit filter, and a value below 1 disables the check. The IP itself is not stored, only a hash of it, for the duration of the window. Behind a proxy (Cloudflare and similar) REMOTE_ADDR is the proxy address, so the limit is shared by all visitors \u2014 raise it in that setup.<\/p><\/dd>\n<dt id=\"why%20do%20the%20numbers%20differ%20from%20my%20analytics%20tool%3F\"><h3>Why do the numbers differ from my analytics tool?<\/h3><\/dt>\n<dd><p>This plugin measures depth through the scrollable height of the page, not the share of the article that was on screen: a short page that fits on one screen records 100%. And it counts visits, not unique readers \u2014 a new tab or a new session is a new visit.<\/p><\/dd>\n<dt id=\"what%20timezone%20are%20the%20numbers%20in%3F\"><h3>What timezone are the numbers in?<\/h3><\/dt>\n<dd><p>Timestamps in the table (created_at) are stored in UTC, while the dashboard computes day boundaries in the site timezone. Keep that in mind when writing manual SQL against {prefix}_ango_visits.<\/p><\/dd>\n<dt id=\"can%20i%20track%20custom%20post%20types%3F\"><h3>Can I track custom post types?<\/h3><\/dt>\n<dd><p>They are tracked by default: the script loads on the single page of every public post type, so a WooCommerce product, a forum thread or a knowledge-base entry all get measured the moment they exist. Media attachments are the one exception \u2014 they are public but are media-library artifacts, not pages a reader scrolls. If a plugin registers a public type you do not want counted (a page-builder's template library, a popup type), remove it with the ango_trackable_post_types filter:<\/p>\n\n<pre><code>add_filter( 'ango_trackable_post_types', function ( $types ) {\n    unset( $types['my_popup'] );\n    return $types;\n} );\n<\/code><\/pre><\/dd>\n<dt id=\"does%20the%20admin%20screen%20load%20anything%20from%20outside%20my%20site%3F\"><h3>Does the admin screen load anything from outside my site?<\/h3><\/dt>\n<dd><p>No. The chart is drawn by Chart.js 4.5.1, bundled with the plugin (assets\/vendor\/chart.umd.min.js, MIT license), so wp-admin makes no external request and the chart works offline and behind a filtering proxy.<\/p><\/dd>\n<dt id=\"why%20does%20the%20bundled%20chart.js%20ship%20minified%3F\"><h3>Why does the bundled Chart.js ship minified?<\/h3><\/dt>\n<dd><p>Chart.js 4.5.1 (MIT) ships here as the minified UMD build that upstream publishes \u2014 assets\/vendor\/chart.umd.min.js, licence banner intact. Upstream has no unminified UMD to use instead: dist\/chart.umd.js and dist\/chart.umd.min.js in its package are both minified. The readable code is published, just in another build: the unminified ESM bundle is dist\/chart.js (https:\/\/unpkg.com\/chart.js@4.5.1\/dist\/chart.js), and the sources it is built from are at https:\/\/github.com\/chartjs\/Chart.js\/tree\/v4.5.1\/src.<\/p><\/dd>\n<dt id=\"why%20are%20the%20file%20names%20so%20plain%3F\"><h3>Why are the file names so plain?<\/h3><\/dt>\n<dd><p>They are deliberately neutral: the tracking script is assets\/js\/scroll-depth.js and the public endpoint is \/wp-json\/ango\/v1\/depth, with no tracker\/track in either. Those words are a common target for filter lists, and a blocked script or beacon loses data silently. Neither EasyList\/EasyPrivacy nor the uBlock Origin and AdGuard filters matched these URLs (checked 2026-09-16 under the plugin's previous name; the endpoint paths did not change in the rename), but the lists update daily \u2014 so do not rename them back \"for clarity\".<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20when%20i%20uninstall%20the%20plugin%3F\"><h3>What happens to my data when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>Deleting the plugin removes everything it stored: the {prefix}_ango_visits table, the ango_db_version option and the throttle transients. Deactivating does not \u2014 the data survives a deactivate and reactivate cycle, so an upgrade or a temporary switch-off costs nothing. Clicking Delete on the Plugins screen shows a confirmation naming the statistics that will be lost. If you need the numbers after the plugin is gone, export them before deleting, or hold the cleanup back from a must-use plugin with add_filter( 'ango_remove_data_on_uninstall', '__return_false' ).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.14.0<\/h4>\n\n<ul>\n<li>New: a Device filter (All devices \/ Mobile \/ Tablet \/ Desktop) in the dashboard's filter bar. Every visit now carries a coarse device class \u2014 mobile, tablet or desktop, computed in the visitor's browser from the pointer type and the viewport width; no user-agent string or anything more specific is collected. The filter narrows the whole dashboard \u2014 summary, percentiles, trend, article table \u2014 to one class, because a phone flick reaches 100% far cheaper than a desktop scroll. Visits recorded before this version appear under All devices only.<\/li>\n<\/ul>\n\n<h4>1.13.0<\/h4>\n\n<ul>\n<li>New: a row-number column (#) at the head of the By article table. The number is the row's place in the current view: it renumbers when you sort or search, so the top of whatever you are looking at is always row 1. The column itself is not sortable \u2014 it always mirrors the active order.<\/li>\n<\/ul>\n\n<h4>1.12.0<\/h4>\n\n<ul>\n<li>New: a \"Percentile mode\" switch on the dashboard (Reach \/ Classical). Reach percentiles answer \"how far did readers get\" \u2014 at least X% of visitors reached this depth. Classical percentiles are the textbook statistical view, computed exactly like Excel's PERCENTILE.INC \u2014 X% of visitors reached this depth or less. The switch changes the summary list, the table columns and their tooltips at once, needs no reload and is remembered per browser. Reach stays the default.<\/li>\n<\/ul>\n\n<h4>1.11.0<\/h4>\n\n<ul>\n<li>New: a \"Search articles\" box above the \"By article\" table. It filters the rows live as you type \u2014 case-insensitive title matching, no Apply click, no extra requests \u2014 composes with any active sort, and survives a re-render. When nothing matches, the table says so instead of showing a stale row set.<\/li>\n<\/ul>\n\n<h4>1.10.0<\/h4>\n\n<ul>\n<li>New: the \"By article\" table replaces the single \"90% scrolled at least to\" column with a full \"Percentiles\" group \u2014 seven sortable sub-columns (5\/10\/25\/50\/75\/90\/100) showing the depth each share of that article's visitors reached. The separate Median column is gone; the 50% sub-column IS the median, computed the same way from the same rows. Wide screens scroll the table horizontally instead of squeezing it.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>New: the tracker covers every public post type, not only posts and pages \u2014 WooCommerce products and any plugin's custom post types are now measured and appear in the \"By article\" table. Media attachments stay untracked, and the new ango_trackable_post_types filter removes a type a site does not want counted.<\/li>\n<li>New: the \"By article\" table names each row's content type \u2014 a product reads \"Product\", not \"Post\".<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>New: article titles in the \"By article\" table are clickable links to the article itself, opening in a new tab. Posts that no longer exist stay plain text.<\/li>\n<li>Fix: the sortable column headers no longer show their label twice (\"ArticleArticle\"). The 1.8.0 headers printed the column name both outside and inside the sort button; it now appears once.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>New: the \"By article\" table is sortable. Click a column header to sort by it \u2014 first click ascending, second descending, with a direction arrow on the active column. Numbers sort numerically, titles and types alphabetically; finding the most visited or worst-median article no longer means eyeballing the rows.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>New: a \"Readability brief\" widget on the admin Dashboard home screen. Visits, average scroll, median and the \"90% scrolled at least to X%\" line for the last 7 days, plus a link to the full report. Server-rendered \u2014 no extra scripts on the Dashboard \u2014 and counts visits exactly like the Readability page, load-and-die exclusion included.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>New: the dashboard percentile list gains the low percentiles 5\/10\/25 alongside 50\/75\/90\/100. On a bounce-heavy audience the classic lines read 0 and say nothing, while \"25% of visitors scrolled at least to X%\" stays informative.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>New: logged-in visitors are not tracked \u2014 the site owner's own views no longer pollute the percentiles. The tracking script is not loaded for logged-in users, and the endpoint refuses their beacons. Multi-author sites that want member visits counted can turn the exclusion off with the ango_track_logged_in filter.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Fix: the tracker no longer records 100% depth when the page layout is still unsettled at load time (scrollable height not yet known) \u2014 such loads were miscounted as full-depth reads.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New \"Exclude load-and-die visits\" filter (on by default): page loads whose only beacon fired at page load \u2014 mostly bots and link previews \u2014 are excluded from all dashboard statistics. The Visits card shows how many were excluded, and a checkbox in the filter bar turns it off.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fix: the author is shown as Andrew Golubev, the Details link points to the WordPress.org page, and \"Details\" is translated in Russian.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Renamed to AnGo Scroll Analytics per the WordPress.org review; all code symbols, options and the REST namespace moved to the ango_ prefix.<\/li>\n<li>Translation files no longer ship in the package \u2014 translations come from translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.1.8<\/h4>\n\n<ul>\n<li>Fix: cleared all Plugin Check errors (inline prepare() calls, %i identifier placeholder, sanitized REMOTE_ADDR).<\/li>\n<\/ul>\n\n<h4>1.1.7<\/h4>\n\n<ul>\n<li>Readme discloses the bundled Chart.js 4.5.1 build (MIT).<\/li>\n<\/ul>\n\n<h4>1.1.6<\/h4>\n\n<ul>\n<li>Uninstall cleanup: deleting the plugin removes its table, options and transients, with a warning on the Plugins screen naming what is lost.<\/li>\n<li>Added the WordPress.org readme metadata block and plugin header fields.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Fix: rebuilt the Russian translation file with a parseable header (the previous build shipped a malformed one).<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Fix: removed a doubled percent sign in the percentile lines (50%% -&gt; 50%).<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Plugin attributed to Adviko Inc.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Neutral asset and endpoint names (scroll-depth.js, \/wp-json\/...\/depth) so ad-blocker filter lists don't silently break tracking.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix: the Apply button sits on the controls' line in the filter row.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>The admin interface is translatable (English source, Russian catalogue).<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: Chart.js is bundled with the plugin instead of loaded from a CDN URL that returned 404.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: scroll-depth tracking on posts and pages, the Readability dashboard (visits, averages, percentiles, trend chart, per-item table), UTC storage with site-timezone day grouping.<\/li>\n<\/ul>","raw_excerpt":"Self-hosted, cookie-free scroll depth tracking. See how far visitors actually read your content right inside wp-admin.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/371100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=371100"}],"author":[{"embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/andrewgolubev"}],"wp:attachment":[{"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=371100"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=371100"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=371100"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=371100"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=371100"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=371100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}