Geliştiriciler

Ajans11 Haber Makinesi için geliştirici kaynakları

REST API, WordPress eklentisi, RSS beslemesi ve webhook. AI ile üretilmiş, editör onaylı Türkçe haber taslaklarını kendi CMS'inize ya da uygulamanıza akıtın.

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:

  1. WordPress eklentisi — kur, token gir, taslaklar otomatik WP draft'ı olarak açılsın.
  2. REST API — kendi CMS'iniz için doğrudan JSON tüketimi.
  3. RSS besleme — mevcut RSS reader'ınızda kategori bazlı akış.
Kural: Sistem hiçbir zaman içeriği doğrudan yayınlamaz. Her taslak bir insan editör tarafından onaylanana kadar 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

MethodPathAmaç
GET/healthServis sağlık kontrolü (public)
GET/openapi.jsonOpenAPI 3.0 spec (public)
GET/categoriesDesteklenen kategori slug'ları (public)
POST/tokensToken üret (email + şifre karşılığında)
DELETE/tokens/currentKullandığınız token'ı iptal et
GET/meŞu anki kullanıcı + tenant
GET/tenants/meTenant config'ini oku
PATCH/tenants/meTenant config güncelle (owner)
GET/articlesTaslakları listele (filtreler destekli)
GET/articles/{id}Tek taslak
PATCH/articles/{id}Taslak düzenle
POST/articles/{id}/publishTaslağı yayınla
POST/articles/{id}/rejectTaslağı reddet
GET/publication-logsYayın log'ları
GET/webhooksWebhook aboneliklerini listele
POST/webhooksYeni 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

KapsamLimit
Kimlik doğrulamalı tüm endpoint'ler60 istek / dakika / kullanıcı
POST /tokens5 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ı

HTTPAnlam
400Genel istek hatası (bad request)
401Token yok / geçersiz / süresi dolmuş
403Yetki yetersiz (role bazlı)
404Kaynak yok ya da tenant scope'unuz dışında
422Validation hatası (detay errors alanında)
429Rate limit aşıldı

Hata gövde formatı:

{
  "message": "The given data was invalid.",
  "errors": {
    "email": ["The email field is required."]
  }
}

Entegrasyon rehberleri

OpenAPI & API Explorer

Tüm endpoint'lerin OpenAPI 3.0 dokümanı JSON olarak sunulur. Postman / Insomnia / editor auto-complete için ideal.

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>