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:
Go to Settings > General > API
Copy your API Key
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/jsonQuick 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 |
|
List categories | GET |
|
Articles
Action | Method | Endpoint |
|---|---|---|
List articles | GET |
|
Search articles | GET |
|
Get article | GET |
|
Count articles | GET |
|
Create article | POST |
|
Update metadata | PATCH |
|
Delete article | DELETE |
|
Publish | POST |
|
Unpublish | POST |
|
Duplicate | POST |
|
Drafts
Action | Method | Endpoint |
|---|---|---|
List drafts | GET |
|
Count drafts | GET |
|
Get draft | GET |
|
Update draft | PATCH |
|
Discard draft | POST |
|
Listing Articles
Fetch your published articles with optional filters:
GET /v0/centers/:centerId/articlesQuery 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 paginationcategory- Filter by category IDsearch- Search by title or contentexpand[]=content- Include full HTML and text content in the response
Creating Articles
POST /v0/centers/:centerId/articlesRequest 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/publishUnpublish to revert to draft:
POST /v0/centers/:centerId/articles/:articleId/unpublishDraft 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 publishedpublished- In sync with the live versionpublished_with_changes- Has unpublished edits
List all drafts:
GET /v0/centers/:centerId/articles/draftsSupports 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/discardPagination
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=10Check 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-ResetIf 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
Always use HTTPS - All API requests must use HTTPS
Keep your API key secret - Never expose it in client-side code
Use pagination - Don't try to fetch all articles at once
Use
expand[]wisely - Only request content when you need itHandle errors gracefully - Check status codes and parse error responses
Respect rate limits - Implement backoff when you hit limits
Still need help?
Contact us