Katteb API

Generate AI-powered articles, run SEO analyses, and create content plans — all from your own code.

BASE https://app.katteb.com/api/v2/

Authentication

All API requests require a Bearer token in the Authorization header.

Generate your API key from Settings → Public API Key in the Katteb dashboard.

# Include in every request
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
⚠️ API access requires a paid plan (Pro, Agency, or Lifetime Deal). Free and trial users cannot access the API.
ℹ️ Credits are checked before every request. If you don't have enough credits, you'll receive a 402 error before any resources are consumed.

Rate Limits

The API mirrors the same behavior as the Katteb dashboard — you can only run one heavy operation at a time.

Heavy Operations (Article, SEO)

These use job-based concurrency gating — the same rules as the dashboard:

RuleBehavior
ArticlesCannot submit a new article while one is being generated. Wait for completion or 10 min timeout.
SEO AnalysisCannot submit a new analysis while one is in progress. Wait for completion or 5 min timeout.
Daily Cap50 heavy operations per day (Pro). Higher tiers get multiplied limits.
💡 Blocked? The 429 response includes active_job_id and active_job_type so you can poll the active job's status instead of waiting blindly.

Read Operations (Status, Credits, Lists)

Lightweight endpoints use standard sliding-window rate limiting:

30
requests per minute
300
requests per hour
5,000
requests per day

Response Headers

# Heavy operations
X-RateLimit-Limit-Day: 50
X-RateLimit-Remaining-Day: 47
X-Credits-Remaining: 25000

# Read operations
X-RateLimit-Limit-Minute: 30
X-RateLimit-Remaining-Minute: 28
X-RateLimit-Limit-Hour: 300
X-RateLimit-Remaining-Hour: 295

When blocked, you receive a 429 with a Retry-After header and the active job details:

{
  "success": false,
  "error": "You have an article being generated (Job #4521, status: processing)...",
  "retry_after": 180,
  "active_job_id": 4521,
  "active_job_type": "article"
}

Endpoints

All endpoints use the query parameter ?endpoint= to specify the operation.

POST

articles/generate

Generate an article

Queue an article for background generation. Returns a job ID for polling. Credits deducted immediately.

Parameters

topicstringrequiredArticle topic (max 500 chars)
languagestringLanguage name, e.g. "English", "Arabic", "French". See full list ↓
countrystringISO 3166-1 alpha-2 code (gl parameter), e.g. "us", "gb", "ae". See full list ↓
word_countinteger500–5000. Default: 1500
brand_idintegerOptional. Get IDs via brands/list
writing_style_idintegerOptional. Get IDs via styles/list
guidelinesstringOptional. Custom instructions (max 2000 chars)
enhancementsarrayOptional: "tldr", "featured_image", "internal_links", "faq", "key_takeaways", "video_embed", "quotes", "patent"

Example Request

curl -X POST "https://app.katteb.com/api/v2/?endpoint=articles/generate" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "topic": "Best AI Writing Tools in 2026",
    "language": "English",
    "country": "us",
    "word_count": 1500,
    "enhancements": ["featured_image", "tldr"]
  }'

Response 201

{
  "success": true,
  "job_id": 4521,
  "topic": "Best AI Writing Tools in 2026",
  "credits_charged": 2005,
  "estimated_time": "2-5 minutes",
  "status": "pending",
  "poll_url": "?endpoint=articles/get&id=4521"
}
GET

articles/get

Get article status & content

Poll this endpoint to check article generation progress. Content is returned when status is "completed".

idintegerrequiredJob ID (from articles/generate response)

Example

curl "https://app.katteb.com/api/v2/?endpoint=articles/get&id=4521" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response (completed) 200

{
  "success": true,
  "job_id": 4521,
  "topic": "Best AI Writing Tools in 2026",
  "status": "completed",
  "progress": 100,
  "content_html": "<h1>Best AI Writing Tools...</h1><p>...</p>",
  "featured_image": "https://...",
  "meta_title": "Best AI Writing Tools in 2026",
  "meta_description": "Discover the top AI writing...",
  "word_count": 1523
}

Status Values

pendingQueued, waiting for worker
processingBeing generated (check progress %)
completedDone — full content available
failedGeneration failed — see error_detail
cancelledCancelled by user
GET

articles/list

List your articles
pageintegerPage number. Default: 1
limitintegerItems per page (1–50). Default: 20
statusstringFilter: pending, processing, completed, failed
curl "https://app.katteb.com/api/v2/?endpoint=articles/list&page=1&limit=10&status=completed" \
  -H "Authorization: Bearer YOUR_API_KEY"
