programmatically 接入南瓜 GEO
国内 8 家 LLM 监测 · Citation 数据 · Priority Queue · AEO 改写建议
REST + Webhook · API Key 鉴权 · 4 档速率限制 · 全部 endpoint 透明标注 Stable / Beta / Roadmap
3 步接入
申请 API key → 选一种 client → 调用 /health 验证连通。30 秒内完成首个 200 响应。
curl -X GET "https://nanguageo.com/api/v1/health" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"// Node.js · 用 fetch
const res = await fetch("https://nanguageo.com/api/v1/brands", {
headers: {
"Authorization": `Bearer ${process.env.NANGUAGEO_API_KEY}`,
"Accept": "application/json",
},
});
const data = await res.json();
console.log(data.brands);# Python · 用 httpx
import os, httpx
with httpx.Client(
base_url="https://nanguageo.com/api/v1",
headers={"Authorization": f"Bearer {os.environ['NANGUAGEO_API_KEY']}"},
timeout=30.0,
) as client:
r = client.get("/brands")
r.raise_for_status()
print(r.json()["brands"])https://nanguageo.com/api/v1 · Content-Type:application/json · 所有响应均为 JSON,时间戳统一 ISO 8601 UTC。鉴权方式
3 种鉴权路径覆盖外部集成 / 仪表盘内嵌 / 服务端事件回调三类场景。
在控制台生成 key(前缀 sk_live_ 或 sk_test_),通过 Authorization: Bearer ... header 传递。支持按 scope(read / write / admin)颗粒化签发。
仪表盘内部调用使用浏览器 session(HttpOnly cookie,24h 滚动续期)。SameSite=Lax,浏览器外不可用。
事件回调使用 HMAC-SHA256 签名(请求 header X-Nangua-Signature)。验签 secret 在创建 webhook 时一次性返回。
速率限制
按 tier 分档 · 滑动窗口(hourly + daily + burst 三层)· 命中限流返回 429,header 含 Retry-After。
| Tier | Hourly | Daily | Burst | 备注 |
|---|---|---|---|---|
| Free | 100 | 1,000 | 20 req/min | 试用 · 不可用于生产 |
| Starter | 1,000 | 20,000 | 100 req/min | 小团队 · 单品牌起步 |
| Growth | 10,000 | 200,000 | 500 req/min | Agency / 多品牌组合 |
| Scale | 100,000 | 2,000,000 | 2,000 req/min | 大型品牌总部 / SaaS 平台集成 |
| Enterprise | 自定义 | 自定义 | 自定义 | 私有部署 / 区域驻留 / SLA |
X-RateLimit-Limit: 1000 X-RateLimit-Remaining: 873 X-RateLimit-Reset: 1746345600
读取 Retry-After header(秒数)等待后重试 · 建议指数退避 + 抖动 · 同一 endpoint 连续 3 次 429 自动降级到下一档轮询频率。
12 个 Endpoint · 9 大分组
每个端点附 method / path / 描述 / 参数 / 真实 JSON 响应形状 · 状态透明(Stable / Beta / Roadmap)。
Health
— 服务存活与依赖健康检查 · 适合外部监控接入/api/v1/healthStable内部映射:/api/health返回服务状态、构建版本、数据库延迟。无需鉴权。
{
"status": "ok",
"service": "nangua-geo",
"version": "a48c862",
"env": "production",
"region": "hkg1",
"timestamp": "2026-05-04T08:30:00.000Z",
"checks": { "db": { "ok": true, "latency_ms": 12 } },
"took_ms": 18
}Brands
— 品牌资产管理 · 每个品牌是探针调度与 citation 归因的最小单元/api/v1/brandsStable内部映射:/api/brands列出当前 API key 所属账户下全部已监测品牌(最多 100 个)。
{
"brands": [
{
"id": "b_8f3a...",
"name": "元气森林",
"category": "饮料",
"website": "https://nongfuspring.com",
"createdAt": "2026-04-12T03:21:00.000Z"
}
],
"persisted": true,
"authed": true
}/api/v1/brandsStable内部映射:/api/brands创建一个新的被监测品牌。受 tier 配额限制(402 表示需升级)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 品牌中文名或英文名 |
| category | string | 是 | 行业分类(如:饮料 / 餐饮 / 医美) |
| website | string | 否 | 品牌官网 URL(可选) |
{
"brand": {
"id": "b_8f3a...",
"userId": "u_2x7q...",
"name": "元气森林",
"category": "饮料",
"website": null,
"createdAt": "2026-05-04T08:30:00.000Z"
},
"persisted": true
}/api/v1/brands/:idStable内部映射:/api/brands/[id]获取单个品牌详情,含最近一次扫描的可见度快照。
{
"brand": { "id": "b_8f3a...", "name": "元气森林", "category": "饮料" },
"lastScan": {
"runId": "r_91c2...",
"completedAt": "2026-05-04T02:00:00.000Z",
"visibility": 0.42,
"platforms": ["deepseek", "kimi", "doubao", "qwen", "glm", "chatgpt"]
}
}Probes
— 国内 8 家 LLM 探针执行 · 异步任务模型 · 通过 runId 轮询结果/api/v1/probesBeta内部映射:/api/brands/[id]/scan为指定品牌触发一次跨 LLM 探针扫描(默认 6 平台已配 + 6 roadmap 平台)。返回 runId,结果异步写入。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| brandId | string | 是 | 品牌 ID |
| platforms | string[] | 否 | 指定平台子集,默认全部已配平台 |
| promptPackId | string | 否 | Prompt 包 ID,默认账户绑定包 |
{
"runId": "r_91c2a8d4...",
"status": "queued",
"brandId": "b_8f3a...",
"platforms": ["deepseek","kimi","doubao","qwen","glm","chatgpt"],
"estimatedCompletionMs": 45000
}/api/v1/probes/:idBeta内部映射:/api/runs/[id]查询探针 run 的执行状态与各平台原始响应快照。
{
"runId": "r_91c2a8d4...",
"status": "completed",
"completedAt": "2026-05-04T08:30:45.000Z",
"results": [
{
"platform": "deepseek",
"mentioned": true,
"rank": 2,
"snippet": "在国产无糖气泡水里,元气森林...",
"tokensUsed": 412
}
]
}Citations
— AI 回答中引用的源链接归因 · 知道你的内容被哪些 LLM 抓走/api/v1/citationsBeta内部映射:/api/knowledge/citation-attribution/daily查询品牌在 LLM 回答中被引用的源链接列表(按时间倒序)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| brandId | string | 是 | 品牌 ID |
| days | number | 否 | 回溯天数,默认 7,最大 90 |
| platform | string | 否 | 过滤特定平台 |
{
"citations": [
{
"id": "c_4d8f...",
"brandId": "b_8f3a...",
"platform": "deepseek",
"sourceUrl": "https://zhihu.com/question/123456",
"sourceDomain": "zhihu.com",
"promptHash": "8e2a...",
"discoveredAt": "2026-05-03T11:22:00.000Z",
"context": "知乎用户提到元气森林的赤藓糖醇..."
}
],
"total": 47,
"windowDays": 7
}Picker
— Priority Queue · 5% 优先采样 · 预算敏感场景下的精选 prompt/api/v1/pickerBeta内部映射:/api/brands/[id]/picker返回为该品牌优先调度的 prompt 集合(按预测信息增益排序,约占总量 5%)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| brandId | string | 是 | 品牌 ID |
| limit | number | 否 | 返回条数,默认 50 |
{
"brandId": "b_8f3a...",
"items": [
{
"promptId": "p_2k9d...",
"prompt": "国产无糖气泡水推荐",
"priorityScore": 0.91,
"lastSampledAt": "2026-05-02T08:00:00.000Z",
"reason": "high_volatility"
}
],
"total": 50
}Authority
— 权威度评分 · GEO Score / E-E-A-T / 引用密度的综合体检/api/v1/authorityBeta内部映射:/api/brands/[id]/geo-score · /api/brands/[id]/eeat-score返回品牌当前权威度综合分(含 GEO Score、E-E-A-T、citation 密度子项)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| brandId | string | 是 | 品牌 ID |
{
"brandId": "b_8f3a...",
"scoredAt": "2026-05-04T06:00:00.000Z",
"geoScore": 72,
"eeatScore": 68,
"citationDensity": 0.34,
"subscores": {
"experience": 70, "expertise": 65, "authoritativeness": 75, "trustworthiness": 62
},
"trend7d": 4.2
}Sentinel
— 舆情/危机哨兵 · 异常事件流 · 突发负面 / 排名暴跌 / 假冒账号/api/v1/sentinel/incidentsBeta内部映射:/api/crisis/incidents返回品牌当前未关闭的危机事件列表(按严重度倒序)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| brandId | string | 是 | 品牌 ID |
| severity | string | 否 | low / medium / high / critical |
| status | string | 否 | open / investigating / resolved |
{
"incidents": [
{
"id": "i_8a3f...",
"brandId": "b_8f3a...",
"severity": "high",
"type": "negative_sentiment_spike",
"title": "豆包平台负面提及 24h 内 +180%",
"openedAt": "2026-05-04T03:15:00.000Z",
"status": "investigating",
"evidenceCount": 12
}
],
"total": 1
}Suggest
— AEO 改写建议 · 基于 LLM 引用偏好的内容优化提案/api/v1/suggestBeta内部映射:/api/restaurant/aeo-suggest · /api/admin/aeo/generate提交一段原文,返回 AEO 优化后的改写版本(含 fact-claim 结构化、E-E-A-T 信号增强)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| brandId | string | 是 | 品牌 ID(用于上下文) |
| content | string | 是 | 待优化原文(最长 4000 字) |
| intent | string | 否 | 目标意图:comparison / how-to / faq / review |
{
"suggestionId": "s_7b2c...",
"rewritten": "元气森林无糖气泡水采用赤藓糖醇代糖...",
"factClaims": [
{ "claim": "0 糖 0 卡 0 脂", "verifiable": true },
{ "claim": "采用赤藓糖醇", "verifiable": true }
],
"eeatSignals": ["origin_country", "ingredient_list", "third_party_test"],
"expectedLift": { "metric": "citation_rate", "delta": 0.18 }
}Webhooks
— 事件回调注册 · HMAC-SHA256 签名 · 指数退避重试/api/v1/webhooksRoadmap注册一个 webhook endpoint,订阅 4 类事件。注册成功后返回 secret 用于 HMAC 签名验证。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | 你的服务接收 URL(必须 HTTPS) |
| events | string[] | 是 | 事件类型数组 |
| description | string | 否 | 用于自查的描述 |
{
"webhookId": "w_3f9a...",
"url": "https://your-api.com/hooks/nanguageo",
"events": ["citation.discovered","priority.changed","sentinel.triggered","uplift.measured"],
"secret": "whsec_2k7b...REDACTED",
"createdAt": "2026-05-04T08:30:00.000Z"
}/api/v1/* 命名空间,期间内部映射保持兼容(无 breaking change)。Roadmap 端点目前不可用,以表中状态为准。事件回调
4 类事件覆盖 citation 发现 / 排名变动 / 危机触发 / 改写效果验证 · HMAC-SHA256 签名 · 指数退避重试 5 次。
| 事件 | 触发条件 | Payload 关键字段 |
|---|---|---|
citation.discovered | 在 LLM 回答中发现新的源链接被引用 | { brandId, platform, sourceUrl, sourceDomain, promptHash, discoveredAt } |
priority.changed | 品牌力排名出现显著变动(绝对值 ≥ 10%) | { brandId, platform, before, after, delta, observedAt } |
sentinel.triggered | 舆情哨兵触发 · 负面提及暴涨 / 排名暴跌 / 假冒账号 | { brandId, incidentId, severity, type, title, openedAt } |
uplift.measured | AEO 改写建议落地后被探针验证有效(lift > 阈值) | { brandId, suggestionId, metric, before, after, lift, measuredAt } |
header X-Nangua-Signature: sha256=... · 用 webhook secret 对原始 body 做 HMAC,常量时间比较防时序攻击。
非 2xx 响应自动重试 5 次 · 间隔 30s / 2min / 10min / 1h / 6h(指数退避 + 抖动)· 24h 内仍失败则转人工告警。
每个事件含唯一 eventId · 重试时 ID 不变 · 服务端请基于此做去重(建议 24h 窗口缓存)。
// 验证 webhook 签名(Node.js)
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyWebhook(rawBody: string, signature: string, secret: string): boolean {
const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(expected, "hex");
const b = Buffer.from(signature.replace(/^sha256=/, ""), "hex");
return a.length === b.length && timingSafeEqual(a, b);
}
// Express 用法
app.post("/hooks/nanguageo", (req, res) => {
const ok = verifyWebhook(req.rawBody, req.header("X-Nangua-Signature") ?? "", SECRET);
if (!ok) return res.status(401).end();
// 处理事件...
res.status(204).end();
});客户端库
目前推荐使用 OpenAPI 规范 + 主流 codegen 自助生成 client。官方 TypeScript / Python SDK 在 roadmap。
/api/v1/openapi.json · 配合 openapi-typescript / openapi-generator 生成强类型 client。
预计 2026 Q3 公开
@nanguageo/sdkTypeScript 官方 SDK · 浏览器 + Node 双环境 · tree-shakeable · 内置重试与速率限制感知。
预计 2026 Q4 npm 发布
nanguageo(PyPI)Python 官方 SDK · 同步 + 异步双 client(httpx 底座)· 完整 type stubs · pydantic v2 模型。
预计 2027 Q1 PyPI 发布
openapi-typescript / openapi-python-client 一键生成临时 client。准备好接入了?
提交申请后,工程师会在 1 个工作日内联系你确认场景,签发 production / sandbox 双 key,并提供 Postman collection 加速联调。
最后更新:2026-05-04 · API 处于 v1 阶段 · breaking change 提前 90 天通知 · 重大变更同步发邮件 + Webhook 提示