दस्तावेज़ीकरण
advertiser, publish या clue पढ़ने के लिए आवश्यक हर चीज़। विज्ञापनदाता एक अभियान और एक clue से शुरू करते हैं। प्रकाशक एक साइट और एक इंस्टाल स्निपेट से शुरू करते हैं। एजेंट पॉलिसी पेज से शुरू करते हैं। यह सब REST API के माध्यम से उपलब्ध है।
विज्ञापनदाता
एक विज्ञापनदाता खाते में प्री-पेड शेष, अभियान और clue होते हैं। एक अभियान मूल्य निर्धारण मॉडल, बोली, बजट और मिलान नियमों को परिभाषित करता है। एक clue वह रिकॉर्ड है जो एजेंटों को प्राप्त होता है। नीचे दी गई हर चीज़ API कुंजी के साथ भी की जा सकती है।
- अपना बैलेंस टॉप अप करें। पहला टॉप अप $50 या उससे अधिक का है, जो Stripe के माध्यम से कार्ड से किया जाता है।
- एक कैंपेन बनाएं: CPC, CPA या CPM चुनें, अधिकतम बोली और बजट निर्धारित करें, और तय करें कि कैंपेन को कब प्रभावी माना जाना चाहिए।
- अपनी खुद की भाषा में एक clue लिखें। clue लगभग एक मिनट में नीति के तहत इसकी समीक्षा करता है और इसे 20 भाषाओं में अनुवादित करता है।
मिलान नियम
दुनिया भर के लिए खाली छोड़ दें। देश एजेंट के नेटवर्क स्थान से या साइट द्वारा हमें बताए जाने से आता है। वह भाषा जिसमें एजेंट ने पूछा। किसी भी भाषा के लिए खाली छोड़ दें। आपका clue अपने आप अनुवादित हो जाता है, इसलिए यह केवल यह सीमित करता है कि आप कहाँ सेवा प्रदान करते हैं। साइट की घोषित श्रेणियों और उस पेज या टास्क के संदर्भ से मिलाया जाता है जिसमें एजेंट काम कर रहा है। सभी प्रकार के लिए खाली छोड़ दें। प्रशिक्षण क्रॉलर शायद ही कभी clue पर कार्रवाई करते हैं; ब्राउज़िंग एजेंट, API क्लाइंट और MCP क्लाइंट आमतौर पर ऐसा करते हैं। एजेंट क्या करने का प्रयास कर रहा है। साइट या एजेंट द्वारा घोषित, या संदर्भ से अनुमानित। सभी इरादों के लिए खाली छोड़ें। व्यवसाय, उपभोक्ता या कोई भी। clue 18 वर्ष से कम उम्र के उपयोगकर्ताओं से कभी मिलान नहीं करता है।
परिणाम रिपोर्टिंग
जब कोई एजेंट किसी clue को फॉलो करता है, तो हम उसे ?clue_id=<id> के साथ आपके गंतव्य URL पर भेजते हैं। जब वह विजिट साइन-अप, खरीदारी, बुकिंग या 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 सर्वर या एजेंट होती है। प्रत्येक साइट की एक कुंजी, एक या अधिक स्लॉट (स्लॉट रिस्पांस के फॉर्मेट और स्टाइल को तय करता है), नियंत्रण और एनालिटिक्स होते हैं। स्वामित्व को एक बार सत्यापित करें और कमाई शुरू करें।
- अपनी वेबसाइट, API, MCP सर्वर या एजेंट को रजिस्टर करें और मेटा टैग या फ़ाइल के साथ स्वामित्व सत्यापित करें।
- एक स्लॉट बनाएं और वह प्रारूप चुनें जिसमें सरफेस काम करता है: JSON, Markdown, text, HTML, llms.txt या MCP।
- टैग, मिडलवेयर या 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.नियंत्रण
उन clues को छोड़ें जो आपको प्रति 1,000 पर इससे कम कमा कर देंगे। कोई फ्लोर न रखने के लिए 0 पर छोड़ें। जब कोई भुगतान किया गया clue मेल नहीं खाता है तब लौटाया जाता है। शीर्षक, सारांश और url के साथ JSON। कभी बिल नहीं किया जाता, कभी भुगतान नहीं किया जाता। स्पष्ट रूप से लेबल किया गया टेस्ट clue प्राप्त करने के लिए किसी भी अनुरोध में &test=1 जोड़ें, जिस पर कभी शुल्क नहीं लिया जाता और जिसका भुगतान कभी नहीं किया जाता।
श्रेणियाँ
एजेंट्स
एजेंटों को खाते की आवश्यकता नहीं है। नीति पृष्ठ clue के प्रारूप, प्रकटीकरण, follow रीडायरेक्ट और परिणाम रिपोर्टिंग, और सीधे clue से पूछने के तरीके को समझाता है। AI एजेंटों के लिए: clue को कैसे पढ़ें।
clue REST API
हर एंडपॉइंट JSON में बात करता है। API कुंजियाँ पेज से Authorization: Bearer <api key> के साथ प्रमाणित करें। डिस्कवर और सर्व एंडपॉइंट सार्वजनिक होते हैं और इसके बजाय साइट कुंजी द्वारा पहचाने जाते हैं।
| Method | Path | Auth | Notes |
|---|---|---|---|
| GET | /v1/discover | public | Agent intent → clues. q/task, lang, country, intent, max, format, site (optional integration key to credit an agent developer). |
| POST | /v1/discover | public | Same as GET with a JSON body: {"task":"…","lang":"ko","country":"KR","intent":"purchase","max":3} |
| GET|POST | /v1/serve | public | Publisher 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/:token | public | Follow redirect → destination URL + ?clue_id= |
| POST | /v1/outcome/:clue_id | public | {"outcome":"useful|not_useful|used|purchased"} — agent outcome. used/purchased also record an action. |
| POST | /v1/conversions | advertiser key | {"click_id":"sv_…","kind":"signup","value_usd":49,"external_id":"…"} — report an action for a follow. |
| POST | /mcp | public | MCP Streamable HTTP (JSON-RPC 2.0): initialize, tools/list, tools/call (discover_clues, report_outcome). |
| GET | /v1/me | key | Account, balances, platform languages. |
| GET|POST | /v1/campaigns | key | List / 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/:id | key | Read (with clues) / update. PATCH {"status":"paused"} pauses. |
| POST | /v1/campaigns/:id/clues | key | Create 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/:id | key | Update a clue (re-reviewed, re-translated) or {"status":"paused"|"active"}. |
| GET | /v1/clues/:id/translations | key | All translations of a clue. |
| GET | /v1/reports/advertiser | key | by=day|country|lang|agent_type|agent_vendor|campaign_id|clue_id|site_id|format, days=30 |
| GET | /v1/reports/publisher | key | by=day|country|lang|agent_type|agent_vendor|site_id|unit_id|format|advertiser_id, days=30 |
| GET | /v1/sites | key | Your integrations with totals. |
| GET | /.well-known/agent-ads.json | public | Discovery 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"}'