Docs 搜索 API
以编程方式搜索您的 Jamdesk 文档。为聊天机器人、Slack 机器人、自定义搜索和 AI 智能体提供最新答案。
Docs Search API 通过语义搜索为您提供文档内容的编程访问。一个端点(POST /_api/search)接收自然语言查询,并返回文档中按相关性排序的最相关段落。
使用场景
快速开始
前往 Jamdesk 仪表板中的 Project Settings → API Keys。点击 Generate Key,为其命名并复制密钥。密钥以 jd_live_ 开头,后跟 32 个十六进制字符(共 40 个字符)。密钥仅显示一次。
在您的文档子域名上向 /_api/search 发送 POST 请求:
curl -X POST https://your-project.jamdesk.app/_api/search \
-H "Authorization: Bearer jd_live_c83003a54ae0a83123454c3f7ec82f0a" \
-H "Content-Type: application/json" \
-d '{"query": "How do I set up a custom domain?", "limit": 5, "language": "en"}'响应返回一个匹配段落数组,包含相关性分数和页面元数据:
{
"query": "How do I set up a custom domain?",
"language": "en",
"results": [
{
"title": "Custom Domains",
"section": "Step 4: Deploy",
"slug": "deploy/custom-domains",
"content": "To add a custom domain, go to Project Settings and enter your domain. You'll need to add a CNAME record pointing to your Jamdesk subdomain.",
"url": "https://your-project.jamdesk.app/deploy/custom-domains",
"score": 0.94
}
],
"total": 1,
"durationMs": 85
}身份验证
所有请求都需要在 Authorization 头中提供 Bearer 令牌。
Authorization: Bearer jd_live_c83003a54ae0a83123454c3f7ec82f0a
Search API 适用于使用密码或 JWT 身份验证的站点。它检查的是您的 API 密钥,而不是访问者的登录状态。您无需将 /_api/search 添加到 auth.jwt.public。结果可能包含需要登录才能访问的页面。请从您的服务器调用该 API,切勿将密钥放入浏览器代码中。结果遵循与站内搜索相同的规则:受组限制的页面永远不会返回。隐藏页面以及设置了 search: false 的页面会被排除,除非您已将其设为可搜索。
同一密钥也可用于这些站点上的 MCP 服务器、.md 页面 URL 以及 llms.txt 和 llms-full.txt。
生成 API 密钥
在 Jamdesk 仪表板中,进入您的项目并点击 Settings。
选择 API Keys 标签页。
点击 Generate Key,输入一个描述性名称(例如 "Intercom chatbot"),然后点击 Create。
立即复制密钥。它以 jd_live_ 开头,后跟 32 个十六进制字符。密钥仅显示一次。请将其存储在您的密钥管理器或环境变量中。
密钥管理
API 密钥仅限于一个项目。针对 acme.jamdesk.app 的密钥无法查询其他项目的文档。
| 规则 | 详情 |
|---|---|
| 格式 | jd_live_<32 个十六进制字符>(共 40 个字符,永不过期) |
| 范围 | 每个项目一个密钥(无法访问其他项目) |
| 轮换 | 可随时在 Project Settings 中撤销并重新生成 |
| 存储 | 存储在环境变量或密钥管理器中;切勿提交到源代码管理 |
撤销密钥
前往 Project Settings → API Keys,按名称找到该密钥,然后点击 Revoke。已撤销的密钥会立即失效。生成新密钥以替换它。
速率限制
请求按 API 密钥进行速率限制。
| 套餐 | 限制 |
|---|---|
| Pro | 60 次请求 / 分钟 |
| Enterprise | 自定义;请联系支持 |
在需要登录的站点上,使用同一密钥发出的 MCP、.md 和 llms.txt 请求共享单独的限制,即每分钟 120 次请求。它们不计入 Search API 的限制,Search API 的请求也不计入它们的限制。
当超出限制时,API 返回 429 Too Many Requests,并附带 Retry-After: 60 头以及响应体中的 {"error": "Rate limit exceeded"}。
如需为生产集成获得更高的速率限制,请联系我们了解 Enterprise 方案。
查询限制
每个请求都接受一个 limit 参数,用于控制返回的结果数量。最大值为 20,默认值为 5,最小值为 1。不支持分页。所有匹配结果都会在一个响应中返回。如需更多上下文,请尝试使用更具体的查询,而不是提高 limit。
没有匹配项的查询返回 HTTP 200 以及一个空结果数组:
{"query": "quantum entanglement", "results": [], "total": 0, "durationMs": 48}
按语言筛选
在多语言站点上,API 每次请求只按一种语言过滤结果。在请求体中传入 language,使用 BCP-47 代码(例如 en、es、fr、pt-BR、zh-Hans)。
curl -X POST https://your-project.jamdesk.app/_api/search \
-H "Authorization: Bearer jd_live_c83003a54ae0a83123454c3f7ec82f0a" \
-H "Content-Type: application/json" \
-d '{"query": "¿Cómo configuro un dominio personalizado?", "language": "es"}'
| 规则 | 详情 |
|---|---|
| 默认值 | en(英语)。省略该字段,或传入 null,即使用默认值。 |
| 格式 | BCP-47(^[a-zA-Z]{2,3}([-_][a-zA-Z]{2,4})?$)。示例:en、es、fr、pt-BR、zh-Hans。 |
| 验证 | 格式错误的值返回 400 以及 {"error": "Invalid language code"}。 |
| 三段式标签 | 目前不支持。zh-Hant-HK 和 sr-Latn-RS 等代码返回 400。如需使用,请联系支持。 |
| 多语言项目 | 过滤是严格的:只返回标记为所请求语言的分块。对于仅包含英语和法语的项目,请求 de 会返回空结果集,而不是 400。 |
| 单语言项目 | 过滤被忽略。您始终会获得完整结果集。发送 language 不会导致错误。 |
| 在响应中回显 | 每个成功的响应都包含一个 language 字段,其值为服务器解析后的结果(请求值,或默认的 en)。 |
当项目的 docs.json 中 navigation.languages 数组包含两个或更多条目时,该项目即为多语言项目。请在仪表板的 Settings → Languages 标签页或 docs.json 中检查您的站点是否为多语言。
即使项目没有英语版本,默认的 en 仍然适用。一个仅有法语和西班牙语的项目,如果调用时未传入 language 字段,则会过滤 en,并返回空结果集。对于没有英语内容的站点,请始终显式传入 language。
错误处理
所有错误响应都包含一个机器可读的 error 字段,您可以据此进行程序化分支处理。
| 状态码 | error 值 | 含义 | 处理方式 |
|---|---|---|---|
| 400 | Missing or empty "query" field | 请求体缺少 query 或其为空 | 添加一个非空的 query 字符串 |
| 400 | Invalid language code | language 字段不是字符串或不符合 BCP-47 模式(null 可以;空字符串/仅含空白以及三段式标签则不行) | 使用有效的一段或两段代码,如 en、es、fr 或 pt-BR |
| 401 | invalid_key_format | Authorization 头缺失,或密钥不符合 jd_live_<32 个十六进制字符> | 检查头格式;必须为 Bearer jd_live_... |
| 401 | invalid_key | 密钥无法识别或已被撤销 | 在仪表板中生成新密钥 |
| 403 | wrong_project | 密钥有效,但它是为其他项目生成的 | 使用与 URL 中的项目 slug 匹配的密钥 |
| 429 | Rate limit exceeded | 超过每分钟 60 次请求 | 等待 Retry-After 头中指定的秒数 |
| 502 | Search temporarily unavailable | 向量搜索后端不可用 | 短暂退避后重试 |
| 503 | lookup_failed 或 redis_unavailable | 无法连接密钥验证后端 | 短暂退避后重试 |
401 和 403 是永久性失败。使用相同密钥重试无济于事。429、502 和 503 是暂时性的。请使用指数退避进行重试。
CORS
所有端点均已启用 CORS。基于浏览器的客户端(单页应用、浏览器扩展、静态站点)可以直接调用 /_api/search,无需后端代理。允许所有来源。
SDK
目前没有官方的语言 SDK。请通过 fetch、requests、curl 或任何 HTTP 客户端直接使用 REST API。下方的 Postman 集合提供了可直接分叉使用的示例。
版本控制
该 API 目前版本为 v1.0.0。破坏性变更(字段重命名、端点移除、身份验证方式变更)将通过 Jamdesk 博客公布,并在移除前至少 90 天通过响应头 X-Deprecation 发出弃用通知。
OpenAPI 规范
完整的 OpenAPI 3.1 规范以 YAML 格式提供。将其导入您的代码生成工具、API 客户端或契约测试流水线。
Postman 集合
我们发布了官方 Postman 工作区,包含完整的 OpenAPI 规范和可直接分叉使用的集合。无需编写代码,即可在 Postman 界面中测试请求。
在分叉后的集合中更新两个集合变量。在您完成此操作之前,任何请求都无法正常工作:
baseUrl:设置为您自己的 Jamdesk 文档站点。通常为https://your-project.jamdesk.app(将your-project替换为您的项目 slug)。若使用自定义域名,请使用您自己的主机。若文档位于子路径下,请包含完整路径(例如https://example.com/docs)。apiKey:将占位符替换为在 仪表板 → Project Settings → API Keys 中生成的真实密钥。
