Dokumentasi
Segala hal yang diperlukan untuk beriklan, menerbitkan, atau membaca clue. Pemasang iklan dimulai dengan kampanye dan clue. Penerbit dimulai dengan satu situs dan satu cuplikan pemasangan. Agen dimulai dengan halaman kebijakan. Semuanya tersedia melalui REST API.
Pengiklan
Akun pengiklan menyimpan saldo prabayar, kampanye, dan clue. Kampanye mendefinisikan model penetapan harga, penawaran harga (bids), anggaran, dan aturan pencocokan. Sebuah clue adalah catatan yang diterima oleh agent. Segala hal di bawah ini juga dapat dilakukan dengan kunci API (API key).
- Isi ulang saldo Anda. Pengisian ulang pertama adalah $50 atau lebih, menggunakan kartu melalui Stripe.
- Buat kampanye: pilih CPC, CPA, atau CPM, tetapkan tawaran maksimum dan anggaran, serta tentukan kapan kampanye harus dipertimbangkan.
- Tulis clue dalam bahasa Anda sendiri. clue meninjaunya terhadap kebijakan dalam sekitar satu menit dan menerjemahkannya ke dalam 20 bahasa.
Aturan kecocokan
Kosongkan untuk seluruh dunia. Negara berasal dari lokasi jaringan agen atau dari apa yang diberitahukan situs kepada kami. Bahasa yang digunakan agen. Biarkan kosong untuk bahasa apa pun. Clue Anda diterjemahkan secara otomatis, sehingga ini hanya membatasi lokasi penayangan. Dicocokkan dengan kategori situs yang dideklarasikan serta konteks halaman atau tugas tempat agen bekerja. Kosongkan untuk semua tipe. Crawler pelatihan jarang merespons clue; agen penjelajahan, klien API, dan klien MCP biasanya merespons. Apa yang coba dilakukan oleh agen. Dideklarasikan oleh situs atau agen, atau disimpulkan dari konteks. Kosongkan untuk semua maksud. Bisnis, konsumen, atau siapa pun. clue tidak pernah mencocokkan clue dengan pengguna di bawah 18 tahun.
Pelaporan hasil
Saat agen mengikuti sebuah clue, kami mengirimkannya ke URL tujuan Anda dengan ?clue_id=<id>. Ketika kunjungan tersebut menghasilkan pendaftaran, pembelian, pemesanan, atau panggilan API, lakukan POST id tersebut kembali ke clue. Kampanye CPA dikenakan biaya pada saat itu; kampanye CPC dan CPM hanya mencatat tindakan tersebut dalam laporan Anda.
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"}Publisher dan pengembang agent
Situs adalah website, API, server MCP, atau agen yang Anda miliki. Setiap situs memiliki kunci, satu atau lebih slot (slot menentukan format dan gaya respons), kontrol, dan analitik. Verifikasi kepemilikan sekali dan pendapatan akan dimulai.
- Daftarkan situs web, API, server MCP, atau agen Anda dan verifikasi kepemilikan dengan meta tag atau file.
- Buat slot dan pilih format yang didukung oleh antarmuka: JSON, Markdown, teks, HTML, llms.txt, atau MCP.
- Pasang tag, middleware, or panggilan API. Analitik agen dimulai dari permintaan pertama, bahkan sebelum clue cocok.
Integrasi sisi server mendeteksi agen berdasarkan User-Agent dan header, meminta clue untuk kecocokan, dan menambahkan blok ke HTML, Markdown, atau JSON sebelum respons meninggalkan server Anda. Pengunjung manusia menerima respons yang tidak berubah.
Untuk agen penelusuran yang mengeksekusi JavaScript. Menambahkan <aside> berlabel dan JSON-LD ke halaman. Manusia hanya melihat catatan kecil yang diciutkan.
<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.Kontrol
Lewati clue yang menghasilkan pendapatan kurang dari jumlah ini per 1.000 penayangan. Biarkan pada 0 jika tidak ada batas minimum. Dikembalikan ketika tidak ada clue berbayar yang cocok. JSON dengan judul, ringkasan, dan URL. Tidak pernah ditagih, tidak pernah dibayar. Tambahkan &test=1 ke permintaan apa pun untuk menerima clue uji berlabel jelas yang tidak pernah ditagih dan tidak pernah dibayar.
Kategori
Agen
Agent tidak memerlukan akun. Halaman kebijakan menjelaskan format clue, pengungkapan, pengalihan ikutan (follow redirect) dan pelaporan hasil, serta cara bertanya langsung kepada clue. Untuk AI agent: cara membaca clue.
clue REST API
Setiap endpoint menggunakan format JSON. Autentikasi dengan Authorization: Bearer <api key> dari halaman kunci API. Endpoint discover dan serve bersifat publik dan diidentifikasi menggunakan kunci situs.
| 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"}'