API Documentation
Connect SiberMakale to your own app, site, or automations (Zapier, Make, n8n): generate articles, track their status, get content as HTML / Markdown.
🚀 Quick start
- Sign up for free or log in, then create an API key on this page.
POST ?r=articlesand send the topic and keywords.GET ?r=jobs&id=…and poll until the status is "done".GET ?r=article&id=…Get the full article with.
Base URL: https://sibermakale.info/api/v1.php · All responses are JSON (UTF-8) · 1 article credit is used per article.
🔑 Your API keys
Log in to generate an API key.
Log in Free registrationDo not share your key with anyone or include it in client-side code; keep it server-side. The key is stored as a hash and we cannot see it.
🛡 Authentication
Send your key with every request Authorization send in header:
Authorization: Bearer sm_ANAHTARINIZ
Alternative: X-API-Key: sm_ANAHTARINIZ
📡 Endpoints
?r=meAccount information and balances (article credits, tool credits, unlimited plan expiration).
Example response
{"ok":true,"user":{"id":12,"name":"Ayşe","email":"ayse@ornek.com","article_credits":18,"tool_credits":5,"unlimited_until":null}}?r=optionsList of available languages, tones, lengths, content types, image options, and formatting values.
Example response
{"ok":true,"options":{"language":["tr","en","de",…],"tone":["profesyonel",…],"length":[500,1000,1500,…],…}}?r=articlesStarts an article job. Each article consumes 1 article credit; credits for failed articles are automatically refunded. See below for body parameters. below see.
Example response
{"ok":true,"job":{"id":345,"status":"planning","total":1,"done":0,"articles":[{"id":901,"status":"pending","title":""}]}}?r=jobs&id=345Job status. Each query advances the job; poll every 10–20 seconds until status is "done" (or use webhook_url).
Example response
{"ok":true,"job":{"id":345,"status":"done","total":1,"done":1,"articles":[{"id":901,"status":"done","title":"Kahve Makinesi Nasıl Seçilir?","word_count":1540,"originality":96.4}]}}?r=articles&limit=20Your latest completed articles (up to 100).
Example response
{"ok":true,"articles":[{"id":901,"job_id":345,"title":"…","slug":"kahve-makinesi-nasil-secilir","word_count":1540}]}?r=article&id=901&format=htmlFull article text. Format: html (default), markdown, or text.
Example response
{"ok":true,"article":{"id":901,"title":"…","seo_title":"…","meta_description":"…","slug":"…","format":"html","content":"<h2>…</h2><p>…</p>"}}🧩 Article parameters (POST ?r=articles)
JSON body (Content-Type: application/json) or sent as form data.
| Field | Type | Required | Description |
|---|---|---|---|
topic | string | Yes* | Article topic / title idea (min 3 characters). |
topics | array / lines | No | Bulk writing: each item is a separate article (max 10). If provided, overrides topic. |
keywords | array / comma-separated text | Yes | Keywords (1–10). |
language | string | No | Language code, e.g., tr, en, de. Default: tr. |
length | number | No | Target word count (options → length). Default 1000. |
tone | string | No | Writing tone (options → tone). Default: professional. |
content_type | string | No | Content type: blog, guide, list, comparison… (options → content_type). |
seo | bool | No | SEO optimization. Default: enabled in API. |
highlight | series | No | Highlight templates (options → highlight). |
faq / toc / takeaways / aeo / citations | bool | No | F.A.Q., table of contents, highlights, AI search optimization, references. |
image_strategy | string | No | none (default), ai or web (options → image_strategy). |
images_per_article | number | No | 1–5 images. |
use_brand | bool | No | Write using your Brand Profile. |
link_url | string | No | Your website to link to in the article. |
webhook_url | https URL | No | When the job is finished, the result is sent as a JSON POST request to this URL. |
* Either topic or topics is required.
🔄 Typical flow
An article is usually ready in 1–4 minutes depending on the settings. Job status: planning, running, done, failed. Article status: pending, running, done, failed.
🪝 Webhook
Instead of polling webhook_url if you provide, a webhook will be sent to your address when the job is complete POST :
{"event":"job.done","job":{"id":345,"status":"done","total":1,"done":1,"articles":[…]}}
Verification: X-SiberMakale-Signature the title, the body's HMAC-SHA256 is the signature; the SHA-256 hash of the API key that initiated the job is used as the key:
hash_hmac('sha256', $govde, hash('sha256', $apiAnahtari)). The process runs in the background even if you don't poll, and a webhook is sent when finished (https addresses only).
💻 Code examples
curl -X POST "https://sibermakale.info/api/v1.php?r=articles" \
-H "Authorization: Bearer sm_ANAHTARINIZ" \
-H "Content-Type: application/json" \
-d '{"topic":"Kahve makinesi nasıl seçilir","keywords":["kahve makinesi","espresso"],"language":"tr","length":1500,"faq":true}'
<?php
$key = 'sm_ANAHTARINIZ';
$api = 'https://sibermakale.info/api/v1.php';
$call = function (string $route, ?array $body = null) use ($key, $api) {
$ch = curl_init($api . '?r=' . $route);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 320,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $key, 'Content-Type: application/json']]);
if ($body) { curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body)); }
return json_decode(curl_exec($ch), true);
};
$job = $call('articles', ['topic' => 'Kahve makinesi nasıl seçilir', 'keywords' => ['kahve makinesi']])['job'];
do { sleep(15); $job = $call('jobs&id=' . $job['id'])['job']; } while (!in_array($job['status'], ['done', 'failed']));
foreach ($job['articles'] as $a) {
$art = $call('article&id=' . $a['id'])['article'];
echo $art['title'], "\n", $art['content'];
}
const KEY = 'sm_ANAHTARINIZ';
const API = 'https://sibermakale.info/api/v1.php';
const call = (route, body) => fetch(`${API}?r=${route}`, {
method: body ? 'POST' : 'GET',
headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: body ? JSON.stringify(body) : undefined,
}).then(r => r.json());
let { job } = await call('articles', { topic: 'Kahve makinesi nasıl seçilir', keywords: ['kahve makinesi'] });
while (!['done', 'failed'].includes(job.status)) {
await new Promise(r => setTimeout(r, 15000));
({ job } = await call(`jobs&id=${job.id}`));
}
console.log(job.articles);
import requests, time
KEY = 'sm_ANAHTARINIZ'
API = 'https://sibermakale.info/api/v1.php'
H = {'Authorization': f'Bearer {KEY}'}
job = requests.post(f'{API}?r=articles', headers=H, json={'topic': 'Kahve makinesi nasıl seçilir', 'keywords': ['kahve makinesi']}).json()['job']
while job['status'] not in ('done', 'failed'):
time.sleep(15)
job = requests.get(f"{API}?r=jobs&id={job['id']}", headers=H, timeout=320).json()['job']
for a in job['articles']:
art = requests.get(f"{API}?r=article&id={a['id']}&format=markdown", headers=H).json()['article']
print(art['title'], art['content'][:200])
⚠ Error codes
{"ok":false,"error":{"type":"invalid_request","message":"En az bir anahtar kelime girin."}}
| HTTP | type | Meaning |
|---|---|---|
| 401 | unauthorized | Missing or invalid key. |
| 402 | insufficient_credits | Not enough article credits. |
| 404 | not_found | Job / article not found or no such endpoint. |
| 422 | invalid_request | Missing or invalid parameter (details in the message). |
| 429 | rate_limited | Rate limit of 60 requests per minute exceeded (see Retry-After header). |
| 500 | server_error | Unexpected error; please try again. |
📏 Limits & pricing
- 60 requests per minute (per key).
- Maximum 10 articles per request; each article consumes 1 article credit. Daily fair use limits apply to unlimited plans.
- The API itself is free; only the articles you generate are deducted from your credits. For plans Plans page.