API — Simulados externos (admin-ext)
Contexto
| Item |
Valor |
| Prefixo global da API |
/api |
| Prefixo do grupo |
/admin-ext/simulados |
| Base completa |
/api/admin-ext/simulados |
| Autenticação |
Header Authorization: Bearer {token} (ou cookie de sessão, se o cliente estiver configurado assim); perfil institucional com instituição vinculada. |
Respostas não listadas explicitamente como erro costumam ser JSON com código HTTP correspondente. Erros de validação costumam retornar 422 com corpo JSON (o formato pode variar por rota; ver exemplos em cada seção).
1. Resumo por status
| Campo |
Valor |
| Método |
GET |
| Path |
/api/admin-ext/simulados/resume |
Entrada
Nenhum parâmetro.
Saída (200)
Objeto com totais de simulados externos agrupados por status lógico:
{
"total": 0,
"by_status": {
"agendados": 0,
"ativos": 0,
"encerrado": 0,
"rascunho": 0
}
}
2. Listar simulados (paginado)
| Campo |
Valor |
| Método |
GET |
| Path |
/api/admin-ext/simulados |
Entrada (query string)
| Parâmetro |
Tipo |
Padrão |
Observação |
page |
int |
1 |
|
limit |
int |
10 |
|
sort |
string |
start_date |
Ordenação: name, start_date, end_date ou created_at; outros valores equivalem a start_date. |
direction |
string |
asc |
desc ou outro valor (tratado como asc quando não for desc). |
status |
string |
— |
Filtro: agendado, agendados, ativo, ativos, encerrado, rascunho. |
search |
string |
— |
Busca por nome (correspondência parcial). |
Saída (200)
{
"total": 0,
"data": [
{
"id": "1",
"name": "",
"duration": 0,
"start_date": null,
"end_date": null,
"questions_count": 0,
"status": "agendado"
}
]
}
Valores possíveis de status na listagem: agendado, ativo, encerrado, Rascunho (a capitalização pode variar conforme o retorno da API).
3. Detalhe de um simulado
| Campo |
Valor |
| Método |
GET |
| Path |
/api/admin-ext/simulados/{id} |
Entrada
- Path:
id — identificador do simulado (inteiro).
Saída (200)
{
"id": "1",
"name": "",
"description": null,
"duration_minutes": 0,
"start_date": null,
"end_date": null,
"questions_count": 0,
"status": "Rascunho",
"created_at": "2026-01-01T00:00:00+00:00",
"updated_at": "2026-01-01T00:00:00+00:00"
}
status na resposta: Rascunho, Agendado, Ativo, Encerrado.
Erros
- 404 — simulado não encontrado.
4. Criar simulado
| Campo |
Valor |
| Método |
POST |
| Path |
/api/admin-ext/simulados |
Regras de validação (body JSON)
| Campo |
Regras |
name |
obrigatório, string, máx. 255, único entre simulados externos |
description |
opcional, string, nullable |
duration_minutes |
obrigatório, inteiro, mínimo 1 |
start_date |
obrigatório, data válida |
end_date |
obrigatório, data válida, maior ou igual a start_date |
Saída (201)
{
"id": "1",
"status": "created"
}
Erros adicionais (422)
- Corpo pode ser
{ "error": "Já existe um simulado com este nome" } para conflito de nome.
- Ou
{ "success": false, "message": "Falha na validação", "data": { ... } } para outros erros de validação.
{ "error": "Usuário institucional sem produto vinculado" } quando a conta institucional não possui produto associado.
5. Atualizar simulado
| Campo |
Valor |
| Método |
PUT |
| Path |
/api/admin-ext/simulados/{id} |
Entrada
- Path:
id
- Body JSON — todos os campos abaixo são opcionais; apenas os enviados são atualizados:
| Campo |
Regras |
name |
string, máx. 255, único entre externos ignorando o próprio id |
description |
nullable, string |
duration_minutes |
inteiro, mínimo 1 |
start_date |
data |
end_date |
data, deve ser maior ou igual a start_date |
Saída (200)
{
"status": "updated"
}
Erros (422)
- Nome duplicado:
{ "error": "Já existe um simulado com este nome" }.
- Alteração de
start_date quando o simulado já iniciou: { "error": "Não é permitido alterar a data de início de um simulado já iniciado" }.
Erros (404)
6. Excluir simulado
| Campo |
Valor |
| Método |
DELETE |
| Path |
/api/admin-ext/simulados/{id} |
Saída (200)
{
"status": "deleted"
}
Erros (404)
| Campo |
Valor |
| Método |
GET |
| Path |
/api/admin-ext/simulados/{id}/questions |
Consistência do simulated_id
Se simulated_id for enviado na query e for diferente do {id} do path, a API responde 422 com mensagem: O parâmetro simulated_id deve ser igual ao id do simulado na URL.
Parâmetros de query permitidos
Somente as chaves abaixo são aceitas; outras geram erro de validação (“Parâmetro não permitido.”).
| Parâmetro |
Regras |
name |
nullable, string, máx. 65535 |
page |
nullable, inteiro ≥ 1 |
limit |
nullable, inteiro entre 1 e 100 |
simulated_id |
nullable, inteiro ≥ 1 |
included |
nullable, boolean |
uf |
nullable, string, tamanho 2 |
specificallies |
nullable, array de inteiros ≥ 1 |
tests |
nullable, array de inteiros ≥ 1 |
type |
nullable, objetiva ou discursiva |
commented |
nullable, boolean |
themes, areas, specialties, years, institutions |
nullable, arrays de inteiros ≥ 1 |
Saída (200)
{
"simulated_id": "1",
"total": 0,
"data": [
{
"id": "1",
"statement": "",
"type": "objetiva",
"themes": [],
"areas": [],
"specialties": [],
"specifically": null,
"status": "ativa",
"order": 1,
"exam": null,
"commented": false,
"alternatives": [],
"correct": null,
"created_at": "2026-01-01T00:00:00+00:00"
}
]
}
status da questão pode ser, entre outros: ativa, inativa, anulada, desatualizada.
Erros (404)
Erros (422)
- Validação:
{ "success": false, "message": "Erro de validação", "errors": { ... } }.
8. Adicionar questões ao simulado
| Campo |
Valor |
| Método |
POST |
| Path |
/api/admin-ext/simulados/{id}/questions |
Regras de validação (body JSON)
| Campo |
Regras |
questions |
obrigatório, array com pelo menos 1 item |
questions.* |
inteiro, distintos entre si, cada um deve ser o ID de uma questão existente |
Saída (200)
{
"added": 0
}
added é a quantidade de questões inseridas.
Erros (422)
- Validação:
{ "success": false, "message": "Erro de validação", "errors": { ... } }.
- Questão já vinculada:
{ "error": "Questão já adicionada ao simulado" }.
Erros (404)
9. Remover questão do simulado
| Campo |
Valor |
| Método |
DELETE |
| Path |
/api/admin-ext/simulados/{id}/questions/{questionId} |
Saída (200)
{
"status": "removed"
}
Erros (404)
- Simulado não encontrado (ou recurso relacionado indisponível).
10. Detalhe de uma questão no simulado
| Campo |
Valor |
| Método |
GET |
| Path |
/api/admin-ext/simulados/{id}/questions/{questionId} |
Saída (200)
{
"statement": "",
"type": "objetiva",
"alternatives": [],
"correct": null,
"comment": null,
"exam": null
}
Erros (404)
- Questão não pertence ao simulado ou não encontrada.
11. Atualizar ordem da questão no simulado
| Campo |
Valor |
| Método |
PATCH |
| Path |
/api/admin-ext/simulados/{id}/questions/{questionId}/ordem |
Entrada (body)
| Campo |
Observação |
order |
Número inteiro da nova ordem; se ausente ou não numérico, a API pode interpretar como 0. |
Saída (200)
{
"status": "order_updated"
}
Erros (404)
Path resume vs. {id}
O segmento fixo resume no path (GET /api/admin-ext/simulados/resume) não é um identificador numérico de simulado; use sempre esse path completo para o resumo por status.