Códigos de erro

Códigos de status HTTP da Listings API, códigos de erro SYxxxxx para Listings e Social e os três formatos de resposta de erro que a API v4 retorna.

A Listings API usa códigos de status HTTP convencionais para informar o resultado de uma requisição. Os códigos de erro têm o prefixo SY e são enviados na string message do erro, no formato SYxxxxx: <human-readable reason>.

Códigos de status HTTP

HTTP status code summary

StatusSignificadoCódigo SY típicoExceção do Python SDK
200 OKA requisição foi bem-sucedida. Para operações de escrita, verifique também o corpo da resposta (veja abaixo).--
400 Bad RequestRequisição malformada, filtro que não pode ser interpretado, valor de enum inválido ou ID malformado.SY90006, SY90001ValidationError
401 UnauthorizedA chave de API está ausente, malformada ou revogada. Você ainda não tem uma chave? Obtenha um passe diário gratuito para o sandbox quando ele estiver disponível.SY90005AuthenticationError
402 Payment RequiredA conta tem uma fatura não paga, então o acesso à API está suspenso. Uma fatura não paga referente apenas ao Social suspende somente os endpoints do Social. Consulte payment_required e social_payment_required.-APIError
403 ForbiddenA chave é válida, mas não tem permissão para acessar o recurso.SY90003PermissionDeniedError
404 Not FoundO caminho ou um recurso identificado pelo ID não existe.SY90002NotFoundError
422 Unprocessable EntityA requisição estava bem formada, mas um valor não pôde ser processado (por exemplo, uma categoria desconhecida ou ambígua).-ValidationError
429 Too Many RequestsVocê excedeu o limite de taxa do seu plano. Respeite o cabeçalho Retry-After.-RateLimitError
5xxUm erro do servidor. É seguro tentar novamente uma leitura com intervalos de espera progressivamente maiores; consulte a ressalva sobre escrita abaixo antes de repetir uma operação de escrita.SY90007InternalServerError

Três formatos de resposta

A maioria das falhas contém um array errors, no nível superior ou aninhado no resultado da operação, como mostram as seções abaixo. Algumas falhas retornam um único objeto error em vez disso: limitação de taxa (429) e algumas falhas no nível da requisição (400/500 com um code como INTERNAL_SERVER_ERROR). Verifique ambos: errors é um array, error é um objeto.

1. No nível da requisição: errors[] no nível superior

Falhas de autenticação, autorização e requisições malformadas interrompem o processamento antes que a operação seja executada. Elas retornam o status 4xx correspondente (acima) com o erro no nível superior da resposta.

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

2. Validação de escrita: data.<operation>.errors[] aninhado

Uma requisição de criação, atualização ou publicação que esteja bem formada nos demais aspectos retorna HTTP 200. Se a entrada violar uma regra de negócio, a falha será informada de forma aninhada no payload da própria operação, em data.<operation>.errors. Em caso de sucesso, esse array está presente e vazio ("errors": []).

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

3. No nível do gateway: um único objeto error no nível superior

A limitação de taxa e as falhas inesperadas do gateway interrompem o processamento antes da tradução e retornam um objeto error com um code, um message e um correlation_id. Consulte rate_limited abaixo para ver o corpo da resposta 429.

Sempre leia data.<operation>.errors em uma operação de escrita, mesmo em uma resposta 200 com um objeto data.<operation> preenchido: uma operação de escrita pode falhar parcialmente e informar a falha aqui.

Uma resposta 402 Payment Required não tem um invólucro error: code, message, doc_url e, quando há uma fatura a pagar, pay_url ficam no nível superior. Consulte payment_required abaixo.

Repetir uma operação de escrita tem consequências

A API v4 não oferece suporte a Idempotency-Key: o cabeçalho é ignorado e nenhum endpoint detecta operações de escrita repetidas. Uma chamada de criação, atualização ou publicação que exceda o tempo limite ou retorne um 5xx ainda pode ter sido efetivada no servidor, portanto, uma nova tentativa sem verificação pode gerar um local, uma publicação ou uma resposta a uma avaliação em duplicidade.

Repita as leituras livremente, com intervalos de espera progressivamente maiores. Para uma operação de escrita, faça primeiro uma leitura de verificação: busque o registro por uma chave que você controla (storeId, um código de loja, a lista de respostas da interação) e só repita a chamada se o registro realmente estiver ausente.

Códigos comuns

Common SY error codes

