Códigos de error
Códigos de estado HTTP de Listings API, códigos de error SYxxxxx de Listings y Social y las tres estructuras de respuesta de error de la API v4.
Listings API utiliza códigos de estado HTTP convencionales para indicar el resultado de una solicitud. Los códigos de error llevan el prefijo SY y se incluyen en la cadena message del error, con el formato SYxxxxx: <human-readable reason>.
Códigos de estado HTTP
HTTP status code summary
Tres estructuras de respuesta
La mayoría de los fallos incluyen una matriz errors, ya sea en el nivel superior o anidada dentro del resultado de la operación, como muestran las secciones siguientes. Algunos fallos devuelven en su lugar un único objeto error: la limitación de solicitudes (429) y algunos fallos a nivel de solicitud (400/500 con un code como INTERNAL_SERVER_ERROR). Comprueba ambas posibilidades: errors es una matriz y error es un objeto.
1. A nivel de solicitud: errors[] en el nivel superior
Los fallos de autenticación, autorización y solicitudes mal formadas interrumpen el procesamiento antes de que se ejecute la operación. Devuelven el estado 4xx correspondiente (indicado arriba) con el error en el nivel superior de la respuesta.
{ "data": { "createLocation": null }, "errors": [{ "message": "SY90005: Invalid Token" }]}2. Validación de escrituras: data.<operation>.errors[] anidado
Una solicitud de creación, actualización o publicación que, por lo demás, esté bien formada devuelve HTTP 200. Si los datos de entrada incumplen una regla de negocio, el fallo se indica en data.<operation>.errors, anidado dentro de la carga útil de la propia operación. Si la operación se completa correctamente, esta matriz está presente y vacía ("errors": []).
{ "data": { "createLocation": { "errors": [ { "message": "SY10126: City is Mandatory" }, { "message": "SY10010: state_iso" } ], "location": null } }}3. A nivel de pasarela: un único objeto error en el nivel superior
La limitación de solicitudes y los fallos inesperados de la pasarela interrumpen el procesamiento antes de la traducción y devuelven un objeto error con un code, un message y un correlation_id. Consulta rate_limited más abajo para ver el cuerpo de 429.
Lee siempre data.<operation>.errors en una escritura, incluso con un 200 que contenga un objeto data.<operation> con datos: una escritura puede fallar parcialmente e indicarlo aquí.
Una respuesta 402 Payment Required no tiene un contenedor error: code, message, doc_url y, cuando hay una factura pendiente de pago, pay_url están en el nivel superior. Consulta payment_required más abajo.
Reintentar una escritura tiene un coste
La API v4 no admite Idempotency-Key: se ignora la cabecera y ningún endpoint detecta las escrituras repetidas. Una llamada de creación, actualización o publicación que agote el tiempo de espera o devuelva un 5xx puede haber guardado los cambios en el servidor, por lo que reintentar sin comprobarlo puede producir una ubicación, una publicación o una respuesta a una reseña duplicadas.
Reintenta las lecturas libremente con intervalos de espera crecientes. Para una escritura, realiza primero una lectura de comprobación: busca el registro mediante una clave que controles (storeId, un código de tienda, la lista de respuestas de la interacción) y repite la llamada solo si el registro realmente no existe.
Códigos habituales
Common SY error codes
Los códigos de validación del intervalo SY10xxx corresponden a un campo de entrada específico; message indica el nombre del campo o de la regla que ha fallado. Los códigos de autenticación y autorización del intervalo SY90xxx se aplican a toda la solicitud y llegan en el nivel superior con el estado correspondiente.
Códigos de cuentas conectadas
Los códigos del intervalo SY810xx proceden de los endpoints de Connected Accounts que importan o vinculan una ficha de una plataforma de publicación. Llegan anidados en el cuerpo de la respuesta con un HTTP 200 (estructura de respuesta 2 anterior), así que lee data.<operation>.errors incluso cuando el estado indique que la operación se ha completado correctamente.
SY810xx connected-account and import codes
Códigos de Social
Los códigos del rango SY950xx proceden de los endpoints de Social: marcas, conexiones y publicaciones en redes sociales. Al igual que los códigos de las cuentas conectadas, llegan anidados en el cuerpo de la respuesta de un HTTP 200, así que lee data.<operation>.error (y data.<operation>.errors en las rutas de operaciones masivas) incluso cuando el estado indique éxito.
SY950xx Social codes
SY95042 y SY95044 son fallos relacionados con las prestaciones del plan, no errores de entrada: volver a intentarlo sin cambiar el plan fallará de la misma manera. SY95045, SY95046, SY95049 y SY95052 son errores de entrada que se pueden corregir en la siguiente solicitud.
Códigos de derechos de acceso a Listings
Listings plan codes
rate_limited
429 Too Many Requests: la cuenta ha superado el límite de solicitudes de su plan. El cuerpo es la respuesta de error estándar que contiene una indicación retry_after_seconds, un correlation_id que debes incluir en las solicitudes de soporte y un doc_url que enlaza a esta sección:
{ "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" }}Espera el tiempo indicado por retry_after_seconds (o por la cabecera Retry-After, si está presente) y vuelve a intentarlo con una espera exponencial entre intentos. Consulta Límites de solicitudes para conocer los límites de cada plan y una implementación de referencia de la espera entre intentos.
payment_required
402: El último pago de esta cuenta no se ha completado, por lo que todos los endpoints de /api/v4 están en pausa. El cuerpo incluye pay_url, la página de Stripe de la factura pendiente de pago, cuando está disponible, y la cabecera de respuesta X-Error-Code contiene el mismo code. Aún puedes abrir la página de facturación en el panel para pagar.
{ "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"}El acceso se restablece en un plazo de un minuto tras el pago de la última factura pendiente. Si la factura sigue sin pagarse 3 días después del primer pago fallido, se cancela la suscripción a Listings y se archivan las ubicaciones de la cuenta. Si la cuenta también tiene una suscripción activa a Social, conserva el acceso a Social; de lo contrario, se cierra la cuenta y sus claves de API dejan de funcionar.
social_payment_required
402: El último pago de la suscripción a Social no se ha completado, por lo que los endpoints de Social (/api/v4/social/*) están en pausa. Los endpoints de Listings siguen funcionando. El cuerpo tiene los mismos campos que payment_required, con "code": "social_payment_required". Si la factura sigue sin pagarse 3 días después del primer pago fallido, se cancela la suscripción a Social y se archivan las marcas de la cuenta. Si la cuenta no tiene una suscripción a Listings, se cierra y sus claves de API dejan de funcionar.
Errores del plano de control del portal de desarrolladores
Los endpoints de gestión de cuentas y claves del portal de desarrolladores (las rutas de API propias del panel) devuelven una única respuesta de error estructurada, distinta de los formatos errors[] de REST anteriores. Cada code contiene un correlation_id y un doc_url que enlaza a la sección correspondiente de esta página.
{ "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: No se ha proporcionado ninguna credencial. Vuelve a iniciar sesión o envía tu clave como Authorization: API <your-key>.
auth_invalid_key
401: La sesión o la clave no es válida o ha caducado. Vuelve a autenticarte o emite una nueva clave desde el panel.
auth_insufficient_scope
403: La credencial es válida, pero no permite realizar esta acción. Una clave con permisos de lectura no puede llamar a endpoints de escritura; emite una clave de escritura si la necesitas.
not_found
404: El recurso solicitado, o un recurso identificado por su ID, no existe.
conflict
409: La solicitud entra en conflicto con el estado actual del recurso (por ejemplo, al revocar una clave que ya está revocada).
validation_failed
422: El cuerpo de la solicitud no ha superado la validación. Los campos field y details de la respuesta identifican el dato de entrada que ha causado el error.
internal_error
500: Un error inesperado del servidor. Reintenta una lectura con una espera exponencial entre intentos; para una escritura, primero vuelve a leer el registro (consulta Reintentar una escritura no es gratis). Incluye el correlation_id si contactas con soporte.
dependency_unavailable
503: Un servicio del que depende la API no está disponible temporalmente. Vuelve a intentarlo con una espera entre intentos.
Para 429, consulta rate_limited más arriba.
Gestión de errores en el código
Comprueba primero el estado HTTP; después, para las operaciones de escritura, busca un array errors anidado en el cuerpo de la respuesta:
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 eAl usar directamente la API HTTP, las mismas dos comprobaciones se realizan de forma explícita: primero el código de estado y después el contenido de la respuesta:
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}")El Python SDK realiza ambas comprobaciones por ti: asigna a cada estado HTTP una excepción de un tipo específico y también lanza una excepción cuando se devuelven datos de error dentro de un cuerpo 200.