Publish your first AI-verified article.
From topic to publish-ready in under six minutes. A single POST triggers the seven-stage pipeline; you watch every inner step over Server-Sent Events.
Sign up and get a JWT.
Every pipeline run needs a Bearer JWT that carries your workspace_id. Sign-up creates the personal workspace in the same transaction; sign-in returns the token.
# 1. Sign up. Personal workspace auto-created in the same transaction.
$ curl -X POST http://localhost:7878/api/auth/sign-up \
-H "Content-Type: application/json" \
-d '{"email":"jane@acme.co","name":"Jane","password":"S3cure!pw"}'
→ 201 Created (empty body; verification email sent)# 2. Sign in. accessToken carries your workspace_id.
$ curl -X POST http://localhost:7878/api/auth/sign-in \
-H "Content-Type: application/json" \
-d '{"email":"jane@acme.co","password":"S3cure!pw"}'
→ 200 OK
{ "user": {...}, "accessToken": "eyJhbGciOi...", "refreshToken": "..." }
$ export JWT=eyJhbGciOi...No verification-click required in dev. Sign-in returns tokens immediately. Verification email is sent via Mailpit for realism, but sign-in does not block on verification status in code.
Submit your topic.
Pass your topic as user_message. The Strategy stage turns it into a position, researches what already ranks, and scopes the supporting claims. The Outline stage normalises the plan into H2/H3 sections ready for Research. You watch both run via SSE.
# Trigger the pipeline. JWT from /api/auth/sign-in carries workspace_id.
$ curl -X POST http://localhost:7878/api/article-jobs \
-H "Authorization: Bearer $JWT" \
-H "Content-Type: application/json" \
-d '{
"brand_voice_id": "33333333-...-...",
"user_message": "How AI coding agents change SDLC",
"audience_level": "intermediate",
"audience_type": "technical",
"tone_preset": "professional",
"article_word_count_preset": "RANGE_2500_3500"
}'
→ 201 Created
{ "id": "a9c3b1e4-..." }
generating_seeds
fetching_keywords
clustering_keywords
fetching_serp
fetching_competitor_content
parsing_competitor_content
analyzing_competitors
analyzing_gaps
planning_article
building_content_brief
generating_outline
validating_outline
Reuse the same position across the cluster. Pillar article and sub-articles keep one angle. Depth differs between them.
Watch the research populate.
Research stage extracts topics from the outline, runs SERP queries per topic, and captures facts. The result is a research tree: topics → queries → SERP results → facts. You follow along via SSE; the stage takes 40 to 90 seconds for typical articles.
# Subscribe to the SSE stream for live per-step updates.
$ curl -N -H "Authorization: Bearer $JWT" \
http://localhost:7878/api/article-jobs/a9c3b1e4-.../status
→ data: { step: "extracting_topics", status: "processing" }
data: { step: "researching_topics", status: "processing" }
data: { step: "consolidating_research", status: "processing" }
...
extracting_topics
researching_topics
consolidating_research
Expect 8 or more tier-A sources for a YMYL topic. Below that, verify-time claim failures climb sharply.
Generate with your voice.
The Generate stage takes the outline, the plan and the research and drafts the article section by section. Your brand_voice_id fingerprint is applied at draft time through Brand Voice; Brand Guard filters forbidden phrasing inline. The result is article_md + FAQ + JSON-LD.
# SSE continues to stream. These step names appear during Generate.
data: { step: "preparing_generation", status: "processing" }
data: { step: "generating_sections", status: "processing" }
data: { step: "generating_faq", status: "processing" }
data: { step: "assembling_article", status: "processing" }
preparing_generation
generating_sections
generating_faq
assembling_article
Voice-score under 0.80 means the draft does not sound like you yet. Re-fingerprint on 15 to 30 of your most recent articles and re-run.
Verify every factual claim.
The Verify stage walks the draft sentence by sentence. For every factual assertion, the stage checks the cited source and scores the match. Unverified claims are flagged and rewritten before the stage closes. Typical run: 40 to 60 claims checked, 2 to 6 flagged on a strong source base.
data: { step: "extracting_claims", status: "processing" }
data: { step: "verifying_claims", status: "processing" }
data: { step: "fixing_claims", status: "processing" }
# verification record written:
# claims_extracted: 58
# claims_verified: 54
# fixes_applied: 4
extracting_claims
verifying_claims
fixing_claims
Fix flagged claims by rewriting the draft. The cited source is ground truth; the draft bends to match.
Ship through the quality gate.
Optimize normalises formatting, runs SEO and GEO audits, scores the article on combined_score. Quality runs an 8-phase audit: burstiness CV above 0.55, opener diversity above 58 percent, AI pattern ratio under 40 percent, HIGH-severity tells fewer than 10. Fail any one and the job terminates with status FAIL.
data: { step: "normalizing_article", status: "processing" }
data: { step: "running_seo_audit", status: "processing" }
data: { step: "running_geo_audit", status: "processing" }
data: { step: "running_quality_audit", status: "processing" }
data: { step: "running_quality_audit", status: "completed" }
# article_quality_results row:
# quality_score: 0.87
# status: PASS
# needs_humanization: false
normalizing_article
running_seo_audit
running_geo_audit
running_quality_audit
On FAIL, the Editor engine fixes patterns without full rewrites. It targets the tells, not the voice.
Retrieve the finished article.
The public endpoint for fetching a completed article by job id is in development. Once live, a single GET /api/article-jobs/:id will return the status, the final article_md, and the quality verdict.
Until then, the article is kept in your workspace: the generated draft, and the rewritten version once verification has run. A workspace-level preview is available on request.
Per-stage artefact endpoints are also in development. When GET /api/article-jobs/:id/artifacts/research ships, this tutorial gains an optional step for inspecting research sources, claim verifications, and quality-audit breakdowns before publication.
NEXT
Verify an existing draft (coming soon)