Adfacten Developers

AI Öneriler: sohbet asistanlarında sponsorlu ürün kartları

Yapay zekâ sohbet uygulamanız, botunuz ya da ajanınız kullanıcının sorusunu Adfacten'e gönderir; biz de reklamverenlerin ürün kataloglarından soruyla ilgili en fazla üç ürünü “Sponsorlu” etiketli kart olarak döneriz. Kullanıcı karta tıklayıp satın alırsa (veya başvuru yaparsa) normal kampanya komisyonunuzu kazanırsınız.

Kurallar

Bu kurallar yayıncı sözleşmesinin parçasıdır; uymayan asistanlar askıya alınır.

  1. Etiket zorunlu. Kartların yanında disclosure.label (“Sponsorlu” / “Sponsored”) ve disclosure.text cümlesini her zaman gösterin; gizlemeyin, küçültmeyin, okunmaz renkte yazmayın. JavaScript paketi etiketi kaldırılamaz biçimde çizer.
  2. Cevaptan ayrı. Kartları modelin cevabına karıştırmayın, modelin “tavsiyesi” gibi sunmayın; cevabın altında ayrı bir blok olarak gösterin. Kartın why satırı neden gösterildiğini açıklar.
  3. Çocuklar yok. Çocuklara yönelik asistanlar eklenemez; sonradan çocuklara yönelik olarak işaretlenen asistana kart gelmez.
  4. Hassas konular yok. Sağlık, ruh sağlığı, cinsellik, kumar, borç sıkıntısı, siyaset, din, silah/uyuşturucu, kendine zarar ve çocuklarla ilgili sorularda API kart döndürmez (204). Bu konularda istek göndermemeniz de beklenir.
  5. Bağlantılar olduğu gibi. url alanını değiştirmeden açın; kısaltmayın, kullanıcı tıklamadan açmayın, botlarla çağırmayın. Tıklamayı ve satışı bu bağlantı kaydeder.

Hızlı başlangıç

  1. Panelde AI asistanlar → Asistan ekle: ad, tür (web sohbet, mobil uygulama, mesajlaşma botu, yapay zekâ ajanı), web siteniz ve “çocuklara yönelik mi?” sorusu.
  2. Asistan sayfasında Yerleşim ekle: kartların gösterileceği her yer için bir yerleşim (plc_…), etiket dili ve en çok kart sayısı (1–3).
  3. Sayfadaki genel anahtarı (rpk_…) ve yerleşim kimliğini kopyalayın. Canlı önizleme kutusuna bir soru yazıp kartları hemen görebilirsiniz.
  4. Kodu ekleyin (aşağıda). Yeni asistanlar test modundadır: örnek ürün kartları gelir, bağlantılar adfacten.com'a gider ve hiçbir şey kaydedilmez.
  5. Ağ ekibi asistanınızı onaylayınca test modunu kapatın; gerçek kartlar başlar.

Tarayıcıda (JavaScript)

<div id="adfacten-cards"></div>
<script src="https://cdn.adfacten.com/js/chat-1.0.0.js"></script>
<script>
  // Kullanıcının mesajını modelinize gönderirken aynı anda çağırın.
  AdfactenChat.recommend({ key: "rpk_…", placement: "plc_…", query: userMessage })
    .then((result) => AdfactenChat.render(document.getElementById("adfacten-cards"), result));
</script>

