API — Portal da instituição (/institution)
Contexto
| Item |
Valor |
| Prefixo global da API |
/api |
| Prefixo do grupo |
/institution |
| Base completa |
/api/institution |
Autenticação
- Rotas públicas (sem token):
POST /login, GET /images.
- Demais rotas:
Authorization: Bearer {token} com token obtido no login institucional.
Rotas protegidas (escopo institucional)
Nas rotas que exigem autenticação, o usuário deve estar autenticado, com perfil institucional e com instituição externa vinculada.
| HTTP |
Resposta típica |
| 401 |
{ "message": "Não autenticado." } (sem usuário) |
| 403 |
{ "message": "Acesso restrito a usuários institucionais." } |
| 403 |
{ "message": "Usuário institucional sem instituição vinculada." } |
1. Login institucional
| Campo |
Valor |
| Método |
POST |
| Path |
/api/institution/login |
Regras de validação (body JSON)
| Campo |
Regras |
email |
obrigatório, string, e-mail válido, máx. 255 |
password |
obrigatório, string, entre 6 e 100 caracteres |
Saída (200)
{
"success": true,
"data": {
"token": "...",
"token_type": "Bearer",
"user": {
"id": 1,
"name": "",
"email": "",
"external_institution_id": 1,
"external_institution_name": ""
}
}
}
Erros
- 422 —
{ "success": false, "message": "Falha na validação", "data": { ... } }
- 401 —
{ "success": false, "message": "E-mail ou senha inválidos." } ou mensagem de usuário sem instituição vinculada
2. Listar imagens de instituições externas
| Campo |
Valor |
| Método |
GET |
| Path |
/api/institution/images |
Entrada
Nenhum parâmetro.
Saída (200)
{
"success": true,
"data": [
{
"id": 1,
"name": "",
"image": "https://..."
}
]
}
Retorno: instituições externas que possuem imagem cadastrada, ordenadas por nome.
3. Logout
| Campo |
Valor |
| Método |
POST |
| Path |
/api/institution/logout |
Encerra a sessão revogando os tokens de acesso associados ao usuário institucional.
Saída (200)
{
"message": "Logout realizado com sucesso."
}
4. Perfil do usuário autenticado (me)
| Campo |
Valor |
| Método |
GET |
| Path |
/api/institution/me |
Saída (200)
{
"id": 1,
"name": "",
"email": "",
"external_institution_id": 1,
"external_institution": null
}
external_institution reflete a instituição vinculada ao usuário; pode ser objeto ou null.
5. Turmas (class groups) da instituição
| Campo |
Valor |
| Método |
GET |
| Path |
/api/institution/class-groups |
Retorna apenas turmas ativas da instituição do usuário autenticado.
Saída (200)
{
"success": true,
"data": [
{
"id": 1,
"name": "",
"external_institution_id": 1
}
]
}
6. Métricas gerais
| Campo |
Valor |
| Método |
GET |
| Path |
/api/institution/metrics |
Entrada (query string)
| Parâmetro |
Tipo |
Observação |
turma |
int (opcional) |
ID da turma; restringe métricas aos alunos dessa turma. |
startDate |
string (opcional) |
Início do período. |
endDate |
string (opcional) |
Fim do período. |
Use datas em formato comum YYYY-MM-DD, salvo indicação contrária do ambiente.
Saída (200)
{
"success": true,
"data": {
"total_questions_realized": 0,
"average_correct_percentage": 0,
"average_by_mock_test": [],
"performance_by_great_area": [],
"lessons_watched": {},
"metrics_by_source": [],
"filters": {
"class_group_id": null,
"start_date": null,
"end_date": null
}
}
}
Os arrays e objetos internos agregam simulados, áreas, aulas, fontes de tráfego etc., conforme filtros informados.
7. Resumo institucional
| Campo |
Valor |
| Método |
GET |
| Path |
/api/institution/summary |
Entrada (query string)
Mesmos parâmetros opcionais de Métricas gerais: turma, startDate, endDate.
Saída (200)
{
"success": true,
"data": {
"institution_name": "",
"product": {
"name": "Extensivo ENAMED - São Camilo"
},
"students": {
"enrolled": 0,
"active": 0
},
"metrics": {
"total_questions_realized": 0,
"average_questions_accuracy": 0,
"followed_mock_tests": 0,
"average_lessons_adherence": 0,
"average_watched_time_per_student": 0,
"average_questions_per_student": 0,
"average_mock_tests_per_student": 0
}
}
}
8. Listar alunos
| Campo |
Valor |
| Método |
GET |
| Path |
/api/institution/students |
Entrada (query string)
| Parâmetro |
Tipo |
Padrão / limite |
per_page |
int |
padrão 15, máximo 50 |
page |
int |
mínimo 1 |
name |
string |
filtro por nome (opcional) |
email |
string |
filtro por e-mail (opcional) |
turma |
int |
ID da turma (opcional) |
startDate |
string |
período (opcional) |
endDate |
string |
período (opcional) |
media |
string |
filtro de desempenho (opcional); valores aceitos: above, below, above_50, below_50 |
Valores de media fora dessa lista são ignorados no filtro de desempenho.
Saída (200)
{
"success": true,
"data": [
{
"id": 1,
"name": "",
"email": "",
"registration_number": null,
"class_group_id": 1,
"active": 1,
"created_at": "...",
"class_group": { "id": 1, "name": "" },
"metrics": {
"media_aulas_assistidas": 0,
"media_questoes_corretas": 0,
"media_simulados": 0,
"media_provas": 0,
"media_pre": 0,
"media_pos": 0,
"media_bloco": 0
}
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 15,
"total": 0
},
"summary": {
"total_enrolled": 0,
"total_active": 0
}
}
9. Detalhe do aluno
| Campo |
Valor |
| Método |
GET |
| Path |
/api/institution/students/{id} |
Entrada
- Path:
id — identificador do aluno.
- Query (opcional):
startDate, endDate, mock_test_id (int) — restringe métricas de simulados a um mock test específico quando informado.
Saída (200)
{
"success": true,
"data": {
"student": {
"name": "",
"email": "",
"registration_number": null,
"country": null,
"state": null,
"city": null,
"registered_at": "2026-01-01T00:00:00+00:00"
},
"period": {
"start_date": null,
"end_date": null
},
"metrics": {
"questions_completed": 0,
"mock_tests_completed": 0,
"mock_tests_average_accuracy_percentage": 0,
"mock_tests_in_period": [],
"flashcards_completed": 0,
"schedule_adherence_percentage": 0,
"lessons": {
"request_period": null,
"weekly": {},
"monthly": {}
},
"total_correct_answers": 0,
"average_questions_per_day": 0,
"questions_average_accuracy_percentage": 0,
"performance_by_area": {}
}
}
}
Chaves em performance_by_area podem incluir gynecology_obstetrics, pediatrics, clinical_medicine, surgery, preventive_medicine, conforme a grande área médica.
Erros
- 404 —
{ "success": false, "message": "Aluno não encontrado ou não pertence à sua instituição." }
- 403 — erros de permissão ou regra de negócio podem retornar 403 quando não for 404.