Wix logo

Wix

Limited · Tier 2 (multiple caveats)

The hardest mainstream CMS we support. Wix’s Velo/Site APIs publish content fine, but everything else — head injection, per-post canonical URLs, native scheduling — is either absent or requires custom Velo code on your side. Connect it if you must, but expect a lower verification score and plan for manual SEO touch-ups.

If you have a choice, pick a different platform
Wix’s technical SEO surface is the most constrained of any CMS we ship. We’ll happily publish, but the post-publish verifier consistently scores Wix sites in the 60-75 range vs. 90+ on WordPress / Webflow / Ghost. If you’re not yet committed to Wix, look at Webflow first — same designer-first feel, vastly better SEO surface.

How it works

Wix exposes blog posts via its /blog/v3/draft-postsendpoint. We POST title, slug, RICOS-converted content (Wix’s rich-text format), SEO meta tags, and a memberId for the author. After draft creation we POST again to /draft-posts/{id}/publish to flip to live.

JSON-LD has no API surface — we ship it inside the body content. Many SEO validators (Google’s Rich Results Test, Bing) parse body-level JSON-LD fine, but it’s noisier than the standard head placement.

What we support

FeatureSupportedNotes
Publish + update + unpublish YesVia /blog/v3/draft-posts + /publish endpoint.
Native scheduling NoWix Blog v3 doesn't expose scheduled-publish. SEORAV holds the post until the time then publishes.
Draft mode YesDefault state; flip to live with /publish call. Visible in Wix Editor → Blog → Drafts.
Featured image PartialImage must be uploaded to Wix Media first via /site-media/v1/files; then referenced by wix:image URI.
Tags & categories PartialResolved by name; must already exist in your Wix site (no auto-creation).
Author PartialmemberId — must already exist as a Wix Member. We don't auto-create.
Meta title + description YesseoData.tags array; Wix renders these into <head>.
Canonical URL NoNo per-post canonical via API. Wix sites have a site-level canonical only.
JSON-LD in <head> NoInline in body only, OR install the Wix SEO app and use Velo to inject.
OpenGraph fields PartialTwitter/OG meta tags via seoData. og:image inherited from featured image automatically.
RICOS body conversion YesWe convert HTML → RICOS structured document. Some advanced HTML (custom CSS classes) is dropped.
Articles + FAQ pages PartialWix Blog v3 hosts articles cleanly. FAQ / answer-engine pages can also flow through this adapter, but Wix has no native FAQ collection — pair the second (answer-page-scoped) connection with a Velo hook that routes those posts to a dedicated FAQ section of your site.
One connection per content type
Wix connections are scoped to a single content type. To publish both long-form articles AND FAQ / answer-engine pages, add two Wix connections — one for articles, one for answer pages. The same OAuth Headless app works for both; differentiate them with tags or a Velo dispatch hook.

Setup

  1. 1

    Create an OAuth Headless app

    Go to Wix Dev Center → My Apps and click Create New App. Choose Headless as the app type.

    Wix has multiple API authentication models. Pick OAuth Headless— it’s the only one that gives stable long-lived tokens for programmatic publishing.
  2. 2

    Grant the right permissions

    On the Permissions tab, add:

    • BLOG.MANAGE — read + write posts, tags, categories
    • SITE-MEDIA.MANAGE — upload featured images
    • MEMBERS.READ — resolve author memberIds
  3. 3

    Install the app on your site

    Install the OAuth Headless app on your specific Wix site. Wix issues an access_token + refresh_token scoped to that site only.

    In SEORAV, you’ll paste:

    • App ID + App Secret (from Wix Dev Center)
    • Refresh token (we manage access-token refresh internally)
    • Site ID
  4. 4

    Probe runs

    We refresh the access token, list one draft post, list tags, list members. Any 401/403 fails the connect with a remediation pointing at the missing scope.

What we send to Wix

http
POST https://www.wixapis.com/blog/v3/draft-posts
Authorization: <wix-jwt>
Content-Type: application/json
wix-account-id: {account_id}
wix-site-id:    {site_id}

{
  "draftPost": {
    "title":           "How to choose a reverse-osmosis system in 2026",
    "slug":            "how-to-choose-reverse-osmosis-system-2026",
    "excerpt":         "Membrane stages, recovery rate, remineralisation — three specs that matter.",
    "richContent":     { /* Wix RICOS document — converted from our HTML */ },
    "memberId":        "{member-id-of-the-author}",
    "tagIds":          ["xxx", "yyy"],
    "categoryIds":     ["zzz"],
    "media": {
      "wixMedia": { "image": { "url": "wix:image://v1/..." } },
      "displayed": true
    },
    "seoData": {
      "tags": [
        { "type": "title",                                    "children": "Reverse osmosis · the 3 specs that matter (2026)" },
        { "type": "meta", "props": { "name": "description" }, "children": "Membrane stages, recovery rate, remineralisation. …" }
      ]
    }
  }
}

