skip to content →
FIELD_MANUAL / LIVEREVISIONv1.3 · 2026.10.04Updated 2026-10-04CHAPTERS12 FILEDCH_05INTEGRATION
[ CH_05.07 / FIELD_MANUAL ]

One-click fixes

[ CH_05.07 / ONE_CLICK_FIXES ]

Fix issues automatically

A site-health issue or a Search Console recommendation can be turned into a published fix. VectraSEO builds the smallest patch that resolves it, re-checks the result through the same quality gates as a normal publish, republishes it through your connected CMS and requests a recrawl. Where it cannot write to the page, it gives you a change set to apply yourself. Every attempt ends in a stated outcome, never a silent no-op.

Three kinds of page

TIER
WHAT HAPPENS
A · written by VectraSEO
A post VectraSEO generated. The fix is applied to the live page and republished through your CMS. A post that was never published is patched in place, with nothing to republish.
B · your connected CMS
A page VectraSEO didn't write, but that your connected CMS can find and update. Applies to single-issue fixes that change the page body.
C · no write access
Any other page. VectraSEO builds a change set: the patched HTML and instructions for you to apply yourself. Nothing is published.

Wix updates carry only the title and excerpt, so a fix that changes a post's body cannot be republished to Wix (reason body_update_unsupported); metadata fixes can.

Fixers

Deterministic fixers use no AI model and are not plan-gated. Model fixers write new text and need a paid plan or an active trial; without one the request returns 403 with code: "subscription_limit" before anything is queued.

FIXER
WHAT IT DOES
remove_broken_links
Deterministic. Unwraps links whose destination is confirmed dead and keeps the link text. Fixes broken_links. Link checks are capped and time-bounded; any link it cannot confirm is left alone.
add_schema
Deterministic. Adds a schema.org Article JSON-LD block built only from data the post already has. Skipped when the post lacks a headline or author, or already has JSON-LD. Fixes structured_data.
add_image_alt
Deterministic. Adds alt text only from what the page already says: a caption, the image title or label, or a descriptive filename. Never invents a description. Fixes image_alt.
rewrite_metadata
Model. Rewrites the title and meta description of a page with many impressions and a low click-through rate, using the option you chose or, in Fix all, a fresh one.
insert_answer_block
Model. Adds a 40-80 word answer block after the first heading, grounded in what the article already says. Fixes aeo_answer_structure and striking-distance and quick-win recommendations.
add_internal_links
Model. Weaves 2-4 links to relevant posts in the same project into the body. For striking-distance and quick-win recommendations.
refresh_content
Model, opt-in. Updates and expands the prose of a post that is losing position or traffic, building on the existing body. Runs in Fix all only with include_refresh: true.

Run a fix

The fix routes queue a job and return its job_id; poll GET /api/v1/jobs/{job_id} until it completes. For a site-health issue, take scan_id, url, rule_id and severity from the scan's issues; a rule no fixer handles is a synchronous 422.

One-click fixes · scope · plan
POST/projects/:id/monitors/:mid/issues/implementFix one site-health issue · jobs:write · model fixers: paid
POST/projects/:id/monitors/:mid/issues/implement-batchFix every page one rule flagged in a scan, as one job · jobs:write · model fixers: paid
POST/projects/:id/monitors/:mid/issues/change-setBuild a change set for a page you will edit yourself · jobs:write · model fixers: paid
GET/projects/:id/change-sets/job/:job_idThe change set a completed job built · projects:read
GET/projects/:id/change-setsChange sets kept with persist: true · projects:read
POST/projects/:id/recommendations/:rule_id/:target_kind/:target_id/applyApply one Search Console recommendation to a post · recommendations:read + content:publish · model fixers: paid
POST/projects/:id/recommendations/apply-allFix all recommendations (dry_run first) · recommendations:read + content:publish · model tier: paid
  • Single issue. implement takes {scan_id, url, rule_id, severity, fixer_id?} and answers with the tier. Tier C returns no job and republish_skipped: "no_write_path": build a change set instead.
  • Every page one rule flagged. implement-batch takes {scan_id, rule_id, severity?, fixer_id?} and runs one job over the pages VectraSEO wrote; the rest are counted in skipped_unowned.
  • Fix all recommendations. Call apply-all with dry_run: true first to see the plan; include_refresh: true opts into the paid content-refresh tier.
  • One batch at a time. A project runs one Fix-all batch at a time; starting a second returns 409 naming the running job.

