API overview
Generate articles and manage custom workflows over HTTP.
curl -X POST https://serpon.ai/v1/articles \
-H "Authorization: Bearer $SERPON_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"project_id": 1,
"title": "How to Choose a Mattress",
"article_type": "ultimate_guide",
"target_word_count": 2000,
"tone": "friendly",
"point_of_view": "second_person",
"language": "en",
"target_keyword": "how to choose a mattress",
"webhook_url": "https://example.com/hooks/serpon"
}'
const res = await fetch('https://serpon.ai/v1/articles', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SERPON_TOKEN}`,
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({
project_id: 1,
title: 'How to Choose a Mattress',
article_type: 'ultimate_guide',
target_word_count: 2000,
tone: 'friendly',
point_of_view: 'second_person',
language: 'en',
target_keyword: 'how to choose a mattress',
webhook_url: 'https://example.com/hooks/serpon',
}),
});
const { data } = await res.json();
import os, requests
r = requests.post(
"https://serpon.ai/v1/articles",
headers={
"Authorization": f"Bearer {os.environ['SERPON_TOKEN']}",
"Accept": "application/json",
},
json={
"project_id": 1,
"title": "How to Choose a Mattress",
"article_type": "ultimate_guide",
"target_word_count": 2000,
"tone": "friendly",
"point_of_view": "second_person",
"language": "en",
"target_keyword": "how to choose a mattress",
"webhook_url": "https://example.com/hooks/serpon",
},
)
data = r.json()["data"]
{
"success": true,
"message": "Article created successfully! AI content generation has started.",
"data": {
"id": 42,
"external_id": "550e8400-e29b-41d4-a716-446655440000",
"title": "How to Choose a Mattress",
"content": null,
"status": "queued",
"article_type": "ultimate_guide",
"project": { "id": 1, "name": "Sleep Blog" },
"created_at": "2026-08-02T10:30:00.000000Z",
"updated_at": "2026-08-02T10:30:00.000000Z"
}
}
The Serpon API creates articles and manages the workflows that produce them. Everything the platform does to an article — research, outline, draft, review, images — runs behind a single POST, and the finished content comes back over polling or a webhook.
https://serpon.ai/v1
All endpoints are JSON in and JSON out, authenticated with a bearer token, and versioned under /v1.
What you can do
| Area | Endpoints |
|---|---|
| Articles | Create, list, and retrieve articles |
| Workflows | Build custom pipelines per project — create, update, reorder, duplicate, delete steps |
| Account | Identify the token holder |
Your first article
Create a token
Under Account → API keys, create a key and copy it. It is shown once. See Authentication.
Find your project ID
Every article belongs to a project. The ID is in the project URL in the dashboard, or in the project block of any article the API returns.
Post the article
Supply a title, an article type, and the style settings. Generation starts immediately.
Conventions
Envelopes. Successful responses carry success: true and put the payload in data. Collections add a meta block with pagination.
{
"success": true,
"data": [],
"meta": { "current_page": 1, "last_page": 5, "per_page": 20, "total": 87 }
}
Errors do not use that envelope. They return a message, plus errors for validation failures or a machine-readable code for gate failures. See Errors.
Timestamps are ISO 8601 in UTC.
Article identity. Articles have a numeric id and a stable external_id UUID. Either works on GET /v1/articles/{id}; store the external_id.
Before you build
API access requires an active subscription. An account with no plan gets 402 with code NO_ACTIVE_SUBSCRIPTION on every endpoint, regardless of the token's validity.
Generation is asynchronous and metered. Two things shape the integration:
- Article lifecycle — how a request becomes finished content, and how to be told when it is ready.
- Rate limits & quotas — per-plan request caps and the monthly word quota that gates creation.