The Blog Post Candidate API lets you generate a site's blog post briefs and read them back. A brief pairs a suggested title with a target keyword and the site page the post should support. It's what a site owner writes an actual blog post from.
Briefs are the final output of a content plan. Generating them is also the step that lets a content plan flow finish, so this API is part of the generation loop, not only a way to read results.
With the Blog Post Candidate API, you can:
A content plan flow doesn't run to completion on its own. It stops at the KEYWORD_RESEARCH status and waits. Create Content Plan generates the briefs and lets the flow continue to SUCCESS. An app that triggers a flow and only polls it waits indefinitely.
Because of this, Create Content Plan sits in the middle of the generation loop rather than at the end. The usual order is: trigger a flow, poll it to KEYWORD_RESEARCH, call Create Content Plan, poll again to SUCCESS, then read the briefs.
Calling Create Content Plan on a flow that already reached SUCCESS doesn't overwrite that flow. It generates a fresh plan under a new content plan flow and returns the new contentPlanFlowId in the response. Poll and read that ID. The original flow keeps its own briefs and stays readable.
Create Content Plan doesn't report every failure as an error. Some failures return HTTP 200 with success set to false and an explanation in message. Check success as well as the HTTP status before assuming the briefs were generated.
A brief is marked as used when a blog post is created from it in the Wix Blog product. That marking belongs to the Blog flow, so this API can read the mark but can't set it.
Two consequences follow:
includeOnlyUnmarked reflects only what Wix Blog has marked. If your app writes posts by another route, track them yourself.It's important to note the following points before starting to code:
id is opaque. Don't parse it or build it yourself, and pass it back exactly as received.paging returns every brief in a single response. When you send paging, limit accepts 1 to 100 and defaults to 50.contentPlanFlowId reads the site's most recent successful flow. A site whose flows are all still running or failed returns a not found error.Last updated: 31 August 2026