GET /v1/articles/{id}
Retrieve a single article by numeric ID or external UUID, including its generated content.
curl https://serpon.ai/v1/articles/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer $SERPON_TOKEN" \
-H "Accept: application/json"
const res = await fetch(`https://serpon.ai/v1/articles/${articleId}`, {
headers: {
Authorization: `Bearer ${process.env.SERPON_TOKEN}`,
Accept: 'application/json',
},
});
const { data } = await res.json();
import os, requests
r = requests.get(
f"https://serpon.ai/v1/articles/{article_id}",
headers={
"Authorization": f"Bearer {os.environ['SERPON_TOKEN']}",
"Accept": "application/json",
},
)
data = r.json()["data"]
{
"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.",
"content": "## 1. Fix crawl budget first
…",
"original_content": "## 1. Fix crawl budget first
…",
"current_version_id": 88,
"published_version_id": null,
"status": "completed",
"article_type": "listicle",
"target_keyword": "SEO strategies 2026",
"keywords": ["search engine optimization", "organic traffic"],
"target_word_count": 1500,
"actual_word_count": 1523,
"tone": "professional",
"point_of_view": "second_person",
"language": "en",
"country_targeting": "US",
"ai_model_used": "openai:gpt-5.4",
"cost": "0.9138",
"current_step": "Final Optimization",
"humanize": false,
"ai_detection_score": 12,
"originality_checked_at": "2026-08-02T10:42:03.000Z",
"additional_context": null,
"webhook_url": "https://example.com/hooks/serpon",
"project": { "id": 1, "name": "My SEO Blog" },
"created_at": "2026-08-02T10:30:00.000000Z",
"updated_at": "2026-08-02T10:41:12.000000Z"
}
}
{
"message": "No query results for model [Article]."
}
Retrieve one article, including its content once generation finishes.
GET https://serpon.ai/v1/articles/{id}
This is the endpoint to poll while an article generates. See Article lifecycle.
Authentication
Bearer token in the Authorization header. See Authentication.
Path parameters
Either the numeric id or the external_id UUID. Both resolve the same article; store the UUID, since it is the stable public identifier.
Example
Response fields
Numeric primary key.
Stable public UUID. Prefer this when storing a reference, and use it as the idempotency key when handling webhook deliveries.
The article title as submitted.
SEO meta description, when the workflow produced one. null otherwise.
The live article — the current version, including edits made after generation. null until generation completes. Some workflows return it wrapped in a JSON envelope with the body at article.content.
The frozen generation output, before any edits. Useful for diffing; not what you should publish.
Version the content field is drawn from.
Version last delivered to an integration, if any.
queued, batching, writing, polishing, completed, published, or failed. See Article lifecycle.
The workflow that produced it — a built-in type or one of your custom types.
Primary keyword, as submitted.
Secondary keywords. Sent as a comma-separated string at creation, returned as an array.
The requested length.
The delivered length. 0 until generation produces content.
Writing tone, as submitted.
Narrative perspective, as submitted.
Content language code.
Target country code, when set.
The model that actually ran, as provider:model — e.g. openai:gpt-5.4. null until the first step completes, and it may differ from the requested model if a fallback was used.
Total generation cost in USD, accumulated across every step.
Name of the workflow step being executed. Drives a progress display while status is writing.
Whether a humanization pass was requested.
Originality score for the current version, when it has been checked. null otherwise.
When that check ran, ISO 8601.
The background material supplied at creation.
The article's own completion webhook target, if one was set.
{ id, name } of the owning project.
ISO 8601 creation timestamp.
ISO 8601 timestamp of the last change — it advances as the pipeline progresses.
Errors
| Status | When |
|---|---|
401 | Missing, invalid, or expired token |
402 | Account has no active subscription |
403 | The article exists but its project is not one you can view |
404 | No such article, or the identifier is neither a number nor a UUID |
429 | Rate limit exceeded |
See Errors for the full reference.
Tips
While polling, watch for failed as well as completed. A failed article never fires a webhook and never changes again on its own, so a loop that only checks for completed will run until it times out.