---
title: "Create a blog article"
method: POST
path: "/v1/accounts/{accountId}/blogs/{blogId}/articles"
tags: ["Blogs"]
---

# Create a blog article

`POST /v1/accounts/{accountId}/blogs/{blogId}/articles`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/accounts/{accountId}/blogs/{blogId}/articles`
- Auth: HTTP bearer

Creates an article on the blog. Publishing behavior:

- WordPress, Wix and Webflow default to a draft when both publishing
  fields are omitted.
- `isPublished: false` keeps the article as a draft and takes priority
  over a future `publishDate`.
- A future `publishDate` schedules publication natively on the
  platform; the platform publishes it at that time with no Zernio
  queue involved.
- `isPublished: true` publishes immediately when there is no future
  `publishDate`.
- `seo.title` / `seo.description` map to Shopify's global `title_tag`
  and `description_tag` metafields (the fields Shopify themes read for
  the page title and meta description), and on Wix to the post's SEO
  title and meta description. WordPress and Webflow reject `seo`; SEO
  plugin and custom-field writes are not supported.
- Webflow has no scheduling API: a future `publishDate` returns 400
  unless `isPublished: false` keeps a draft. Fields map to the
  collection's own fields by type and slug (the body to its rich text
  field, `excerpt` to a summary field, `image` to an image field, `tags`
  and `author` to tag and author reference fields); sending a field the
  collection does not have returns 400, as does a collection that
  requires a field the Blogs API cannot fill.
- Wix stores rich content: `bodyHtml` is converted on write (each
  top-level HTML element must fit 30,000 characters), and images in
  the body are imported into the site's Media Manager.

Supported on Shopify (`shopify`), WordPress (`wordpress`), Wix (`wix`) and Webflow (`webflow`). WordPress
native scheduling depends on the site's scheduler/WP-Cron.

## Path parameters

- `accountId` string, required
- `blogId` string, required

## Request body

- object
  - `title` string, required
  - `bodyHtml` string: Article body as HTML.
  - `handle` string: URL slug. Generated from the title when omitted.
  - `tags` string[]: Tag names. WordPress and Wix resolve existing names case-insensitively and create missing tags (Wix allows up to 30).
  - `author` string: Shopify author display name, numeric WordPress user id serialized as a string, or Wix site member id. Assigning another WordPress user may require elevated capability. Wix posts without one go to the site's default author.
  - `excerpt` string: Short summary shown in blog listings.
  - `image` object: Featured image from a public URL. WordPress downloads it into the media library and Wix imports it into the Media Manager; JPEG, PNG, GIF and WebP are accepted up to 10 MB.
    - `url` string, uri, required
    - `altText` string
  - `seo` object: Shopify and Wix. Search-engine overrides: Shopify global title_tag and description_tag metafields, Wix post SEO title and meta description. WordPress rejects this field.
    - `title` string
    - `description` string
  - `isPublished` boolean: Set false for a draft or true to publish. On WordPress and Wix false takes priority over a future publishDate; omission with no date defaults to draft.
  - `publishDate` string, date-time: ISO 8601 datetime with offset (or Z). A future date schedules publication natively on the platform.
  - `fieldData` object: Webflow only. The collection's own fields that the Blogs API does not map, keyed by field slug, in Webflow's value format (a Reference is an item id, an Image is { url, alt }). Required by collections with required fields of their own; a create that leaves one empty answers 400 listing them. A slug the API already fills (name, slug, body, summary, image, tags, author, date) or one the collection lacks answers 400. Other platforms answer 400.

## Response `201`

Article created

- object
  - `platform` 'shopify' | 'wordpress' | 'wix' | 'webflow'
  - `article` BlogArticle: An article inside a blog on the connected platform.
    - `id` string: Platform-native article/post id: numeric on Shopify and WordPress, a GUID on Wix, a hex item id on Webflow.
    - `blogId` string: Platform-native id of the blog the article belongs to.
    - `platform` 'shopify' | 'wordpress' | 'wix' | 'webflow'
    - `title` string
    - `bodyHtml` string, nullable: Article body as HTML. Wix stores rich content, converted from and to HTML; Wix lists return null (get the article for its body).
    - `handle` string: URL slug of the article.
    - `tags` string[]: Tag names. On WordPress and Wix, missing tag names are created and matching is case-insensitive.
    - `author` string, nullable: Shopify author display name, numeric WordPress user id serialized as a string, or Wix site member id. Wix posts without one are attributed to the site's default author.
    - `excerpt` string, nullable: Short summary shown in blog listings.
    - `image` object, nullable: Featured image.
      - `url` string
      - `altText` string, nullable
    - `isPublished` boolean: False while the article is a draft or its publish date is still in the future.
    - `publishedAt` string, date-time, nullable: Publication time. On WordPress this is present only when status is `publish`; null for drafts, pending/private posts, and scheduled posts.
    - `status` 'publish' | 'future' | 'draft' | 'pending' | 'private': WordPress and Wix. Post status (`future` = scheduled, `pending` = in review on Wix); omitted for Shopify.
    - `publishDate` string, date-time, nullable: WordPress and Wix. Scheduled publication time in UTC when status is `future`; null for other statuses and omitted for Shopify.
    - `createdAt` string, date-time, nullable: Creation time when the platform exposes one. WordPress returns null because its core date is the editable publication date.
    - `updatedAt` string, date-time, nullable: Last modification time. WordPress returns modified_gmt as UTC.

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `403`: The platform rejected the request (code insufficient_permissions); reconnect the account or restore the WordPress user capabilities.
- `404`: Account not found or not accessible (code account_not_found), or blog not found (code blog_not_found).
- `405`: Platform does not support creating articles.
- `429`: Rate limited by Zernio or the connected platform. Retry later.
- `502`: The connected platform returned an unclassified upstream error. Article mutations are not blindly retried.

## Changes

- **2026-10-21** `5304778ae6b6`: 2 warning, 1 info
  - added the new `webflow` enum value to the `article/platform` response property for the response status `201`
  - added the new `webflow` enum value to the `platform` response property for the response status `201`
  - added the new optional request property `fieldData`
- **2026-10-20** `0d064f3b2f7a`: 3 warning
  - changed the pattern of the `path` request parameter `blogId` from `^\d+$` to `^[A-Za-z0-9_-]{1,64}$`
  - added the new `wix` enum value to the `article/platform` response property for the response status `201`
  - added the new `wix` enum value to the `platform` response property for the response status `201`
- **2026-10-06** `f8c8f34fb41a`: 2 warning
  - added the new `account` enum value to the `details/budgetScope` response property for the response status `400`
  - added the new `account` enum value to the `details/budgetScope` response property for the response status `401`
- **2026-10-02** `d556591af3f6`: 8 info
  - added the optional property `code` to the response with the `401` status
  - added the optional property `details` to the response with the `401` status
  - added the optional property `docUrl` to the response with the `400` status
  - added the optional property `docUrl` to the response with the `401` status
  - …4 more
- **2026-09-30** `16a7b9d5373e`: 1 info
  - removed the `platform` enum value from the `details/budgetScope` response property for the response status `400`

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/accounts/:accountId/blogs/:blogId/articles/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/4e74db179e73?raw)
