---
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`

Creates an article on the blog. Publishing behavior:

- WordPress defaults 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). WordPress rejects `seo`; SEO
  plugin and custom-field writes are not supported.

Supported on Shopify (`shopify`) and WordPress (`wordpress`). 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 resolves existing names case-insensitively and creates missing tags.
  - `author` string — Shopify author display name, or numeric WordPress user id serialized as a string. Assigning another WordPress user may require elevated capability.
  - `excerpt` string — Short summary shown in blog listings.
  - `image` object — Featured image from a public URL. WordPress downloads it into the media library; JPEG, PNG, GIF and WebP are accepted up to 10 MB.
    - `url` string, uri, required
    - `altText` string
  - `seo` object — Shopify only. Search-engine overrides mapped to global title_tag and description_tag metafields. WordPress rejects this field.
    - `title` string
    - `description` string
  - `isPublished` boolean — Set false for a draft or true to publish. On WordPress 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.

## Response `201`

Article created

- object
  - `platform` 'shopify' | 'wordpress'
  - `article` BlogArticle — An article inside a blog on the connected platform.
    - `id` string — Platform-native numeric article/post id.
    - `blogId` string — Platform-native id of the blog the article belongs to.
    - `platform` 'shopify' | 'wordpress'
    - `title` string
    - `bodyHtml` string, nullable — Article body as HTML.
    - `handle` string — URL slug of the article.
    - `tags` string[] — Tag names. On WordPress, missing tag names are created and matching is case-insensitive.
    - `author` string, nullable — Shopify author display name, or numeric WordPress user id serialized as a string.
    - `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 only. Native post status returned by WordPress; omitted for Shopify.
    - `publishDate` string, date-time, nullable — WordPress only. Scheduled publication time in UTC when status is `future`; null for other WordPress 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` — Unauthorized
- `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-09-17** `fdaf9a9fb1a7` — 1 breaking, 2 warning, 3 info
  - the `tags/items/` request property's minLength was increased from `0` to `1`
  - added the new `wordpress` enum value to the `article/platform` response property for the response status `201`
  - added the new `wordpress` enum value to the `platform` response property for the response status `201`
  - added the non-success response with the status `502`
  - …2 more
- **2026-09-16** `3e6ddf2a99ea` — 1 info
  - added the optional property `details/budgetScope` to the response with the `400` status
- **2026-09-15** `0dba7d004d75` — 2 info
  - added the optional property `details/quotaExhausted` to the response with the `400` status
  - added the optional property `details/quotaScope` to the response with the `400` status
- **2026-08-14** `875093317201` — 1 info
  - endpoint added

[Change 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/339f59df69dd?raw)
