Automatic organic internal linking + one conversion CTA block per article, for every connected site. Builds a lightweight content index, proposes language-isolated relevant link targets, drafts anchor placements and a CTA with a strict preview -> apply -> rollback diff -- never a silent content rewrite.
enable_sitewriteTurn on Internal Linking Engine for one site already known to Sites Registry. Creates the site's settings row in review_first mode by default -- no content is touched until a plan is previewed and explicitly applied.
update_site_settingswriteUpdate an existing site's Internal Linking Engine settings (mode, limits, CTA targets, exclusions, languages). Only given fields change.
list_sitesreadList every site with Internal Linking Engine settings (enabled or not), across every connected site.
get_site_settingsreadRead one site's Internal Linking Engine settings in full.
index_postswriteCache metadata for a batch of posts already fetched via wordpress-hub, so the Relevance Engine can score them without re-fetching. Call this once per post before get_relevant_targets/preview_internal_links can use it as a candidate or source.
get_site_index_statusreadOne-glance index health for a site: how many posts indexed, by language, and when last indexed.
get_relevant_targetsreadFind the top-N internal-link targets for one already-indexed source post, using deterministic metadata + term-overlap scoring (categories/tags/product_type/title). Language isolation is a hard filter -- a candidate whose lang differs from the source post's lang is never returned, even if it scores highest (the climtec.md RU/RO lesson). Excluded URLs from the site's settings are also dropped before scoring.
preview_internal_linkswriteBuild a preview linking+CTA plan for a site -- NEVER writes anything. Takes raw content Webbee already fetched via wordpress-hub.get_post_content, and (optionally) anchor/CTA insertions Webbee already drafted via an LLM pass, and validates every proposed insertion's find_exact_substring occurs EXACTLY ONCE in that post's current raw content -- any insertion that doesn't is dropped, never guessed. Returns a plan_id; nothing is applied until apply_internal_links is called after Webbee has actually written each surviving diff via wordpress-hub.replace_post_content_text.
get_linking_planreadRead one linking plan in full -- every post's proposed diff, for review before applying.
list_linking_plansreadList linking plans, optionally filtered by site and/or status.
apply_internal_linkswriteRecord that a pending_review plan's diffs were actually written to the site -- call this ONLY AFTER Webbee has already called wordpress-hub.replace_post_content_text for each surviving insertion in the plan (using expected_state_token per post for safety). This function does not write to any site itself; it only transitions the plan's own status and increments the site's confirmed_applies_count toward its full_auto threshold.
reject_linking_planwriteReject a pending_review plan without applying it. Nothing was ever written, so this is purely a status change.
rollback_linking_runwriteRoll back an already-applied plan: returns the original find/replace pairs (the inserted anchor/CTA text as 'find', the pre-insertion original snippet as 'replace') for Webbee to write back via wordpress-hub.replace_post_content_text, restoring each post's content. This function does not write to any site itself -- it only returns the rollback instructions and transitions the plan's own status once Webbee confirms.
list_linking_runsreadList the linking runs dashboard -- one row per plan lifecycle event, newest first.
Install Internal Linking Engine and let Webbee use it across your workflow.
Open in panel