Article Management API

The Help.Center API lets you programmatically manage your help center articles. Create, update, publish, and organize articles without ever opening the dashboard.

Tip: Want to skip the manual API calls? Install the Help.Center Agent Skill to manage articles using plain language with AI coding agents like Claude Code, Cursor, or OpenClaw.

Before You Start

You'll need two things from your Help.Center dashboard:

  1. Go to Settings > General > API

  2. Copy your API Key

  3. Copy your Center ID

All API requests go to https://api.help.center and require your API key in the header:

Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

Quick Start: Create Your First Article

Here's how to create and publish an article in two steps:

Step 1: Create a Draft

curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Getting Started with Our Product",
    "content": {
      "html": "<h1>Welcome</h1><p>Your article content here...</p>"
    },
    "category_id": "getting-started",
    "status": "draft"
  }' \
  "https://api.help.center/v0/centers/YOUR_CENTER_ID/articles"

Step 2: Publish It

curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.help.center/v0/centers/YOUR_CENTER_ID/articles/ARTICLE_ID/publish"

That's it! Your article is now live.

API Endpoints

Center & Categories

Action

Method

Endpoint

Get center info

GET

/v0/centers/:centerId

List categories

GET

/v0/centers/:centerId/articles/categories

Articles

Action

Method

Endpoint

List articles

GET

/v0/centers/:centerId/articles

Search articles

GET

/v0/centers/:centerId/articles?search=query

Get article

GET

/v0/centers/:centerId/articles/:articleId

Count articles

GET

/v0/centers/:centerId/articles/count

Create article

POST

/v0/centers/:centerId/articles

Update metadata

PATCH

/v0/centers/:centerId/articles/:articleId/metadata

Delete article

DELETE

/v0/centers/:centerId/articles/:articleId

Publish

POST

/v0/centers/:centerId/articles/:articleId/publish

Unpublish

POST

/v0/centers/:centerId/articles/:articleId/unpublish

Duplicate

POST

/v0/centers/:centerId/articles/:articleId/duplicate

Drafts

Action

Method

Endpoint

List drafts

GET

/v0/centers/:centerId/articles/drafts

Count drafts

GET

/v0/centers/:centerId/articles/drafts/count

Get draft

GET

/v0/centers/:centerId/articles/:articleId/draft

Update draft

PATCH

/v0/centers/:centerId/articles/:articleId/draft

Discard draft

POST

/v0/centers/:centerId/articles/:articleId/draft/discard

Listing Articles

Fetch your published articles with optional filters:

GET /v0/centers/:centerId/articles

Query parameters:

  • limit - Number of results (default: 50, max: 100)

  • starting_after - Cursor for forward pagination (pass the last article's ID)

  • ending_before - Cursor for backward pagination

  • category - Filter by category ID

  • search - Search by title or content

  • expand[]=content - Include full HTML and text content in the response

Creating Articles

POST /v0/centers/:centerId/articles

Request body:

{
  "title": "Your Article Title",
  "content": {
    "html": "<h1>Title</h1><p>Your content here</p>"
  },
  "category_id": "getting-started",
  "status": "draft",
  "metadata": {
    "seo": {
      "title": "SEO-friendly title (50-60 chars)",
      "description": "Meta description (150-160 chars)"
    }
  }
}

The title field is required. Set status to "draft" or "published".

Updating Articles

To update an article's content, use the draft endpoint:

PATCH /v0/centers/:centerId/articles/:articleId/draft
{
  "title": "Updated Title",
  "html": "<h1>Updated Content</h1><p>New content here...</p>"
}

To update metadata (category, slug, SEO) without touching content:

PATCH /v0/centers/:centerId/articles/:articleId/metadata
{
  "category": "new-category-id",
  "slug": "new-article-slug",
  "seo": {
    "title": "New SEO Title",
    "description": "New SEO Description"
  }
}

Publishing & Unpublishing

Publish a draft to make it live:

POST /v0/centers/:centerId/articles/:articleId/publish

Unpublish to revert to draft:

POST /v0/centers/:centerId/articles/:articleId/unpublish

Draft Management

Every article has a draft version. When you edit a published article, changes stay in draft until you publish again.

Draft statuses:

  • unpublished - Never been published

  • published - In sync with the live version

  • published_with_changes - Has unpublished edits

List all drafts:

GET /v0/centers/:centerId/articles/drafts

Supports the same limit, starting_after, category, search, and expand[] parameters, plus a status filter.

To discard unpublished changes and restore the published version:

POST /v0/centers/:centerId/articles/:articleId/draft/discard

Pagination

The API uses cursor-based pagination. Use starting_after with the last item's ID to get the next page:

GET /v0/centers/:centerId/articles?starting_after=last_article_id&limit=10

Check the has_more field in the response to know if more pages exist.

Rate Limiting

  • 100 requests per minute per API key (burst up to 200)

  • Check response headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

  • If you hit the limit, wait until the reset time before retrying

Error Handling

The API returns standard HTTP status codes with descriptive error messages:

  • 400 - Bad request (missing fields, invalid parameters)

  • 401 - Invalid or missing API key

  • 404 - Article or center not found

  • 429 - Rate limited

  • 500 - Server error

Error responses include a type, message, and code to help you debug:

{
  "error": {
    "type": "invalid_request_error",
    "message": "Title is required",
    "code": "missing_required_field"
  }
}

Code Examples

JavaScript / Node.js

const axios = require('axios');

const api = axios.create({
  baseURL: 'https://api.help.center',
  headers: {
    'Authorization': `Bearer ${process.env.HC_API_KEY}`,
    'Content-Type': 'application/json'
  }
});

// List articles
const { data } = await api.get(
  `/v0/centers/${centerId}/articles`,
  { params: { category: 'getting-started', limit: 10 } }
);

Python

import requests

headers = {
    'Authorization': f'Bearer {api_key}',
    'Content-Type': 'application/json'
}

response = requests.get(
    f'https://api.help.center/v0/centers/{center_id}/articles',
    headers=headers,
    params={'category': 'getting-started', 'limit': 10}
)
articles = response.json()

Best Practices

  1. Always use HTTPS - All API requests must use HTTPS

  2. Keep your API key secret - Never expose it in client-side code

  3. Use pagination - Don't try to fetch all articles at once

  4. Use expand[] wisely - Only request content when you need it

  5. Handle errors gracefully - Check status codes and parse error responses

  6. Respect rate limits - Implement backoff when you hit limits



Still need help?

Contact us

API