错误代码

Listings API 的 HTTP 状态码、Listings 和 Social 的 SYxxxxx 错误代码,以及 v4 API 返回的 3 种错误响应结构。

Listings API 使用常规 HTTP 状态码报告请求的处理结果。错误代码以 SY 为前缀,包含在错误的 message 字符串中,格式为 SYxxxxx: <human-readable reason>。

HTTP 状态码

HTTP status code summary

状态含义典型的 SY 代码Python SDK 异常
200 OK请求成功。对于写入操作,还要检查响应体(见下文)。--
400 Bad Request请求格式错误、筛选条件无法解析、枚举值无效或 ID 格式错误。SY90006, SY90001ValidationError
401 UnauthorizedAPI 密钥缺失、格式错误或已被撤销。您还没有密钥?可在提供免费沙盒单日通行证时获取单日通行证。SY90005AuthenticationError
402 Payment Required该账户有未支付的账单,因此 API 访问已暂停。仅涉及 Social 的未支付账单只会暂停 Social 端点的访问。请参阅 payment_required 和 social_payment_required。-APIError
403 Forbidden密钥有效,但无权访问该资源。SY90003PermissionDeniedError
404 Not Found路径或通过 ID 指定的资源不存在。SY90002NotFoundError
422 Unprocessable Entity请求格式正确,但其中某个值无法处理(例如,未知或存在歧义的类别)。-ValidationError
429 Too Many Requests您已超出套餐的速率限制。请遵循 Retry-After 响应头的要求。-RateLimitError
5xx服务器错误。对于读取操作,可以安全地采用退避策略重试;重复执行写入操作之前,请参阅下方的写入注意事项。SY90007InternalServerError

3 种响应结构

大多数失败响应都包含一个 errors 数组,该数组位于顶层或嵌套在操作结果中,如下文各节所示。少数失败响应会改为返回单个 error 对象:触发速率限制(429)以及某些请求级别的失败(400/500,带有 code,例如 INTERNAL_SERVER_ERROR)。请检查这两种情况:errors 是数组,error 是对象。

1. 请求级别:顶层 errors[]

身份验证失败、授权失败和请求格式错误会在操作执行前直接中止处理。它们会返回相应的 4xx 状态码(见上文),并将错误放在响应的顶层。

JSON
{  "data": { "createLocation": null },  "errors": [{ "message": "SY90005: Invalid Token" }]}

2. 写入验证:嵌套的 data.<operation>.errors[]

创建、更新或发布请求在其他方面格式正确时,会返回 HTTP 200。如果输入违反业务规则,失败信息会嵌套在操作自身的载荷中,位于 data.<operation>.errors。成功时,此数组仍然存在,但为空("errors": [])。

JSON
{  "data": {    "createLocation": {      "errors": [        { "message": "SY10126: City is Mandatory" },        { "message": "SY10010: state_iso" }      ],      "location": null    }  }}

3. 网关级别:单个顶层 error 对象

触发速率限制和意外的网关故障会在转换之前直接中止处理,并返回一个 error 对象,其中包含 code、message 和 correlation_id。有关 429 响应体,请参阅下方的 rate_limited。

执行写入操作时,请始终读取 data.<operation>.errors,即使返回的是 200 且 data.<operation> 对象中已有数据:写入操作可能部分失败,并在此处报告。

402 Payment Required 响应没有 error 封装层:code、message、doc_url 均位于顶层,有待支付账单时,pay_url 也位于顶层。请参阅下方的 payment_required。

重试写入操作并非没有代价

v4 API 不支持 Idempotency-Key:该请求头会被忽略,而且没有任何端点会检测重复写入。创建、更新或发布调用即使超时或返回 5xx,也可能已在服务器上完成提交,因此盲目重试可能产生重复的地点、帖子或评价回复。

读取操作可以放心地采用退避策略重试。对于写入操作,请先回读数据:使用您可控制的键(storeId、门店代码、互动的回复列表)查找记录,仅在确认记录确实不存在时才重复调用。

常见代码

Common SY error codes

代码消息HTTP 状态含义
SY90005Invalid Token401API 密钥缺失、格式错误或已被撤销。请从控制台重新签发密钥,并以 Authorization: API <your-key> 的形式发送。
SY90001Not authorized to access this resource401 / 403该密钥被此资源拒绝。Python 和 Node SDK 均会将其作为 AuthenticationError 抛出。
SY90002Invalid Id404 / 400无法解析路径或参数中的 ID(通常是无效或非 base64 格式的 relay ID)。
SY10126City is Mandatory200(响应正文)输入中遗漏了必填字段(city)。
SY10010state_iso200(响应正文)stateIso 的值缺失或无效。有关有效值,请参阅国家和州端点。

