Skip to main content

Limites e Erros

Códigos HTTP padronizados

StatusSignificadoAção recomendada
200Sucesso
201Recurso criado
204Sucesso sem corpo
400Body inválido ou recurso ausenteValidar payload
401Token inválido, ausente ou expiradoGerar novo PAT
403Sem permissão no recurso ou domínio bloqueado pelo planoVerificar papel na org / upgrade
404Recurso não encontradoConferir IDs
409Conflito (ex: nome duplicado)Resolver conflito
429Rate limit ou limite de plano atingidoBackoff / upgrade
500Erro interno do PortalTente novamente / contato suporte
501Serviço não implementado para aquela integraçãoUse outro serviço

Formato padrão dos erros

A maioria dos erros segue o formato:
{
  "error": "codigo_legivel",
  "message": "Descricao humana do que aconteceu"
}
Códigos comuns:
errorQuando ocorre
forbiddenSem permissão na entidade/recurso
domain_restrictedPlano não libera aquele domínio
limit_reachedAtingiu limite de quantidade do plano
not_foundRecurso ausente
invalid_bodyJSON malformado ou campos faltando
Exemplo de limit_reached:
{
  "error": "limit_reached",
  "message": "Limite de entidades expostas atingido (5)",
  "limit": 5,
  "current": 5
}

Limites por plano

RecursoFreePadrão
Integrações1Ilimitado
Automações2Ilimitado
Entidades expostas (Alexa/Google)5Ilimitado
Domínios controladoscoverTodos
Veja a tabela completa em Referência → Limites por Plano.

Rate limiting

A API protege os endpoints contra abuso. Em caso de excesso, você recebe 429 Too Many Requests. Recomendacoes:
  • Throttle no cliente: não envie rajadas de chamadas — espalhe no tempo.
  • Backoff exponencial ao receber 429: dobre o intervalo a cada tentativa.
  • Use WebSocket para receber estados em tempo real em vez de polling agressivo.
import time
import requests

def call_with_backoff(method, url, **kwargs):
    delay = 1
    for attempt in range(6):
        resp = requests.request(method, url, **kwargs)
        if resp.status_code != 429:
            return resp
        time.sleep(delay)
        delay *= 2
    return resp

Erros específicos do POST /v1/service

StatusBodyO que significa
400Entidade ausente lightentity_id não existe ou não pertence ao usuário
403{ "error": "forbidden" }Org member sem can_control na entidade
403{ "error": "domain_restricted" }Plano não libera aquele domínio
501Service not found: light.turn_rainbowO serviço não existe nessa integração

Depurando

  1. Confira a especificação: API Reference lista todos os endpoints com schemas.
  2. Verifique o token: faca uma chamada simples (GET /v1/states) — se voltar 401, o problema e o token.
  3. Verifique o contexto da org: se opera em organização, o header X-Organization-Id precisa estar correto e o usuário precisa ser membro.
  4. Logs do painel: em Automações → Histórico você ve cada execução com trace passo-a-passo.
Em caso de comportamento inesperado, abra um ticket em suporte.unicontrol.com.br com a request_id retornada nos headers da resposta (X-Request-Id).