南瓜 GEO API · v1

programmatically 接入南瓜 GEO

国内 8 家 LLM 监测 · Citation 数据 · Priority Queue · AEO 改写建议

REST + Webhook · API Key 鉴权 · 4 档速率限制 · 全部 endpoint 透明标注 Stable / Beta / Roadmap

🔑 Bearer Token🪝 4 类 Webhook 事件📦 12 endpoint🌐 全球 CDN 加速
01 · Quick Start

3 步接入

申请 API key → 选一种 client → 调用 /health 验证连通。30 秒内完成首个 200 响应。

1. cURL(推荐先验证)
bash
curl -X GET "https://nanguageo.com/api/v1/health" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
2. Node.js / TypeScript
typescript
// 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);
3. Python
python
# 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"])
Base URL:https://nanguageo.com/api/v1 · Content-Type:application/json · 所有响应均为 JSON,时间戳统一 ISO 8601 UTC。
02 · Authentication

鉴权方式

3 种鉴权路径覆盖外部集成 / 仪表盘内嵌 / 服务端事件回调三类场景。

推荐
API Key(Bearer)

在控制台生成 key(前缀 sk_live_sk_test_),通过 Authorization: Bearer ... header 传递。支持按 scope(read / write / admin)颗粒化签发。

Authorization: Bearer sk_live_***
Session Cookie

仪表盘内部调用使用浏览器 session(HttpOnly cookie,24h 滚动续期)。SameSite=Lax,浏览器外不可用。

Cookie: ng_session=eyJ...
Webhook HMAC

事件回调使用 HMAC-SHA256 签名(请求 header X-Nangua-Signature)。验签 secret 在创建 webhook 时一次性返回。

X-Nangua-Signature: sha256=...
安全提示:API key 只在生成时显示完整值一次。请存入服务端 secret manager(不要提交到 Git)。怀疑泄露请立即在控制台 revoke 后重新生成。
03 · Rate Limits

速率限制

按 tier 分档 · 滑动窗口(hourly + daily + burst 三层)· 命中限流返回 429,header 含 Retry-After。

TierHourlyDailyBurst备注
Free1001,00020 req/min试用 · 不可用于生产
Starter1,00020,000100 req/min小团队 · 单品牌起步
Growth10,000200,000500 req/minAgency / 多品牌组合
Scale100,0002,000,0002,000 req/min大型品牌总部 / SaaS 平台集成
Enterprise自定义自定义自定义私有部署 / 区域驻留 / SLA
响应 Header 自检
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 873
X-RateLimit-Reset: 1746345600
命中 429 后客户端策略

读取 Retry-After header(秒数)等待后重试 · 建议指数退避 + 抖动 · 同一 endpoint 连续 3 次 429 自动降级到下一档轮询频率。

04 · Endpoints Catalogue

12 个 Endpoint · 9 大分组

每个端点附 method / path / 描述 / 参数 / 真实 JSON 响应形状 · 状态透明(Stable / Beta / Roadmap)。

Health

服务存活与依赖健康检查 · 适合外部监控接入
GET/api/v1/healthStable内部映射:/api/health

返回服务状态、构建版本、数据库延迟。无需鉴权。