SY10xxx 范围内的验证代码对应特定的输入字段;message 指明未通过验证的字段或规则。SY90xxx 范围内的身份验证和授权代码属于请求级别,会在顶层返回,并附带相应的状态。

已连接账户代码

SY810xx 范围内的代码来自用于导入或关联发布平台商家信息的 Connected Accounts 端点。这些代码会在 HTTP 200 的响应正文中以嵌套形式返回(上文的响应结构 2),因此,即使状态表示成功,也请读取 data.<operation>.errors。

SY810xx connected-account and import codes

代码含义处理方法
SY81019无法找到与密钥所属账户对应的用户。请联系支持团队:该账户没有处于活跃状态的主用户。
SY81066connectedAccountId 不存在,或该账户已归档。请从 GET /connected-accounts 重新读取 ID。
SY81067无法解码或解析 connectedAccountListingId。请从 connected-account-listings 记录的 id 中重新获取。
SY81068该商家信息已关联到一个地点。请先断开关联,或选择其他商家信息。
SY81069已连接账户的凭据已失效。请通过 connect-google 或 connect-facebook 重新连接该账户。
SY81070该商家信息不属于您指定的已连接账户。请将每条商家信息与其来源账户配对。常见原因是在获取商家信息时未在请求体中包含 connectedAccountId,从而返回了其他账户的商家信息。
SY81071创建地点时发生意外错误。请重试;如果问题持续存在,请联系支持团队。
SY81072创建地点时,在构建或保存阶段失败。请重试;如果问题持续存在,请联系支持团队。
SY81073不支持导入此类型的商家信息。只能导入 Google 和 Facebook 商家信息。
SY81074Google 未返回该商家信息的数据。请确认该商家信息仍然存在,且该账户仍在管理它。
SY81075已超出 Google API 的速率限制。请采用退避策略,稍后重试。
SY81076从 Google 获取商家信息失败。请重试,并检查该账户的 Google 权限。
SY81077无法根据 Facebook 页面确定国家。请在 Facebook 上为该页面的地址添加国家,然后重试。
SY81078根据 Facebook 页面构建地点数据失败。请重试;如果问题持续存在,请联系支持团队。
SY81081该商家信息未设置主要类别。请为该商家信息设置主要类别,然后重试。
SY81082不支持该商家信息所在的国家。有关支持的国家,请参阅国家和州端点。
SY81083无法导入该 Google 商家信息。请联系支持团队并提供时间戳。
SY81084准备 Facebook 导入时发生内部错误。请重试;如果问题持续存在,请联系支持团队并提供时间戳。
SY81085无法导入该 Facebook 页面。请联系支持团队并提供时间戳。
SY81086地点创建被业务规则拒绝。嵌套的 message 包含底层代码,例如账户的地点名额已用尽时,代码为 SY10151。请读取嵌套消息;对于 SY10151,请添加地点附加项或升级套餐。
SY81087地点创建请求失败。请重试;如果问题持续存在,请联系支持团队并提供时间戳。
SY81088地点创建因无法识别的原因而失败。请联系支持团队并提供时间戳。
SY81089内部服务调用返回了非成功状态。这不是您的请求存在问题。请重试 1 次;如果问题持续存在,请联系支持团队并提供时间戳,以便我们追踪内部调用。
SY81090内部地点创建调用期间发生意外错误。请重试;如果问题持续存在,请联系支持团队并提供时间戳。

Social 错误代码

SY950xx 范围内的代码来自 Social 端点:品牌、连接和社交帖子。与已连接账户代码一样,它们会在 HTTP 200 时嵌套在响应体中返回,因此即使状态表示成功,也要读取 data.<operation>.error(批量路由还需读取 data.<operation>.errors)。

SY950xx Social codes