DELETE

articles/cancel

Cancel a pending article

Cancel a pending or scheduled article. Credits are automatically refunded.

idintegerrequiredJob ID to cancel
curl -X DELETE "https://app.katteb.com/api/v2/?endpoint=articles/cancel&id=4521" \
  -H "Authorization: Bearer YOUR_API_KEY"
POST

seo/analyze

Submit SEO analysis

Submit a URL or raw text for AI-powered SEO analysis. Returns a job ID for polling.

typestringrequired"url" or "text"
valuestringrequiredThe URL to analyze or raw HTML/text content
keywordstringTarget keyword (auto-extracted if empty)
brand_idintegerOptional brand ID
curl -X POST "https://app.katteb.com/api/v2/?endpoint=seo/analyze" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "url",
    "value": "https://example.com/blog-post",
    "keyword": "ai writing tools"
  }'

Response 201

{
  "success": true,
  "job_id": 4522,
  "keyword": "ai writing tools",
  "credits_charged": 1000,
  "estimated_time": "1-3 minutes",
  "status": "pending",
  "poll_url": "?endpoint=seo/get&id=4522"
}
GET

seo/get

Get SEO analysis results
idintegerrequiredJob ID from seo/analyze
curl "https://app.katteb.com/api/v2/?endpoint=seo/get&id=4522" \
  -H "Authorization: Bearer YOUR_API_KEY"
GET

account/credits

Get credit balance
curl "https://app.katteb.com/api/v2/?endpoint=account/credits" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "credits": 25000,
  "credits_total": 50000,
  "plan_type": "pro",
  "plan_tier": "pro",
  "api_usage_today": { "heavy": 3, "read": 12 }
}
GET

account/limits

Get rate limit status
curl "https://app.katteb.com/api/v2/?endpoint=account/limits" \
  -H "Authorization: Bearer YOUR_API_KEY"
GET

styles/list

List your writing styles

Get all your writing styles with their IDs. Use the id as writing_style_id in articles/generate.

Writing styles are created in the Katteb dashboard under Writer → Writing Style. Each style defines tone, formatting rules, and example text that the AI follows.

curl "https://app.katteb.com/api/v2/?endpoint=styles/list" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response 200

{
  "success": true,
  "styles": [
    {
      "id": 42,
      "name": "Conversational Blog",
      "description": "Friendly, engaging tone with short paragraphs",
      "is_active": true,
      "created_at": "2026-03-15 10:30:00"
    },
    {
      "id": 38,
      "name": "Technical Documentation",
      "description": "Formal, precise language with code examples",
      "is_active": false,
      "created_at": "2026-02-20 14:15:00"
    }
  ],
  "count": 2,
  "hint": "Use the 'id' value as 'writing_style_id' in articles/generate."
}
💡 How to use: First call styles/list to get your style IDs, then pass the desired id as writing_style_id when generating articles.
GET

brands/list

List your brands

Get all your brands/workspaces with their IDs. Use the id as brand_id in articles/generate or seo/analyze.

curl "https://app.katteb.com/api/v2/?endpoint=brands/list" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response 200

{
  "success": true,
  "brands": [
    {
      "id": 15,
      "name": "My Tech Blog",
      "url": "https://mytechblog.com",
      "created_at": "2026-01-10 08:00:00"
    }
  ],
  "count": 1,
  "hint": "Use the 'id' value as 'brand_id' in articles/generate or seo/analyze."
}

Credit Costs

Credits are deducted at the time of job creation. Cancelled jobs are refunded. Costs are loaded live from the system and always up to date.

OperationCredit CostNotes
Article Generation1,500Base cost per article
SEO Analysis1,000Includes competitor analysis + recommendations
Status Check / List0Free — poll as needed
Credit Balance / Limits0Free

Enhancement Add-on Costs

Each enhancement adds to the base article cost when included in the enhancements array.

EnhancementKeyCredit Cost
TL;DR Summarytldr5
Featured Imagefeatured_image500
Internal Linksinternal_links100
FAQ Sectionfaq5
Key Takeawayskey_takeaways5
Video Embedvideo_embed10
Quotesquotes10
Patent Analysispatent15
💡 Example: An article with featured_image + tldr costs 1,500 + 500 + 5 = 2,005 credits.

Countries & Languages

