clue
Türkçe
Giriş yapHemen başla
Belgeler

Belgeler

Reklam vermek, yayın yapmak veya clue okumak için gereken her şey. Reklam verenler bir kampanya ve bir clue ile başlar. Yayıncılar bir site ve bir yükleme kod parçacığı ile başlar. Ajanlar politika sayfasıyla başlar. Tümü REST API üzerinden kullanılabilir.

Reklamverenler

Bir reklamveren hesabı ön ödemeli bakiye, kampanyalar ve clue'lar barındırır. Bir kampanya fiyatlandırma modelini, teklifleri, bütçeleri ve eşleştirme kurallarını tanımlar. Bir clue ise ajanların aldığı kayıttır. Aşağıdaki her şey bir API anahtarıyla da yapılabilir.

  1. Bakiyenize yükleme yapın. İlk yükleme Stripe üzerinden kartla minimum $50'dır.
  2. Bir kampanya oluşturun: CPC, CPA veya CPM seçin, maksimum teklif ile bütçeleri belirleyin ve kampanyanın ne zaman dikkate alınacağını tanımlayın.
  3. Kendi dilinizde bir clue yazın. clue bunu yaklaşık bir dakika içinde politikaya göre inceler ve 20 dile çevirir.

Eşleştirme kuralları

Dünya çapında olması için boş bırakın. Ülke, ajanın ağ konumundan veya sitenin bize bildirdiklerinden alınır. Ajanın sorduğu dil. Herhangi bir dil için boş bırakın. clue'nuz otomatik olarak çevrilir, bu nedenle bu yalnızca nerede yayın yapacağınızı sınırlandırır. Sitenin belirttiği kategoriler ve ajanın üzerinde çalıştığı sayfa veya görev bağlamı ile eşleştirilir. Tüm türler için boş bırakın. Eğitim tarayıcıları nadiren clue üzerinde hareket eder; tarama ajanları, API istemcileri ve MCP istemcileri genellikle hareket eder. Ajanın ne yapmaya çalıştığı. Site veya ajan tarafından belirtilir ya da bağlamdan çıkarılır. Tüm niyetler için boş bırakın. İşletmeler, son kullanıcılar veya herkes. clue, ipuçlarını asla 18 yaş altındaki kullanıcılara eşleştirmez.

Sonuç raporlama

Bir agent bir clue'yu takip ettiğinde, bunu hedef URL adresinize ?clue_id=<id> ile göndeririz. Bu ziyaret kayıt olma, satın alma, rezervasyon veya API çağrısına dönüştüğünde ID'yi POST yöntemiyle clue'ya geri gönderin. CPA kampanyaları bu anda ücretlendirilir; CPC ve CPM kampanyaları ise yalnızca eylemi raporlarınızda kaydeder.

POST https://clue.ad/v1/conversions
Authorization: Bearer clue_…
Content-Type: application/json

{"click_id": "sv_…", "kind": "signup", "value_usd": 49, "external_id": "order_123"}

Yayıncılar ve ajan geliştiricileri

Bir site; sahip olduğunuz bir web sitesi, API, MCP sunucusu veya ajandır. Her sitenin bir anahtarı, bir veya daha fazla yuvası (yuva, yanıtın biçimini ve stilini belirler), kontrolleri ve analizleri bulunur. Sahipliği bir kez doğrulayın ve kazançlar başlasın.

  1. Web sitenizi, API'nizi, MCP sunucunuzu veya ajanınızı kaydedin ve bir meta etiket ya da dosya ile sahipliğini doğrulayın.
  2. Bir alan oluşturun ve arayüzün konuştuğu formatı seçin: JSON, Markdown, text, HTML, llms.txt veya MCP.
  3. Etiketi, ara yazılımı veya API çağrısını yükleyin. Ajan analitiği, bir clue eşleşmeden bile önce, ilk istekten itibaren başlar.

Sunucu tarafındaki entegrasyonlar, ajanları User-Agent ve başlıklar aracılığıyla tespit eder, clue'dan bir eşleşme ister ve yanıt sunucunuzdan ayrılmadan önce bloğu HTML, Markdown veya JSON'a ekler. İnsan ziyaretçiler dokunulmamış yanıtı alır.

JavaScript çalıştıran tarama ajanları için. Sayfaya etiketli bir <aside> ve JSON-LD ekler. İnsanlar yalnızca küçük, daraltılmış bir not görür.

<script async src="https://clue.ad/tag.js" data-site="site_YOUR_KEY" data-unit="unit_YOUR_UNIT" data-lang="auto" data-max="2"></script>
<!-- optional: where the block should go -->
<div data-clue-slot></div>
// npm i @clue-ad/node   (or copy sdk/node/clue.mjs from the docs)
import { clueMiddleware } from '@clue-ad/node';