代码含义处理方法
SY95041账户已达到品牌数量上限。API 套餐不会触发此错误:该套餐的品牌数量不受限制。使用 API 套餐时无需采取任何操作。如果您遇到此错误,请报告:GET /social/limits 应返回 brands: null。
SY95042账户已达到当前计费周期的连接数量上限。上限会与 GET /social/limits 返回的 usage.connections 进行比较,该值为计费数量:当前已连接的数量加上本周期内已释放的数量。通过断开连接或归档品牌释放的名额会一直保留到本周期结束,因此最近断开连接不会消除此错误。您可以将某个已释放的账号重新连接到它原来所属的品牌(免费,会复用该名额),或购买一个包含 5 个连接的连接包(立即生效),或等待续费,届时 usage.connectionsReleased 名额将恢复。将已释放的账号连接到其他品牌不会复用该名额。请参阅套餐和附加项。
SY95043此账户中不存在该 ID 的品牌,或该品牌已归档。请从 GET /social/brands 重新读取 ID。品牌 ID 是普通 UUID,不是 Base64 relay ID。
SY95044此账户未启用该平台。账户的 Social 套餐不包含您请求连接的平台。请联系支持团队,或选择账户已开通的平台。
SY95045该品牌没有连接到该平台的渠道。请引导用户通过该平台的连接链接进行连接,或将该平台从 platforms 中移除。如果渠道在帖子排期后被断开连接,也会出现此错误。
SY95046排期或时区无效。请传入 scheduledAt 或 scheduleDate + scheduleTime,切勿同时传入两种形式。scheduledAt 需要 UTC 偏移量;scheduleTime 为 HH:MM。时区使用 IANA 标识符(tzCode)。
SY95047此账户中不存在该 ID 的批量任务。请从批量创建响应中重新读取 job.id。任务不会永久保留。
SY95048批量请求超出行数限制。每个请求最多发送 500 行,其余行请拆分为后续批次。未创建任何内容。
SY95049重定向 URL 无效。连接链接中的 redirectUrl 和 errorUrl 必须是由您控制的绝对 https URL。
SY95050批量验证失败;请查看各行的错误。未创建任何内容。请读取 job.results[]:每个被拒绝的行都包含其从 0 开始的 index、其 clientReference,以及 errors[] 中的原因。请修正这些行,然后重新发送整个批次。
SY95051该品牌尚未满足存续 90 天的要求。品牌创建满 90 天后才能归档。响应还会报告 status: "TENURE_NOT_MET",且未发生任何更改。请在第 90 天之后重试,届时品牌及其连接会立即归档,但这些连接的名额仍会保留到计费周期结束。请参阅存续期限规则。
SY95052已连接的渠道不属于此品牌。请将每个连接与创建该连接时所属的品牌配对。使用一个品牌的帖子和另一个品牌的渠道 ID 构建数据洞察调用时,常会出现此错误。

SY95042 和 SY95044 表示权益校验失败,而非输入错误:如果不更改套餐,重试仍会以同样的方式失败。SY95045、SY95046、SY95049 和 SY95052 是输入错误,可在下一次请求中修正。

Listings 权益代码

Listings plan codes

代码含义处理方法
SY10150该账户已达到地点数量上限。请归档一个地点、购买额外地点附加项或升级套餐。请参阅套餐和附加项。
SY10151该账户已用完当前套餐的地点名额。如果使用的是沙盒单日通行证,则其 2 个地点名额均已使用。处理方法与 SY10150 相同。如果使用的是单日通行证,请更新现有地点或选择付费套餐。从已连接账户的商家信息创建地点时,此错误也会嵌套在 SY81086 中出现。
SY10152该地点的活跃时间还不够长,暂时无法归档。地点必须保持活跃状态达到该账户规定的最短期限(默认为 90 天),POST /locations/archive 才会接受其归档。请等待该期限届满。
SY10155该账户没有 Listings 套餐,因此无法创建地点。该 API 密钥所属的账户没有 Listings 订阅,例如仅订阅了 Social 的账户。地点属于 Listings 产品;请先订阅该产品,再调用 POST /locations。

rate_limited

429 Too Many Requests:该账户已超出其套餐的速率限制。响应正文为标准错误响应,其中包含 retry_after_seconds 提示、供您在支持请求中引用的 correlation_id,以及链接回本节的 doc_url:

JSON
{  "error": {    "code": "RATE_LIMITED",    "message": "Too many requests. Slow down.",    "retry_after_seconds": 30,    "correlation_id": "9f2c1e64-2b1a-4b0e-9f1a-2c7d5e8a1b3c",    "doc_url": "https://listingsapi.com/docs/error-codes#rate_limited"  }}

请等待 retry_after_seconds 指定的时间(如果存在 Retry-After 响应头,则等待该响应头指定的时间),然后采用指数退避策略重试。有关各套餐的限制和退避策略的参考实现,请参阅速率限制。

