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

Exemplos de uso

Receitas prontas para as integrações mais comuns.

API v1 · contrato 1.0.0

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

Requisição
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.

Requisição
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

Requisição
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) ou access_until (último dia, no formato 2027-12-31) — um dos dois.
  • O curso precisa ter um plano configurado no painel. Sem plano, a resposta é 409 com reason: 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.

  1. Guarde a data e hora de início de cada rodada de sincronização.
  2. Chame a lista com updated_since igual ao início da rodada anterior e percorra todas as páginas (siga links.next).
  3. Ao terminar sem erro, salve o início desta rodada como referência da próxima.
Requisição
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.

  1. Consulte as tabelas de apoio para achar os ids de nível e tipo: GET /reference/course-levels e GET /reference/course-types.
  2. Crie (ou escolha) a categoria com POST /course-categories.
  3. Crie o curso com POST /courses:
Requisição
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
  }'
  1. Crie os módulos com POST /courses/{course}/modules, enviando só o name.
  2. Crie as aulas em cada módulo. Uma aula de vídeo, por exemplo:
Requisição
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"
  }'
  1. Ajuste a ordem, se precisar, com as rotas reorder de módulos e de aulas.
  2. 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 é 409 com reason: 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.

Requisição
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.

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