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

Referência

Todas as rotas da API, com parâmetros, respostas e exemplos em curl.

API v1 · contrato 1.0.0

As 65 rotas da API, geradas do contrato OpenAPI 1.0.0. Os exemplos usam o endereço minhaescola.lmsestudio.com e o token na variável $LMS_TOKEN.

Baixar openapi.json

Conexão

Conferir o token e descobrir o que ele pode fazer.

GET /api/v1/me #

Dados do token em uso

Atende qualquer token valido, sem exigir permissao de modulo: e com esta chamada que se confere a conexao antes de escrever a integracao.

Devolve duas listas de permissoes. granted e o que esta gravado no token, como a tela mostra. effective e tudo o que o token satisfaz de fato, incluindo o que vem por nivel — um token com courses.delete tambem le e escreve cursos, e so a segunda lista mostra isso.

Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/me" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Token valido.
Resposta 200
{
    "data": {
        "token": {
            "name": "Integração com o ERP",
            "purpose": "Integração com o ERP",
            "masked": "elms_live_...Qw2r",
            "last_four": "Qw2r",
            "expires_at": "2026-11-10T14:30:00-03:00",
            "last_used_at": "2026-11-10T14:30:00-03:00",
            "rate_limit_per_minute": 1,
            "ip_restricted": true
        },
        "school": {
            "id": "9b3adf86-f581-4f68-af3b-6dae067f956a",
            "plan": "Plano Premium"
        },
        "permissions": {
            "granted": [
                "courses.read"
            ],
            "effective": [
                "courses.read"
            ]
        },
        "api": {
            "version": "v1",
            "phase": 1
        }
    }
}
400 O token foi enviado na URL, no corpo ou em cookie. Nesses lugares ele fica gravado no registro do servidor e no historico do navegador: use o cabecalho Authorization.
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 Chamada em HTTP. Nao ha redirecionamento para HTTPS de proposito: um redirecionamento faria o token viajar aberto na primeira chamada.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
503 Escola suspensa, em manutencao, ou servico temporariamente fora do ar. Tente de novo depois do tempo de Retry-After.

Cursos

Cursos, categorias, modulos e aulas.

GET /api/v1/courses #

Lista os cursos da escola

Exige a permissao Cursos: Leitura (courses.read).

Os campos description, programmatic_content e prerequisites so aparecem com a permissao Conteudo das aulas (special.lesson_content). Sem ela eles nao vem — nao e erro, e a regra. Nao assuma que existem.

Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
status string Situacao do curso.
category_id integer
instructor_id integer
q string Busca por nome ou resumo.
sort string
dir string
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/courses" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada de cursos.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "name": "Marketing Digital para Iniciantes",
            "slug": "meu-curso",
            "short_description": "Aprenda o essencial em 4 semanas.",
            "description": "<p>Descrição do conteúdo.</p>",
            "programmatic_content": "Texto de exemplo",
            "prerequisites": "Texto de exemplo",
            "category": {
                "id": 1,
                "name": "Marketing"
            },
            "instructor": {
                "id": 1,
                "name": "Maria Souza"
            },
            "level": {
                "id": 1,
                "name": "Iniciante"
            },
            "type": {
                "id": 1,
                "name": "Online"
            },
            "course_load": 1,
            "is_free": true,
            "purpose": "sales",
            "status": "published",
            "published_at": "2026-11-10T14:30:00-03:00",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "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"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses #

Cria curso

Exige Cursos: Escrita (courses.write).

O curso nasce despublicado. A API nao define preco, imagem nem campos Hotmart: configure o preco na tela antes de publicar.

Sem instructor_id, o instrutor e quem criou o token. Os campos de HTML passam por filtro (perfil de aula); name e short_description viram texto puro.

Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
nameobrigatório string Mín. 3 caracteres, máx. 255 caracteres.
short_descriptionobrigatório string Texto puro. Máx. 255 caracteres.
description string ou null HTML, filtrado (perfil de aula).
programmatic_content string ou null HTML, filtrado.
prerequisites string ou null HTML, filtrado.
category_idobrigatório integer
instructor_id integer Professor ativo. Ausente = quem criou o token.
level_idobrigatório integer Ver /reference/course-levels.
type_idobrigatório integer Ver /reference/course-types.
certificate_requirement string Valores: none, all_lessons. Padrão "none".
course_load integer ou null Carga horaria em horas. Ausente ou null = nao informada, gravada como 0. Mínimo 0, máximo 100000, padrão 0.
purpose string Valores: sales, internal. Padrão "sales".
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Marketing Digital para Iniciantes",
    "short_description": "Aprenda o essencial em 4 semanas.",
    "description": "<p>Descrição do conteúdo.</p>",
    "programmatic_content": "Texto de exemplo",
    "prerequisites": "Texto de exemplo",
    "category_id": 1,
    "level_id": 1,
    "type_id": 1
}'
Respostas
201 Curso criado.
Resposta 201
{
    "data": {
        "id": 1,
        "name": "Marketing Digital para Iniciantes",
        "slug": "meu-curso",
        "short_description": "Aprenda o essencial em 4 semanas.",
        "description": "<p>Descrição do conteúdo.</p>",
        "programmatic_content": "Texto de exemplo",
        "prerequisites": "Texto de exemplo",
        "category": {
            "id": 1,
            "name": "Marketing"
        },
        "instructor": {
            "id": 1,
            "name": "Maria Souza"
        },
        "level": {
            "id": 1,
            "name": "Iniciante"
        },
        "type": {
            "id": 1,
            "name": "Online"
        },
        "course_load": 1,
        "is_free": true,
        "purpose": "sales",
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/courses/{course} #

Um curso

Exige Cursos: Leitura (courses.read).

Caminho
NomeTipoDescrição
courseobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/courses/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O curso.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Marketing Digital para Iniciantes",
        "slug": "meu-curso",
        "short_description": "Aprenda o essencial em 4 semanas.",
        "description": "<p>Descrição do conteúdo.</p>",
        "programmatic_content": "Texto de exemplo",
        "prerequisites": "Texto de exemplo",
        "category": {
            "id": 1,
            "name": "Marketing"
        },
        "instructor": {
            "id": 1,
            "name": "Maria Souza"
        },
        "level": {
            "id": 1,
            "name": "Iniciante"
        },
        "type": {
            "id": 1,
            "name": "Online"
        },
        "course_load": 1,
        "is_free": true,
        "purpose": "sales",
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
PATCH /api/v1/courses/{course} #

Altera curso

Exige Cursos: Escrita (courses.write). Envie so os campos a mudar. Situacao muda pelas acoes publish/unpublish, nao por aqui.

Caminho
NomeTipoDescrição
courseobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)

Os mesmos campos de CourseCreate, todos opcionais.

CampoTipoDescrição
name string Mín. 3 caracteres, máx. 255 caracteres.
short_description string Máx. 255 caracteres.
description string ou null
programmatic_content string ou null
prerequisites string ou null
category_id integer
instructor_id integer
level_id integer
type_id integer
certificate_requirement string Valores: none, all_lessons.
course_load integer ou null null = nao informada, gravada como 0. Mínimo 0, máximo 100000.
purpose string Valores: sales, internal.
Exemplo
curl
curl -X PATCH "https://minhaescola.lmsestudio.com/api/v1/courses/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Marketing Digital para Iniciantes",
    "short_description": "Aprenda o essencial em 4 semanas.",
    "description": "<p>Descrição do conteúdo.</p>"
}'
Respostas
200 Curso alterado.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Marketing Digital para Iniciantes",
        "slug": "meu-curso",
        "short_description": "Aprenda o essencial em 4 semanas.",
        "description": "<p>Descrição do conteúdo.</p>",
        "programmatic_content": "Texto de exemplo",
        "prerequisites": "Texto de exemplo",
        "category": {
            "id": 1,
            "name": "Marketing"
        },
        "instructor": {
            "id": 1,
            "name": "Maria Souza"
        },
        "level": {
            "id": 1,
            "name": "Iniciante"
        },
        "type": {
            "id": 1,
            "name": "Online"
        },
        "course_load": 1,
        "is_free": true,
        "purpose": "sales",
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
DELETE /api/v1/courses/{course} #

