跳到主要内容

错误

Platform API 失败使用标准 HTTP 状态码。几乎每次失败都包含一个稳定的 subcode 字符串,客户端应基于它进行分支 — 单独依赖状态码会产生歧义 (403 同时涵盖 scope、产品、origin、IP 和密钥类型)。

Envelope

大多数错误都会返回 FastAPI 风格的 detail wrapper:

{ "detail": "<subcode>" }

结构化的 429 payload(map_load_quota_exceeded, b2b_overloaded, org_overloaded, tile_access_restricted)是位于顶层的扁平对象 — 没有 detail wrapper:

{ "error": "map_load_quota_exceeded", "meter": "map_loads", "limit": 50000, "used": 50000 }

带 string-detail 的 429(map-load hard stop)仍保留 wrapper:

{ "detail": "map_load_hard_stop" }

某些非 streaming endpoint 会以 HTTP 200 加 error key 的形式报告失败 — 最典型的是 POST /chat/control/route。如果只根据 status 分支,就会将其视为成功。请始终读取 body。

表格

状态Subcode含义处理方式
401(no detail)密钥缺失 / 无效 / 已撤销 / 已过期检查密钥值,并确认未被撤销。Viewer 不需要密钥。
401publishable_requires_sessionpublishable key(kld_pk_…)被作为 direct bearer 发送通过 SDK 使用它,由 SDK 将其交换为 session。
403insufficient_scope密钥有效,但缺少 route 所需 scope创建 / 重新创建具有正确 scope(ai / maps / design)的密钥。
403tier_capability_not_allowed已存储的 key 曾经拥有该 capability,但组织当前 tier 已不再允许(通常是 Pro→Free downgrade)升级套餐,或使用当前 tier 允许的产品。
403origin_requiredpublishable key 在没有浏览器 Origin 的情况下使用(例如服务端)publishable key 仅限浏览器使用。
403session_origin_mismatch请求 Origin 不在 key 的 allowlist 中更新 key 的 allowed origins(参阅 获取 API 密钥)。
403product_not_allowedkey 不允许用于此产品创建允许该产品的 key(或使用无需密钥的 viewer)。
403server_key_in_browserserver key(kld_sk_…)从浏览器使用server key 仅限服务端;同时会被 CORS 阻止。
403ip_not_allowedserver key 从 allowlist 外的 IP 使用更新 key 的 IP allowlist,或从允许的地址调用。
403publishable_key_requiredSDK session exchange 使用了 publishable key 以外的内容在 session-exchange 步骤使用 kld_pk_… key。
403sessions_disabled此 deployment 禁用了 session 发放联系支持 — 这是运行状态,不是客户设置。
403sessions_not_configuredsession infrastructure 尚未配置联系支持。
422(various)请求 body 格式错误修复 payload(参阅 Endpoints)。mint 时,unknown_scope / unknown_product 表示未识别值;publishable_live_requires_origins 表示 live publishable key 在没有 allowed origins 的情况下被 mint。
429(flat) map_load_quota_exceeded组织每月 map-loads 配额已用尽升级套餐或减少底图加载。
429map_load_hard_stop付费组织超过 map-loads 配额 5×此处停止服务;配额以上的 soft band 在达到该点前仍可工作。
429(flat) tile_access_restrictedTile 请求被拒绝(通常是 origin allowlist 不匹配)。包含 Retry-After: 3600将页面 origin 添加到 key allowlist;在 header 指定时间后重试。
429(flat) b2b_overloaded全局 request-shedding 已启用降低请求频率,并加入 jitter 后重试。
429(flat) org_overloaded组织级 shedding降低请求频率并重试。
429limiter_unavailablerate limiter 暂时不可访问视为临时错误并重试。
429rate_limited当前请求过多遵循 Retry-After
503(no detail)密钥服务暂时不可用临时错误 — 稍后重试。

密钥管理

来自 POST/PATCH/DELETE /shared-api/api-keys/* 的失败(使用 Cognito org-admin JWT,而不是 platform key):

状态Subcode含义
403free_plan_publishable_onlyFree-tier 组织只能创建 publishable key。
403plan_required组织没有可识别的 API plan 记录。
403tier_capability_not_allowedPATCH 尝试将 key 扩展到组织当前 tier admission 之外。
403vendor_scope_requires_acknowledgementvendor scope 需要每个 key 显式设置 acknowledgement flag。
409key_limit_reached组织已达到其套餐允许的每组织 key 数量上限。

完整的 mint 流程和 PATCH 更新路径请参阅 获取 API 密钥

Streaming 错误

在 SSE stream 中,终止性失败会以 error event 的形式出现,而不是 HTTP status(因为 response 已经以 200 开始):

event: error
data: { "type":"error", "message":"…", "code":"…", "partial_text":"…" }

error event 视为该 stream 的结束。stream 中途出现的 quota event 不是错误 — 它只是告诉您还剩多少 budget 的 meter。 客户端必须忽略未知 event name — 在稳定 contract 内可以不升级版本就 添加新 event。

浏览器中的 CORS "blocked"

如果浏览器在真实请求中报告 CORS block,则请求 Origin 不在 key allowlist 中 — 这不是 auth failure。请参阅 CORS & allowed origins