GET /v1/articles
List articles across your projects, with search, status, and project filters.
curl -G https://serpon.ai/v1/articles \
-H "Authorization: Bearer $SERPON_TOKEN" \
-H "Accept: application/json" \
-d status=completed \
-d project_id=1 \
-d per_page=20
const params = new URLSearchParams({ status: 'completed', project_id: '1', per_page: '20' });
const res = await fetch(`https://serpon.ai/v1/articles?${params}`, {
headers: {
Authorization: `Bearer ${process.env.SERPON_TOKEN}`,
Accept: 'application/json',
},
});
const { data, meta } = await res.json();
import os, requests
r = requests.get(
"https://serpon.ai/v1/articles",
params={"status": "completed", "project_id": 1, "per_page": 20},
headers={
"Authorization": f"Bearer {os.environ['SERPON_TOKEN']}",
"Accept": "application/json",
},
)
payload = r.json()
{
"success": true,
"data": [
{
"id": 123,
"external_id": "550e8400-e29b-41d4-a716-446655440000",
"title": "10 Best SEO Strategies for 2026",
"description": "Practical SEO tactics that still move rankings in 2026.",
"status": "completed",
"article_type": "listicle",
"target_keyword": "SEO strategies 2026",
"keywords": ["search engine optimization", "organic traffic"],
"target_word_count": 1500,
"actual_word_count": 1523,
"ai_model_used": "openai:gpt-5.4",
"cost": "0.9138",
"project": { "id": 1, "name": "My SEO Blog" },
"created_at": "2026-08-02T10:30:00.000000Z",
"updated_at": "2026-08-02T10:41:12.000000Z"
}
],
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 20,
"total": 87
}
}
List articles across every project you can access.
GET https://serpon.ai/v1/articles
Results are newest first and paginated. Each entry is a full article object, so a listing of completed articles already carries their content — no follow-up request needed.
Authentication
Bearer token in the Authorization header. See Authentication.
Query parameters
Case-insensitive substring match on the article title. No other field is searched.
Exact match on status: queued, batching, writing, polishing, completed, published, or failed. One value only.
Restrict to a single project. Without it, every project on every account you belong to is included.
Results per page. Default 20.
Page number, starting at 1.
Example
Response fields
Always true on 200.
Article objects, newest first. Each has the same shape as Get article — including the full content for completed articles.
Pagination: current_page, last_page, per_page, total.
Errors
| Status | When |
|---|---|
401 | Missing, invalid, or expired token |
402 | Account has no active subscription |
429 | Rate limit exceeded |
An empty result is a 200 with data: [], not a 404.
See Errors for the full reference.
Tips
Article bodies are large. Requesting per_page=100 over a project of finished articles returns a very heavy payload — keep pages small unless you actually want every body.
This endpoint is not a completion notifier. Polling it in a loop burns the articles rate limit across all your work at once; watch a single article with GET /v1/articles/{id}, or use a webhook.