{"id":381496,"date":"2026-10-10T08:41:48","date_gmt":"2026-10-10T08:41:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/senroflux\/"},"modified":"2026-10-10T08:41:35","modified_gmt":"2026-10-10T08:41:35","slug":"senroflux","status":"publish","type":"plugin","link":"https:\/\/ms.wordpress.org\/plugins\/senroflux\/","author":22006989,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.2","stable_tag":"0.3.2","tested":"7.1.3","requires":"7.0","requires_php":"8.1","requires_plugins":null,"header_name":"SenroFlux","header_author":"Stephen Paul Samynathan","header_description":"Resumable, browser-driven multi-step agent runs inside the logged-in WordPress session \u2014 Abilities as tools, governed by SenroGate when active or a built-in approval gate otherwise.","assets_banners_color":"666a8a","last_updated":"2026-10-10 08:41:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/specflux\/senroflux","header_author_uri":"https:\/\/www.specflux.com\/author\/stephen\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.2":{"tag":"0.3.2","author":"specflux","date":"2026-10-10 08:41:35","revision":3737785}},"upgrade_notice":{"0.3.2":"<p>Tightens permission checks on media, store report and coupon abilities; fixes truncated questions and plan card badges.<\/p>","0.3.1":"<p>Sanitizes the JSON payloads of the admin-ajax endpoints; fixes the Openverse terms link.<\/p>","0.3.0":"<p>Breaking: update-post no longer publishes (use publish-post); create-post refuses slug\/title collisions; SenroGate is optional; runs still parked under 0.2 fail on their next tick; run list is per viewer; see the changelog.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3737822,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3737822,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3737822,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3737822,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.3.2"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[15643,2353,23348,569,13261],"plugin_category":[],"plugin_contributors":[274074,235985],"plugin_business_model":[],"class_list":["post-381496","plugin","type-plugin","status-publish","hentry","plugin_tags-agents","plugin_tags-ai","plugin_tags-approvals","plugin_tags-automation","plugin_tags-safety","plugin_contributors-specflux","plugin_contributors-stephen1204paul","plugin_committers-specflux"],"banners":{"banner":"https:\/\/ps.w.org\/senroflux\/assets\/banner-772x250.png?rev=3737822","banner_2x":"https:\/\/ps.w.org\/senroflux\/assets\/banner-1544x500.png?rev=3737822","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/senroflux\/assets\/icon-128x128.png?rev=3737822","icon_2x":"https:\/\/ps.w.org\/senroflux\/assets\/icon-256x256.png?rev=3737822","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>SenroFlux runs an agent loop on behalf of a logged-in user: one goal, many\nmodel turns, many tool calls \u2014 pausing for a human whenever a write needs\napproval, whenever the model needs to ask a clarifying question, or before\nits first side-effecting write \u2014 and resuming exactly where it left off.<\/p>\n\n<ul>\n<li><strong>Runs are session-bound.<\/strong> A run acts as the user who started it; nothing\nruns in the background.<\/li>\n<li><strong>Tools are WordPress Abilities<\/strong>, restricted per run to an allow-list\nsupplied directly by the consumer, or derived from a registered <strong>pack<\/strong>\n(a named tool surface \u2014 pages, posts, site, or commerce, all bundled).<\/li>\n<li><strong>Two gate modes, resolved once per run.<\/strong> If the <strong>SenroGate<\/strong> plugin\nis active, every call is governed by its gate (packs, tiers, approvals)\nand audit trail. Without it, SenroFlux falls back to a <strong>built-in minimal\ngate<\/strong>: every call that changes the site still stops for a person to\napprove it on SenroFlux's own Runs screen before it runs; reads do not.\nA run's mode is pinned at start and never changes underneath it \u2014 if the\nenvironment's mode changes mid-run, the run fails cleanly instead of\nsilently switching enforcement.<\/li>\n<li><strong>Three kinds of park.<\/strong> An <strong>approval park<\/strong> (a governed write, resolved\nby a person), a <strong>question park<\/strong> (the model asks the user one structured\nquestion), and a <strong>plan park<\/strong> (the model proposes a numbered plan before\nits first write; once accepted, that plan's tool set is a fence \u2014 calls\noutside it are refused until a new plan is accepted).<\/li>\n<li><strong>Budgets bound every run.<\/strong> Steps, tool calls, tokens, questions and\nplans. A consumer may only lower a registered ceiling; running out of\nquestions is not a failure \u2014 the model loses the ability to ask and\nproceeds on stated assumptions.<\/li>\n<li><strong>Four bundled packs.<\/strong> Pages and posts (create\/update\/publish, with\npublish handled as its own governed step), site (navigation, front page,\nhomepage patterns), and commerce (WooCommerce catalogue and order\noperations, when WooCommerce is active). Every content write is validated\nbefore anything is persisted: unrenderable or non-round-tripping markup,\nblocks outside the allowed set, disallowed tags or attributes, unresolved\n  {{placeholder}} text, an unrecognised pattern shape, a slot count out of\nrange, a page-shape rule (e.g. hero must come first), or a slug\/title\ncollision with an existing page or post \u2014 all refuse the whole write and\npersist nothing.<\/li>\n<li><strong>Not for multisite.<\/strong> SenroFlux refuses to activate on a WordPress\nmultisite install.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>SenroFlux itself makes two kinds of outbound request, both only while a\nhuman is actively driving a run from their own browser session \u2014 SenroFlux\nnever runs in the background.<\/p>\n\n<p><strong>Model calls (AI Client).<\/strong> Made through the WordPress AI Client (bundled\nwith WordPress 7.0+), using whichever provider your site has connected\nunder Settings \u2192 Connectors \u2014 commonly OpenAI, but any provider the AI\nClient supports. On every model turn (at most one per tick), SenroFlux\nsends that provider:<\/p>\n\n<ul>\n<li>the run's full conversation history so far (the goal, every model\nmessage, and every tool result already produced in the run);<\/li>\n<li>a system instruction assembled from the harness's own operating rules,\nthe active pack's skills (e.g. a pack's block-pattern vocabulary and\ncopy constraints), and anything the consumer or <code>senroflux_system_instruction<\/code>\nfilter contributes;<\/li>\n<li>the declared tool (Ability) schemas the run is allowed to call, and the\nresults those tools return, which are fed back to the model on the next\nturn (capped at 32 KB per result by default, filterable via\n  senroflux_tool_result_max_bytes).<\/li>\n<\/ul>\n\n<p>No file, database or site content is sent beyond what a run's own tool\ncalls read and return as results. Sending and handling this data is\ngoverned by the connected provider's own terms. The site owner chooses the\nAI provider, so that provider's terms and privacy policy apply; see, for\nexample, OpenAI's:\nhttps:\/\/openai.com\/policies\/row-terms-of-use\/ and\nhttps:\/\/openai.com\/policies\/row-privacy-policy\/ \u2014 consult your specific\nprovider's terms if you have connected a different one.<\/p>\n\n<p><strong>Stock photo search (Openverse).<\/strong> When a run searches for a stock image\n(pages\/site packs), SenroFlux sends the model-generated search text as a\nquery string to Openverse's public search API\n(<code>https:\/\/api.openverse.org\/v1\/images\/<\/code>) and to Openverse's individual\nimage-detail endpoint when fetching a chosen result. No account\ncredentials, site content, or personal data are sent \u2014 only the search\nterms and the id of a selected result. This runs only during an active,\nhuman-driven run. See Openverse's terms and privacy policy:\nhttps:\/\/docs.openverse.org\/terms_of_service.html and\nhttps:\/\/openverse.org\/privacy (Openverse is a WordPress.org project;\nits privacy policy is https:\/\/wordpress.org\/about\/privacy\/).<\/p>\n\n<p><strong>Image downloads.<\/strong> When a run imports a chosen stock photo or a generated\nimage, the plugin downloads the image file from the URL Openverse or the AI\nprovider returned (Openverse results are hosted by third-party sites such\nas Flickr or Wikimedia Commons; an AI provider may instead return the image\ndata inline, in which case nothing is downloaded). Only the image URL is\nrequested, with no site data, and the file is then saved to your Media\nLibrary.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>SenroFlux stores each run in two custom tables: the ID of the user who\nstarted it, the goal they typed, the conversation with the AI model, the\ntool calls and their results, and timestamps. Runs stay until you remove\nthem or delete the plugin with the opt-in below.<\/p>\n\n<p>Runs are sent off-site to the AI provider you connected, and search terms\nare sent to Openverse; see \"External services\" above for exactly what.<\/p>\n\n<p>SenroFlux adds suggested text for your privacy policy under Settings \u2192\nPrivacy \u2192 Policy Guide. It does not register a personal-data exporter or\neraser.<\/p>\n\n<p>Deleting the plugin keeps your runs by default. To remove all SenroFlux\ndata (both tables, its options, transients and per-user flags) when the\nplugin is deleted, opt in first: <code>wp option update senroflux_uninstall_delete_data 1<\/code>,\nthen delete the plugin.<\/p>\n\n<h3>Developers<\/h3>\n\n<h4>Extension API<\/h4>\n\n<pre><code>SENROFLUX_API_VERSION (currently 0.3.0, defined in senroflux.php) versions the declared\n<\/code><\/pre>\n\n<p>extension surface, independently of this plugin's own Stable tag. Semver promise: a removal\nor signature change needs a major bump; an addition needs a minor bump \u2014 this applies starting\nat 0.3.0, even below 1.0.<\/p>\n\n<p>The <code>@api<\/code> list: the <code>Pack<\/code> abstract class's <code>@api<\/code>-tagged methods (name, roles,\nabilityNamespaces, inputProperties, verbFor, objectIdKey\/Prefix\/ForWrite\/ForRead,\nroleCapabilities, withheldRoleNotice, verbMap, roleVerbs, ungrantableVerbs, governedNamespaces,\nagentSafetyVerbMap, defaultBudget, skills, agentSafetyPack, validateCall, setupChecks,\nrunCapability, requiresAgentSafety, agentSafetyBindingError, guidesHash); the\n    Api\\LayoutVocabulary facade (names, sectionSchema, validate, imageUrls, rulesLines); the\nSkill\/SkillSource\/SetupCheck value types a pack constructs; and the <code>senroflux_packs<\/code>,\n    senroflux_run_skills and <code>senroflux_default_budget<\/code> filters. Every other filter, including\n    senroflux_can_tick and <code>senroflux_http_consumers<\/code>, is not part of this surface and may change\nwithout a version bump.<\/p>\n\n<p>REST (<code>senroflux\/v1<\/code>) is the public <code>@api<\/code> consumer surface; admin-ajax is this plugin's own private transport for its\nbundled Runs screen and is not guaranteed to match REST's shape.<\/p>\n\n<p>Deprecation: a break goes through <code>_deprecated_hook()<\/code>\/<code>_deprecated_function()<\/code> for at least\none minor release before removal at the next major. None exist yet.<\/p>\n\n<p>See the \"Extension API\" section of README.md in the public repository,\nhttps:\/\/github.com\/specflux\/senroflux, for the full reference, including how to\nregenerate the reflection snapshot (tests\/Api\/public-surface.json there) that\nenforces this.<\/p>\n\n<h4>Source code and build<\/h4>\n\n<p>The JavaScript in <code>build\/<\/code> is compiled from the sources in <code>assets\/src\/<\/code> in\nthe public repository, https:\/\/github.com\/specflux\/senroflux. To rebuild it:<\/p>\n\n<ol>\n<li><code>git clone https:\/\/github.com\/specflux\/senroflux.git &amp;&amp; cd senroflux<\/code><\/li>\n<li><code>npm ci<\/code><\/li>\n<li><p><code>npm run build<\/code><\/p>\n\n<p>npm run build runs <code>wp-scripts build<\/code> and writes <code>build\/<\/code>.<\/p><\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate SenroFlux. It works standalone with a built-in\napproval gate.<\/li>\n<li>Optionally install and activate <strong>SenroGate<\/strong> for its full audit\ntrail, tiered approvals, and cross-plugin governance \u2014 SenroFlux detects\nit automatically and switches gate modes on the next run started after\nactivation.<\/li>\n<li>Consumers (e.g. marketing-analytics-chat) detect <code>senroflux()<\/code> and offer\nmulti-step runs automatically.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20the%20ai%20add%20scripts%20or%20code%20to%20my%20site%3F\"><h3>Can the AI add scripts or code to my site?<\/h3><\/dt>\n<dd><p>No. SenroFlux never writes PHP, JavaScript or CSS files and never runs code\nthe model produces. A run only writes content: pages, posts, navigation,\nproducts and store reports. Every piece of markup it writes is checked\nagainst a fixed list of allowed blocks, tags and attributes before saving,\nand anything outside that list (a <code>&lt;script&gt;<\/code>, an inline event handler, an\nunknown block) refuses the whole write. SenroFlux does this itself rather\nthan relying on WordPress's HTML filtering, because administrators are\nallowed unfiltered HTML.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20senrogate%3F\"><h3>Does it work without SenroGate?<\/h3><\/dt>\n<dd><p>Yes. SenroGate is optional, not required. If it isn't active, SenroFlux\nuses its own built-in minimal gate: every call that changes the site still\nstops for a person to approve it on SenroFlux's Runs screen before it runs;\nread-only calls do not. Installing SenroGate later adds its full audit\ntrail, tiered approval thresholds, and governance shared across other\nplugins \u2014 new runs pick it up automatically.<\/p><\/dd>\n<dt id=\"does%20a%20run%20keep%20going%20while%20i%27m%20not%20looking%3F\"><h3>Does a run keep going while I'm not looking?<\/h3><\/dt>\n<dd><p>No. Runs are session-bound and driven from the browser; nothing executes in\nthe background. A parked run simply waits until someone with permission\nresolves it.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20a%20run%20in%20progress%20when%20i%20upgrade%20from%200.2%3F\"><h3>What happens to a run in progress when I upgrade from 0.2?<\/h3><\/dt>\n<dd><p>A run that was still parked or running at the moment of the upgrade fails\non its next tick with a partial report and the reason \"started under 0.2\" \u2014\n0.2's <code>update-post<\/code> tier changed under it, so it cannot safely continue.\nCompleted 0.2 runs still render their full history and report. Nothing is\nsilently re-tiered or auto-resumed.<\/p><\/dd>\n<dt id=\"which%20post%20statuses%20can%20create-post%20and%20update-post%20write%3F\"><h3>Which post statuses can create-post and update-post write?<\/h3><\/dt>\n<dd><p>create-post never publishes \u2014 it refuses a <code>publish<\/code> or <code>future<\/code> status\noutright and only ever creates a draft. <code>update-post<\/code> covers draft-state\nedits only; any transition to <code>publish<\/code>\/<code>future<\/code>, or any edit to an\nalready-public post, goes through the separate <code>publish-post<\/code> ability,\nwhich is a higher-tier, separately governed call.<\/p><\/dd>\n<dt id=\"will%20pages%20use%20my%20theme%27s%20design%3F\"><h3>Will pages use my theme's design?<\/h3><\/dt>\n<dd><p>On block themes, yes. SenroFlux builds each section from one of your theme's\nown patterns when one fits the content, and otherwise uses its own layouts\nwith your theme's spacing and colours. It never adds colours of its own to a\ntheme pattern. To use only SenroFlux's layouts, untick \"Use my theme's block\npatterns\" under SenroFlux \u2192 Settings. Developers can drop individual patterns\nwith the <code>senroflux_theme_patterns<\/code> filter.<\/p><\/dd>\n<dt id=\"does%20senroflux%20support%20wordpress%20multisite%3F\"><h3>Does SenroFlux support WordPress multisite?<\/h3><\/dt>\n<dd><p>No. SenroFlux refuses to activate on a multisite install.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.2<\/h4>\n\n<p>Fixed:<\/p>\n\n<ul>\n<li>The bundled image patterns no longer reference a remote placeholder image; they use a small image shipped with the plugin.<\/li>\n<li>Media search and the missing-alt-text list now need the upload_files capability and only show images the current user may read or edit. Saving a store report, setting a featured or product image, and enabling a coupon check the matching post type and attachment capabilities too.<\/li>\n<li>A question the assistant asks is no longer cut off mid-word at 300 characters.<\/li>\n<li>A plan step now shows one plain-language badge (Read only, Makes changes, Needs approval) with the actions it will use, instead of the same badge once per action.<\/li>\n<li>A blank assistant turn no longer shows as an empty chat bubble, and a run still working in the background no longer greys out the Accept and Approve buttons on another run.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<p>Fixed:<\/p>\n\n<ul>\n<li>Sanitize the decoded JSON bodies of the admin-ajax start (budget) and tick\n(park resolution) requests: answer text, choices and plan notes go through\nsanitize_textarea_field(), budget caps are kept only as non-negative\nintegers.<\/li>\n<li>Point the Openverse terms-of-service link at its current location.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<p>New:<\/p>\n\n<ul>\n<li>Two gate modes: SenroGate when active, otherwise a built-in minimal\ngate that still pauses every governed write for human approval on the\nRuns screen. A run's mode is pinned at start.<\/li>\n<li>Three new packs alongside pages: posts, site (navigation, front page,\nhomepage patterns), and commerce (WooCommerce catalogue\/order\noperations).<\/li>\n<li>Stock photo search and alt-text\/image-generation abilities via the\nWordPress AI Client and Openverse.<\/li>\n<li>The Runs screen moved out of Tools to its own top-level \"SenroFlux\" menu\nand is now a React app (<code>assets\/src\/runs\/<\/code>, built with\n  @wordpress\/scripts); <code>tools.php?page=senroflux-runs<\/code> redirects there.<\/li>\n<li>Extension API: <code>SENROFLUX_API_VERSION<\/code>, a reflection-enforced <code>@api<\/code>\nsurface for third-party packs (see \"Extension API\" above).<\/li>\n<li>Pages follow your theme. Each page layout (hero, text, text with image,\nservices, FAQ, call to action) is built from the active theme's own\nblock patterns where one fits, filled with the run's copy. Twenty\nTwenty-Five and Ollie have built-in mappings; other block themes are\nmatched automatically, and anything that doesn't fit falls back to\nSenroFlux's own layouts, using the theme's spacing and colours.<\/li>\n<li>Section tone: a section can sit on a contrast or accent band taken from\nthe theme palette, only where the text keeps WCAG AA contrast.<\/li>\n<li>A Settings checkbox, \"Use my theme's block patterns\", to build every page\nfrom SenroFlux's own layouts instead.<\/li>\n<\/ul>\n\n<p><strong>Breaking changes from 0.2:<\/strong><\/p>\n\n<ul>\n<li><code>senroflux\/update-post<\/code> is now draft-state edits only (Tier 1) \u2014 it\nrefuses an already-public target (publish\/future\/private) and a\nrequested publish\/future transition. New <code>senroflux\/publish-post<\/code>\n(Tier 2) covers every publish\/future transition and any edit to an\nalready-public post. Update your integration to call <code>publish-post<\/code> for\nthose cases.<\/li>\n<li><code>senroflux\/create-post<\/code> now refuses <code>slug_collision<\/code> (409) when a\nnon-trashed page or post of the same type already holds the requested\nslug, or matches the title case-insensitively.<\/li>\n<li>SenroGate is no longer a hard requirement. 0.2 always failed closed\nwithout it; 0.3 falls back to a built-in minimal gate instead (see the\nFAQ above). If you relied on <code>senroflux_ungoverned<\/code> meaning \"SenroGate\nis missing,\" check the run's <code>gate_mode<\/code> instead.<\/li>\n<li>A run still parked or running under 0.2 at the moment you upgrade to 0.3\nfails on its next tick with reason \"started under 0.2\" instead of\ncontinuing \u2014 it is not migrated or resumed.<\/li>\n<li><code>GET \/runs<\/code> (and the Runs screen's run list) is now scoped to what the\ncurrent viewer may see or resolve, instead of returning every run on the\nsite to any user who could reach the endpoint.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Schema v2: run status\/step-kind enums, <code>resume<\/code> object replaces the\n0.1 <code>approval_action<\/code> parameter (breaking), <code>max_questions<\/code>\/<code>max_plans<\/code>\nbudget keys.<\/li>\n<li>Default budget ceilings raised to <code>max_steps<\/code> 60, <code>max_tool_calls<\/code> 30 and\n  max_tokens 250000 \u2014 a live pages run costs 31-45 steps and up to 90k\ntokens once the model retries a refused write, and a consumer may only\nlower a ceiling.<\/li>\n<li>Question parks (<code>senroflux\/ask-user<\/code>) and plan parks\n(<code>senroflux\/propose-plan<\/code>) with an accept\/veto fence around Tier \u2265 1\nwrites.<\/li>\n<li>Packs: a named tool surface a run may start from (<code>pack<\/code> argument to\n  start()), plus the bundled pages pack and its five polyfill Abilities.<\/li>\n<li>Skills and a rendered system-instruction pipeline\n(<code>senroflux_run_skills<\/code> filter), with a per-run disable list\n(<code>skills_disable<\/code>).<\/li>\n<li>Verification read-back and a per-run report surfaced on completion.<\/li>\n<li>Runs screen: new-run form with preflight, three park cards, polling\ndetail view.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial scaffold: hard-dependency gate against Agent Safety.<\/li>\n<\/ul>","raw_excerpt":"Resumable multi-step agent runs inside the logged-in WordPress session: Abilities as tools, a governed approval gate on every write.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/381496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=381496"}],"author":[{"embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/specflux"}],"wp:attachment":[{"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=381496"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=381496"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=381496"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=381496"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=381496"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ms.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=381496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}