Exclui curso

Exige Cursos: Exclusao (courses.delete), que pede lista de IPs no token.

Exclusao logica. Recusada com 409 (reason: has_enrollments) se houver matricula — despublique o curso para tira-lo da vitrine.

Caminho
NomeTipoDescrição
courseobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X DELETE "https://minhaescola.lmsestudio.com/api/v1/courses/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
204 Excluido.
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/course-categories #

Lista as categorias de curso

Exige Cursos: Leitura (courses.read) — a mesma permissao dos cursos: quem le curso precisa ler a categoria dele.

Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
parent_id integer
q string
sort string
dir string
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/course-categories" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada de categorias.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "name": "Marketing",
            "slug": "meu-curso",
            "description": "<p>Descrição do conteúdo.</p>",
            "parent_id": 1,
            "status": "published",
            "language": "pt",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/course-categories?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/course-categories?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/course-categories?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/course-categories #

Cria categoria de curso

Exige Cursos: Escrita (courses.write).

A categoria nasce despublicada (status: draft). Subcategoria herda o idioma do pai. No maximo 3 niveis.

description passa por filtro de HTML (perfil basico: sem imagem, tabela ou video).

Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
nameobrigatório string Unico entre todas as categorias. Mín. 2 caracteres, máx. 80 caracteres.
parent_id integer ou null 0 ou ausente = categoria raiz.
language string So na raiz; subcategoria herda do pai. Valores: pt, en, es. Padrão "pt".
description string ou null HTML, filtrado (perfil basico).
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/course-categories" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Marketing",
    "parent_id": 1,
    "language": "pt",
    "description": "<p>Descrição do conteúdo.</p>"
}'
Respostas
201 Categoria criada.
Resposta 201
{
    "data": {
        "id": 1,
        "name": "Marketing",
        "slug": "meu-curso",
        "description": "<p>Descrição do conteúdo.</p>",
        "parent_id": 1,
        "status": "published",
        "language": "pt",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/course-categories/{category} #

Uma categoria

Exige Cursos: Leitura (courses.read).

Caminho
NomeTipoDescrição
categoryobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/course-categories/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 A categoria.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Marketing",
        "slug": "meu-curso",
        "description": "<p>Descrição do conteúdo.</p>",
        "parent_id": 1,
        "status": "published",
        "language": "pt",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
PATCH /api/v1/course-categories/{category} #

Altera categoria de curso

Exige Cursos: Escrita (courses.write). Envie so os campos a mudar.

status publica ou despublica a categoria — e leva junto as subcategorias, como na tela. O slug nao muda com o nome (ele esta em links ja publicados).

Caminho
NomeTipoDescrição
categoryobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
name string Mín. 2 caracteres, máx. 80 caracteres.
parent_id integer ou null
language string Valores: pt, en, es.
description string ou null
status string Valores: published, draft.
Exemplo
curl
curl -X PATCH "https://minhaescola.lmsestudio.com/api/v1/course-categories/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Marketing",
    "parent_id": 1,
    "language": "pt"
}'
Respostas
200 Categoria alterada.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Marketing",
        "slug": "meu-curso",
        "description": "<p>Descrição do conteúdo.</p>",
        "parent_id": 1,
        "status": "published",
        "language": "pt",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
DELETE /api/v1/course-categories/{category} #

Exclui categoria de curso

Exige Cursos: Exclusao (courses.delete), que pede lista de IPs no token.

Exclusao logica, junto com as subcategorias. Recusada com 409 (reason: has_courses) se houver curso na categoria ou em descendente.

Caminho
NomeTipoDescrição
categoryobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X DELETE "https://minhaescola.lmsestudio.com/api/v1/course-categories/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
204 Excluida.
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/courses/{course}/modules #

Modulos de um curso

Exige a permissao lessons.read.

Caminho
NomeTipoDescrição
courseobrigatório integer
Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "course_id": 1,
            "name": "Módulo 1 — Primeiros passos",
            "slug": "meu-curso",
            "position": 1,
            "status": "published",
            "published_at": "2026-11-10T14:30:00-03:00",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/modules?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/modules?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/modules?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/modules #

Cria modulo

Exige Aulas: Escrita (lessons.write). O modulo vai para o fim do curso, despublicado. Nome unico no curso.

Caminho
NomeTipoDescrição
courseobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
nameobrigatório string Unico entre os modulos do curso. Mín. 1 caracteres, máx. 255 caracteres.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Módulo 1 — Primeiros passos"
}'
Respostas
201 Modulo criado.
Resposta 201
{
    "data": {
        "id": 1,
        "course_id": 1,
        "name": "Módulo 1 — Primeiros passos",
        "slug": "meu-curso",
        "position": 1,
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/courses/{course}/modules/{module}/lessons #

Aulas de um modulo

Exige lessons.read. O campo content so aparece com special.lesson_content.

Caminho
NomeTipoDescrição
moduleobrigatório integer
courseobrigatório integer
Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules/123/lessons" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "course_id": 1,
            "module_id": 1,
            "name": "Maria Souza",
            "slug": "meu-curso",
            "type": {
                "id": 1,
                "name": "Online"
            },
            "position": 1,
            "is_free": true,
            "counts_for_average": true,
            "status": "published",
            "content": "<p>Conteúdo da aula.</p>",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/lessons?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/lessons?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/lessons?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/modules/{module}/lessons #

Cria aula sem arquivo

Exige Aulas: Escrita (lessons.write).

Tipos aceitos: text, link, video (YouTube/Vimeo), code, separator e youtubelive. Aulas com arquivo ficam para uma fase posterior. A aula vai para o fim do modulo, despublicada.

HTML (content, description) passa por filtro com lista permitida. URLs so https; a API nunca acessa a URL informada (a duracao do video vem em duration_seconds, ou fica zero).

Caminho
NomeTipoDescrição
courseobrigatório integer
moduleobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)

Campos por tipo: | type | obrigatorios | opcionais | |---|---|---| | text | content (HTML) | — | | link | url (https) | description (HTML) | | video | url (YouTube ou Vimeo, https) | duration_seconds | | code | code (texto; exibido como codigo, nunca executado) | description (HTML) | | separator | — | — | | youtubelive | youtube_id (11 caracteres), event_date (ISO 8601 com fuso) | description (HTML) | Campo de outro tipo e recusado como desconhecido.

CampoTipoDescrição
typeobrigatório string Valores: text, link, video, code, separator, youtubelive.
titleobrigatório string Mín. 1 caracteres, máx. 255 caracteres.
content string
url string (uri)
description string ou null
duration_seconds integer ou null Mínimo 0, máximo 86400.
code string
youtube_id string
event_date string (date-time)
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules/123/lessons" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "type": "text",
    "title": "Boas-vindas ao curso",
    "content": "<p>Conteúdo da aula.</p>",
    "url": "https://minhaescola.lmsestudio.com/...",
    "description": "<p>Descrição do conteúdo.</p>"
}'
Respostas
201 Aula criada.
Resposta 201
{
    "data": {
        "id": 1,
        "course_id": 1,
        "module_id": 1,
        "name": "Maria Souza",
        "slug": "meu-curso",
        "type": {
            "id": 1,
            "name": "Online"
        },
        "position": 1,
        "is_free": true,
        "counts_for_average": true,
        "status": "published",
        "content": "<p>Conteúdo da aula.</p>",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/courses/{course}/lessons/{lesson} #

Uma aula

Exige a permissao lessons.read.

Caminho
NomeTipoDescrição
lessonobrigatório integer
courseobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/courses/123/lessons/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "course_id": 1,
        "module_id": 1,
        "name": "Maria Souza",
        "slug": "meu-curso",
        "type": {
            "id": 1,
            "name": "Online"
        },
        "position": 1,
        "is_free": true,
        "counts_for_average": true,
        "status": "published",
        "content": "<p>Conteúdo da aula.</p>",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
PATCH /api/v1/courses/{course}/lessons/{lesson} #

Altera aula

Exige Aulas: Escrita (lessons.write). O tipo nao muda; envie os campos do tipo da aula. Aula de tipo com arquivo ou questionario: 409 (reason: lesson_type_not_supported).

Caminho
NomeTipoDescrição
courseobrigatório integer
lessonobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)

Os campos de LessonCreate do tipo da aula, todos opcionais, sem type.

CampoTipoDescrição
title string Mín. 1 caracteres, máx. 255 caracteres.
content string
url string (uri)
description string ou null
duration_seconds integer ou null
code string
youtube_id string
event_date string (date-time)
Exemplo
curl
curl -X PATCH "https://minhaescola.lmsestudio.com/api/v1/courses/123/lessons/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "title": "Boas-vindas ao curso",
    "content": "<p>Conteúdo da aula.</p>",
    "url": "https://minhaescola.lmsestudio.com/..."
}'
Respostas
200 Aula alterada.
Resposta 200
{
    "data": {
        "id": 1,
        "course_id": 1,
        "module_id": 1,
        "name": "Maria Souza",
        "slug": "meu-curso",
        "type": {
            "id": 1,
            "name": "Online"
        },
        "position": 1,
        "is_free": true,
        "counts_for_average": true,
        "status": "published",
        "content": "<p>Conteúdo da aula.</p>",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
DELETE /api/v1/courses/{course}/lessons/{lesson} #

Exclui aula

Exige Aulas: Exclusao (lessons.delete), que pede lista de IPs no token. So os tipos sem arquivo; os demais: 409 (reason: lesson_type_not_supported).

Caminho
NomeTipoDescrição
courseobrigatório integer
lessonobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X DELETE "https://minhaescola.lmsestudio.com/api/v1/courses/123/lessons/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
204 Excluida.
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/courses/{course}/quizzes #

Quizzes de um curso (so metadados)

Exige lessons.read. So metadados: o gabarito nunca sai na v1. Paginado.

Caminho
NomeTipoDescrição
courseobrigatório integer
Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/courses/123/quizzes" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "course_id": 1,
            "module_id": 1,
            "name": "Maria Souza",
            "slug": "meu-curso",
            "type": {
                "id": 1,
                "name": "Online"
            },
            "position": 1,
            "is_free": true,
            "counts_for_average": true,
            "status": "published",
            "content": "<p>Conteúdo da aula.</p>",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/quizzes?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/quizzes?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/quizzes?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/publish #

Publica curso

Exige Cursos: Escrita (courses.write). Sem corpo.

Recusada com 409 (reason: missing_price) se o preco ou a duracao ainda nao foram configurados na tela.

Caminho
NomeTipoDescrição
courseobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/publish" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Curso publicado.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Marketing Digital para Iniciantes",
        "slug": "meu-curso",
        "short_description": "Aprenda o essencial em 4 semanas.",
        "description": "<p>Descrição do conteúdo.</p>",
        "programmatic_content": "Texto de exemplo",
        "prerequisites": "Texto de exemplo",
        "category": {
            "id": 1,
            "name": "Marketing"
        },
        "instructor": {
            "id": 1,
            "name": "Maria Souza"
        },
        "level": {
            "id": 1,
            "name": "Iniciante"
        },
        "type": {
            "id": 1,
            "name": "Online"
        },
        "course_load": 1,
        "is_free": true,
        "purpose": "sales",
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/unpublish #

Despublica curso

Exige Cursos: Escrita (courses.write). Sem corpo. Quem ja esta matriculado continua com acesso.

Caminho
NomeTipoDescrição
courseobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/unpublish" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Curso despublicado.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Marketing Digital para Iniciantes",
        "slug": "meu-curso",
        "short_description": "Aprenda o essencial em 4 semanas.",
        "description": "<p>Descrição do conteúdo.</p>",
        "programmatic_content": "Texto de exemplo",
        "prerequisites": "Texto de exemplo",
        "category": {
            "id": 1,
            "name": "Marketing"
        },
        "instructor": {
            "id": 1,
            "name": "Maria Souza"
        },
        "level": {
            "id": 1,
            "name": "Iniciante"
        },
        "type": {
            "id": 1,
            "name": "Online"
        },
        "course_load": 1,
        "is_free": true,
        "purpose": "sales",
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/modules/reorder #

Reordena os modulos

Exige Aulas: Escrita (lessons.write). Envie todos os ids dos modulos do curso, na ordem desejada, uma vez cada. Lista parcial e recusada com 409 (reason: order_mismatch).

Caminho
NomeTipoDescrição
courseobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
orderobrigatório array de integer Todos os ids, na ordem desejada, uma vez cada.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules/reorder" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "order": [
        1
    ]
}'
Respostas
200 Modulos na nova ordem.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "course_id": 1,
            "name": "Módulo 1 — Primeiros passos",
            "slug": "meu-curso",
            "position": 1,
            "status": "published",
            "published_at": "2026-11-10T14:30:00-03:00",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ]
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
PATCH /api/v1/courses/{course}/modules/{module} #