Change sets (pages VectraSEO can't write)

POST …/issues/change-set takes {url, rule_id, severity?, scan_id?, fixer_id?, persist?}. Pass scan_id and severity so the fix uses the issue's evidence. When the job completes, read the result from GET /projects/{id}/change-sets/job/{job_id}. With persist: true it is also kept in GET /projects/{id}/change-sets. Nothing is published.

FIELD
CONTAINS
summary
What the fix changes, in one line.
before_excerpt, after_excerpt
Short text excerpts of the content before and after the fix.
patched_html
The patched HTML to paste or download.
patched_scope
fragment: the article body, recovered from your page. document: the whole rendered page, when the body could not be isolated.
instructions_md
Step-by-step instructions for applying it, in Markdown.
changed, skipped_reason
changed: false with a skipped_reason when the page needed no change.

The live page is the source of truth

For a published post, the fixer reads your live page, not a stored copy, and patches that. Edits you made outside VectraSEO are kept, not overwritten. It finds the editable content through the body marker, or falls back to the page's single <main> or <article> element checked against the last body VectraSEO sent. If the page can't be read, or its content can't be isolated with confidence, the fix is skipped rather than applied to an older copy. After a successful fix, VectraSEO's own copy is re-synced to the live, patched version.

Did the live page actually change?

A 2xx from your CMS is not proof that visitors see the fix. Before the update, VectraSEO fingerprints the live URL (ETag, Last-Modified and a hash of the content), then re-reads it for a short window afterwards. The result is stored on the post as live_verification.status: verified, unchanged or unknown. unchanged means the CMS accepted the write but the page did not move, typically a static site that does not rebuild on update, and the fix is reported as unverified. unknown means the page could not be measured; failing to observe is not evidence of failure, so the fix stays published. The check can never fail or delay the write.

Outcomes

A site-health issue carries fix_status: "submitted" while its job runs, then one of these. Batch results report the same as counts (republished, republished_unverified, republish_failed, skipped, failed) plus one items entry per page.

STATUS
MEANING
published
Republished. The live page changed, or could not be measured.
unverified
Your CMS accepted the update, but the live page did not change. Usually a site that does not rebuild when a post is updated.
held
The patch was built, but a quality gate held it back. Nothing was published.
noop
No change was needed.
skipped
Nothing was published, deliberately. The reason is one of the skip reasons below.
failed
The fix was built but the republish failed, or your destination rejected it over a product claim (claim_rejected, with your stated reason).

Skip reasons

REASON
WHAT TO DO
live_unreadable
The live page could not be read (down, 404 or blocked), so it wasn't overwritten from an older copy. Check the page is publicly reachable, then retry.
extract_low_confidence
The editable content on the live page couldn't be isolated with confidence. Render the body marker, or wrap your content in a single <main> or <article>.
destination_no_update_route
Your Custom API endpoint answered 404/405 to PUT {publish_path}/{id}. The change is saved, the live page is unchanged and the post stays published. Add the PUT route.
body_update_unsupported
Your CMS can't take a body update (Wix). Metadata fixes still work.
never_published, no_cms_connection
The fix was saved to the post, but there is no published copy or connected CMS to push it to.
no_write_path
VectraSEO cannot write to this page (tier C). Build a change set instead.
[ END_OF_MANUAL ]
[ NEED_HELP? ]

Can't find what
you're looking for?

Reach out to the team. We answer every email and we read every bug report.