---
title: "Create a new article"
url: https://docs.gleap.ai/en/reference/rest-api/create-helpcenter-article
method: POST
path: "/helpcenter/collections/{helpcenterCollectionId}/articles"
api: "API Reference"
tag: "Help center articles"
operationId: "CreateHelpcenterArticle"
updatedAt: "2026-11-01T19:40:01.089Z"
language: en
---

# Create a new article

`POST https://api.gleap.io/v3/helpcenter/collections/{helpcenterCollectionId}/articles`

Create a new help center article in a collection. `title`, `description` and `content` may be sent either localized (`{ "en": ... }`) or as a bare value, which is stored under the help center's default language. `project`, `helpcenterCollection`, `docId`, `lexorank`, `plainContent` and `baseAudienceFilter` are assigned by the server and ignored if sent. The article is created unpublished (`isDraft: true`) unless `isDraft: false` is passed.

`content` is TipTap JSON. Images are `image` nodes referencing a hosted image URL: `{ "type": "image", "attrs": { "src": "<url>" } }`. To host images on the Gleap CDN, upload them first via `POST /v3/uploads` (or import from an existing URL via `POST /v3/uploads/from-url`) and use the returned `fileUrl` as the `src`.

## Authorization

- `Authorization` (header, required): `Bearer <token>`

## Headers

- `project` (string, required)

## Request body (`application/json`, required)

- `title` (any)
- `navigationTitle` (any): Short localized label in Docs navigation. Empty uses the article title.
- `description` (any)
- `content` (any)
- `plainContent` (any)
- `helpcenterCollection` (string)
- `author` (string)
- `project` (string)
- `isDraft` (boolean): `true` keeps the article unpublished. New articles are drafts unless `false` is sent; an update that leaves it out keeps the current state.
- `docId` (number<double>)
- `expectedVersion` (number<double>): Optimistic-concurrency token. When provided, the update is applied only if the article's current `version` still equals this value; otherwise the server rejects the write with 409 (and preserves the rejected content as a 'conflict' version). When omitted, the save falls back to last-write-wins (keeps the existing editor working until it is updated to send the token).
- `lexorank` (string)
- `upvotes` (any)
- `targetAudience` (string): Who can read the article. New articles default to `all`; an update that leaves it out keeps the current audience.
- `externalId` (string)
- `baseAudienceFilter` (any)
- `extendedAudienceFilter` (any)
- `tags` (string[])
- `newCollectionId` (string): Deprecated here. Only read by PUT .../articles/{id}/move (which has its own body); ignored on create/update.

## Example request

```bash
curl --request POST \
  --url 'https://api.gleap.io/v3/helpcenter/collections/{helpcenterCollectionId}/articles' \
  --header 'Authorization: Bearer <token>' \
  --header 'project: <project>' \
  --header 'Content-Type: application/json' \
  --data '{
  "helpcenterCollection": "<helpcenterCollection>",
  "author": "<author>",
  "project": "<project>",
  "isDraft": true
}'
```

## Responses

### 200 (`application/json`)

Ok