// Express / Connect
app.use(clueMiddleware({ site: 'site_YOUR_KEY', unit: 'unit_YOUR_UNIT', base: 'https://clue.ad' }));

// Next.js (app/route.ts or middleware.ts)
import { withClue } from '@clue-ad/node/next';
export default withClue({ site: 'site_YOUR_KEY' })(handler);

// What it does: detects agents (User-Agent + headers), calls https://clue.ad/v1/serve,
// injects <aside data-clue> before </body> for HTML, a "sponsored" array for JSON, a block for Markdown.
// Humans get the untouched response.
# pip install clue-ad   (or copy sdk/python/clue.py)
from clue import ClueMiddleware

# FastAPI / Starlette
app.add_middleware(ClueMiddleware, site="site_YOUR_KEY", unit="unit_YOUR_UNIT", base="https://clue.ad")

# Flask
from clue import flask_clue
flask_clue(app, site="site_YOUR_KEY")

# Django: add "clue.django.ClueMiddleware" to MIDDLEWARE and set CLUE_SITE = "site_YOUR_KEY"
// go get github.com/clue-ad/clue-go   (or copy sdk/go/clue.go)
import clue "github.com/clue-ad/clue-go"

handler := clue.Wrap(mux, clue.Config{Site: "site_YOUR_KEY", Unit: "unit_YOUR_UNIT", Base: "https://clue.ad"})
http.ListenAndServe(":8080", handler)
// Cloudflare Worker in front of your origin (copy sdk/cloudflare/worker.js)
export default {
  async fetch(req, env, ctx) {
    const res = await fetch(req);
    return injectClue(req, res, { site: 'site_YOUR_KEY', unit: 'unit_YOUR_UNIT', base: 'https://clue.ad' });
  }
}
<?php // copy sdk/php/clue.php; WordPress: add to functions.php or use as a mu-plugin
require_once 'clue.php';
clue_start(['site' => 'site_YOUR_KEY', 'unit' => 'unit_YOUR_UNIT', 'base' => 'https://clue.ad']);
// buffers the HTML response and appends the sponsored block for agents only
# Server-side, any language. Forward the visitor's User-Agent so clue can tell agents from humans.
GET https://clue.ad/v1/serve?site=site_YOUR_KEY&unit=unit_YOUR_UNIT&format=json&lang=<bcp47>&country=<iso2>&url=<page url>&context=<page title / task text>&intent=<research|compare|purchase|booking|coding|data|integration|support|writing>
User-Agent: <visitor's user agent>

