Katteb API

Generate AI-powered articles, run SEO analyses, humanize text, and verify facts — 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 the API page in your 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

Rate limits scale with your plan. Higher-tier plans and AppSumo stacks get proportionally higher limits.

Your Rate Limit Tier

Limits are calculated as Base × Multiplier. Pro plan is the base (1×).

PlanMultiplierHeavy/DayMedium/Day
Pro1.0×50200
Agency1.5×75300
AppSumo 1–9 codes1.0×50200
AppSumo 10–19 codes1.2×60240
AppSumo 20–29 codes1.4×70280
AppSumo 30–39 codes1.6×80320
AppSumo 40–49 codes1.8×90360
AppSumo 50+ codes2.0×100400
💡 Your current tier and effective limits are shown on your API page.

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 base). Scaled by your plan multiplier.
💡 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.

Medium Operations (Humanizer, Fact-Checker)

Synchronous AI tools use standard sliding-window rate limiting (Pro base):

5
requests per minute
30
requests per hour
200
requests per day

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"
POST

humanizer/detect

Detect AI-written text

Analyze text to determine the probability that it was written by AI. Returns a 0–100 score and a human-readable verdict. Synchronous — returns results immediately.

Parameters

textstringrequiredText to analyze (50–50,000 chars)
languagestringLanguage of the text, e.g. "English", "Arabic", "French". Helps the AI analyze in the context of that language's writing norms. Default: "English". See full list ↓

Example Request

curl -X POST "https://app.katteb.com/api/v2/?endpoint=humanizer/detect" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "The landscape of artificial intelligence continues to evolve rapidly, with new paradigms emerging that leverage cutting-edge transformer architectures.",
    "language": "English"
  }'

Response 200

{
  "success": true,
  "ai_probability": 92,
  "verdict": "likely_ai",
  "credits_charged": 1,
  "word_count": 18
}

Verdict Values

likely_humanAI probability < 30%
mixedAI probability 30–69%
likely_aiAI probability ≥ 70%
POST

humanizer/rewrite

Humanize AI-written text

Rewrite text to sound naturally human while preserving meaning. Supports strength levels and optional brand voice. Synchronous — returns rewritten text immediately.

Parameters

textstringrequiredText to humanize (20–50,000 chars)
strengthstring"Subtle", "Moderate" (default), or "Strong"
languagestringOutput language for the rewritten text, e.g. "English", "Arabic", "Spanish". Default: "English". See full list ↓
add_imperfectionsbooleanAdd subtle human-like imperfections (skipped commas, informal caps)
brand_idintegerOptional. Apply brand voice context. Get IDs via brands/list

Example Request

curl -X POST "https://app.katteb.com/api/v2/?endpoint=humanizer/rewrite" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "The landscape of artificial intelligence continues to evolve rapidly.",
    "strength": "Strong",
    "language": "English",
    "add_imperfections": true
  }'

Response 200

{
  "success": true,
  "rewritten_text": "AI is moving fast, and honestly it's hard to keep up sometimes. What I've seen in the last year alone...",
  "strength": "Strong",
  "language": "English",
  "credits_charged": 100,
  "original_length": 68,
  "rewritten_length": 102
}
💡 Workflow tip: Call humanizer/detect first to check the AI probability, then use humanizer/rewrite to reduce it. Detect again to verify the improvement.
POST

factcheck/verify

Verify a claim

Verify a factual claim using AI-powered web search. Returns a TRUE/FALSE/INCONCLUSIVE verdict with explanation and source references. Synchronous — returns results immediately.

Parameters

textstringrequiredThe claim to verify (3–300 words)
brand_idintegerOptional brand ID for record-keeping

Example Request

curl -X POST "https://app.katteb.com/api/v2/?endpoint=factcheck/verify" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "The Great Wall of China is visible from space with the naked eye."
  }'

Response 200

{
  "success": true,
  "verdict": "FALSE",
  "is_fact": false,
  "explanation": "The Great Wall of China is not visible from space with the naked eye. Multiple astronauts and NASA have confirmed this is a common misconception.",
  "search_query": "is Great Wall of China visible from space",
  "references": [
    {
      "url": "https://www.nasa.gov/...",
      "title": "NASA - Great Wall Visibility"
    }
  ],
  "credits_charged": 100,
  "word_count": 13
}

Verdict Values

TRUEClaim is factually accurate based on web sources
FALSEClaim is factually inaccurate
INCONCLUSIVENot enough evidence to determine accuracy
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
Humanizer — Detect1AI detection probability score
Humanizer — Rewrite100Humanize text to bypass AI detection
Fact Check100Web-search-backed claim verification
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