Anos Letivos
Os anos letivos representam o período em que as matrículas são válidas. Cada unidade tem um único ano letivo ativo por vez, mas pode manter um histórico de anos anteriores para referência e relatórios.
:::info
Por que isso importa
Vários outros recursos exigem um schoolYearId para alocar o registro no tempo correto — especialmente matrículas de alunos em turmas (POST /v1/students com classId exige schoolYearId juntos), períodos acadêmicos (bimestres/trimestres/semestres) e configurações de preço por série. Sem um ano letivo ativo, esses fluxos ficam bloqueados.
:::
Endpoints
| Método | Rota | Scope | Descrição |
|---|---|---|---|
| GET | /v1/school-years | schoolYears:read | Listar anos letivos da unidade |
| GET | /v1/school-years/active | schoolYears:read | Obter o ano letivo ativo |
| POST | /v1/school-years | schoolYears:write | Criar ano letivo |
| GET | /v1/school-years/:id | schoolYears:read | Detalhar ano letivo |
| PUT | /v1/school-years/:id | schoolYears:write | Atualizar nome, ano e datas |
| POST | /v1/school-years/:id/activate | schoolYears:write | Definir como ano letivo atual (desativa os demais) |
| POST | /v1/school-years/:id/deactivate | schoolYears:write | Desativar (mantém o registro) |
GET /v1/school-years
Lista os anos letivos da unidade.
Parâmetros (query)
| Param | Tipo | Default | Descrição |
|---|---|---|---|
search | string | — | Busca por nome (case-insensitive). |
isActive | true | false | — | Filtra por status. |
page | number | 1 | |
limit | number | 20 | Max 100. |
sortBy | name | year | startDate | endDate | createdAt | year | |
sortOrder | asc | desc | desc |
Exemplo
curl "https://api.gdredu.com/v1/school-years?isActive=true&sortBy=year" \
-H "Authorization: Bearer gdredu_live_..." \
-H "x-branch-id: 770e8400-e29b-41d4-a716-446655440000"Resposta (200)
{
"data": [
{
"id": "aa0e8400-e29b-41d4-a716-446655440000",
"name": "Ano letivo 2026",
"year": 2026,
"startDate": "2026-01-15T12:00:00.000Z",
"endDate": "2026-12-20T12:00:00.000Z",
"isActive": true,
"branchId": "770e8400-e29b-41d4-a716-446655440000",
"createdAt": "2025-11-01T10:00:00.000Z",
"updatedAt": "2026-01-10T08:00:00.000Z",
"_count": {
"studentClasses": 450,
"academicPeriods": 12
}
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 3,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}GET /v1/school-years/active
Retorna o ano letivo atualmente ativo da unidade. Útil para integrações que precisam saber em qual ano estão operando.
Resposta (200)
{
"active": {
"id": "aa0e8400-e29b-41d4-a716-446655440000",
"name": "Ano letivo 2026",
"year": 2026,
"startDate": "2026-01-15T12:00:00.000Z",
"endDate": "2026-12-20T12:00:00.000Z",
"isActive": true,
"branchId": "770e8400-e29b-41d4-a716-446655440000",
"createdAt": "2025-11-01T10:00:00.000Z",
"updatedAt": "2026-01-10T08:00:00.000Z",
"_count": { "studentClasses": 450, "academicPeriods": 12 }
}
}Se nenhum ano estiver ativo, retorna { "active": null }.
POST /v1/school-years
Cria um novo ano letivo.
Body
{
"name": "Ano letivo 2026",
"year": 2026,
"startDate": "2026-01-15",
"endDate": "2026-12-20",
"isActive": true
}| Campo | Tipo | Obrigatório | Default | Descrição |
|---|---|---|---|---|
name | string | sim | — | Nome descritivo (até 200 caracteres) |
year | integer | sim | — | Ano do período (1900-3000). Use o mesmo valor em name para clareza. |
startDate | YYYY-MM-DD | não | 01/01/<year> | Data de início |
endDate | YYYY-MM-DD | não | 31/12/<year> | Data de término |
isActive | boolean | não | auto | Define se este ano fica ativo imediatamente. Se omitido, será true quando a unidade não tem nenhum ativo, ou false caso contrário. |
Regras de ativação
- Se a unidade não tem ano letivo ativo e
isActivefor omitido, o novo ano é criado como ativo automaticamente. - Se a unidade já tem um ano ativo e você enviar
isActive: true, o sistema desativa o anterior e ativa o novo. - Se você enviar
isActive: false(ou omitir quando já existe um ativo), o novo ano é criado inativo e o anterior continua ativo.
Resposta (201)
Mesma forma do GET. isActive reflete o estado final após a operação.
Erros
| Status | Code | Quando |
|---|---|---|
| 400 | VALIDATION_ERROR | name/year faltando, ou endDate <= startDate |
GET /v1/school-years/:id
Detalha um ano letivo. Retorna os mesmos campos da listagem, incluindo _count.studentClasses e _count.academicPeriods.
Exemplo
curl "https://api.gdredu.com/v1/school-years/aa0e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer gdredu_live_..." \
-H "x-branch-id: 770e8400-e29b-41d4-a716-446655440000"Resposta (200)
Mesmo formato de GET /v1/school-years. O objeto vem sem o envelope { data, pagination }.
| Status | Code | Quando |
|---|---|---|
| 404 | NOT_FOUND | Ano letivo não encontrado na unidade |
PUT /v1/school-years/:id
Atualiza nome, ano e datas. Não altera o status de ativação — para isso use POST /:id/activate ou POST /:id/deactivate.
Body
{
"name": "Ano letivo 2026 (corrigido)",
"year": 2026,
"startDate": "2026-02-01",
"endDate": "2026-12-20"
}| Campo | Tipo | Descrição |
|---|---|---|
name | string | Novo nome |
year | integer | Novo ano |
startDate | YYYY-MM-DD | Nova data de início (se omitida, mantém a atual) |
endDate | YYYY-MM-DD | Nova data de término (se omitida, mantém a atual) |
Erros
| Status | Code | Quando |
|---|---|---|
| 400 | VALIDATION_ERROR | endDate <= startDate |
| 404 | NOT_FOUND | Ano letivo não encontrado na unidade |
POST /v1/school-years/:id/activate
Define este ano como o ativo da unidade. Os demais anos ativos são desativados automaticamente. Use quando precisar "rotacionar" o ano letivo (ex: início de 2026).
Resposta (200)
{
"message": "Ano letivo definido como atual.",
"schoolYear": {
"id": "aa0e8400-e29b-41d4-a716-446655440000",
"name": "Ano letivo 2026",
"year": 2026,
"isActive": true,
...
}
}| Status | Code | Quando |
|---|---|---|
| 404 | NOT_FOUND | Ano letivo não encontrado na unidade |
POST /v1/school-years/:id/deactivate
Desativa o ano letivo (mantém o registro para histórico). Após desativar, a unidade ficará sem ano ativo — recomendado ativar outro na sequência.
Resposta (200)
{
"id": "aa0e8400-e29b-41d4-a716-446655440000",
"isActive": false,
"message": "Ano letivo desativado."
}| Status | Code | Quando |
|---|---|---|
| 404 | NOT_FOUND | Ano letivo não encontrado na unidade, ou já está inativo |
Conceitos importantes
Apenas um ano ativo por unidade
Cada unidade tem no máximo um ano letivo com isActive: true por vez. A API garante isso: ao ativar um, todos os outros são desativados na mesma transação.
Relação com outros recursos
Os seguintes recursos dependem de um schoolYearId válido:
- Matrícula de aluno em turma (
POST /v1/studentscomclassId) —schoolYearIdé obrigatório quando se cria o vínculoStudentClass. Veja a seção Anos Letivos na doc de Estudantes. - Períodos acadêmicos (bimestres/trimestres/semestres) — cada período é vinculado a um
schoolYearId. - Configurações de preço por série —
gradePriceConfigreferencia umschoolYearId. - Provas e exames —
Examreferencia umschoolYearId.
Workaround para chamadas que pedem schoolYearId
schoolYearIdQuando um endpoint pedir schoolYearId e você não souber qual usar, faça GET /v1/school-years/active para obter o ano letivo corrente. Se não houver ativo, a unidade ainda não foi provisionada corretamente — ative um antes de prosseguir.
Ativação na criação
POST /v1/school-years aceita o campo opcional isActive. Quando omitido, o comportamento é inteligente:
- Se a unidade não tem ano ativo → o novo é criado ativo.
- Se a unidade já tem ano ativo → o novo é criado inativo (sem mexer no atual).
Use POST /:id/activate para trocar o ano ativo a qualquer momento.
Updated about 21 hours ago