Tarayıcıdan çağırıyorsanız asistan sayfasındaki İzinli adresler listesine sitenizi yazın (ör. https://www.siteniz.com); anahtar başka sitelerden çalışmaz.

Sunucudan

curl -X POST https://api.adfacten.com/v1/recommendations \
  -H "X-Adfacten-Key: rpk_…" \
  -H "Content-Type: application/json" \
  -d '{"placement": "plc_…", "query": "3000 TL altı iyi bir kahve makinesi", "lang": "tr", "limit": 3}'
import httpx

r = httpx.post(
    "https://api.adfacten.com/v1/recommendations",
    headers={"X-Adfacten-Key": "rpk_…"},
    json={"placement": "plc_…", "query": user_message, "lang": "tr", "limit": 3},
    timeout=0.4,
)
cards = r.json() if r.status_code == 200 else None  # 204: kart yok, normal devam edin

Sunucudan rpk_ yerine recommendations:read yetkili API anahtarınızı da kullanabilirsiniz: Authorization: Bearer af_live_….

API referansı

POST https://api.adfacten.com/v1/recommendations

Başlık
X-Adfacten-Key: rpk_… Asistanın genel anahtarı (tarayıcıda kullanılabilir)
Authorization: Bearer af_live_… Ya da recommendations:read yetkili API anahtarı (yalnız sunucuda)

İstek gövdesi:

Alan Tür
placement string Yerleşim kimliği (plc_…), zorunlu
query string Kullanıcının son mesajı ya da çıkardığınız alışveriş niyeti, en çok 500 karakter, zorunlu
lang string tr (varsayılan) veya en; etiket ve why dili
country string ISO ülke kodu, ör. TR
currency string Ör. TRY
price_max number Üst fiyat sınırı (currency cinsinden)
limit number 1–3; yerleşimin en çok kart sayısını geçemez
session string İsteğe bağlı, opak sohbet kimliği; bizde yalnız tek yönlü özeti tutulur
agent_checkout boolean Ajanınız satın almayı kendisi tamamlıyorsa true (aşağıya bakın)
test boolean Onaylı asistanda da test kartı ister

Cevap 200:

{
  "request_id": "rec_…",
  "test": false,
  "disclosure": { "label": "Sponsorlu", "text": "Bu öneriler reklamdır; satın alırsanız Adfacten ve yayıncı komisyon kazanır." },
  "items": [
    {
      "id": "prd_…",
      "title": "Filtre kahve makinesi 1,2 L",
      "brand": "Marka",
      "merchant": "Mağaza adı",
      "price": { "amount": "1299.90", "currency": "TRY", "as_of": "2026-11-09T08:00:00Z" },
      "image_url": "https://…",
      "url": "https://trk.adfacten.com/c/…",
      "shown_url": "https://trk.adfacten.com/i?…&e=rec_shown",
      "why": "Sorunuzla ilgili: kahve makinesi; reklamveren komisyon öder"
    }
  ]
}

Hatalar RFC 9457 biçimindedir:

HTTP code
401 unknown_key Anahtar geçersiz ya da yenilenmiş
403 placement_mismatch Yerleşim bu asistana ait değil ya da silinmiş (durdurulmuş yerleşim 204 döner)
403 assistant_suspended Asistan askıya alınmış veya reddedilmiş
403 origin_not_allowed Tarayıcı adresi izinli adresler listesinde yok
422 invalid_request Eksik veya hatalı alan
429 rate_limited Anahtar ya da IP başına hız sınırı aşıldı; Retry-After kadar bekleyin

JavaScript paketi: @adfacten/chat

Bağımlılığı yoktur, sıkıştırılmış hâli 8 KB'ın altındadır. CDN'den (chat-1.0.0.js, global AdfactenChat) ya da npm'den kullanılabilir.

Fonksiyon
recommend(options) İsteği yapar; kartları ya da null döner. Asla hata fırlatmaz. Varsayılan zaman aşımı 400 ms (timeout). Hataları görmek için onError.
render(element, result, { theme, lang, onClick }) Kartları çizer. Etiket en üsttedir ve kaldırılırsa geri konur. Bağlantılar rel="sponsored noopener" ile yeni sekmede açılır. Görülme bildirimi kendiliğinden gönderilir. theme: light, dark, auto.
toPlainText(result) Mesajlaşma botları için düz metin: her satır Sponsorlu · Ürün – fiyat bağlantı, en sonda açıklama cümlesi.

React için:

import { AdfactenRecommendations } from "@adfacten/chat/react";

<AdfactenRecommendations request={{ key: "rpk_…", placement: "plc_…", query: userMessage }} theme="auto" />

Renkleri kapsayıcıya --adf-bg, --adf-fg, --adf-muted, --adf-border, --adf-accent, --adf-radius, --adf-font değişkenleriyle uyarlayabilirsiniz; etiketin renkleri sabittir.

MCP aracı

MCP sunucusu üzerinden ajanlar recommend_products aracını çağırabilir:

Parametre
query Zorunlu
placement İsteğe bağlı; verilmezse ilk asistanınızın ilk yerleşimi kullanılır
lang, country, price_max, limit API ile aynı

Araç API ile aynı kartları döner. Ajan kartları kullanıcıya gösterirken etiketi ve açıklama cümlesini de göstermelidir. Anahtarın recommendations:read yetkisi olmalıdır.

search_products aracı da artık doğrudan mağaza adresi yerine takip bağlantısı döner.

Ajan ödemesi (agent checkout)

Satın almayı kullanıcı adına ajanınız tamamlıyorsa (tarayıcı açmadan), istekte "agent_checkout": true gönderin. Her kartta bir attribution_token ve expires_at (30 dakika) gelir. Siparişi verirken bu token'ı mağazanın ödeme akışına (referans/kupon alanı ya da mağazanın desteklediği parametre) iletin; reklamveren dönüşümü bildirirken token'ı gönderir ve satış size yazılır. Ayrıntılar: Atıf token'ları.

Gizlilik

Sık sorulan sorular

Kart gelmiyor, neden? Soru alışverişle ilgili olmayabilir, konu hassas olabilir, eşleşen ürün olmayabilir ya da süre dolmuş olabilir; hepsinde 204 döner. Panelde canlı önizlemeyle deneyin.

Test kartlarıyla kazanç olur mu? Hayır. Test kartları örnek ürünlerdir; tıklama ve satış kaydedilmez.

Gösterim veya tıklamadan para kazanır mıyım? Hayır. Kazanç yalnız karttan gelen satış veya başvuru onaylanınca yazılır. Gösterim ve tıklama yalnız raporlarda (CTR, EPC) görünür.

Kartları kendi tasarımımla gösterebilir miyim? Evet; API'yi doğrudan kullanın. Etiket, açıklama cümlesi, why satırı ve fiyat zamanını göstermeniz ve shown_url'ü kart görüldüğünde bir kez çağırmanız gerekir.

Kartları modelin cevabına ekleyebilir miyim? Hayır. Kartlar cevaptan ayrı, etiketli bir blok olmalıdır.

Anahtarım kötüye kullanılıyor. Asistan sayfasından anahtarı yenileyin ve izinli adresleri girin.