clue
المستندات

التوثيق

كل ما تحتاجه للإعلان، أو النشر، أو قراءة الأدلة. يبدأ المعلنون بحملة ودليل. يبدأ الناشرون بموقع واحد ومقتطف تثبيت واحد. يبدأ الوكلاء بصفحة السياسة. كل ذلك متاح عبر واجهة برمجة التطبيقات REST API.

المعلنون

يحتفظ حساب المعلن برصيد مدفوع مقدماً، وحملات، وإعلانات clue. تحدد الحملة نموذج التسعير، وعروض الأسعار، والميزانيات، وقواعد المطابقة. إعلان clue هو السجل الذي يتلقاه الوكلاء. يمكن تنفيذ كل ما يلي أيضاً باستخدام مفتاح API.

  1. اشحن رصيدك. الشحن الأول بمبلغ 50$ أو أكثر، باستخدام البطاقة عبر Stripe.
  2. أنشئ حملة: اختر CPC أو CPA أو CPM، واضبط الحد الأقصى للمزايدة والميزانيات، وحدد متى يجب اعتبار الحملة ناجحة.
  3. اكتب clue بلغتك الخاصة. تقوم clue بمراجعته وفقاً للسياسة في غضون دقيقة وترجمته إلى 20 لغة.

قواعد المطابقة

اتركه فارغاً ليشمل العالم أجمع. يأتي البلد من موقع شبكة الوكيل أو مما يخبرنا به الموقع. اللغة التي سأل بها الوكيل. اتركها فارغة لأي لغة. يتم ترجمة clue تلقائياً، لذا يقتصر هذا فقط على مكان ظهورك. يتم مطابقتها مع الفئات المعلن عنها للموقع وسياق الصفحة أو المهمة التي يعمل فيها الوكيل. اتركه فارغًا لجميع الأنواع. نادرًا ما تتفاعل برامج الزحف الخاصة بالتدريب مع clue؛ بينما تفعل ذلك عادةً وكلاء التصفح وعملاء API وعملاء MCP. ما يحاول الوكيل القيام به. يتم الإعلان عنه بواسطة الموقع أو الوكيل، أو استنتاجه من السياق. اتركه فارغاً لجميع النوايا. الشركات، أو المستهلكون، أو أي شخص. لا يطابق clue الحملات أبدًا مع المستخدمين دون سن 18 عامًا.

تقارير النتائج

عندما يتابع الوكيل إعلان clue، نرسله إلى رابط وجهتك مع ?clue_id=<id>. وعندما تتحول هذه الزيارة إلى تسجيل أو شراء أو حجز أو استدعاء API، قم بإرسال المعرف (id) مرة أخرى إلى clue باستخدام طلب POST. يتم احتساب رسوم حملات CPA في تلك اللحظة؛ بينما تسجل حملات CPC و CPM الإجراء ببساطة في تقاريرك.

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"}

ناشرو المحتوى ومطورو الوكلاء

الموقع هو موقع إلكتروني، أو واجهة برمجة تطبيقات (API)، أو خادم MCP، أو وكيل تملكه. يحتوي كل موقع على مفتاح، وفتح أو أكثر (تحدد الفتحة تنسيق وطريقة الاستجابة)، وعناصر تحكم وتحليلات. قم التحقق من الملكية مرة واحدة وابدأ الأرباح.

  1. سجل موقعك الإلكتروني أو API أو خادم MCP أو الوكيل الخاص بك وتحقق من الملكية باستخدام علامة ميتا أو ملف.
  2. أنشئ مساحة إعلانية واختر التنسيق الذي تدعمه الواجهة: JSON أو Markdown أو نص أو HTML أو llms.txt أو MCP.
  3. قم بتثبيت العلامة (tag) أو الوسيط (middleware) أو استدعاء API. تبدأ تحليلات الوكيل مع الطلب الأول تماماً، حتى قبل أن تتطابق clue.

تكتشف التكاملات من جانب الخادم الوكلاء عبر User-Agent والرؤوس، وتطلب من clue مطابقة، وتضيف الكتلة إلى HTML أو Markdown أو JSON قبل مغادرة الاستجابة لخادمك. الزوار البشريون يتلقون الاستجابة دون المساس بها.

لوكلاء التصفح الذين ينفذون JavaScript. يضيف عنصر <aside> مسجلاً وJSON-LD إلى الصفحة. البشر يَرون فقط ملاحظة صغيرة مطوية.

<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.

التحكم

تخطي الإعلانات التي تربحك أقل من هذا المبلغ لكل 1,000 إعلان معروض. اتركها على 0 لعدم وجود حد أدنى. يتم إرجاعه عند عدم مطابقة أي إعلان مدفوع. JSON يحتوي على العنوان، الملخص، والرابط. لا يتم فوترته أبدًا، ولا يتم دفع أجر عليه أبدًا. أضف &test=1 إلى أي طلب لتلقي دليل اختبار واضح التسمية لا يتم إفوترته أو دفع أجر مقابله أبداً.

الفئات

developer_toolsai_mlcloud_infradata_analyticssecurityproductivitycommunicationecommerceretail_productsfinance_fintechinsurancetravelhospitalityfood_deliveryreal_estateautomotivehealth_wellnesseducationlegalhr_recruitingmarketing_salesmedia_entertainmentgamingnewssciencegovernment_publicnonprofithome_serviceslogisticsmanufacturingenergytelecomconsumer_appsother

الوكلاء

الوكلاء لا يحتاجون إلى حساب. تشرح صفحة السياسات تنسيق إعلان clue، والإفصاح، وإعادة توجيه المتابعة والإبلاغ عن النتائج، وكيفية سؤال clue مباشرة. وكلاء الذكاء الاصطناعي: كيفية قراءة إعلان clue.

واجهة برمجة تطبيقات clue

تتواصل كل نقطة نهاية (endpoint) بلغة JSON. قم المصادقة باستخدام Authorization: Bearer <api key> من صفحة مفاتيح واجهة برمجة التطبيقات. نقاط نهاية الاكتشاف والخدمة عامة ويتم تحديدها بواسطة مفتاح الموقع بدلاً من ذلك.

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"}'