Use ISO 3166-1 alpha-2 codes for the country parameter (Google's gl geo-location parameter) and language names or codes for language.

Country Codes (gl parameter)

170+ supported countries. Use the 2-letter code in your API requests.

CodeCountry
us🇺🇸 United States
gb🇬🇧 United Kingdom
ca🇨🇦 Canada
au🇦🇺 Australia
de🇩🇪 Germany
fr🇫🇷 France
es🇪🇸 Spain
it🇮🇹 Italy
nl🇳🇱 Netherlands
br🇧🇷 Brazil
in🇮🇳 India
jp🇯🇵 Japan
ae🇦🇪 United Arab Emirates
sa🇸🇦 Saudi Arabia
eg🇪🇬 Egypt
tr🇹🇷 Turkey
kr🇰🇷 South Korea
mx🇲🇽 Mexico
ar🇦🇷 Argentina
co🇨🇴 Colombia
za🇿🇦 South Africa
ng🇳🇬 Nigeria
ke🇰🇪 Kenya
se🇸🇪 Sweden
no🇳🇴 Norway
dk🇩🇰 Denmark
fi🇫🇮 Finland
pl🇵🇱 Poland
at🇦🇹 Austria
ch🇨🇭 Switzerland
be🇧🇪 Belgium
pt🇵🇹 Portugal
ie🇮🇪 Ireland
nz🇳🇿 New Zealand
sg🇸🇬 Singapore
my🇲🇾 Malaysia
ph🇵🇭 Philippines
id🇮🇩 Indonesia
th🇹🇭 Thailand
vn🇻🇳 Vietnam
pk🇵🇰 Pakistan
bd🇧🇩 Bangladesh
il🇮🇱 Israel
jo🇯🇴 Jordan
lb🇱🇧 Lebanon
kw🇰🇼 Kuwait
qa🇶🇦 Qatar
bh🇧🇭 Bahrain
om🇴🇲 Oman
ma🇲🇦 Morocco
tn🇹🇳 Tunisia
dz🇩🇿 Algeria
iq🇮🇶 Iraq
ru🇷🇺 Russia
ua🇺🇦 Ukraine
ro🇷🇴 Romania
cz🇨🇿 Czech Republic
hu🇭🇺 Hungary
gr🇬🇷 Greece
bg🇧🇬 Bulgaria
rs🇷🇸 Serbia
hr🇭🇷 Croatia
cl🇨🇱 Chile
pe🇵🇪 Peru
hk🇭🇰 Hong Kong
tw🇹🇼 Taiwan
cn🇨🇳 China
ℹ️ Full list of 170+ countries available. These are the most commonly used codes.

Supported Languages

For articles/generate, use the full language name (e.g. "English").

CodeNameNative
enEnglishEnglish
arArabicالعربية
zhChinese (Simplified)简体中文
zh_TWChinese (Traditional)繁體中文
esSpanishEspañol
hiHindiहिन्दी
ptPortuguesePortuguês
ruRussianРусский
jaJapanese日本語
deGermanDeutsch
frFrenchFrançais
koKorean한국어
trTurkishTürkçe
itItalianItaliano
nlDutchNederlands
viVietnameseTiếng Việt
plPolishPolski
ukUkrainianУкраїнська
roRomanianRomână
idIndonesianBahasa Indonesia
thThaiไทย
svSwedishSvenska
daDanishDansk
fiFinnishSuomi
noNorwegianNorsk
heHebrewעברית
faPersianفارسی
urUrduاردو
bnBengaliবাংলা
taTamilதமிழ்
teTeluguతెలుగు
mrMarathiमराठी
guGujaratiગુજરાતી
msMalayBahasa Melayu
huHungarianMagyar
elGreekΕλληνικά
csCzechČeština
bgBulgarianБългарски
hrCroatianHrvatski
skSlovakSlovenčina
srSerbianСрпски
ltLithuanianLietuvių
slSlovenianSlovenščina
etEstonianEesti
lvLatvianLatviešu
kaGeorgianქართული
azAzerbaijaniAzərbaycan
swSwahiliKiswahili
amAmharicአማርኛ
neNepaliनेपाली
tlTagalogTagalog
jvJavaneseBasa Jawa
yoYorubaYorùbá
igIgboIgbo
zuZuluIsiZulu

Error Codes

All errors return JSON with "success": false and an "error" message.

CodeMeaningAction
400Bad RequestCheck required parameters
401UnauthorizedCheck your API key
402Insufficient CreditsTop up credits or upgrade plan
403ForbiddenAPI requires a paid plan
429Rate LimitedWait for Retry-After seconds
500Server ErrorRetry after a moment

Error Response Example

{
  "success": false,
  "error": "Rate limit exceeded. You can make 1 request every 10 minutes.",
  "retry_after": 420
}

API Playground

Test API endpoints directly from your browser. Your API key is only sent to the Katteb API and never stored.

GET

Send a request to see the response here