Renomeia modulo

Exige Aulas: Escrita (lessons.write). O slug acompanha o nome.

Caminho
NomeTipoDescrição
courseobrigatório integer
moduleobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
nameobrigatório string Unico entre os modulos do curso. Mín. 1 caracteres, máx. 255 caracteres.
Exemplo
curl
curl -X PATCH "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Módulo 1 — Primeiros passos"
}'
Respostas
200 Modulo alterado.
Resposta 200
{
    "data": {
        "id": 1,
        "course_id": 1,
        "name": "Módulo 1 — Primeiros passos",
        "slug": "meu-curso",
        "position": 1,
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
DELETE /api/v1/courses/{course}/modules/{module} #

Exclui modulo

Exige Aulas: Exclusao (lessons.delete), que pede lista de IPs no token. Exclusao logica do modulo e das aulas dele.

Caminho
NomeTipoDescrição
courseobrigatório integer
moduleobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X DELETE "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
204 Excluido.
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/modules/{module}/publish #

Publica modulo

Exige Aulas: Escrita (lessons.write). Sem corpo.

Leva junto todas as aulas do modulo, como na tela: publica tambem as aulas que estavam em outra situacao.

Caminho
NomeTipoDescrição
courseobrigatório integer
moduleobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules/123/publish" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Modulo alterado.
Resposta 200
{
    "data": {
        "id": 1,
        "course_id": 1,
        "name": "Módulo 1 — Primeiros passos",
        "slug": "meu-curso",
        "position": 1,
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/modules/{module}/unpublish #

Despublica modulo

Exige Aulas: Escrita (lessons.write). Sem corpo.

Leva junto todas as aulas do modulo, como na tela: despublica tambem as aulas que estavam em outra situacao.

Caminho
NomeTipoDescrição
courseobrigatório integer
moduleobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules/123/unpublish" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Modulo alterado.
Resposta 200
{
    "data": {
        "id": 1,
        "course_id": 1,
        "name": "Módulo 1 — Primeiros passos",
        "slug": "meu-curso",
        "position": 1,
        "status": "published",
        "published_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/modules/{module}/lessons/reorder #

Reordena as aulas de um modulo

Exige Aulas: Escrita (lessons.write). Envie todos os ids das aulas do modulo, na ordem desejada. Lista parcial: 409 (reason: order_mismatch).

Caminho
NomeTipoDescrição
courseobrigatório integer
moduleobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
orderobrigatório array de integer Todos os ids, na ordem desejada, uma vez cada.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/modules/123/lessons/reorder" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "order": [
        1
    ]
}'
Respostas
200 Aulas na nova ordem.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "course_id": 1,
            "module_id": 1,
            "name": "Maria Souza",
            "slug": "meu-curso",
            "type": {
                "id": 1,
                "name": "Online"
            },
            "position": 1,
            "is_free": true,
            "counts_for_average": true,
            "status": "published",
            "content": "<p>Conteúdo da aula.</p>",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ]
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/lessons/{lesson}/publish #

Publica aula

Exige Aulas: Escrita (lessons.write). Sem corpo. Vale para qualquer tipo, menos questionario (409, reason: quiz_visibility_managed).

Caminho
NomeTipoDescrição
courseobrigatório integer
lessonobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/lessons/123/publish" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Aula alterada.
Resposta 200
{
    "data": {
        "id": 1,
        "course_id": 1,
        "module_id": 1,
        "name": "Maria Souza",
        "slug": "meu-curso",
        "type": {
            "id": 1,
            "name": "Online"
        },
        "position": 1,
        "is_free": true,
        "counts_for_average": true,
        "status": "published",
        "content": "<p>Conteúdo da aula.</p>",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/courses/{course}/lessons/{lesson}/unpublish #

Despublica aula

Exige Aulas: Escrita (lessons.write). Sem corpo. Vale para qualquer tipo, menos questionario (409, reason: quiz_visibility_managed).

Caminho
NomeTipoDescrição
courseobrigatório integer
lessonobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/courses/123/lessons/123/unpublish" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Aula alterada.
Resposta 200
{
    "data": {
        "id": 1,
        "course_id": 1,
        "module_id": 1,
        "name": "Maria Souza",
        "slug": "meu-curso",
        "type": {
            "id": 1,
            "name": "Online"
        },
        "position": 1,
        "is_free": true,
        "counts_for_average": true,
        "status": "published",
        "content": "<p>Conteúdo da aula.</p>",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.

Pessoas

Alunos, professores, turmas e matriculas.

GET /api/v1/users #

Lista alunos e professores

Exige users.read. CPF, telefone e endereco so com special.personal_data. Papeis administrativos nao aparecem.

Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/users" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "name": "Maria Souza",
            "email": "aluno@exemplo.com",
            "role": "student",
            "status": "active",
            "cpf": "12345678909",
            "phone": "11999990000",
            "address": {
                "zip_code": "01310100",
                "street": "Av. Paulista",
                "number": "1000",
                "complement": "Sala 12",
                "neighborhood": "Bela Vista",
                "city": "São Paulo",
                "state": "SP"
            },
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/users?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/users?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/users?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/users #

Cadastra aluno ou professor

Exige Usuarios: Escrita (users.write) e o cabecalho Idempotency-Key (obrigatorio aqui).

O papel (student ou teacher) e fixo na criacao. A API nao recebe senha: o usuario recebe por e-mail o link para definir a dele (send_invite, padrao true). O resultado do envio vem em meta.invite; o cadastro vale mesmo se o e-mail falhar.

cpf e address exigem a permissao Dados pessoais (special.personal_data) — sem ela, 403. E-mail ja usado (inclusive por usuario excluido): 422.

Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
nameobrigatório string Mín. 5 caracteres, máx. 50 caracteres.
emailobrigatório string (email) Unico, inclusive entre usuarios excluidos. Nao muda depois.
roleobrigatório string Fixo na criacao. Valores: student, teacher.
send_invite boolean Envia o link de definir senha. Padrão true.
cpf string ou null CPF ou CNPJ, com ou sem pontuacao; gravado so com os digitos. So com special.personal_data. Obrigatorio se a escola exigir.
address object So com special.personal_data. Envie so os campos a gravar.
address.zip_code string ou null Máx. 20 caracteres.
address.street string ou null Máx. 80 caracteres.
address.number string ou null Máx. 10 caracteres.
address.complement string ou null Máx. 80 caracteres.
address.neighborhood string ou null Máx. 80 caracteres.
address.city string ou null Máx. 80 caracteres.
address.state string ou null Máx. 80 caracteres.
address.phone string ou null So digitos, com DDD. Máx. 11 caracteres.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/users" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Maria Souza",
    "email": "aluno@exemplo.com",
    "role": "student",
    "send_invite": true
}'
Respostas
201 Usuario cadastrado.
Resposta 201
{
    "data": {
        "id": 1,
        "name": "Maria Souza",
        "email": "aluno@exemplo.com",
        "role": "student",
        "status": "active",
        "cpf": "12345678909",
        "phone": "11999990000",
        "address": {
            "zip_code": "01310100",
            "street": "Av. Paulista",
            "number": "1000",
            "complement": "Sala 12",
            "neighborhood": "Bela Vista",
            "city": "São Paulo",
            "state": "SP"
        },
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    },
    "meta": {
        "invite": {
            "sent": true,
            "reason": "not_requested"
        }
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
409 A Idempotency-Key ja foi usada com um pedido diferente, ou uma chamada com a mesma chave esta em andamento. Gere uma chave nova para cada operacao.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/users/{user} #

Um aluno ou professor

Exige a permissao users.read.

Caminho
NomeTipoDescrição
userobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/users/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Maria Souza",
        "email": "aluno@exemplo.com",
        "role": "student",
        "status": "active",
        "cpf": "12345678909",
        "phone": "11999990000",
        "address": {
            "zip_code": "01310100",
            "street": "Av. Paulista",
            "number": "1000",
            "complement": "Sala 12",
            "neighborhood": "Bela Vista",
            "city": "São Paulo",
            "state": "SP"
        },
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
PATCH /api/v1/users/{user} #

Altera aluno ou professor

Exige Usuarios: Escrita (users.write). Altera name, cpf e address (estes dois com Dados pessoais).

email, role, status e password sao recusados com 422, com o motivo: o e-mail nao muda pela API, o papel e fixo, a situacao muda pelas acoes activate/deactivate.

Caminho
NomeTipoDescrição
userobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)

email, role, status e password sao recusados com 422.

CampoTipoDescrição
name string Mín. 5 caracteres, máx. 50 caracteres.
cpf string ou null CPF ou CNPJ, com ou sem pontuacao; gravado so com os digitos. null ou vazio remove. So com special.personal_data.
address object So com special.personal_data. Envie so os campos a gravar.
address.zip_code string ou null Máx. 20 caracteres.
address.street string ou null Máx. 80 caracteres.
address.number string ou null Máx. 10 caracteres.
address.complement string ou null Máx. 80 caracteres.
address.neighborhood string ou null Máx. 80 caracteres.
address.city string ou null Máx. 80 caracteres.
address.state string ou null Máx. 80 caracteres.
address.phone string ou null So digitos, com DDD. Máx. 11 caracteres.
Exemplo
curl
curl -X PATCH "https://minhaescola.lmsestudio.com/api/v1/users/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Maria Souza"
}'
Respostas
200 Usuario alterado.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Maria Souza",
        "email": "aluno@exemplo.com",
        "role": "student",
        "status": "active",
        "cpf": "12345678909",
        "phone": "11999990000",
        "address": {
            "zip_code": "01310100",
            "street": "Av. Paulista",
            "number": "1000",
            "complement": "Sala 12",
            "neighborhood": "Bela Vista",
            "city": "São Paulo",
            "state": "SP"
        },
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
DELETE /api/v1/users/{user} #

Exclui aluno ou professor

Exige Usuarios: Exclusao (users.delete), que pede lista de IPs no token.

Exclusao logica. Recusada com 409 (reason: has_enrollments) se houver matricula — desative o usuario para bloquear o acesso.

Caminho
NomeTipoDescrição
userobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X DELETE "https://minhaescola.lmsestudio.com/api/v1/users/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
204 Excluido.
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/groups #

Lista as turmas

Exige a permissao classes.read.

Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/groups" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "name": "Turma Noite 2026",
            "slug": "meu-curso",
            "code": "ABC123",
            "status": "published",
            "members_count": 1,
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/groups?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/groups?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/groups?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/groups #

Cria turma

Exige Turmas: Escrita (classes.write). Nome e codigo unicos. Nasce draft, salvo status: published. Turma nao da acesso a curso.

Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)

Na criacao, name e obrigatorio.

CampoTipoDescrição
name string Mín. 2 caracteres, máx. 255 caracteres.
code string ou null Máx. 100 caracteres.
status string Valores: published, draft.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/groups" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Turma Noite 2026",
    "code": "ABC123",
    "status": "published"
}'
Respostas
201 Turma criada.
Resposta 201
{
    "data": {
        "id": 1,
        "name": "Turma Noite 2026",
        "slug": "meu-curso",
        "code": "ABC123",
        "status": "published",
        "members_count": 1,
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/groups/{group} #

Uma turma

Exige a permissao classes.read.

Caminho
NomeTipoDescrição
groupobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/groups/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Turma Noite 2026",
        "slug": "meu-curso",
        "code": "ABC123",
        "status": "published",
        "members_count": 1,
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
PATCH /api/v1/groups/{group} #

Altera turma

Exige Turmas: Escrita (classes.write). Envie so os campos a mudar.

Caminho
NomeTipoDescrição
groupobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)

Na criacao, name e obrigatorio.

CampoTipoDescrição
name string Mín. 2 caracteres, máx. 255 caracteres.
code string ou null Máx. 100 caracteres.
status string Valores: published, draft.
Exemplo
curl
curl -X PATCH "https://minhaescola.lmsestudio.com/api/v1/groups/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Turma Noite 2026",
    "code": "ABC123",
    "status": "published"
}'
Respostas
200 Turma alterada.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Turma Noite 2026",
        "slug": "meu-curso",
        "code": "ABC123",
        "status": "published",
        "members_count": 1,
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
DELETE /api/v1/groups/{group} #

Exclui turma

Exige Turmas: Exclusao (classes.delete), que pede lista de IPs no token. Exclusao logica; os vinculos de membro ficam guardados.

Caminho
NomeTipoDescrição
groupobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X DELETE "https://minhaescola.lmsestudio.com/api/v1/groups/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
204 Excluida.
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/groups/{group}/members #

Membros de uma turma

Exige a permissao classes.read.

Caminho
NomeTipoDescrição
groupobrigatório integer
Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/groups/123/members" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "name": "Turma Noite 2026",
            "email": "aluno@exemplo.com",
            "role": "student",
            "status": "active",
            "cpf": "12345678909",
            "phone": "11999990000",
            "address": {
                "zip_code": "01310100",
                "street": "Av. Paulista",
                "number": "1000",
                "complement": "Sala 12",
                "neighborhood": "Bela Vista",
                "city": "São Paulo",
                "state": "SP"
            },
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/groups?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/groups?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/groups?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/groups/{group}/members #

Inclui membros na turma

Exige Turmas: Escrita (classes.write). Ate 100 ids por chamada. Quem ja e membro nao e duplicado. Id que nao e aluno ou professor visivel volta em skipped com reason: not_found.

Caminho
NomeTipoDescrição
groupobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
user_idsobrigatório array de integer Até 100 itens.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/groups/123/members" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "user_ids": [
        1
    ]
}'
Respostas
200 Resultado da inclusao.
Resposta 200
{
    "data": {
        "added": 1,
        "already_members": 1,
        "skipped": [
            {
                "user_id": 1,
                "reason": "not_found"
            }
        ]
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/enrollments #

Lista as matriculas

Exige a permissao enrollments.read.

Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
user_id integer
course_id integer
status string
source string
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/enrollments" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "course_id": 1,
            "status": "active",
            "source": "api",
            "starts_at": "2026-11-10T14:30:00-03:00",
            "ends_at": "2026-11-10T14:30:00-03:00",
            "is_free": true,
            "completed": true,
            "completed_at": "2026-11-10T14:30:00-03:00",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/enrollments?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/enrollments?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/enrollments?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/enrollments #

Concede acesso a um curso (sem cobranca)

Exige Matriculas: Escrita (enrollments.write). Idempotency-Key obrigatoria.

Matricula administrativa, sem cobranca: nao gera venda, nao soma receita. Informe access_days (a partir de hoje) ou access_until (ultimo dia, incluido). O acesso termina as 23:59:59 do ultimo dia, no fuso da escola. O curso precisa ter um plano configurado no painel.

Se o aluno ja teve acesso a este curso (expirado, cancelado), a mesma matricula e renovada (meta.outcome: renewed) e o progresso dele e mantido.

Recusas com 409 e reason: already_active (o aluno ja tem acesso; nada muda), pending_order (ha pedido do curso aguardando pagamento), missing_plan, concurrent_request (tente de novo com a mesma chave). Limite de alunos do plano: 422 plan-limit-reached.

notify (padrao true) envia ao aluno o aviso padrao de matricula.

Cabeçalhos
NomeTipoDescrição
Idempotency-Keyobrigatório string Obrigatoria. Ver o parametro idempotencyKey.
Corpo (JSON)

Informe access_days ou access_until — exatamente um.

CampoTipoDescrição
user_idobrigatório integer Usuario com papel de aluno.
course_idobrigatório integer
access_days integer Dias de acesso a partir de hoje. Mínimo 1, máximo 3650.
access_until string (date) Ultimo dia de acesso, incluido. Hoje ou depois, ate 3650 dias.
notify boolean Padrão true.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/enrollments" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "user_id": 1,
    "course_id": 1,
    "access_days": 1,
    "access_until": "2026-11-10",
    "notify": true
}'
Respostas
201 Acesso concedido.
Resposta 201
{
    "data": {
        "id": 1,
        "user_id": 1,
        "course_id": 1,
        "status": "active",
        "source": "api",
        "starts_at": "2026-11-10T14:30:00-03:00",
        "ends_at": "2026-11-10T14:30:00-03:00",
        "is_free": true,
        "completed": true,
        "completed_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    },
    "meta": {
        "outcome": "created",
        "notified": true
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/enrollments/bulk #

Concede acesso em lote (ate 100)

Exige Matriculas: Escrita (enrollments.write). Idempotency-Key obrigatoria.

Formato invalido recusa a chamada inteira (422, apontando o item). Recusa de negocio de um item nao para os demais: ele sai em skipped com o motivo — user_not_found, course_not_found, already_active, pending_order, missing_plan, plan_limit_reached, failed.

notify e false por padrao: o aviso e enviado na hora, e cem avisos seguidos podem estourar o tempo da chamada.

Cabeçalhos
NomeTipoDescrição
Idempotency-Keyobrigatório string Obrigatoria. Ver o parametro idempotencyKey.
Corpo (JSON)
CampoTipoDescrição
itemsobrigatório array de object Até 100 itens.
items[].user_idobrigatório integer
items[].course_idobrigatório integer
items[].access_days integer Mínimo 1, máximo 3650.
items[].access_until string (date)
notify boolean Padrão false.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/enrollments/bulk" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "items": [
        {
            "user_id": 1,
            "course_id": 1,
            "access_days": 1,
            "access_until": "2026-11-10"
        }
    ],
    "notify": false
}'
Respostas
200 Resultado por item.
Resposta 200
{
    "data": {
        "created": 1,
        "renewed": 1,
        "results": [
            {
                "index": 1,
                "user_id": 1,
                "course_id": 1,
                "enrollment_id": 1,
                "outcome": "created",
                "notified": true
            }
        ],
        "skipped": [
            {
                "index": 1,
                "user_id": 1,
                "course_id": 1,
                "reason": "user_not_found"
            }
        ]
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/enrollments/{enrollment} #

Uma matricula

Exige a permissao enrollments.read.

Caminho
NomeTipoDescrição
enrollmentobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/enrollments/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "user_id": 1,
        "course_id": 1,
        "status": "active",
        "source": "api",
        "starts_at": "2026-11-10T14:30:00-03:00",
        "ends_at": "2026-11-10T14:30:00-03:00",
        "is_free": true,
        "completed": true,
        "completed_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
PATCH /api/v1/enrollments/{enrollment} #

Altera o fim do acesso

Exige Matriculas: Escrita (enrollments.write). So o fim do acesso, e so de matricula concedida pela API (source: api); as demais respondem 409 reason: not_api_enrollment. Matricula expirada volta a valer com uma data futura. Revogada: 409 reason: revoked.

Caminho
NomeTipoDescrição
enrollmentobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Corpo (JSON)
CampoTipoDescrição
access_untilobrigatório string (date) Novo ultimo dia de acesso, incluido.
Exemplo
curl
curl -X PATCH "https://minhaescola.lmsestudio.com/api/v1/enrollments/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "access_until": "2026-11-10"
}'
Respostas
200 Matricula alterada.
Resposta 200
{
    "data": {
        "id": 1,
        "user_id": 1,
        "course_id": 1,
        "status": "active",
        "source": "api",
        "starts_at": "2026-11-10T14:30:00-03:00",
        "ends_at": "2026-11-10T14:30:00-03:00",
        "is_free": true,
        "completed": true,
        "completed_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/enrollments/{enrollment}/revoke #

Revoga acesso concedido pela API

Exige Matriculas: Exclusao (enrollments.delete). Sem corpo.

Cancela so o que a API concedeu (source: api); acesso por compra, curso gratuito ou matricula do painel nunca e revogado pela API (409 reason: not_api_enrollment). Depois de revogar, o acesso e recalculado pelos outros pedidos do aluno no curso: se ele tem uma compra paga e valida, a matricula continua active, agora com source: purchase. Repetir: 409 reason: already_revoked.

Caminho
NomeTipoDescrição
enrollmentobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/enrollments/123/revoke" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 A matricula como ficou.
Resposta 200
{
    "data": {
        "id": 1,
        "user_id": 1,
        "course_id": 1,
        "status": "active",
        "source": "api",
        "starts_at": "2026-11-10T14:30:00-03:00",
        "ends_at": "2026-11-10T14:30:00-03:00",
        "is_free": true,
        "completed": true,
        "completed_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/users/{user}/deactivate #

Desativa aluno ou professor

Exige Usuarios: Escrita (users.write). Sem corpo. O usuario deixa de conseguir entrar. Ja inativo: 200, sem mudanca.

Caminho
NomeTipoDescrição
userobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/users/123/deactivate" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Usuario alterado.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Maria Souza",
        "email": "aluno@exemplo.com",
        "role": "student",
        "status": "active",
        "cpf": "12345678909",
        "phone": "11999990000",
        "address": {
            "zip_code": "01310100",
            "street": "Av. Paulista",
            "number": "1000",
            "complement": "Sala 12",
            "neighborhood": "Bela Vista",
            "city": "São Paulo",
            "state": "SP"
        },
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/users/{user}/activate #

Ativa aluno ou professor

Exige Usuarios: Escrita (users.write). Sem corpo. Ja ativo: 200, sem mudanca.

Caminho
NomeTipoDescrição
userobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/users/123/activate" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Usuario alterado.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Maria Souza",
        "email": "aluno@exemplo.com",
        "role": "student",
        "status": "active",
        "cpf": "12345678909",
        "phone": "11999990000",
        "address": {
            "zip_code": "01310100",
            "street": "Av. Paulista",
            "number": "1000",
            "complement": "Sala 12",
            "neighborhood": "Bela Vista",
            "city": "São Paulo",
            "state": "SP"
        },
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/users/{user}/send-password-reset #

Envia o link de definir senha

Exige Usuarios: Escrita (users.write). Sem corpo.

Envia ao proprio usuario o link padrao de "esqueci minha senha". A API nunca ve nem define a senha. Usuario inativo ou pedido repetido em menos de um minuto: 409 (reason: user_inactive / recently_sent). Falha do servidor de e-mail: 502, com error_ref.

Caminho
NomeTipoDescrição
userobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/users/123/send-password-reset" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
202 Link enviado.
Resposta 202
{
    "data": {
        "sent": true
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
POST /api/v1/users/{user}/restore #

Restaura aluno ou professor excluido

Exige Usuarios: Exclusao (users.delete). Sem corpo. 404 se o usuario nao estiver excluido.

Caminho
NomeTipoDescrição
userobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X POST "https://minhaescola.lmsestudio.com/api/v1/users/123/restore" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
200 Usuario restaurado.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Maria Souza",
        "email": "aluno@exemplo.com",
        "role": "student",
        "status": "active",
        "cpf": "12345678909",
        "phone": "11999990000",
        "address": {
            "zip_code": "01310100",
            "street": "Av. Paulista",
            "number": "1000",
            "complement": "Sala 12",
            "neighborhood": "Bela Vista",
            "city": "São Paulo",
            "state": "SP"
        },
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
409 O pedido esta bem formado, mas uma regra da escola impede a operacao no estado atual do recurso. O reason diz qual — trate por ele, nao pelo texto.
415 O corpo nao e JSON. Envie Content-Type application/json.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
DELETE /api/v1/groups/{group}/members/{user} #

Tira membro da turma

Exige Turmas: Escrita (classes.write). 404 se o usuario nao for membro.

Caminho
NomeTipoDescrição
groupobrigatório integer
userobrigatório integer
Cabeçalhos
NomeTipoDescrição
Idempotency-Key string Chave de 8 a 128 caracteres (letras, numeros, hifen e sublinhado; um UUID serve) que identifica a operacao. Repetir a chamada com a mesma chave devolve a resposta guardada, sem executar de novo — e o que evita duplicata quando a resposta se perde num timeout. Use uma chave nova para cada operacao: a mesma chave com um pedido diferente recebe 409.
Exemplo
curl
curl -X DELETE "https://minhaescola.lmsestudio.com/api/v1/groups/123/members/123" \
  -H "Authorization: Bearer $LMS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Respostas
204 Removido.
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.

Financeiro

Pedidos, assinaturas e relatorios. Somente consulta — a API nao vende, nao cobra e nao estorna.

GET /api/v1/orders #

Lista os pedidos de curso

Exige Vendas (sales.read). Somente consulta. Codigo de transacao do gateway, boleto e dados de cartao nunca saem.

Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
user_id integer
course_id integer
status string
gateway string
created_from string (date-time) Criados a partir deste instante (ISO 8601 com fuso).
created_to string (date-time) Criados antes deste instante (exclusivo; ISO 8601 com fuso).
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/orders" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "course_id": 1,
            "gateway": "api",
            "payment_method": "credit_card",
            "status": "pending",
            "installments": 1,
            "amounts": {
                "gross": "149.90",
                "discount": "149.90",
                "fee": "149.90",
                "extra": "149.90",
                "shipping": "149.90",
                "installment_interest": "149.90",
                "net": "149.90"
            },
            "coupon": {
                "code": "ABC123",
                "title": "Boas-vindas ao curso",
                "discount": "149.90"
            },
            "access_starts_at": "2026-11-10T14:30:00-03:00",
            "access_ends_at": "2026-11-10T14:30:00-03:00",
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/orders?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/orders?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/orders?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/orders/{order} #

Um pedido

Exige a permissao sales.read.

Caminho
NomeTipoDescrição
orderobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/orders/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "user_id": 1,
        "course_id": 1,
        "gateway": "api",
        "payment_method": "credit_card",
        "status": "pending",
        "installments": 1,
        "amounts": {
            "gross": "149.90",
            "discount": "149.90",
            "fee": "149.90",
            "extra": "149.90",
            "shipping": "149.90",
            "installment_interest": "149.90",
            "net": "149.90"
        },
        "coupon": {
            "code": "ABC123",
            "title": "Boas-vindas ao curso",
            "discount": "149.90"
        },
        "access_starts_at": "2026-11-10T14:30:00-03:00",
        "access_ends_at": "2026-11-10T14:30:00-03:00",
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/subscriptions #

Lista as assinaturas de alunos

Exige a permissao subscriptions.read. As cobrancas saem so no detalhe.

Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
user_id integer
plan_id integer
status string
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/subscriptions" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "plan": {
                "id": 1,
                "title": "Boas-vindas ao curso"
            },
            "period_days": 1,
            "gateway": "Texto de exemplo",
            "payment_method": "credit_card",
            "status": "active",
            "amounts": {
                "gross": "149.90",
                "discount": "149.90",
                "fee": "149.90",
                "extra": "149.90",
                "net": "149.90"
            },
            "charges": [
                {
                    "id": 1,
                    "number": 1,
                    "status": "scheduled",
                    "payment_method": "Texto de exemplo",
                    "due_date": "2026-11-10",
                    "paid_date": "2026-11-10",
                    "attempts": 1,
                    "amounts": {
                        "gross": "149.90",
                        "discount": "149.90",
                        "fee": "149.90",
                        "extra": "149.90",
                        "net": "149.90"
                    },
                    "created_at": "2026-11-10T14:30:00-03:00",
                    "updated_at": "2026-11-10T14:30:00-03:00"
                }
            ],
            "created_at": "2026-11-10T14:30:00-03:00",
            "updated_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/subscriptions?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/subscriptions?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/subscriptions?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/subscriptions/{subscription} #

Uma assinatura, com as cobrancas

Exige a permissao subscriptions.read. Ate 120 cobrancas, das mais recentes.

Caminho
NomeTipoDescrição
subscriptionobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/subscriptions/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "user_id": 1,
        "plan": {
            "id": 1,
            "title": "Boas-vindas ao curso"
        },
        "period_days": 1,
        "gateway": "Texto de exemplo",
        "payment_method": "credit_card",
        "status": "active",
        "amounts": {
            "gross": "149.90",
            "discount": "149.90",
            "fee": "149.90",
            "extra": "149.90",
            "net": "149.90"
        },
        "charges": [
            {
                "id": 1,
                "number": 1,
                "status": "scheduled",
                "payment_method": "Texto de exemplo",
                "due_date": "2026-11-10",
                "paid_date": "2026-11-10",
                "attempts": 1,
                "amounts": {
                    "gross": "149.90",
                    "discount": "149.90",
                    "fee": "149.90",
                    "extra": "149.90",
                    "net": "149.90"
                },
                "created_at": "2026-11-10T14:30:00-03:00",
                "updated_at": "2026-11-10T14:30:00-03:00"
            }
        ],
        "created_at": "2026-11-10T14:30:00-03:00",
        "updated_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/reports/{report} #

Relatorio agregado

Exige Relatorios (reports.read). Lista fechada:

  • sales: pedidos criados no periodo, por status; pagos (status pago, disponivel ou expirado, como o relatorio do painel) com totais, por gateway e por curso;
  • enrollments: por curso, matriculas novas e concluidas no periodo, e a situacao atual (ativas, expiradas, inativas);
  • certificates: certificados emitidos no periodo, por curso.

from e to obrigatorios (AAAA-MM-DD, os dois incluidos, fuso da escola), com ate 366 dias. Nenhum relatorio traz dado de aluno.

Caminho
NomeTipoDescrição
reportobrigatório string
Filtros (query)
NomeTipoDescrição
fromobrigatório string (date)
toobrigatório string (date)
course_id integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/reports/sales" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O relatorio.
Resposta 200
{
    "data": {
        "report": "sales",
        "from": "2026-11-10",
        "to": "2026-11-10",
        "course_id": 1,
        "totals": {},
        "by_gateway": [
            {}
        ],
        "by_course": [
            {}
        ]
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
422 Campo obrigatorio ausente, valor invalido ou campo desconhecido. A API recusa campo que nao conhece em vez de ignorar, para que um nome errado nao passe por alteracao bem-sucedida.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.

Desempenho

Progresso, certificados e emblemas.

GET /api/v1/users/{user}/progress #

Progresso de um aluno

Exige performance.read. lessons_completed so aparece se a escola registrar conclusao por aula. Paginado.

Caminho
NomeTipoDescrição
userobrigatório integer
Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/users/123/progress" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "user_id": 1,
            "course_id": 1,
            "lessons_total": 1,
            "lessons_completed": 1,
            "completed": true,
            "completed_at": "2026-11-10T14:30:00-03:00",
            "enrolled_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/users?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/users?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/users?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/courses/{course}/progress #

Progresso dos alunos de um curso

Exige a permissao performance.read.

Caminho
NomeTipoDescrição
courseobrigatório integer
Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/courses/123/progress" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "user_id": 1,
            "course_id": 1,
            "lessons_total": 1,
            "lessons_completed": 1,
            "completed": true,
            "completed_at": "2026-11-10T14:30:00-03:00",
            "enrolled_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "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"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/certificates #

Certificados emitidos

Exige a permissao certificates.read.

Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/certificates" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "course_id": 1,
            "issued_at": "2026-11-10T14:30:00-03:00",
            "validation_code": "Texto de exemplo",
            "created_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/certificates?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/certificates?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/certificates?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/certificates/{certificate} #

Um certificado

Exige a permissao certificates.read.

Caminho
NomeTipoDescrição
certificateobrigatório integer
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/certificates/123" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "user_id": 1,
        "course_id": 1,
        "issued_at": "2026-11-10T14:30:00-03:00",
        "validation_code": "Texto de exemplo",
        "created_at": "2026-11-10T14:30:00-03:00"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/users/{user}/badges #

Emblemas de um aluno

Exige a permissao gamification.read.

Caminho
NomeTipoDescrição
userobrigatório integer
Filtros (query)
NomeTipoDescrição
page integer Pagina, a partir de 1.
per_page integer Itens por pagina.
updated_since string (date-time) So os registros alterados a partir desta data (ISO 8601). E o meio de sincronizacao incremental: nao ha webhooks.
Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/users/123/badges" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 Lista paginada.
Resposta 200
{
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "course_id": 1,
            "badge_id": 1,
            "name": "Primeiro curso concluído",
            "value": 1,
            "acquired_at": "2026-11-10T14:30:00-03:00"
        }
    ],
    "meta": {
        "page": 1,
        "per_page": 25,
        "total": 42
    },
    "links": {
        "first": "https://minhaescola.lmsestudio.com/api/v1/badges?page=1",
        "last": "https://minhaescola.lmsestudio.com/api/v1/badges?page=2",
        "prev": null,
        "next": "https://minhaescola.lmsestudio.com/api/v1/badges?page=2"
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
403 O token e valido, mas nao tem a permissao que o endereco exige. O detail diz qual permissao falta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.

Tabelas de apoio

Listas de valores para interpretar as outras respostas. Qualquer token valido.

GET /api/v1/reference/lesson-types #

Tipos de aula

Atende qualquer token valido.

Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/reference/lesson-types" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Texto",
        "is_separator": true
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/reference/course-levels #

Niveis de curso

Atende qualquer token valido.

Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/reference/course-levels" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Iniciante",
        "is_separator": true
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.
GET /api/v1/reference/course-types #

Tipos de curso

Atende qualquer token valido.

Exemplo
curl
curl "https://minhaescola.lmsestudio.com/api/v1/reference/course-types" \
  -H "Authorization: Bearer $LMS_TOKEN"
Respostas
200 O registro.
Resposta 200
{
    "data": {
        "id": 1,
        "name": "Online",
        "is_separator": true
    }
}
401 Token ausente, invalido, expirado, revogado, suspenso ou vindo de um IP fora da lista permitida. A resposta e a mesma em todos esses casos, de proposito: distinguir "nao existe" de "expirado" ajudaria quem esta tentando adivinhar. O motivo real fica na auditoria da escola, que o administrador consulta.
404 O recurso nao existe, nao pertence a esta escola, ou a API nao esta liberada para a escola. Os casos sao indistinguiveis de proposito: um 403 confirmaria que o recurso existe.
429 Limite de requisicoes alcancado. Espere o tempo de Retry-After.

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