> Portal Navigation:
> 
> - Append `.md` to any URL under `https://dev.wix.com/docs/` to get its markdown version.
> - Pages are either content pages (article or reference text) or menu pages (a list of links to child pages).
> - To get a menu page, truncate any URL to a parent path and append `.md` (e.g. `https://dev.wix.com/docs/sdk.md`, `https://dev.wix.com/docs/sdk/core-modules.md`).
> - Top-level index of all portals: https://dev.wix.com/docs/llms.txt
> - Full concatenated docs: https://dev.wix.com/docs/llms-full.txt

# Resource: Content Plan Blog Post Candidate V1

# Type: Content Plan Blog Post Candidate Object

# Link: https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-blog-post-candidate-v1/content-plan-blog-post-candidate-object.md

## Description: A blog post candidate is a single blog post brief in a site's content plan.

Each candidate pairs a target keyword with a suggested title, the search
data behind that keyword, and the site page the post should support. A site
owner uses a candidate as the starting point for writing a post.

Candidates are generated by the content plan pipeline and are read-only.
Call Create Content Plan to generate them, and List Blog Post Candidates to
read them.

## Schema:

```json
 Type: Content Plan Blog Post Candidate Object | type: BlogPostCandidate
 Description: A blog post candidate is a single blog post brief in a site's content plan.

Each candidate pairs a target keyword with a suggested title, the search
data behind that keyword, and the site page the post should support. A site
owner uses a candidate as the starting point for writing a post.

Candidates are generated by the content plan pipeline and are read-only.
Call Create Content Plan to generate them, and List Blog Post Candidates to
read them.
       - name: id  | type: string | description: Blog post candidate ID.  Treat this value as opaque. Don't parse it or build it yourself, and pass it back exactly as received. The individual IDs it's built from are available on `candidateData`.
           - name: value  | type: string | description: 
       - name: candidateData  | type: CandidateData | description: IDs that identify the candidate and the flow that generated it.
           - name: blogPostCandidateId  | type: string | description: ID of the blog post candidate within its content plan flow.
           - name: contentPlanFlowId  | type: string | description: ID of the content plan flow that generated this candidate.
       - name: briefData  | type: BriefData | description: The blog post brief itself: the suggested title, the target keywords, and the search data behind them.
           - name: h1Title  | type: string | description: Suggested title for the blog post.
           - name: keyword  | type: string | description: Keyword the blog post targets.
           - name: mainKeyword  | type: string | description: Primary keyword for the page the blog post supports.  A page has a single main keyword, and several blog posts can support the same one.
           - name: serpData  | type: SerpData | description: Search engine results data for `mainKeyword`, such as its search volume and how hard it is to rank for.  List Blog Post Candidates doesn't currently return this field.
               - name: id  | type: string | description: SerpDataResult ID
               - name: peopleAlsoAskSuggestions  | type: Array<PeopleAlsoAskQuestion> | description: list of people also ask questions
               - name: peopleAlsoSearchSuggestions  | type: Array<StringValue> | description: list of related searches
               - name: autocompleteSuggestions  | type: Array<StringValue> | description: list of autocomplete suggestions
           - name: pageUrl  | type: string | description: URL of the site page the blog post is meant to support.
       - name: seoData  | type: SeoSchema | description: SEO tags suggested for the blog post, such as its title tag and meta description.
           - name: tags  | type: Array<Tag> | description: SEO tag information.
               - name: type  | type: string | description: SEO tag type.   Supported values: `title`, `meta`, `script`, `link`.  Which of these an API actually accepts depends on where the tag is being set: this list is not a blanket guarantee across every API that reuses this message. Site SEO Tags in particular accepts only `meta` (see `SiteSeoTags.tags`) and rejects `title`/`script`/`link` with a validation error even though they appear here — check the field description of the specific `tags`-typed field you're writing to for the types it actually supports and the error it returns.  Limitation: `title` and `script` (e.g. a `script` tag with `props.type` `"application/ld+json"` carrying structured data) are supported only when `custom` is unset or `false`. Setting `custom: true` on a `title` or `script` tag is rejected with `TAG_TYPE_NOT_ALLOWED`, because `custom: true` routes the write through the site's Advanced/Custom Tags list. To write structured data, omit `custom` (or set it to `false`).
               - name: props  | type: Struct | description: A `{"key": "value"}` pair object where each SEO tag property (`"name"`, `"content"`, `"rel"`, `"href"`) contains a value. For example: `{"name": "description", "content": "the description itself"}`.
               - name: meta  | type: Struct | description: SEO tag metadata. For example, `{"height": 300, "width": 240}`.
               - name: children  | type: string | description: SEO tag inner content. For example, `<title> inner content </title>`.
               - name: custom  | type: boolean | description: Whether the tag is a [custom tag](https://support.wix.com/en/article/adding-additional-meta-tags-to-your-sites-pages) — i.e. an entry from the site's Advanced/Custom Tags list.  Setting this to `true` on a write restricts which `type` values are accepted — the same restriction the Advanced/Custom Tags UI enforces. `title` and `script` tags (including JSON-LD structured data) must be sent with `custom` omitted or `false`; sending them with `custom: true` is rejected with `TAG_TYPE_NOT_ALLOWED`.  Note this is a separate restriction from Site SEO Tags' own type restriction on `SiteSeoTags.tags`: even with `custom` unset, Site SEO Tags rejects `script` (e.g. for site-wide structured data) unconditionally. There is currently no way to set site-wide, every-page structured data through any of these APIs — write a per-page `script` tag through the Item SEO Tags API instead.  This flag is scoped to that feature only. It is NOT an indicator of whether a standard tag (`title`, `description`, Open Graph, etc.) reflects a manually configured value versus a computed default/pattern — standard tags always resolve with `custom: false`, even when their content comes from a page's manually saved SEO title/description override. Don't use this field to verify whether a live page reflects a manual per-page SEO edit.  Limitation: when `ResolveStaticPageSeoTags` is called without `seoData`, the per-page SEO data is read only from the Vibe/Wix-managed-headless override store. That store holds nothing for classic Wix Editor or Wix Studio pages, so even genuine Advanced/Custom Tags saved on those pages are missing from the response entirely — there, `false` means this API could not tell, not that no custom tag exists. Pass `seoData` explicitly to resolve against a known set of tags.
               - name: disabled  | type: boolean | description: Whether the tag is disabled. If the tag is disabled, people can't find your page when searching for this phrase in search engines.
           - name: settings  | type: Settings | description: SEO general settings.
               - name: preventAutoRedirect  | type: boolean | description: Whether the [automatical redirect visits](https://support.wix.com/en/article/customizing-your-pages-seo-settings-in-the-seo-panel) from the old URL to the new one is enabled.   Default: `false` (automatical redirect is enabled).
               - name: keywords  | type: Array<Keyword> | description: User-selected keyword terms for a specific page.

```