CódigoMensagemStatus HTTPSignificado
SY90005Invalid Token401A chave de API está ausente, malformada ou revogada. Emita uma nova chave pelo painel e envie-a como Authorization: API <your-key>.
SY90001Not authorized to access this resource401 / 403A chave foi rejeitada para este recurso. Tanto o Python SDK quanto o de Node lançam esse erro como AuthenticationError.
SY90002Invalid Id404 / 400Não foi possível resolver um ID no caminho ou em um argumento (geralmente um ID de relay inválido ou que não está em base64).
SY10126City is Mandatory200 (corpo da resposta)Um campo obrigatório (city) foi omitido da entrada.
SY10010state_iso200 (corpo da resposta)O valor de stateIso está ausente ou é inválido. Consulte o endpoint de países e estados para obter os valores válidos.

Os códigos de validação no intervalo SY10xxx correspondem a um campo de entrada específico; message indica o campo ou a regra que falhou. Os códigos de autenticação e autorização no intervalo SY90xxx se aplicam à requisição e chegam no nível superior com o status correspondente.

Códigos de contas conectadas

Os códigos no intervalo SY810xx vêm dos endpoints de contas conectadas que importam ou vinculam uma listagem de uma plataforma de publicação. Eles chegam aninhados no corpo da resposta em um HTTP 200 (formato de resposta 2 acima), portanto leia data.<operation>.errors mesmo quando o status indicar sucesso.

SY810xx connected-account and import codes

CódigoSignificadoO que fazer
SY81019Não foi possível identificar nenhum usuário para a conta associada à chave.Entre em contato com o suporte: a conta não tem um usuário principal ativo.
SY81066connectedAccountId não existe ou a conta está arquivada.Leia novamente o ID em GET /connected-accounts.
SY81067Não foi possível decodificar ou resolver connectedAccountListingId.Obtenha-o novamente no campo id de um registro de connected-account-listings.
SY81068Essa listagem já está vinculada a um local.Desconecte-a primeiro ou escolha outra listagem.
SY81069As credenciais da conta conectada não são mais válidas.Reconecte a conta por meio de connect-google ou connect-facebook.
SY81070A listagem não pertence à conta conectada que você indicou.Associe cada listagem à conta da qual ela veio. Uma causa comum é buscar listagens sem connectedAccountId no corpo da requisição, o que retorna listagens de outra conta.
SY81071Ocorreu um erro inesperado ao criar o local.Tente novamente; se o erro persistir, entre em contato com o suporte.
SY81072A criação do local falhou durante a montagem ou o salvamento.Tente novamente; se o erro persistir, entre em contato com o suporte.
SY81073O tipo de listagem não é compatível com a importação.Somente listagens do Google e do Facebook podem ser importadas.
SY81074O Google não retornou dados para a listagem.Confirme se a listagem ainda existe e se a conta ainda a gerencia.
SY81075O limite de requisições da API do Google foi excedido.Tente novamente mais tarde com backoff.
SY81076A busca da listagem no Google falhou.Tente novamente; verifique as permissões da conta no Google.
SY81077Não foi possível determinar o país a partir da página do Facebook.Adicione um país ao endereço da página no Facebook e tente novamente.
SY81078A montagem dos dados do local a partir da página do Facebook falhou.Tente novamente; se o erro persistir, entre em contato com o suporte.
SY81081A listagem não tem uma categoria principal definida.Defina uma categoria principal na listagem e tente novamente.
SY81082O país da listagem não é compatível.Consulte o endpoint de países e estados para obter os países compatíveis.
SY81083Não foi possível importar a listagem do Google.Entre em contato com o suporte e informe a data e a hora da ocorrência.
SY81084Ocorreu um erro interno ao preparar a importação do Facebook.Tente novamente; se o erro persistir, entre em contato com o suporte e informe a data e a hora da ocorrência.
SY81085Não foi possível importar a página do Facebook.Entre em contato com o suporte e informe a data e a hora da ocorrência.
SY81086A criação do local foi rejeitada por uma regra de negócio. O campo message aninhado contém o código subjacente, por exemplo, SY10151 quando a conta não tem mais vagas para locais.Leia a mensagem aninhada; para SY10151, adicione um complemento de locais ou faça um upgrade do plano.
SY81087A requisição de criação do local falhou.Tente novamente; se o erro persistir, entre em contato com o suporte e informe a data e a hora da ocorrência.
SY81088A criação do local falhou por um motivo não reconhecido.Entre em contato com o suporte e informe a data e a hora da ocorrência.
SY81089Uma chamada de serviço interno retornou um status que não indica sucesso. Não é um problema com a sua requisição.Tente novamente uma vez; se o erro persistir, entre em contato com o suporte e informe a data e a hora da ocorrência para que possamos rastrear a chamada interna.
SY81090Ocorreu um erro inesperado durante a chamada interna de criação do local.Tente novamente; se o erro persistir, entre em contato com o suporte e informe a data e a hora da ocorrência.