无入参(path / 查询参数见上)
示例响应
json
{
  "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 归因的最小单元
GET/api/v1/brandsStable内部映射:/api/brands

列出当前 API key 所属账户下全部已监测品牌(最多 100 个)。

无入参(path / 查询参数见上)
示例响应
json
{
  "brands": [
    {
      "id": "b_8f3a...",
      "name": "元气森林",
      "category": "饮料",
      "website": "https://nongfuspring.com",
      "createdAt": "2026-04-12T03:21:00.000Z"
    }
  ],
  "persisted": true,
  "authed": true
}
POST/api/v1/brandsStable内部映射:/api/brands

创建一个新的被监测品牌。受 tier 配额限制(402 表示需升级)。

参数
字段类型必填说明
namestring品牌中文名或英文名
categorystring行业分类(如:饮料 / 餐饮 / 医美)
websitestring品牌官网 URL(可选)
示例响应
json
{
  "brand": {
    "id": "b_8f3a...",
    "userId": "u_2x7q...",
    "name": "元气森林",
    "category": "饮料",
    "website": null,
    "createdAt": "2026-05-04T08:30:00.000Z"
  },
  "persisted": true
}
GET/api/v1/brands/:idStable内部映射:/api/brands/[id]

获取单个品牌详情,含最近一次扫描的可见度快照。

无入参(path / 查询参数见上)
示例响应
json
{
  "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 轮询结果
POST/api/v1/probesBeta内部映射:/api/brands/[id]/scan

为指定品牌触发一次跨 LLM 探针扫描(默认 6 平台已配 + 6 roadmap 平台)。返回 runId,结果异步写入。

参数
字段类型必填说明
brandIdstring品牌 ID
platformsstring[]指定平台子集,默认全部已配平台
promptPackIdstringPrompt 包 ID,默认账户绑定包
示例响应
json
{
  "runId": "r_91c2a8d4...",
  "status": "queued",
  "brandId": "b_8f3a...",
  "platforms": ["deepseek","kimi","doubao","qwen","glm","chatgpt"],
  "estimatedCompletionMs": 45000
}
GET/api/v1/probes/:idBeta内部映射:/api/runs/[id]

查询探针 run 的执行状态与各平台原始响应快照。

无入参(path / 查询参数见上)
示例响应
json
{
  "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 抓走
GET/api/v1/citationsBeta内部映射:/api/knowledge/citation-attribution/daily

查询品牌在 LLM 回答中被引用的源链接列表(按时间倒序)。

参数
字段类型必填说明
brandIdstring品牌 ID
daysnumber回溯天数,默认 7,最大 90
platformstring过滤特定平台
示例响应
json
{
  "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
GET/api/v1/pickerBeta内部映射:/api/brands/[id]/picker

返回为该品牌优先调度的 prompt 集合(按预测信息增益排序,约占总量 5%)。

参数
字段类型必填说明
brandIdstring品牌 ID
limitnumber返回条数,默认 50
示例响应
json
{
  "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 / 引用密度的综合体检
GET/api/v1/authorityBeta内部映射:/api/brands/[id]/geo-score · /api/brands/[id]/eeat-score

返回品牌当前权威度综合分(含 GEO Score、E-E-A-T、citation 密度子项)。

参数
字段类型必填说明
brandIdstring品牌 ID
示例响应
json
{
  "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

舆情/危机哨兵 · 异常事件流 · 突发负面 / 排名暴跌 / 假冒账号
GET/api/v1/sentinel/incidentsBeta内部映射:/api/crisis/incidents

返回品牌当前未关闭的危机事件列表(按严重度倒序)。

参数
字段类型必填说明
brandIdstring品牌 ID
severitystringlow / medium / high / critical
statusstringopen / investigating / resolved
示例响应
json
{
  "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 引用偏好的内容优化提案
POST/api/v1/suggestBeta内部映射:/api/restaurant/aeo-suggest · /api/admin/aeo/generate

提交一段原文,返回 AEO 优化后的改写版本(含 fact-claim 结构化、E-E-A-T 信号增强)。

参数
字段类型必填说明
brandIdstring品牌 ID(用于上下文)
contentstring待优化原文(最长 4000 字)
intentstring目标意图:comparison / how-to / faq / review
示例响应
json
{
  "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 签名 · 指数退避重试
POST/api/v1/webhooksRoadmap

注册一个 webhook endpoint,订阅 4 类事件。注册成功后返回 secret 用于 HMAC 签名验证。

参数
字段类型必填说明
urlstring你的服务接收 URL(必须 HTTPS)
eventsstring[]事件类型数组
descriptionstring用于自查的描述
示例响应
json
{
  "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"
}
关于 v1 命名空间:目前以上端点的内部实现已上线(详见每个端点的「内部映射」标注)。我们将在 2026 Q3 把这些路径正式收敛到 /api/v1/* 命名空间,期间内部映射保持兼容(无 breaking change)。Roadmap 端点目前不可用,以表中状态为准。
05 · Webhooks

事件回调

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.measuredAEO 改写建议落地后被探针验证有效(lift > 阈值){ brandId, suggestionId, metric, before, after, lift, measuredAt }
HMAC-SHA256 验签

header X-Nangua-Signature: sha256=... · 用 webhook secret 对原始 body 做 HMAC,常量时间比较防时序攻击。

重试策略

非 2xx 响应自动重试 5 次 · 间隔 30s / 2min / 10min / 1h / 6h(指数退避 + 抖动)· 24h 内仍失败则转人工告警。

幂等保证

每个事件含唯一 eventId · 重试时 ID 不变 · 服务端请基于此做去重(建议 24h 窗口缓存)。

验签代码示例
typescript
// 验证 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();
});
06 · SDKs

客户端库

目前推荐使用 OpenAPI 规范 + 主流 codegen 自助生成 client。官方 TypeScript / Python SDK 在 roadmap。

Roadmap
OpenAPI 3.1 Spec

/api/v1/openapi.json · 配合 openapi-typescript / openapi-generator 生成强类型 client。

预计 2026 Q3 公开

Roadmap
@nanguageo/sdk

TypeScript 官方 SDK · 浏览器 + Node 双环境 · tree-shakeable · 内置重试与速率限制感知。

预计 2026 Q4 npm 发布

Roadmap
nanguageo(PyPI)

Python 官方 SDK · 同步 + 异步双 client(httpx 底座)· 完整 type stubs · pydantic v2 模型。

预计 2027 Q1 PyPI 发布

在等待官方 SDK 期间:REST 端点完全可用 · fetch / axios / requests / httpx 任一 HTTP client 均可调用 · OpenAPI 公开后可用 openapi-typescript / openapi-python-client 一键生成临时 client。

准备好接入了?

提交申请后,工程师会在 1 个工作日内联系你确认场景,签发 production / sandbox 双 key,并提供 Postman collection 加速联调。

最后更新:2026-05-04 · API 处于 v1 阶段 · breaking change 提前 90 天通知 · 重大变更同步发邮件 + Webhook 提示