Criar minha escola grátis →
Desenvolvedores · Documentação da API

Erros e limites

Formato dos erros, códigos de resposta, limites de uso e como repetir chamadas com segurança.

API v1 · contrato 1.0.0

A API responde com os códigos HTTP padrão e, quando algo dá errado, com um corpo que diz o motivo de forma estável — para o seu código tratar cada caso sem depender do texto da mensagem.

Formato do erro

Todo erro vem como application/problem+json (RFC 9457):

Resposta 422
{
    "type": "validation-failed",
    "title": "Dados inválidos.",
    "status": 422,
    "errors": {
        "email": ["Este e-mail já está em uso."]
    },
    "request_id": "9b3adf86-f581-4f68-af3b-6dae067f956a"
}
CampoO que é
typeIdentificador estável do tipo de erro. É este campo que o seu código deve testar.
titleFrase curta, para exibir ou registrar em log.
statusO mesmo código HTTP da resposta.
detailExplicação adicional, quando houver algo útil a dizer.
errorsNa validação: a lista de problemas de cada campo.
reasonSó no 409: o motivo do conflito. Veja a lista.
request_idIdentificador da chamada. Informe-o ao suporte.

Códigos de resposta

CódigotypeQuando acontece
200 201 202 204—Deu certo. 201 quando algo foi criado, 202 quando um e-mail foi enfileirado e 204 em exclusões, sem corpo.
400token-in-query-stringO token foi enviado na URL. Envie só no cabeçalho Authorization.
401unauthenticatedSem token, ou token inválido, vencido, suspenso, revogado ou usado de um IP fora da lista. A resposta é a mesma para todos os casos; o motivo fica no histórico do token, no painel.
403forbiddenO token não tem a permissão que a rota exige. O detail diz qual falta.
403tls-requiredChamada sem HTTPS.
404not-foundO registro não existe, foi excluído ou não é desta escola.
404api-disabledA API não está disponível para esta escola.
405method-not-allowedMétodo HTTP que a rota não aceita.
409conflictUma regra da escola impede a operação. O reason diz qual.
409idempotency-key-conflictA mesma Idempotency-Key foi reaproveitada num pedido diferente.
413payload-too-largeCorpo acima de 1 MB. Para muitos registros, use as rotas em lote.
415unsupported-media-typeO corpo não é JSON. Envie Content-Type: application/json.
422validation-failedDados inválidos. Os problemas de cada campo vêm em errors.
422unknown-fieldCampo que a rota não conhece. A API recusa em vez de ignorar, para um nome digitado errado não passar em silêncio.
422plan-limit-reachedA operação passaria do limite do plano da escola (por exemplo, de alunos ativos).
429rate-limitedLimite de chamadas atingido. Espere os segundos de Retry-After.
500server-errorFalha do nosso lado. Pode repetir com a mesma Idempotency-Key; se persistir, fale com o suporte citando o request_id.
503school-unavailableA escola está temporariamente indisponível. Tente de novo em alguns minutos.

Motivos de conflito (409)

Quando uma regra da escola barra a operação, o campo reason traz um destes códigos:

reasonSignificado
has_coursesA categoria ainda tem cursos.
has_enrollmentsO curso ainda tem matrículas.
missing_priceO curso não tem preço ou duração configurados; não pode ser publicado.
missing_planO curso não tem plano configurado; não aceita matrícula.
order_mismatchA lista enviada para reordenar não traz exatamente os ids existentes, uma vez cada.
category_cycleA categoria ficaria dentro de si mesma.
parent_not_foundA categoria-mãe informada não existe.
max_depthPassaria do limite de níveis de categorias.
lesson_type_not_supportedEsse tipo de aula não pode ser criado ou alterado pela API.
quiz_visibility_managedA visibilidade do quiz é controlada pelo painel.
recently_sentO link de senha foi enviado há pouco; aguarde antes de pedir outro.
user_inactiveO usuário está inativo.
policy_*Regras da escola sobre a gestão de usuários (o texto explica qual).

Limites de uso

LimiteValor
Chamadas por token, por minuto60 (o administrador pode definir outro valor ao criar o token)
Chamadas por token, por dia10.000
Relatórios (/reports), por minuto10
Chamadas da escola inteira, por minuto (somando todos os tokens)300
Itens por chamada em lote100
Tamanho do corpo1 MB
Itens por página nas listasaté 100 (padrão 25)

Cada resposta informa onde você está no limite:

CabeçalhoO que diz
X-RateLimit-LimitLimite por minuto deste token.
X-RateLimit-RemainingQuantas chamadas restam na janela atual.
X-RateLimit-ResetQuando a janela reinicia (epoch, em segundos).
Retry-AfterNo 429: quantos segundos esperar antes de tentar de novo.

Proteção contra tentativas: 20 falhas de autenticação num minuto, vindas do mesmo IP, bloqueiam esse IP na escola por 15 minutos. Se a sua integração receber 401, pare e confira o token em vez de repetir em laço.

Repetir sem duplicar (idempotência)

Rede falha: às vezes a chamada chega, a operação acontece e a resposta se perde. Para repetir sem criar o registro duas vezes, envie o cabeçalho Idempotency-Key nas escritas.

  • Use uma chave de 8 a 128 caracteres, com letras, números, hífen e sublinhado — um UUID serve. Gere uma chave por operação.
  • Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo. Ela vem com o cabeçalho Idempotent-Replay: true.
  • A chave fica guardada por 24 horas.
  • Usar a mesma chave num pedido diferente gera 409 idempotency-key-conflict.
  • É recomendada em toda escrita e obrigatória no cadastro de usuário e na matrícula em lote.
Exemplo
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/groups" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0c9d2a7e-3f41-4b8e-9f0a-2d6b1c5e8a11" \
  -d '{ "name": "Turma Noite 2026" }'

Paginação

As listas aceitam page (a partir de 1) e per_page (até 100, padrão 25) e respondem sempre no mesmo envelope:

Resposta 200
{
    "data": [ ... ],
    "meta": { "page": 1, "per_page": 25, "total": 42 },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/courses?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/courses?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/courses?page=2"
    }
}

Para percorrer tudo, siga links.next até ele vir null. Algumas listas também aceitam sort e dir (asc ou desc); veja quais na Referência.

Usamos cookies para melhorar sua experiência de navegação.