Note the richContent field — Wix uses RICOS, a structured rich-text JSON format unique to their platform. We convert from our HTML to RICOS using @wix/draft-content-converters. The conversion handles paragraphs, headings, links, lists, images inline, and code blocks. Custom HTML (inline styles, classes, embedded scripts) is dropped — RICOS has no equivalent representation.

Publishing options

Auto-publish

We POST the draft, then immediately POST /publish. Live in two round-trips, usually under 2 seconds total.

Scheduled (server-side hold)

Wix has no native scheduling. SEORAV holds the article in our queue until the scheduled minute, then publishes. Latency from scheduled-time to live: usually under 30 seconds.

Draft

We create the draft and skip the /publish call. Open in Wix Editor → Blog → Drafts to review and publish manually.

Activity timeline · what you’ll see

Activity timeline · what shows up in your dashboard
  • job_queuedidempotency_key=8b3c…
  • adapter_requestPOST/site-media/v1/files (upload featured image)
  • adapter_response2001.6s
  • adapter_requestPOST/blog/v3/draft-posts
  • adapter_response200743msdraft_post_id=abc-123
  • adapter_requestPOST/blog/v3/draft-posts/abc-123/publish
  • adapter_response200512ms
  • verify_startGET https://yoursite.com/post/how-to-…
  • verify_complete200521msscore 67/100 · canonical missing, JSON-LD in body
  • job_succeededsee Wix optimisation guide for next steps

After publishing — make it shine

Install the Wix SEO app

The Wix SEO app (free) gives per-page meta-title and meta-description controls in the editor. SEORAV-published posts will have these set via API, but the app makes them editable in the UI later.

Add Velo code for canonical URL injection

In Wix Editor → Dev Mode → Pages → Blog post template → site code, add: import wixWindow from 'wix-window'; $w.onReady(() => { wixWindow.SEO.setSeoTags([{type:'link', props:{rel:'canonical', href: window.location.href.split('?')[0]}}]); }); — this stamps a canonical on every blog page.

Inject JSON-LD via Velo

Same Velo file, fetch the post’s SEORAV metadata via a Velo backend function and inject as script tag using wixWindow.SEO.setSeoTags. Bumps the verifier score from ~67 to ~85.

Verify in Wix Editor &ldquo;SEO Setup Checklist&rdquo;

Editor → Marketing & SEO → SEO Setup Checklist. Run through it once after first publish — Wix flags missing alt text, broken links, redirects to fix.

Submit URL to Bing IndexNow

Wix doesn’t auto-submit to IndexNow. Use Bing’s manual URL submission tool or build a small Velo backend job that hits IndexNow on every onPostPublished webhook.

Watch the Wix Analytics organic-search dashboard

Wix surfaces Google Search Console data inside the editor (paid plans only). Compare clicks + impressions across SEORAV-published posts vs. manually-written ones — informs whether the verifier score gap is hurting traffic.

Troubleshooting

401 / token refresh failed

Refresh tokens for OAuth Headless apps are valid until the user uninstalls the app from the site. If a refresh fails, the user uninstalled. Reinstall from Wix Dev Center → My Apps → Install on Site, get a new refresh token, update the SEORAV connection.

Body content rendering is wrong

RICOS conversion drops unsupported HTML. Common culprits: nested tables, custom style= attributes, embedded iframes (other than YouTube / Twitter / Instagram, which RICOS supports natively). If your articles rely on these, we can help map them — open a support thread.

Featured image broken

Wix Media expects a wix:image:// URI, not a public URL. We upload the image first via /site-media/v1/files, then reference the returned URI. If you see a broken image icon, the upload failed silently — check the activity log for the upload step.

Tags appearing as “Untagged”

Wix doesn’t auto-create tags via the API. The tag must exist on your site first. Add the tags you want under Wix Editor → Blog → Manage Posts → Tags before publishing — SEORAV will then resolve names to IDs correctly.

Security & best practices

Storage
OAuth refresh token + app secret encrypted with AES-256-GCM at rest. We rotate the access token internally on every request that needs one. If a refresh token leaks, uninstall the app from your Wix site to revoke; SEORAV will start failing immediately.

Useful links