Genel bakış
Ajans11 Haber Makinesi, AI destekli çoklu-kaynak doğrulama akışıyla marka sesinize göre yazılmış Türkçe haber taslakları üretir. Editör ekibiniz taslakları panelden ya da API üzerinden inceler; onayladığınız içerikler doğrudan kendi CMS'inize aktarılır.
Geliştirici olarak üç ana entegrasyon yolunuz var:
- WordPress eklentisi — kur, token gir, taslaklar otomatik WP draft'ı olarak açılsın.
- REST API — kendi CMS'iniz için doğrudan JSON tüketimi.
- RSS besleme — mevcut RSS reader'ınızda kategori bazlı akış.
needs_review ya da approved
durumunda kalır.
Kimlik doğrulama
Kimlik doğrulama, Laravel Sanctum tabanlı kişisel erişim token'ları ile yapılır.
Token'ı standart Authorization: Bearer <token> başlığında gönderin.
# Token isteği
curl -X POST https://newsmachine.umutozan.dev/api/v1/tokens \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"******","name":"benim-cms"}'
Cevap 201 döndüğünde token alanındaki dizeyi güvenli bir yerde saklayın.
Token, üretildiği kullanıcının tenant'ına otomatik bağlanır — bir sonraki isteklerinizin
hepsi bu tenant'a scope'lanır. Token'lar süresizdir; iptal için DELETE /tokens/current
kullanın.
API base URL
https://newsmachine.umutozan.dev/api/v1
Tüm endpoint yolları bu prefix'e göre yazılmıştır. Yanıtlar application/json
formatındadır. Tarih alanları ISO 8601 (UTC).
Endpoint özeti
| Method | Path | Amaç |
|---|---|---|
| GET | /health | Servis sağlık kontrolü (public) |
| GET | /openapi.json | OpenAPI 3.0 spec (public) |
| GET | /categories | Desteklenen kategori slug'ları (public) |
| POST | /tokens | Token üret (email + şifre karşılığında) |
| DELETE | /tokens/current | Kullandığınız token'ı iptal et |
| GET | /me | Şu anki kullanıcı + tenant |
| GET | /tenants/me | Tenant config'ini oku |
| PATCH | /tenants/me | Tenant config güncelle (owner) |
| GET | /articles | Taslakları listele (filtreler destekli) |
| GET | /articles/{id} | Tek taslak |
| PATCH | /articles/{id} | Taslak düzenle |
| POST | /articles/{id}/publish | Taslağı yayınla |
| POST | /articles/{id}/reject | Taslağı reddet |
| GET | /publication-logs | Yayın log'ları |
| GET | /webhooks | Webhook aboneliklerini listele |
| POST | /webhooks | Yeni webhook kaydet (secret tek seferlik döner) |
| DELETE | /webhooks/{id} | Webhook sil |
Kod örnekleri
Token üretip son 10 taslağı çekmek — dört dilde:
# 1. Token al
TOKEN=$(curl -sS -X POST \
https://newsmachine.umutozan.dev/api/v1/tokens \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"***"}' \
| jq -r .token)
# 2. Son 10 approved taslağı listele
curl -sS "https://newsmachine.umutozan.dev/api/v1/articles?status=approved&per_page=10" \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
const BASE = 'https://newsmachine.umutozan.dev/api/v1';
// 1. Token al
const tokenRes = await fetch(`${BASE}/tokens`, {
method: 'POST',
headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
body: JSON.stringify({ email: '[email protected]', password: '***' }),
});
const { token } = await tokenRes.json();
// 2. Taslakları listele
const res = await fetch(`${BASE}/articles?status=approved&per_page=10`, {
headers: { 'Authorization': `Bearer ${token}`, 'Accept': 'application/json' },
});
const { data } = await res.json();
console.log(data.length, 'taslak alındı');
import requests
BASE = 'https://newsmachine.umutozan.dev/api/v1'
# 1. Token al
r = requests.post(f'{BASE}/tokens', json={
'email': '[email protected]',
'password': '***',
'name': 'benim-cms',
})
token = r.json()['token']
# 2. Taslakları listele
r = requests.get(f'{BASE}/articles',
params={'status': 'approved', 'per_page': 10},
headers={'Authorization': f'Bearer {token}'},
)
articles = r.json()['data']
print(len(articles), 'taslak')
use Illuminate\Support\Facades\Http;
$base = 'https://newsmachine.umutozan.dev/api/v1';
// 1. Token al
$token = Http::acceptJson()
->post($base.'/tokens', [
'email' => '[email protected]',
'password' => '***',
'name' => 'benim-cms',
])->json('token');
// 2. Taslakları listele
$articles = Http::withToken($token)
->acceptJson()
->get($base.'/articles', [
'status' => 'approved',
'per_page' => 10,
])->json('data');
Webhook
Onaylanan / yayınlanan taslaklar için kendi endpoint'inize webhook alabilirsiniz.
Her payload X-Signature başlığında HMAC-SHA256 imzasıyla gönderilir.
Aşağıda Node ve PHP için doğrulama örnekleri:
import crypto from 'node:crypto';
function verify(rawBody, header, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(header)
);
}
app.post('/hooks/ajans11', express.raw({ type: '*/*' }), (req, res) => {
const ok = verify(req.body, req.header('X-Signature'), process.env.SECRET);
if (!ok) return res.status(401).end();
const payload = JSON.parse(req.body.toString('utf8'));
// payload.event, payload.article, payload.tenant
res.json({ received: true });
});
Route::post('/hooks/ajans11', function (Request $request) {
$raw = $request->getContent();
$header = $request->header('X-Signature', '');
$expected = hash_hmac('sha256', $raw, config('services.ajans11.secret'));
if (! hash_equals($expected, $header)) {
abort(401);
}
$payload = json_decode($raw, true);
// $payload['event'], $payload['article'], $payload['tenant']
return ['received' => true];
});
Desteklenen event'ler:
article.published,
article.needs_review,
article.rejected,
gallery.published,
quality.dropped.
Webhook aboneliği POST /api/v1/webhooks ile yapılır — dönüş 201'de gelen secret
sadece bir kez gösterilir, güvenli bir yere kaydedin.
Rate limits
| Kapsam | Limit |
|---|---|
| Kimlik doğrulamalı tüm endpoint'ler | 60 istek / dakika / kullanıcı |
| POST /tokens | 5 istek / dakika / IP |
| Public discovery (/health, /categories, /openapi.json) | 60 istek / dakika / IP |
Limit aşımında 429 Too Many Requests döner. Bekleme süresi Retry-After başlığındadır.
Hata kodları
| HTTP | Anlam |
|---|---|
| 400 | Genel istek hatası (bad request) |
| 401 | Token yok / geçersiz / süresi dolmuş |
| 403 | Yetki yetersiz (role bazlı) |
| 404 | Kaynak yok ya da tenant scope'unuz dışında |
| 422 | Validation hatası (detay errors alanında) |
| 429 | Rate limit aşıldı |
Hata gövde formatı:
{
"message": "The given data was invalid.",
"errors": {
"email": ["The email field is required."]
}
}Entegrasyon rehberleri
WP eklentisi
Zip'i indir, kur, token gir. Onaylı taslaklar WP draft'ı olarak açılsın.
REST APIKendi CMS'iniz
curl workflow'ları ile başka bir CMS'e taslak çekme reçetesi.
RSSRSS beslemesi
Tenant + kategori başına RSS feed URL — mevcut reader'ınızda çalışır.
OpenAPI & API Explorer
Tüm endpoint'lerin OpenAPI 3.0 dokümanı JSON olarak sunulur. Postman / Insomnia / editor auto-complete için ideal.
/api/v1/openapi.json— makine-okur OpenAPI 3.0 spec/gelistiriciler/api-explorer— inline Swagger UI
Kendi projelerinizde Swagger UI yüklemek için CDN link:
<!-- Swagger UI 5 · CDN -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css">
<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
<div id="swagger"></div>
<script>
SwaggerUIBundle({
url: 'https://newsmachine.umutozan.dev/api/v1/openapi.json',
dom_id: '#swagger',
});
</script>