Exemplos de uso
Receitas prontas para as integrações mais comuns.
Receitas para as integrações mais pedidas. Os exemplos usam curl e a variável $LMS_TOKEN; troque minhaescola.lmsestudio.com pelo endereço da sua escola. Os detalhes de cada rota estão na Referência.
Cadastrar e matricular um aluno
O caso típico: alguém comprou no seu site ou foi cadastrado no ERP, e precisa ganhar acesso a um curso. Permissões: users.write e enrollments.write.
1. Veja se o aluno já existe
curl "https://minhaescola.lmsestudio.com/api/v1/users?email=maria@exemplo.com" \
-H "Authorization: Bearer $LMS_TOKEN"
O filtro email procura o endereço exato. Se a lista vier com o aluno, guarde o id e pule para o passo 3. Vale guardar esse id no seu sistema: as próximas chamadas ficam mais rápidas.
2. Cadastre o aluno
O cadastro exige Idempotency-Key: gere uma por aluno (um UUID serve) e guarde-a até ter a resposta. Se a conexão cair, repita com a mesma chave e você recebe o mesmo aluno, sem duplicar.
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/users" \
-H "Authorization: Bearer $LMS_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f0c6e1a-pedido-48213" \
-d '{
"name": "Maria Souza",
"email": "maria@exemplo.com",
"role": "student",
"send_invite": true
}'
A API não recebe senha: com send_invite ligado, o aluno recebe por e-mail o link para criar a dele. Se a escola exige CPF no cadastro, envie também cpf — o token precisa da permissão special.personal_data.
3. Matricule no curso
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/enrollments" \
-H "Authorization: Bearer $LMS_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f0c6e1a-pedido-48213-curso-12" \
-d '{
"user_id": 1532,
"course_id": 12,
"access_days": 365
}'
- Informe
access_days(dias a partir de hoje) ouaccess_until(último dia, no formato2027-12-31) — um dos dois. - O curso precisa ter um plano configurado no painel. Sem plano, a resposta é
409comreason: missing_plan. - A matrícula pela API é acesso concedido: não gera pedido nem cobrança. Por padrão o aluno recebe o aviso de matrícula; com
"notify": false, não recebe.
Sincronizar mudanças
A API não envia avisos automáticos (webhooks). Para manter outro sistema em dia, consulte as listas com o filtro updated_since, que traz só o que mudou desde a última consulta.
- Guarde a data e hora de início de cada rodada de sincronização.
- Chame a lista com
updated_sinceigual ao início da rodada anterior e percorra todas as páginas (sigalinks.next). - Ao terminar sem erro, salve o início desta rodada como referência da próxima.
curl "https://minhaescola.lmsestudio.com/api/v1/enrollments?updated_since=2026-11-10T08:00:00-03:00&per_page=100" \
-H "Authorization: Bearer $LMS_TOKEN"
O filtro existe nas listas de cursos, categorias, módulos, aulas, quizzes, usuários, turmas e membros, matrículas, progresso por curso, certificados, emblemas, pedidos e assinaturas. Um registro excluído some das listas; para saber se ele saiu, consulte-o pelo id — a resposta será 404.
Uma rodada a cada 5 a 15 minutos costuma bastar e cabe com folga no limite de chamadas. Use per_page=100 para gastar menos chamadas.
Montar um curso
Útil para importar conteúdo de outra plataforma. Permissões: courses.write e lessons.write. Tudo nasce despublicado, então os alunos só veem quando você publicar.
- Consulte as tabelas de apoio para achar os ids de nível e tipo:
GET /reference/course-levelseGET /reference/course-types. - Crie (ou escolha) a categoria com
POST /course-categories. - Crie o curso com
POST /courses:
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses" \
-H "Authorization: Bearer $LMS_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: importacao-curso-marketing" \
-d '{
"name": "Marketing Digital para Iniciantes",
"short_description": "Aprenda o essencial em 4 semanas.",
"category_id": 3,
"level_id": 1,
"type_id": 1,
"course_load": 20
}'
- Crie os módulos com
POST /courses/{course}/modules, enviando só oname. - Crie as aulas em cada módulo. Uma aula de vídeo, por exemplo:
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/45/modules/88/lessons" \
-H "Authorization: Bearer $LMS_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: importacao-aula-001" \
-d '{
"type": "video",
"title": "Boas-vindas ao curso",
"url": "https://www.youtube.com/watch?v=xxxxxxxxxxx"
}'
- Ajuste a ordem, se precisar, com as rotas
reorderde módulos e de aulas. - Publique aulas, módulos e por fim o curso. Para publicar o curso, ele precisa ter preço ou duração configurados no painel; sem isso, a resposta é
409comreason: missing_price.
Matrícula em lote
Para liberar acesso a uma turma inteira de uma vez, envie até 100 pares de aluno e curso numa chamada. Permissão: enrollments.write; a Idempotency-Key é obrigatória.
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/enrollments/bulk" \
-H "Authorization: Bearer $LMS_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: turma-noite-2026-lote-1" \
-d '{
"items": [
{ "user_id": 1532, "course_id": 12, "access_days": 180 },
{ "user_id": 1533, "course_id": 12, "access_days": 180 }
],
"notify": false
}'
Se algum item tiver formato inválido, a chamada inteira é recusada com 422, apontando o item. Já uma recusa de regra afeta só aquele item: ele volta em skipped, com a posição (index, a partir de 0) e o motivo — user_not_found, course_not_found, already_active, pending_order, missing_plan, plan_limit_reached ou failed. Os que deram certo vêm em results, como created ou renewed.
No lote, notify é false por padrão: cem avisos seguidos deixariam a chamada lenta demais.