Códigos do Social

Os códigos no intervalo SY950xx vêm dos endpoints de Social: marcas, conexões e publicações em redes sociais. Assim como os códigos de contas conectadas, eles chegam aninhados no corpo da resposta em um HTTP 200, portanto, leia data.<operation>.error (e data.<operation>.errors nas rotas em lote) mesmo quando o status indicar sucesso.

SY950xx Social codes

CódigoSignificadoO que fazer
SY95041A conta atingiu seu limite de marcas. Não ocorre em um plano de API: nesses planos, as marcas são ilimitadas.Não há nada a fazer em um plano de API. Se você encontrar esse código, informe o problema: GET /social/limits deveria retornar brands: null.
SY95042A conta atingiu seu limite de conexões para o período de cobrança atual.O limite é comparado com usage.connections de GET /social/limits — a contagem faturável: as conexões ativas agora mais as liberadas neste período. Uma vaga liberada ao desconectar ou ao arquivar uma marca fica reservada até o fim do período, portanto, uma desconexão recente não elimina esse erro. Vincule novamente uma das contas que você liberou à marca à qual ela estava vinculada (gratuito, pois reutiliza essa vaga), compre outro pacote de 5 conexões (imediato) ou aguarde a renovação, quando as vagas usage.connectionsReleased voltam a ficar disponíveis. Vincular uma conta liberada a uma marca diferente não reutiliza a vaga. Consulte Planos e complementos.
SY95043Não há nenhuma marca com esse ID nesta conta, ou a marca está arquivada.Consulte novamente o ID em GET /social/brands. Os IDs de marca são UUIDs simples, não IDs relay em Base64.
SY95044Essa plataforma não está habilitada para esta conta.O plano Social da conta não inclui a plataforma que você solicitou conectar. Entre em contato com o suporte ou escolha uma plataforma disponível na conta.
SY95045A marca não tem nenhum canal conectado para essa plataforma.Encaminhe o usuário para um link de conexão dessa plataforma ou remova-a de platforms. Também ocorre quando o canal foi desconectado após o agendamento da publicação.
SY95046O agendamento ou o fuso horário é inválido.Envie scheduledAt ou scheduleDate + scheduleTime, nunca ambos. scheduledAt precisa de um deslocamento em relação ao UTC; scheduleTime é HH:MM. Os fusos horários são identificadores IANA (tzCode).
SY95047Não há nenhum trabalho em lote com esse ID nesta conta.Consulte novamente job.id na resposta de criação em lote. Os trabalhos não são mantidos para sempre.
SY95048A requisição em lote excede o limite de linhas.Envie no máximo 500 linhas por requisição e divida o restante em lotes adicionais. Nada foi criado.
SY95049A URL de redirecionamento é inválida.redirectUrl e errorUrl em um link de conexão devem ser URLs https absolutas sob seu controle.
SY95050A validação em lote falhou; consulte os erros de cada linha.Nada foi criado. Leia job.results[]: cada linha rejeitada contém seu index com base 0, seu clientReference e o motivo em errors[]. Corrija essas linhas e reenvie o lote inteiro.
SY95051A marca não cumpriu o requisito de permanência de 90 dias.Uma marca não pode ser arquivada antes de completar 90 dias de existência. A resposta também informa status: "TENURE_NOT_MET", e nada foi alterado. Tente novamente após o 90º dia, quando a marca e suas conexões serão arquivadas imediatamente — embora as vagas dessas conexões permaneçam reservadas até o fim do período de cobrança. Consulte a regra de permanência.
SY95052O canal conectado não pertence a esta marca.Associe cada conexão à marca na qual ela foi criada. Isso é comum quando uma chamada de métricas é montada com a publicação de uma marca e o ID de canal de outra marca.

SY95042 e SY95044 são falhas de acesso a recursos do plano, não erros de entrada: tentar novamente sem alterar o plano resultará na mesma falha. SY95045, SY95046, SY95049 e SY95052 são erros de entrada que podem ser corrigidos na próxima requisição.

Códigos de direitos de uso do Listings

Listings plan codes

