Programmatic SEO articles from $0.50 each
Prepaid credit packs from $0.60/article. No subscription. Integrate from your own stack.
-H "Authorization: Bearer $KEY" \-d '{"primary_keyword":"crm startups"}'✔ 201 — job queued→ id: a1b2c3d4researching → drafting → published✔ published — markdown + schema readyOne POST to start, then GET polls on a separate per-minute limit.
Dashboard vs API
Dashboard
- Editor UI, approvals, and CMS connectors
- Subscription quota with optional overage
- Campaigns, review queues, and team seats
Developer API
- REST v2: start jobs, poll status, pull markdown
- Credits never expire; scale concurrency by pack
- Cron, workers, or your own backend
Best for
Teams using CMS workflows, campaigns, and review queues
Developers, cron jobs, and multi-app content pipelines
Billing
Monthly subscription with article quota
One-time prepaid packs ($0.60 to $0.50/article)
Lock-in
Plan renews monthly
No subscription required
Credits
Monthly quota + optional overage
Prepaid balance, no monthly reset
Concurrency
Portal generation limits
5 / 10 / 20 parallel jobs by pack tier
Credit packs
Buy once, use anytime. Credits never expire. Higher packs unlock more parallel generations and lower per-article cost.
Side Project Pack
$30one-time
50 articles · $0.60 each
Ship one app or test the API locally.
- 5 concurrent generations
- 10 article starts/min (POST)
- 150 status polls/min (GET)
Indie SaaS Pack
$55one-time
100 articles · $0.55 each
Cron-driven content for one product or a couple of client sites.
- 10 concurrent generations
- 20 article starts/min (POST)
- 300 status polls/min (GET)
Scale Pack
$100one-time
200 articles · $0.50 each
Programmatic SEO across several sites or a content-heavy launch.
- 20 concurrent generations
- 30 article starts/min (POST)
- 600 status polls/min (GET)
How it works
- Create an account and buy a credit pack in the Developer hub.
- POST
/api/v2/articleswith your keyword, intent category, and optional brand voice overrides. - GET
/api/v2/articles/:iduntil status is published. - Optional: configure webhooks in the portal for
article.generated,article.published, and other lifecycle events.
API reference
Start a generation job, poll until the article is ready, and optionally override brand voice, reader perspective, and article category per request. Authenticate with a Bearer API key from the Developer hub.
Create article
/api/v2/articlesStarts an async SEO article generation job. Returns 202 with an article id and poll_url. Consumes one API credit per successful start (by pack tier).
Body Parameters
JSONprimary_keywordrequiredstring
Main SEO keyword or phrase the article should rank for. Drives research, outline, and on-page optimization.
secondary_keywordsarray of string
Optional supporting keywords. When omitted, GeoCopy derives related terms from the primary keyword and intent category.
intent_categorystring — "informational" | "how_to" | "comparison" | "commercial" | "transactional" | "listicle" | "local"
Article format / search intent category. Controls outline structure, word-count targets, and module selection. Default:
informational.search_intentstring
Free-text search intent label stored on the article (e.g. informational, commercial). Defaults to informational when omitted. Default:
informational.topicstring
Optional title or topic override. When omitted, the primary keyword is used as the working title.
target_word_countinteger
Target article length in words. When omitted, GeoCopy uses the default for the intent category (typically ~1,200–1,800).
length_preference"shorter" | "standard" | "comprehensive" — "shorter" | "standard" | "comprehensive"
Pipeline length bias applied on top of the category default.
reader_voicestring — "practitioner" | "expert_authority" | "editorial"
Narrative perspective preset. Practitioner allows first person where appropriate; expert_authority is third-person peer voice; editorial is reportage-style. Default:
expert_authority (or your Developer hub default).brand_voicestring or object
Brand voice override as plain text or a JSON brand-voice document (tone, vocabulary, example phrases). When omitted, your account brand brief from the Developer hub is used.
first_person_stancestring — "I" | "we" | "our team" | "the team" | "none"
First-person pronoun policy merged into brand voice when using a JSON brand_voice object. Use none to forbid first person.
Retrieve article
/api/v2/articles/:idPoll job status until the article reaches a terminal state (published, failed, or rejected). Returns the full nested document including markdown body, metadata, and billing when complete.
Path Parameters
JSONidrequiredstring (uuid)
Article ID returned from POST /api/v2/articles.
Rate limits
GeoCopy rate-limits the API on three independent axes: concurrent jobs, article starts, and status polls. Polling does not compete with new generations.
Concurrent jobs cap how many articles can be in-flight at once (queued through drafting, until published, failed, rejected, or archived). Article starts measure POST /api/v2/articles calls per minute. Each successful start consumes one API credit and queues a new job. Status polls measure GET traffic to /api/v2/articles, /api/v2/articles/:id, and /api/v2/account per minute in a separate bucket, so a tight poll loop will not reduce how many articles you can start.
Limits are set by your highest active credit pack. If you buy a larger pack later, concurrency and per-minute ceilings increase immediately. When you exceed a limit, the API returns HTTP 429 with a Retry-After hint. Check your live caps anytime with GET /api/v2/account.
Side Project Pack
50 articles · $0.60 each
- 5
- parallel
- 10
- POST / min
- 150
- GET / min
Indie SaaS Pack
Popular100 articles · $0.55 each
- 10
- parallel
- 20
- POST / min
- 300
- GET / min
Scale Pack
200 articles · $0.50 each
- 20
- parallel
- 30
- POST / min
- 600
- GET / min
| Credit pack | Parallel jobsIn-flight generations at the same time | Article startsPOST /api/v2/articles per minute | Status pollsGET polls & account checks per minute |
|---|---|---|---|
Side Project Pack 50 articles · $30 pack | 5 | 10 | 150 |
Indie SaaS Pack 100 articles · $55 pack | 10 | 20 | 300 |
Scale Pack 200 articles · $100 pack | 20 | 30 | 600 |
Per-minute counters reset on a rolling 60-second window. Concurrent slots free up when a job reaches a terminal status. Exceeding a limit returns 429 Too Many Requests with Retry-After when applicable.
REST API on every plan
Every paid plan can enable REST API access. Starter includes Tier 1 throughput, Growth Tier 2, Pro Tier 3. Each API article uses your plan quota unless you have prepaid credits.
Need API-only, prepaid credits? See Developer API pricing.
Need CMS workflows and team seats? Compare dashboard plans