ArticlesGet article

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"
{
  "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"
  }
}

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

path
idstring
Required

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

idinteger
Required

Numeric primary key.

external_idstring
Required

Stable public UUID. Prefer this when storing a reference, and use it as the idempotency key when handling webhook deliveries.

titlestring
Required

The article title as submitted.

descriptionstring

SEO meta description, when the workflow produced one. null otherwise.

contentstring

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.

original_contentstring

The frozen generation output, before any edits. Useful for diffing; not what you should publish.

current_version_idinteger

Version the content field is drawn from.

published_version_idinteger

Version last delivered to an integration, if any.

statusstring
Required

queued, batching, writing, polishing, completed, published, or failed. See Article lifecycle.

article_typestring
Required

The workflow that produced it — a built-in type or one of your custom types.

target_keywordstring

Primary keyword, as submitted.

keywordsarray

Secondary keywords. Sent as a comma-separated string at creation, returned as an array.

target_word_countinteger
Required

The requested length.

actual_word_countinteger
Required

The delivered length. 0 until generation produces content.

tonestring
Required

Writing tone, as submitted.

point_of_viewstring
Required

Narrative perspective, as submitted.

languagestring
Required

Content language code.

country_targetingstring

Target country code, when set.

ai_model_usedstring

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.

coststring

Total generation cost in USD, accumulated across every step.

current_stepstring

Name of the workflow step being executed. Drives a progress display while status is writing.

humanizeboolean
Required

Whether a humanization pass was requested.

ai_detection_scoreinteger

Originality score for the current version, when it has been checked. null otherwise.

originality_checked_atstring

When that check ran, ISO 8601.

additional_contextstring

The background material supplied at creation.

webhook_urlstring

The article's own completion webhook target, if one was set.

projectobject
Required

{ id, name } of the owning project.

created_atstring
Required

ISO 8601 creation timestamp.

updated_atstring
Required

ISO 8601 timestamp of the last change — it advances as the pipeline progresses.

Errors

StatusWhen
401Missing, invalid, or expired token
402Account has no active subscription
403The article exists but its project is not one you can view
404No such article, or the identifier is neither a number nor a UUID
429Rate 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.