CódigoSignificadoO que fazer
SY10150A conta atingiu seu limite de locais.Arquive um local, compre um complemento de local extra ou mude para um plano superior. Consulte Planos e complementos.
SY10151A conta não tem mais vagas para locais neste plano. Em um passe diário de sandbox, os dois locais disponíveis estão em uso.As mesmas soluções de SY10150 se aplicam. Em um passe diário, atualize um local existente ou escolha um plano pago. Também aparece aninhado em SY81086 quando um local é criado a partir de uma listagem de uma conta conectada.
SY10152O local ainda não está ativo há tempo suficiente para ser arquivado.Os locais precisam permanecer ativos pelo período mínimo de permanência da conta, de 90 dias por padrão, antes que POST /locations/archive os aceite. Aguarde o término desse período.
SY10155A conta não tem um plano do Listings, portanto não é possível criar locais.A chave de API pertence a uma conta sem assinatura do Listings, como uma conta que tem apenas o Social. Os locais fazem parte do produto Listings; assine-o antes de chamar POST /locations.

rate_limited

429 Too Many Requests: a conta excedeu o limite de requisições do plano. O corpo é a resposta de erro padrão, que contém uma indicação em retry_after_seconds, um correlation_id para informar nas solicitações de suporte e um doc_url com um link para esta seção:

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"  }}

Aguarde o tempo indicado por retry_after_seconds (ou pelo cabeçalho Retry-After, quando presente) e tente novamente com espera exponencial entre as tentativas. Consulte Limites de requisições para ver os limites por plano e uma implementação de referência de espera entre tentativas.

payment_required

402: O último pagamento desta conta não foi concluído, portanto todos os endpoints /api/v4 estão pausados. O corpo inclui pay_url, a página do Stripe referente à fatura não paga, quando disponível, e o cabeçalho de resposta X-Error-Code contém o mesmo code. Você ainda pode abrir a página de Faturamento no painel para pagar.

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"}

O acesso é restabelecido em até um minuto após o pagamento da última fatura em aberto. Se a fatura continuar sem pagamento 3 dias após a primeira tentativa de pagamento malsucedida, a assinatura do Listings será cancelada e os locais da conta serão arquivados. Se a conta também tiver uma assinatura ativa do Social, ela manterá o acesso ao Social; caso contrário, a conta será encerrada e suas chaves de API deixarão de funcionar.

social_payment_required

402: O último pagamento da assinatura do Social não foi concluído, portanto os endpoints do Social (/api/v4/social/*) estão pausados. Os endpoints do Listings continuam funcionando. O corpo tem os mesmos campos de payment_required, com "code": "social_payment_required". Se a fatura continuar sem pagamento 3 dias após a primeira tentativa de pagamento malsucedida, a assinatura do Social será cancelada e as marcas da conta serão arquivadas. Uma conta sem assinatura do Listings será encerrada, e suas chaves de API deixarão de funcionar.

Erros do plano de controle do portal do desenvolvedor

Os endpoints de gerenciamento de contas e chaves no portal do desenvolvedor (as rotas de API do próprio painel) retornam uma única resposta de erro estruturada, distinta dos formatos errors[] da API REST apresentados acima. Cada code contém um correlation_id e um doc_url com um link para a seção correspondente nesta página.

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: Nenhuma credencial foi fornecida. Faça login novamente ou envie sua chave como Authorization: API <your-key>.

auth_invalid_key

401: A sessão ou a chave é inválida ou expirou. Autentique-se novamente ou emita uma nova chave pelo painel.

auth_insufficient_scope

403: A credencial é válida, mas não tem permissão para esta ação. Uma chave com escopo de leitura não pode chamar endpoints de escrita; emita uma chave de escrita se precisar.

not_found

404: O recurso solicitado, ou um recurso referenciado por ID, não existe.

conflict

409: A solicitação entra em conflito com o estado atual do recurso (por exemplo, revogar uma chave que já foi revogada).

validation_failed

422: O corpo da solicitação não passou na validação. Os campos field e details da resposta identificam a entrada que causou o problema.

internal_error

500: Um erro inesperado no servidor. Repita uma leitura com espera exponencial entre as tentativas; para uma escrita, leia o registro novamente primeiro (consulte Repetir uma escrita não é isento de custo). Informe o correlation_id se entrar em contato com o suporte.

dependency_unavailable

503: Um serviço do qual a API depende está temporariamente indisponível. Tente novamente com espera entre as tentativas.

Para 429, consulte rate_limited acima.

Tratamento de erros no código

Verifique primeiro o status HTTP; depois, para operações de escrita, procure um array errors aninhado no corpo da resposta:

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

Ao usar a API HTTP diretamente, as mesmas duas verificações são explícitas: primeiro o código de status e depois o payload da resposta:

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}")

O Python SDK faz ambas as verificações para você: ele mapeia cada status HTTP para uma exceção tipada e também lança uma exceção quando há payloads de erro retornados em um corpo 200.