Uç nokta: {WHMCS_SYSTEM_URL}modules/addons/musteriyorumlari/api.php
- Yalnızca
GET/HEAD(CORS ön kontrolü içinOPTIONS). Diğer yöntemler405. - WHMCS oturumu başlatılmaz: çerez okunmaz/yazılmaz, API anahtarı istenmez. Tarayıcıdan
credentials: 'omit'ile çağrılır. - Modül etkin değilse
404 {"hata":"modul_kapali"}. - Veritabanına WHMCS'in
vendor/dizinindeki Illuminate Capsule ile,configuration.phpbilgileriyle bağlanır; WHMCS'in kendisini yüklemez (hızlı, oturumsuz).
Parametreler (hepsi isteğe bağlı; izin listesi)
| Parametre | Değer | Varsayılan |
|---|---|---|
r |
yorumlar · ozet · kategoriler |
yorumlar |
kategori |
kategori anahtarı ^[a-z][a-z0-9_]{1,39}$ ya da tum |
tum |
adet |
1–50 | yönetici/kategori ayarı |
sayfa |
1–500 | 1 |
sirala |
yeni · eski · puan_yuksek · puan_dusuk |
yönetici/kategori ayarı |
puan |
1–5 (filtre) | — |
donem |
30 · 90 · 365 (son N gün) | — |
Geçersiz değer 400 {"hata":"gecersiz_parametre","alan":"<ad>"} döner. Sorgu dizesi 512 baytı aşamaz. Bilinmeyen parametreler yok sayılır.
Yanıt başlıkları
| Başlık | Değer |
|---|---|
Content-Type |
application/json; charset=utf-8 |
Cache-Control |
public, no-cache (her istekte yeniden doğrulama; çoğunlukla 304) |
ETag, Last-Modified |
içerik özetinden / en son değişiklikten |
Vary |
Origin (bütün yanıtlarda) |
Access-Control-Allow-Origin |
yalnızca istek Origin'i izinli kökenlerden biriyle birebir eşleşirse, o köken |
X-Content-Type-Options |
nosniff |
Referrer-Policy |
no-referrer |
Cross-Origin-Resource-Policy |
cross-origin |
Content-Security-Policy |
default-src 'none'; frame-ancestors 'none' |
Access-Control-Allow-Credentials hiçbir zaman gönderilmez; * kullanılmaz. İzinsiz kökenden gelen ön kontrol 403.
Hata kodları
| Durum | Gövde |
|---|---|
| 400 | {"hata":"gecersiz_parametre","alan":"adet"} |
| 404 | {"hata":"kategori_yok"} (kategori yok / pasif / arşiv) · {"hata":"modul_kapali"} |
| 405 | {"hata":"yontem"} |
| 429 | {"hata":"cok_fazla_istek"} + Retry-After: <sn> (IP başına dakikada api_rate_per_minute, varsayılan 120) |
| 500 | {"hata":"sunucu"} (ayrıntı verilmez) |
| 503 | {"hata":"yapilandirma"} |
r=yorumlar gövdesi
{
"surum": 1,
"kategori": {"anahtar": "vds", "ad": "VDS Sunucu", "sayfa": "https://www.ornek.com/vds"},
"ozet": {"sayi": 3, "ortalama": 4.33, "ortalama_metin": "4,3", "dagilim": {"5": 2, "4": 0, "3": 1, "2": 0, "1": 0}},
"yorumlar": [
{
"id": "k3m9x2p4q7wz",
"kategori": {"anahtar": "vds", "ad": "VDS Sunucu"},
"paket": "OneTRVDS",
"ad": "Ayşe K.",
"dogrulanmis": true,
"rozet": "Doğrulanmış Müşteri",
"baslik": "Hızlı kurulum",
"metin": "Birinci paragraf.\nAlt satır.\n\nİkinci paragraf.",
"puan": 5,
"tarih": "2026-09-12T08:15:00Z",
"guncellendi": null,
"yanit": {"metin": "Teşekkür ederiz.", "tarih": "2026-09-13T10:00:00Z"}
}
],
"sayfalama": {"sayfa": 1, "adet": 6, "toplam": 3, "sayfa_sayisi": 1, "siralama": "yeni"},
"baglantilar": {
"tumu": "https://www.ornek.com/musteri-yorumlari?kategori=vds",
"yorum_yap": "https://my.ornek.com/index.php?m=musteriyorumlari&eylem=yaz&kategori=vds",
"bildir": "https://my.ornek.com/index.php?m=musteriyorumlari&eylem=bildir"
},
"gorunum": {
"gorunum": "kart", "tema": "acik",
"renkler": {"vurgu": "#1798c6", "yildiz": "#f2a900", "metin": "#1f2937", "zemin": "#ffffff", "cerceve": "#ecedf2"},
"ozet": true, "yanitlar": true, "saat_dilimi": "Europe/Istanbul"
},
"sema": null,
"kategoriler": null
}
kategorinull ise genel istektir (bütün aktif kategoriler); bu durumdakategoriler=[{"anahtar","ad","sayi"}].ortalamahiç yorum yoksanull,ortalama_metin""(varsayılan puan üretilmez).paketyönetici "Paket adını göster" ayarını kapatırsanull.guncellendiiçerik revizyonla değiştiyse dolu.sema: yalnızca şema koşullarını sağlayan kategoride (bkz.SEO-SEMA.md) JSON-LD nesnesi; aksi hâldenull.- Metinler düz metindir; HTML değildir. İstemci kaçışlamalıdır (
textContent,htmlspecialchars, Blade{{ }}). - JSON
<,>,&karakterlerini\u003C,\u003E,\u0026biçiminde kodlar.
r=ozet
{"surum":1,"kategori":…,"ozet":…,"baglantilar":…,"gorunum":…}
r=kategoriler
{"surum":1,"kategoriler":[{"anahtar":"vds","ad":"VDS Sunucu","sayi":3}]}
Asla dönmeyen alanlar
E-posta, IP, WHMCS müşteri/kullanıcı/hizmet/sipariş/fatura kimliği, alan adı, doğrulama kanıtı, yönetici adı, bekleyen/reddedilen/spam/kaldırılmış içerik, pasif/arşiv kategori. Sorgular bu kolonları hiç okumaz (PublicReadService); testler (K5, K12) JSON anahtarlarını ve değerlerini ayrıca tarar.
Güncellik
Yayın durumunu değiştiren her olay (onay, revizyon onayı, yayından kaldırma, maskeleme, anonimleştirme, firma yanıtı, kategori durumu/ayarı) sunucu önbelleğinin neslini artırır; eski kayıtlar anında erişilemez olur. HTTP katmanında no-cache + ETag olduğu için tarayıcı ve vekiller her istekte yeniden doğrular: en fazla gecikme sunucu ve HTTP katmanında 0 sn. Sunucuda üst süre (cache_ttl, varsayılan 900 sn) yalnızca bellek/disk temizliği içindir. Harici sunucu adaptörlerinin (WordPress transient, Laravel Cache, PHP dosya önbelleği) kendi TTL'i kadar gecikme olabilir; örneklerde varsayılan 120 sn.
CORS bir kimlik doğrulama yöntemi değildir
CORS yalnızca tarayıcıların başka kökenden yanıtı okumasını sınırlar. Aynı veriler curl gibi tarayıcı dışı istemcilere açıktır; bu sorun değildir, çünkü API yalnızca zaten herkese açık olan içeriği döndürür. Yetki gerektiren hiçbir işlem API'de yoktur.