---
title: "Publish article"
method: POST
path: "/api/articles"
tags: ["articles"]
---

# Publish article

`POST /api/articles`

This endpoint allows the client to create a new article.

"Articles" are all the posts that users create on DEV/Forem that typically show up in the feed. They can be a blog post, a discussion question, a help thread etc. but are referred to as articles within the code.

### Body Parameter Tips:
- **title**: A compelling and descriptive title for the article.
- **body_markdown**: The main text of the article in Markdown format. You can use standard Markdown as well as Forem-specific Liquid tags (e.g., `{% embed ... %}`). You can also include YAML front matter at the very beginning of the markdown to specify metadata such as tags, series, and cover image.
- **published**: Set to `true` to immediately publish the article and make it visible in feeds. Set to `false` (default) to save it as a draft.
- **tags**: A comma-separated list of tags (up to 4 tags). Tags help categorize your post and improve discoverability.
- **series**: Group articles together by specifying a series name. If the series does not exist, it will be created.
- **main_image**: Absolute URL of the cover image for the article.
- **canonical_url**: If this post was originally published elsewhere, specify the canonical URL to maintain SEO integrity.
- **description**: A short summary of the article used for previews and SEO meta description.
- **ai_disclosure_level**: AI tooling usage disclosure (`not_disclosed`, `no_ai`, `some_ai`, `fully_autonomous`).

## Request body

- Article — Representation of an Article to be created/updated
  - `article` object
    - `title` string
    - `body_markdown` string
    - `published` boolean
    - `series` string, nullable
    - `main_image` string, nullable
    - `canonical_url` string, nullable
    - `description` string
    - `tags` string
    - `organization_id` integer, nullable
    - `ai_disclosure_level` 'not_disclosed' | 'no_ai' | 'some_ai' | 'fully_autonomous' — Level of AI tooling usage disclosure

## Response `201`

An Article

## Other responses

- `401` — Unauthorized
- `422` — Unprocessable Entity

## Changes

- **2026-08-17** (v1) `32364ddfcc63` — 1 info
  - added the new optional request property `article/ai_disclosure_level`
- **2026-07-13** (v1) `189b62b952ea` — 3 breaking
  - removed the media type `application/json` for the response with the status `201`
  - removed the media type `application/json` for the response with the status `401`
  - removed the media type `application/json` for the response with the status `422`
- **2026-07-13** (v1) `7db6ba099285` — 3 breaking
  - removed the media type `application/json` for the response with the status `201`
  - removed the media type `application/json` for the response with the status `401`
  - removed the media type `application/json` for the response with the status `422`
- **2026-05-28** (v1) `6550ad7be94f` — 3 info
  - added the media type `application/json` for the response with the status `201`
  - added the media type `application/json` for the response with the status `401`
  - added the media type `application/json` for the response with the status `422`
- **2026-03-03** (v1) `c9e7662755c2` — 3 breaking
  - removed the media type `application/json` for the response with the status `201`
  - removed the media type `application/json` for the response with the status `401`
  - removed the media type `application/json` for the response with the status `422`

[Full history](https://skmtc.dev/forem/apis/forem-api-v1/changes/api/articles/post.md)

---

[API](https://skmtc.dev/forem/apis/forem-api-v1.md) · [All operations](https://skmtc.dev/forem/apis/forem-api-v1/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/forem/forem-api-v1/revisions/1f64f71fc2a7/schema)
