401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/openapi.json
Especificação OpenAPI
Sem chave de acesso
Esta especificação, em JSON (OpenAPI 3.1), com o endereço deste servidor. Aberta, sem chave: serve para gerar cliente, importar no Postman ou Insomnia e ler em ferramentas de IA.
200Página de ofertas.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
200A oferta.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/trails
Listar trilhas
Chave comcatalog:read
Trilhas com as ofertas que fazem parte de cada uma, na ordem em que o aluno cursa.
Parâmetros
Nome
Tipo
Descrição
limitna query · opcional
integer
Itens por página (1 a 200).
cursorna query · opcional
string
O meta.next_cursor da página anterior.
updated_sincena query · opcional
string
Só registros alterados desde esta data e hora (ISO 8601).
200Página de trilhas.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/cohorts
Listar turmas
Chave comcatalog:read
Parâmetros
Nome
Tipo
Descrição
limitna query · opcional
integer
Itens por página (1 a 200).
cursorna query · opcional
string
O meta.next_cursor da página anterior.
updated_sincena query · opcional
string
Só registros alterados desde esta data e hora (ISO 8601).
200Página de turmas.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/financial-plans
Listar planos de pagamento
Chave comcatalog:read
Formas de pagamento aceitas, número de parcelas, taxa de matrícula, juros e multa. Os campos de desconto do plano não são devolvidos: hoje eles não são aplicados na cobrança.
Parâmetros
Nome
Tipo
Descrição
limitna query · opcional
integer
Itens por página (1 a 200).
cursorna query · opcional
string
O meta.next_cursor da página anterior.
updated_sincena query · opcional
string
Só registros alterados desde esta data e hora (ISO 8601).
200Página de planos.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/sales-pages
Listar páginas de vendas publicadas
Chave comcatalog:read
Só páginas publicadas, com o link público onde o interessado se matricula e o preço.
Parâmetros
Nome
Tipo
Descrição
limitna query · opcional
integer
Itens por página (1 a 200).
cursorna query · opcional
string
O meta.next_cursor da página anterior.
updated_sincena query · opcional
string
Só registros alterados desde esta data e hora (ISO 8601).
200Página de páginas de vendas.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
Alunos
Cadastro dos alunos (students:read, students:write), resumo financeiro (billing:read) e link de entrada no portal (portal:link).
GET/api/v1/students
Listar alunos
Chave comstudents:read
Parâmetros
Nome
Tipo
Descrição
limitna query · opcional
integer
Itens por página (1 a 200).
cursorna query · opcional
string
O meta.next_cursor da página anterior.
updated_sincena query · opcional
string
Só registros alterados desde esta data e hora (ISO 8601).
200Página de alunos.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
POST/api/v1/students
Cadastrar aluno
Chave comstudents:write
Cria o aluno e a conta de acesso ao portal, como o cadastro do painel. O login segue a configuração da escola (CPF ou e-mail).
Parâmetros
Nome
Tipo
Descrição
Idempotency-Keyno cabeçalho · opcional
string
Código único deste pedido (até 255 caracteres visíveis; um UUID serve). Repetir com a mesma chave em 24 h devolve a primeira resposta.
Campos do corpo (JSON)
Nome
Tipo
Descrição
external_idopcional
string | null
Código do aluno no sistema da escola. Único na escola.
full_nameobrigatório
string
emailopcional
string | null
phoneopcional
string | null
document_numberopcional
string | null
CPF (conferido quando a escola liga a validação). Único na escola.
birth_dateopcional
string | null
statusopcional
string (active, inactive)
addressopcional
object
send_welcome_emailopcional
boolean
Envia ao aluno o e-mail com login e senha temporária do portal. Com false, a conta é criada sem e-mail (use o link de entrada ou o "esqueci a senha").
201Aluno cadastrado.application/json400Idempotency-Key ausente onde é exigida (idempotency_key_required) ou fora do formato (idempotency_key_invalid).application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Este pedido exige o cabeçalho Idempotency-Key, com um código único por pedido (por exemplo, um UUID).",
"code": "idempotency_key_required"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada, chave sem a permissão (insufficient_scope) ou limite de alunos do plano atingido (student_limit_reached).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "O plano da escola permite até 500 alunos, e o limite foi atingido.",
"code": "student_limit_reached"
}
409Outro pedido com a mesma Idempotency-Key ainda está em andamento.application/problem+json
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "Um pedido com esta Idempotency-Key ainda está em andamento. Aguarde alguns segundos e repita.",
"code": "idempotency_in_progress"
}
422Campos inválidos (validation_failed, com o detalhe por campo em errors) ou Idempotency-Key já usada com outros dados (idempotency_key_reused).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"address.line": [
"O campo endereço é obrigatório."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
200O aluno.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
PATCH/api/v1/students/{student}
Alterar aluno
Chave comstudents:write
Altera só os campos enviados. Se o aluno ainda não tinha conta no portal e o dado de login passa a existir, a conta é criada e o e-mail de boas-vindas sai, como na edição pelo painel.
Parâmetros
Nome
Tipo
Descrição
studentno caminho · obrigatório
integer
Idempotency-Keyno cabeçalho · opcional
string
Código único deste pedido (até 255 caracteres visíveis; um UUID serve). Repetir com a mesma chave em 24 h devolve a primeira resposta.
Campos do corpo (JSON)
Nome
Tipo
Descrição
external_idopcional
string | null
Código do aluno no sistema da escola. Único na escola.
full_nameopcional
string
emailopcional
string | null
phoneopcional
string | null
document_numberopcional
string | null
CPF (conferido quando a escola liga a validação). Único na escola.
200Aluno alterado.application/json400Idempotency-Key ausente onde é exigida (idempotency_key_required) ou fora do formato (idempotency_key_invalid).application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Este pedido exige o cabeçalho Idempotency-Key, com um código único por pedido (por exemplo, um UUID).",
"code": "idempotency_key_required"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
409Outro pedido com a mesma Idempotency-Key ainda está em andamento.application/problem+json
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "Um pedido com esta Idempotency-Key ainda está em andamento. Aguarde alguns segundos e repita.",
"code": "idempotency_in_progress"
}
422Campos inválidos (validation_failed, com o detalhe por campo em errors) ou Idempotency-Key já usada com outros dados (idempotency_key_reused).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"address.line": [
"O campo endereço é obrigatório."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/students/{student}/summary
Resumo financeiro do aluno
Chave combilling:read
Soma as parcelas que ainda podem ser pagas em qualquer matrícula do aluno, inclusive multa de matrícula cancelada. O contrato é o da matrícula viva mais recente.
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
POST/api/v1/students/{student}/portal-link
Link de entrada no portal do aluno
Chave comportal:link
Gera um link que abre o portal do aluno já conectado, sem senha. Vale 5 minutos e uma vez só: gere na hora do clique. O aluno precisa estar ativo, ter e-mail e conta no portal.
Parâmetros
Nome
Tipo
Descrição
studentno caminho · obrigatório
integer
Exemplo
curl -X POST https://edupay.estudiosite.com/api/v1/students/123/portal-link \
-H "Authorization: Bearer $EDUPAY_KEY"
Respostas
201Link gerado.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
409Aluno inativo (student_inactive), sem e-mail ou conta no portal (student_without_portal_access), portal sem endereço (portal_not_configured) ou e-mail repetido em outro aluno (portal_link_ambiguous_email).application/problem+json
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "O aluno não tem e-mail ou conta de acesso ao portal.",
"code": "student_without_portal_access"
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
Matrículas
Matrículas e contratos (enrollments:read, enrollments:write).
GET/api/v1/enrollments
Listar matrículas
Chave comenrollments:read
Parâmetros
Nome
Tipo
Descrição
limitna query · opcional
integer
Itens por página (1 a 200).
cursorna query · opcional
string
O meta.next_cursor da página anterior.
updated_sincena query · opcional
string
Só registros alterados desde esta data e hora (ISO 8601).
includena query · opcional
string
Dados relacionados, separados por vírgula: student (exige students:read), installments (exige billing:read), contract.
200Página de matrículas.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
POST/api/v1/enrollments
Criar matrícula
Chave comenrollments:write
Cria a matrícula como o painel: gera as parcelas e o contrato, coloca o aluno no Moodle na hora (quando a turma está ligada ao Moodle) e emite as cobranças que já estão na janela de emissão — cartão na hora; boleto e PIX quando faltam poucos dias para o vencimento. Exige Idempotency-Key. Aceita ?include= como a consulta da matrícula.
Parâmetros
Nome
Tipo
Descrição
Idempotency-Keyno cabeçalho · obrigatório
string
Código único deste pedido (até 255 caracteres visíveis; um UUID serve). Repetir com a mesma chave em 24 h devolve a primeira resposta.
includena query · opcional
string
Dados relacionados, separados por vírgula: student (exige students:read), installments (exige billing:read), contract.
Campos do corpo (JSON)
Nome
Tipo
Descrição
external_idopcional
string | null
Código da matrícula no sistema da escola. Único na escola.
student_idopcional
integer
studentopcional
object
Aluno novo. Os campos obrigatórios seguem a configuração da escola (CPF, telefone e endereço podem ser exigidos; e-mail é exigido quando o login do aluno é o e-mail).
offering_idopcional
integer
trail_idopcional
integer
cohort_idopcional
integer | null
Turma. Ligada a uma turma do Moodle, o aluno entra no Moodle na hora, como na matrícula pelo painel.
financial_plan_idobrigatório
integer
payment_methodobrigatório
string (boleto, pix, credit_card)
Precisa ser aceita pelo plano e pela conta Stripe da escola.
contract_template_idopcional
integer | null
Modelo de contrato. Com assinatura exigida, a matrícula nasce aguardando contrato.
base_valueopcional
integer | null
Valor do curso em centavos. Sem ele, vale o preço do curso (ou a soma dos cursos da trilha).
enrollment_feeopcional
integer | null
Taxa de matrícula em centavos. Sem ela, vale a do plano.
201Matrícula criada.application/json400Idempotency-Key ausente onde é exigida (idempotency_key_required) ou fora do formato (idempotency_key_invalid).application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Este pedido exige o cabeçalho Idempotency-Key, com um código único por pedido (por exemplo, um UUID).",
"code": "idempotency_key_required"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada, chave sem a permissão (insufficient_scope) ou, com aluno novo, limite de alunos do plano atingido (student_limit_reached).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: enrollments:write.",
"code": "insufficient_scope",
"scopes": [
"enrollments:write"
]
}
409O aluno já tem matrícula viva no mesmo curso ou trilha (enrollment_conflict, com existing_enrollment_id) ou o pedido com esta Idempotency-Key ainda está em andamento (idempotency_in_progress).application/problem+json
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "O aluno já tem matrícula viva neste curso ou trilha (veja existing_enrollment_id).",
"code": "enrollment_conflict",
"existing_enrollment_id": 812
}
422Campos inválidos (validation_failed, com o detalhe por campo em errors) ou Idempotency-Key já usada com outros dados (idempotency_key_reused).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"address.line": [
"O campo endereço é obrigatório."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/enrollments/{enrollment}
Uma matrícula
Chave comenrollments:read
Parâmetros
Nome
Tipo
Descrição
enrollmentno caminho · obrigatório
integer
includena query · opcional
string
Dados relacionados, separados por vírgula: student (exige students:read), installments (exige billing:read), contract.
200A matrícula.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
200O contrato.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
200O arquivo.application/pdf401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
POST/api/v1/enrollments/{enrollment}/cancel
Cancelar matrícula
Chave comenrollments:write
Cancela como o painel, sem multa de rescisão (essa só pelo painel): as parcelas em aberto são canceladas junto com as cobranças no Stripe, o aluno é avisado e sai do Moodle. Boleto ainda dentro da validade não pode ser cancelado no Stripe e continua pagável até vencer: meta.charges_still_payable diz quantos.
Parâmetros
Nome
Tipo
Descrição
enrollmentno caminho · obrigatório
integer
Idempotency-Keyno cabeçalho · opcional
string
Código único deste pedido (até 255 caracteres visíveis; um UUID serve). Repetir com a mesma chave em 24 h devolve a primeira resposta.
includena query · opcional
string
Dados relacionados, separados por vírgula: student (exige students:read), installments (exige billing:read), contract.
200Matrícula cancelada.application/json400Idempotency-Key ausente onde é exigida (idempotency_key_required) ou fora do formato (idempotency_key_invalid).application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Este pedido exige o cabeçalho Idempotency-Key, com um código único por pedido (por exemplo, um UUID).",
"code": "idempotency_key_required"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
409A matrícula já está cancelada ou concluída (enrollment_not_cancellable).application/problem+json
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "Só matrícula aguardando contrato, aguardando pagamento ou ativa pode ser cancelada.",
"code": "enrollment_not_cancellable"
}
422Campos inválidos (validation_failed, com o detalhe por campo em errors) ou Idempotency-Key já usada com outros dados (idempotency_key_reused).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"address.line": [
"O campo endereço é obrigatório."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
Cobranças
Parcelas, dados para pagar (billing:read) e 2ª via (billing:write).
GET/api/v1/installments
Listar parcelas
Chave combilling:read
Parâmetros
Nome
Tipo
Descrição
limitna query · opcional
integer
Itens por página (1 a 200).
cursorna query · opcional
string
O meta.next_cursor da página anterior.
updated_sincena query · opcional
string
Só registros alterados desde esta data e hora (ISO 8601).
200Página de parcelas.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/installments/{installment}
Uma parcela
Chave combilling:read
Inclui a imagem do QR Code PIX (payment.pix_qr_code_base64), que a lista não traz.
200A parcela.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
Gera a 2ª via com novo vencimento, como o painel: a parcela atual é cancelada junto com a cobrança no Stripe e nasce outra (replaces_installment_id aponta a anterior), com boleto ou PIX novo e e-mail ao aluno. O valor não muda pela API.
Parâmetros
Nome
Tipo
Descrição
installmentno caminho · obrigatório
integer
Idempotency-Keyno cabeçalho · opcional
string
Código único deste pedido (até 255 caracteres visíveis; um UUID serve). Repetir com a mesma chave em 24 h devolve a primeira resposta.
Campos do corpo (JSON)
Nome
Tipo
Descrição
due_dateopcional
string | null
Novo vencimento (AAAA-MM-DD, de hoje em diante no fuso da escola). Sem ele, vence em 3 dias.
201A parcela nova, com os dados para pagar.application/json400Idempotency-Key ausente onde é exigida (idempotency_key_required) ou fora do formato (idempotency_key_invalid).application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Este pedido exige o cabeçalho Idempotency-Key, com um código único por pedido (por exemplo, um UUID).",
"code": "idempotency_key_required"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
409Parcela paga, cancelada ou dispensada (installment_not_payable), boleto atual ainda válido (boleto_still_valid) ou escola sem conta Stripe conectada (gateway_not_connected).application/problem+json
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "O boleto atual ainda está dentro da validade e não pode ser cancelado.",
"code": "boleto_still_valid"
}
422Campos inválidos (validation_failed, com o detalhe por campo em errors) ou Idempotency-Key já usada com outros dados (idempotency_key_reused).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"address.line": [
"O campo endereço é obrigatório."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
502O Stripe recusou ou não respondeu (gateway_error). Com installment_id, a 2ª via foi criada e a cobrança dela sai de novo automaticamente.application/problem+json
{
"type": "about:blank",
"title": "Bad Gateway",
"status": 502,
"detail": "O Stripe recusou ou não respondeu. Se veio installment_id, a 2ª via foi criada e a cobrança dela sai de novo automaticamente.",
"code": "gateway_error",
"installment_id": 4521
}
Avisos automáticos
Endereços que recebem os avisos da escola (webhooks:manage). O formato do aviso está em webhooks → evento.
200Endereços da escola (sem o segredo).application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
POST/api/v1/webhooks
Cadastrar endereço de aviso
Chave comwebhooks:manage
A resposta traz o segredo (secret) uma única vez: guarde-o para conferir a assinatura dos avisos. Até 10 endereços por escola.
Campos do corpo (JSON)
Nome
Tipo
Descrição
urlopcional
string
Precisa ser https e apontar para endereço público.
descriptionopcional
string | null
eventsopcional
array
Eventos assinados (WebhookEventType) ou ["*"] para todos.
201Endereço cadastrado, com o segredo.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
409Limite de endereços atingido.application/problem+json422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
200O endereço.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
PATCH/api/v1/webhooks/{webhook}
Alterar endereço de aviso
Chave comwebhooks:manage
Envie só o que muda. enabled: false pausa; enabled: true religa e zera a contagem de falhas.
200O endereço alterado.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
422Parâmetro inválido (detalhe por campo em errors).application/problem+json
{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "Alguns campos estão inválidos.",
"code": "validation_failed",
"errors": {
"limit": [
"O campo limit não pode ser superior a 200."
]
}
}
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
204Excluído.401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
GET/api/v1/webhooks/{webhook}/deliveries
Histórico de entregas do endereço
Chave comwebhooks:manage
Últimos 30 dias, do mais antigo para o mais novo.
Parâmetros
Nome
Tipo
Descrição
webhookno caminho · obrigatório
integer
limitna query · opcional
integer
Itens por página (1 a 200).
cursorna query · opcional
string
O meta.next_cursor da página anterior.
updated_sincena query · opcional
string
Só registros alterados desde esta data e hora (ISO 8601).
200Página de entregas.application/json400Cursor inválido: recomece a lista sem cursor.application/problem+json
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Cursor inválido. Recomece a lista sem o parâmetro cursor.",
"code": "invalid_cursor"
}
401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
POST/api/v1/webhooks/{webhook}/test
Enviar aviso de teste
Chave comwebhooks:manage
Manda um aviso webhook.test ao endereço, numa tentativa só. Funciona mesmo com a API da escola desligada.
Parâmetros
Nome
Tipo
Descrição
webhookno caminho · obrigatório
integer
Exemplo
curl -X POST https://edupay.estudiosite.com/api/v1/webhooks/123/test \
-H "Authorization: Bearer $EDUPAY_KEY"
Respostas
202Aviso de teste na fila.application/json401Chave ausente, inválida, vencida ou revogada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desligada na escola (code api_disabled) ou chave sem a permissão necessária (code insufficient_scope, com a lista em scopes).application/problem+json
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "A chave não tem a permissão necessária: students:read.",
"code": "insufficient_scope",
"scopes": [
"students:read"
]
}
404Registro não existe nesta escola.application/problem+json
429Limite de chamadas atingido.application/problem+json
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "Limite de chamadas atingido. Tente de novo depois do tempo indicado em Retry-After.",
"code": "rate_limited"
}
Fale com a gente
Nossa equipe está disponível para tirar dúvidas sobre projetos, consultoria e tecnologia educacional.