payment_required

402:该账户最近一次付款未成功,因此所有 /api/v4 端点均已暂停。若有未付款账单对应的 Stripe 页面,响应正文会包含指向该页面的 pay_url,且 X-Error-Code 响应头会携带相同的 code。您仍可打开控制台中的账单页面进行付款。

JSON
{  "code": "payment_required",  "message": "This account has an unpaid invoice, so API access is paused. Pay the invoice to restore access.",  "pay_url": "https://invoice.stripe.com/i/acct_123/test_abc",  "doc_url": "https://listingsapi.com/docs/error-codes#payment_required"}

付清最后一张未结清账单后,访问权限会在 1 分钟内恢复。如果首次付款失败 3 天后该账单仍未付款,Listings 订阅将被取消,该账户的地点也将被归档。如果该账户还拥有有效的 Social 订阅,则会保留 Social 访问权限;否则,该账户将被关闭,其 API 密钥将失效。

social_payment_required

402:Social 订阅最近一次付款未成功,因此 Social 端点(/api/v4/social/*)已暂停。Listings 端点仍可正常使用。响应正文包含与 payment_required 相同的字段,其中包含 "code": "social_payment_required"。如果首次付款失败 3 天后该账单仍未付款,Social 订阅将被取消,该账户的品牌也将被归档。没有 Listings 订阅的账户将被关闭,其 API 密钥将失效。

开发者门户控制平面错误

开发者门户中的账户和密钥管理端点(即控制台自身的 API 路由)统一返回一种结构化错误响应,其格式不同于上述 REST errors[] 格式。每个 code 都携带一个 correlation_id 和一个链接回本文对应章节的 doc_url。

JSON
{  "error": {    "code": "AUTH_INVALID_KEY",    "message": "Session is invalid or expired.",    "correlation_id": "9f2c1e64-2b1a-4b0e-9f1a-2c7d5e8a1b3c",    "doc_url": "https://listingsapi.com/docs/error-codes#auth_invalid_key"  }}

auth_missing_key

401:未提供凭据。请重新登录,或以 Authorization: API <your-key> 的形式发送您的密钥。

auth_invalid_key

401:会话或密钥无效或已过期。请重新进行身份验证,或在控制台中重新签发密钥。

auth_insufficient_scope

403:凭据有效,但无权执行此操作。仅具有读取权限的密钥无法调用写入端点;如有需要,请签发具有写入权限的密钥。

not_found

404:所请求的资源或通过 ID 指定的资源不存在。

conflict

409:请求与资源的当前状态冲突(例如,撤销已被撤销的密钥)。

validation_failed

422:请求体未通过验证。响应中的 field 和 details 指出了有问题的输入。

internal_error

500:发生了意外的服务器端错误。对于读取操作,请采用指数退避策略重试;对于写入操作,请先回读该记录(请参阅重试写入并非没有代价)。如果您联系支持团队,请引用 correlation_id。

dependency_unavailable

503:API 所依赖的某项服务暂时不可用。请采用退避策略重试。

有关 429,请参阅上文的 rate_limited。

在代码中处理错误

先检查 HTTP 状态;然后,对于写入操作,检查响应体中是否存在嵌套的 errors 数组:

Python
from listingsapi import APIError, ListingsAPI client = ListingsAPI(api_key=os.environ["LISTINGSAPI_KEY"]) try:    location = client.locations.create(input=payload)except APIError as e:    # Raised for a non-2xx status (AuthenticationError, ValidationError, and    # so on) and for an error payload returned inside a 200 body.    raise RuntimeError(f"Listings API error: {e}") from e

直接使用原始 HTTP API 时,需要显式执行相同的 2 项检查:先检查状态码,再检查响应载荷:

Python
resp = requests.post(    "https://listingsapi.com/api/v4/locations",    headers={"Authorization": f"API {os.environ['LISTINGSAPI_KEY']}"},    json=payload,    timeout=30,)resp.raise_for_status()body = resp.json() op = (body.get("data") or {}).get("createLocation") or {}if op.get("errors"):    messages = [e["message"] for e in op["errors"]]    raise RuntimeError(f"Listings API error: {messages}")

Python SDK 会为您完成这 2 项检查:它会将每个 HTTP 状态映射为具有特定类型的异常,并在 200 响应体内返回错误载荷时引发异常。