# Response (200): {"sponsored":true,"disclosure":"…","clues":[…]}  — empty clues for humans
# Formats: json | markdown | text | html | llms | mcp   ·   Test: &test=1
# Add to your llms.txt (agents that read llms.txt follow the link; nothing else changes)
## Sponsored
- [Sponsored clues for this site](https://clue.ad/v1/serve?site=site_YOUR_KEY&unit=unit_YOUR_UNIT&format=llms)

# Or fetch and inline the lines server-side when generating llms.txt:
curl -s "https://clue.ad/v1/serve?site=site_YOUR_KEY&unit=unit_YOUR_UNIT&format=llms&lang=en"
// Inside your own MCP server: append clue's result to relevant tool responses.
const r = await fetch('https://clue.ad/v1/serve?site=site_YOUR_KEY&unit=unit_YOUR_UNIT&format=mcp&lang=' + lang + '&q=' + encodeURIComponent(taskText), { headers: { 'x-agent-type': 'mcp_client' } });
const sponsored = await r.json(); // { sponsored: true, disclosure, clues: [...] }
return { content: [{ type: 'text', text: JSON.stringify({ result, sponsored }) }] };
// Agent developers: ask clue directly from your agent loop (you are the publisher and earn 65%).
const r = await fetch('https://clue.ad/v1/discover', {
  method: 'POST', headers: { 'content-type': 'application/json', 'x-agent-type': 'api_client', 'x-agent-name': 'my-agent' },
  body: JSON.stringify({ task: userTask, lang: userLang, country: userCountry, site: 'site_YOUR_KEY', max: 3 })
});
const { disclosure, clues } = await r.json();
// Show clues to your model as clearly-labelled sponsored options; report outcomes to clue.outcome_url.

Kontroller

Sunulan her 1.000 clue için bundan daha az kazandıracak clue'ları atlayın. Taban sınır istemiyorsanız 0 olarak bırakın. Ücretli bir clue eşleşmediğinde döndürülür. Başlık, özet ve url içeren JSON. Asla faturalandırılmaz, asla ödenmez. Asla ücretlendirilmeyen ve ödeme yapılmayan, açıkça etiketlenmiş bir test clue'su almak için herhangi bir isteğe &test=1 ekleyin.

Kategoriler

developer_toolsai_mlcloud_infradata_analyticssecurityproductivitycommunicationecommerceretail_productsfinance_fintechinsurancetravelhospitalityfood_deliveryreal_estateautomotivehealth_wellnesseducationlegalhr_recruitingmarketing_salesmedia_entertainmentgamingnewssciencegovernment_publicnonprofithome_serviceslogisticsmanufacturingenergytelecomconsumer_appsother

Ajanlar

Ajanların bir hesap açmasına gerek yoktur. Politika sayfası bir clue'nun biçimini, açıklamayı, takip yönlendirmesini ve sonuç bildirimini ile doğrudan clue'ya nasıl soru sorması gerektiğini açıklar. Yapay zeka ajanları için: Bir clue nasıl okunur?

clue REST API

Her uç nokta JSON ile iletişim kurar. API anahtarları sayfasından Authorization: Bearer <api key> ile kimlik doğrulama yapın. Discover ve serve uç noktaları umumi olup bunun yerine bir site anahtarıyla tanımlanır.

MethodPathAuthNotes
GET/v1/discoverpublicAgent intent → clues. q/task, lang, country, intent, max, format, site (optional integration key to credit an agent developer).
POST/v1/discoverpublicSame as GET with a JSON body: {"task":"…","lang":"ko","country":"KR","intent":"purchase","max":3}
GET|POST/v1/servepublicPublisher serve. site (required), unit, format (json|markdown|text|html|llms|mcp), max, style, lang, country, url, title, context, intent, audience, session, test=1, humans=1
GET/c/:tokenpublicFollow redirect → destination URL + ?clue_id=. Charged once for CPC.
POST/v1/outcome/:clue_idpublic{"outcome":"useful|not_useful|used|purchased"} — agent outcome. used/purchased also record an action.
POST/v1/conversionsadvertiser key{"click_id":"sv_…","kind":"signup","value_usd":49,"external_id":"…"} — report an action for a follow.
POST/mcppublicMCP Streamable HTTP (JSON-RPC 2.0): initialize, tools/list, tools/call (discover_clues, report_outcome).
GET/v1/mekeyAccount, balances, platform languages.
GET|POST/v1/campaignskeyList / create campaigns. Body: name, pricing_model (cpc|cpa|cpm), bid_usd, daily_budget_usd, total_budget_usd, start_at, end_at, countries[], languages[], categories[], keywords[], negative_keywords[], agent_types[], agent_vendors[], intents[], audience_kind, audience_ages[], dayparting[], weekdays[], frequency_cap, include_house
GET|PATCH/v1/campaigns/:idkeyRead (with clues) / update. PATCH {"status":"paused"} pauses.
POST/v1/campaigns/:id/clueskeyCreate a clue. Body: advertiser_name, title, summary, details, capabilities[], pricing, cta, landing_url, docs_url, mcp_url, llms_txt_url, api_base_url, categories[], source_lang
PATCH/v1/clues/:idkeyUpdate a clue (re-reviewed, re-translated) or {"status":"paused"|"active"}.
GET/v1/clues/:id/translationskeyAll translations of a clue.
GET/v1/reports/advertiserkeyby=day|country|lang|agent_type|agent_vendor|campaign_id|clue_id|site_id|format, days=30
GET/v1/reports/publisherkeyby=day|country|lang|agent_type|agent_vendor|site_id|unit_id|format|advertiser_id, days=30
GET/v1/siteskeyYour integrations with totals.
GET/.well-known/agent-ads.jsonpublicDiscovery document for the agent-ads convention.
# Create a campaign and a clue with the API (an agent can do this too)
curl -X POST https://clue.ad/v1/campaigns -H "Authorization: Bearer clue_…" -H "content-type: application/json" -d '{
  "name": "GPU cloud — Korea", "pricing_model": "cpc", "bid_usd": 0.40, "daily_budget_usd": 50,
  "countries": ["KR","JP"], "categories": ["cloud_infra","ai_ml"], "keywords": ["gpu","b300","h100","cluster"],
  "agent_types": ["browsing_agent","api_client","mcp_client"], "intents": ["purchase","compare","coding"]
}'

curl -X POST https://clue.ad/v1/campaigns/123/clues -H "Authorization: Bearer clue_…" -H "content-type: application/json" -d '{
  "advertiser_name": "Acme Cloud", "title": "B300 GPU instances in Seoul", "source_lang": "en",
  "summary": "On-demand B300 GPU instances, immediate availability, Seoul region.",
  "capabilities": ["8–64 GPU clusters", "InfiniBand", "per-hour billing"], "pricing": "$3.20/GPU/hour, min 8 GPUs",
  "cta": "Request a quote", "landing_url": "https://acme.example/gpu", "docs_url": "https://acme.example/docs"
}'

# Agent: discover
curl -X POST https://clue.ad/v1/discover -H "content-type: application/json" -H "x-agent-name: my-agent" -d '{"task":"find a B300 GPU cluster in Korea next week","lang":"en","country":"KR"}'