Referencia completa de las rutas de la API de EduPay, con parámetros, respuestas y ejemplos en curl.
Todas las rutas de la API, generadas de la especificación OpenAPI 1.0.0-beta. Los ejemplos usan la dirección de este servidor; guarde la clave en la variable EDUPAY_KEY.
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
429Límite de llamadas alcanzado.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
Especificación OpenAPI
Sin clave de acceso
Esta especificación, en JSON (OpenAPI 3.1), con la dirección de este servidor. Abierta, sin clave: sirve para generar un cliente, importar en Postman o Insomnia y leer en herramientas de IA.
200Página de ofertas.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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 (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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"
}
200La oferta.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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 trayectos
Clave concatalog:read
Trayectos con las ofertas que forman parte de cada uno, en el orden en que el alumno las cursa.
Parámetros
Nombre
Tipo
Descripción
limiten la query · opcional
integer
Elementos por página (1 a 200).
cursoren la query · opcional
string
El meta.next_cursor de la página anterior.
updated_sinceen la query · opcional
string
Solo registros modificados desde esta fecha y hora (ISO 8601).
200Página de trayectos.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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 (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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 grupos
Clave concatalog:read
Parámetros
Nombre
Tipo
Descripción
limiten la query · opcional
integer
Elementos por página (1 a 200).
cursoren la query · opcional
string
El meta.next_cursor de la página anterior.
updated_sinceen la query · opcional
string
Solo registros modificados desde esta fecha y hora (ISO 8601).
200Página de grupos.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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 (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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 planes de pago
Clave concatalog:read
Formas de pago aceptadas, número de cuotas, tasa de matrícula, intereses y multa. Los campos de descuento del plan no se devuelven: hoy no se aplican en el cobro.
Parámetros
Nombre
Tipo
Descripción
limiten la query · opcional
integer
Elementos por página (1 a 200).
cursoren la query · opcional
string
El meta.next_cursor de la página anterior.
updated_sinceen la query · opcional
string
Solo registros modificados desde esta fecha y hora (ISO 8601).
200Página de planes.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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 (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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 ventas publicadas
Clave concatalog:read
Solo páginas publicadas, con el enlace público donde el interesado se matricula y el precio.
Parámetros
Nombre
Tipo
Descripción
limiten la query · opcional
integer
Elementos por página (1 a 200).
cursoren la query · opcional
string
El meta.next_cursor de la página anterior.
updated_sinceen la query · opcional
string
Solo registros modificados desde esta fecha y hora (ISO 8601).
200Página de páginas de ventas.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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 (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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"
}
Alumnos
Registro de los alumnos (students:read, students:write), resumen financiero (billing:read) y enlace de acceso al portal (portal:link).
GET/api/v1/students
Listar alumnos
Clave constudents:read
Parámetros
Nombre
Tipo
Descripción
limiten la query · opcional
integer
Elementos por página (1 a 200).
cursoren la query · opcional
string
El meta.next_cursor de la página anterior.
updated_sinceen la query · opcional
string
Solo registros modificados desde esta fecha y hora (ISO 8601).
emailen la query · opcional
string
E-mail exacto, sin distinguir mayúsculas.
document_numberen la query · opcional
string
CPF (documento fiscal de persona física en Brasil) u otro documento, con o sin puntuación.
200Página de alumnos.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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 (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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
Registrar alumno
Clave constudents:write
Crea el alumno y la cuenta de acceso al portal, como el registro del panel. El inicio de sesión sigue la configuración de la escuela (CPF o e-mail).
Parámetros
Nombre
Tipo
Descripción
Idempotency-Keyen el encabezado · opcional
string
Código único de esta solicitud (hasta 255 caracteres visibles; sirve un UUID). Repetir con la misma clave en 24 h devuelve la primera respuesta.
Campos del cuerpo (JSON)
Nombre
Tipo
Descripción
external_idopcional
string | null
Código del alumno en el sistema de la escuela. Único en la escuela.
full_nameobligatorio
string
emailopcional
string | null
phoneopcional
string | null
document_numberopcional
string | null
CPF (verificado cuando la escuela activa la validación). Único en la escuela.
birth_dateopcional
string | null
statusopcional
string (active, inactive)
addressopcional
object
send_welcome_emailopcional
boolean
Envía al alumno el e-mail con el usuario y la contraseña temporal del portal. Con false, la cuenta se crea sin e-mail (use el enlace de acceso o "Olvidé mi contraseña").
201Alumno registrado.application/json400Idempotency-Key ausente donde se exige (idempotency_key_required) o fuera del 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada, clave sin el permiso (insufficient_scope) o límite de alumnos del plan alcanzado (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"
}
409Otra solicitud con la misma Idempotency-Key todavía está en curso.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, con el detalle por campo en errors) o Idempotency-Key ya usada con otros datos (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."
]
}
}
429Límite de llamadas alcanzado.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"
}
200El alumno.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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}
Modificar alumno
Clave constudents:write
Modifica solo los campos enviados. Si el alumno todavía no tenía cuenta en el portal y el dato de inicio de sesión pasa a existir, se crea la cuenta y sale el e-mail de bienvenida, como en la edición por el panel.
Parámetros
Nombre
Tipo
Descripción
studenten la ruta · obligatorio
integer
Idempotency-Keyen el encabezado · opcional
string
Código único de esta solicitud (hasta 255 caracteres visibles; sirve un UUID). Repetir con la misma clave en 24 h devuelve la primera respuesta.
Campos del cuerpo (JSON)
Nombre
Tipo
Descripción
external_idopcional
string | null
Código del alumno en el sistema de la escuela. Único en la escuela.
full_nameopcional
string
emailopcional
string | null
phoneopcional
string | null
document_numberopcional
string | null
CPF (verificado cuando la escuela activa la validación). Único en la escuela.
200Alumno modificado.application/json400Idempotency-Key ausente donde se exige (idempotency_key_required) o fuera del 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
409Otra solicitud con la misma Idempotency-Key todavía está en curso.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, con el detalle por campo en errors) o Idempotency-Key ya usada con otros datos (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."
]
}
}
429Límite de llamadas alcanzado.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
Resumen financiero del alumno
Clave conbilling:read
Suma las cuotas que todavía se pueden pagar en cualquier matrícula del alumno, incluida la multa de una matrícula cancelada. El contrato es el de la matrícula vigente más reciente.
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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
Enlace de acceso al portal del alumno
Clave conportal:link
Genera un enlace que abre el portal del alumno con la sesión ya iniciada, sin contraseña. Vale 5 minutos y una sola vez: genérelo en el momento del clic. El alumno tiene que estar activo y tener e-mail y cuenta en el portal.
Parámetros
Nombre
Tipo
Descripción
studenten la ruta · obligatorio
integer
Ejemplo
curl -X POST https://edupay.estudiosite.com/api/v1/students/123/portal-link \
-H "Authorization: Bearer $EDUPAY_KEY"
Respuestas
201Enlace generado.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
409Alumno inactivo (student_inactive), sin e-mail o cuenta en el portal (student_without_portal_access), portal sin dirección (portal_not_configured) o e-mail repetido en otro alumno (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"
}
429Límite de llamadas alcanzado.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 y contratos (enrollments:read, enrollments:write).
GET/api/v1/enrollments
Listar matrículas
Clave conenrollments:read
Parámetros
Nombre
Tipo
Descripción
limiten la query · opcional
integer
Elementos por página (1 a 200).
cursoren la query · opcional
string
El meta.next_cursor de la página anterior.
updated_sinceen la query · opcional
string
Solo registros modificados desde esta fecha y hora (ISO 8601).
includeen la query · opcional
string
Datos relacionados, separados por coma: student (exige students:read), installments (exige billing:read), contract.
student_iden la query · opcional
integer
external_iden la query · opcional
string
Código de la matrícula en el sistema de la escuela.
200Página de matrículas.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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 (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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
Crear matrícula
Clave conenrollments:write
Crea la matrícula como el panel: genera las cuotas y el contrato, inscribe al alumno en Moodle en el momento (cuando el grupo está vinculado a Moodle) y emite los cobros que ya están en la ventana de emisión — tarjeta en el momento; boleto y PIX cuando faltan pocos días para el vencimiento. Exige Idempotency-Key. Acepta ?include= como la consulta de la matrícula.
Parámetros
Nombre
Tipo
Descripción
Idempotency-Keyen el encabezado · obligatorio
string
Código único de esta solicitud (hasta 255 caracteres visibles; sirve un UUID). Repetir con la misma clave en 24 h devuelve la primera respuesta.
includeen la query · opcional
string
Datos relacionados, separados por coma: student (exige students:read), installments (exige billing:read), contract.
Campos del cuerpo (JSON)
Nombre
Tipo
Descripción
external_idopcional
string | null
Código de la matrícula en el sistema de la escuela. Único en la escuela.
student_idopcional
integer
studentopcional
object
Alumno nuevo. Los campos obligatorios siguen la configuración de la escuela (se pueden exigir CPF, teléfono y dirección; el e-mail se exige cuando el inicio de sesión del alumno es el e-mail).
offering_idopcional
integer
trail_idopcional
integer
cohort_idopcional
integer | null
Grupo. Si está vinculado a una cohorte de Moodle, el alumno entra a Moodle en el momento, como en la matrícula por el panel.
financial_plan_idobligatorio
integer
payment_methodobligatorio
string (boleto, pix, credit_card)
Tiene que ser aceptada por el plan y por la cuenta de Stripe de la escuela.
contract_template_idopcional
integer | null
Modelo de contrato. Si exige firma, la matrícula se crea esperando contrato.
base_valueopcional
integer | null
Valor del curso en centavos. Sin él, vale el precio del curso (o la suma de los cursos del trayecto).
enrollment_feeopcional
integer | null
Tasa de matrícula en centavos. Sin ella, vale la del plan.
201Matrícula creada.application/json400Idempotency-Key ausente donde se exige (idempotency_key_required) o fuera del 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada, clave sin el permiso (insufficient_scope) o, con un alumno nuevo, límite de alumnos del plan alcanzado (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"
]
}
409El alumno ya tiene una matrícula vigente en el mismo curso o trayecto (enrollment_conflict, con existing_enrollment_id) o la solicitud con esta Idempotency-Key todavía está en curso (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, con el detalle por campo en errors) o Idempotency-Key ya usada con otros datos (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."
]
}
}
429Límite de llamadas alcanzado.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}
Una matrícula
Clave conenrollments:read
Parámetros
Nombre
Tipo
Descripción
enrollmenten la ruta · obligatorio
integer
includeen la query · opcional
string
Datos relacionados, separados por coma: student (exige students:read), installments (exige billing:read), contract.
200La matrícula.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
422Parámetro inválido (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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"
}
200El contrato.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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"
}
200El archivo.application/pdf401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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
Clave conenrollments:write
Cancela como el panel, sin multa por rescisión (esa solo por el panel): las cuotas pendientes se cancelan junto con los cobros en Stripe, el alumno recibe un aviso y sale de Moodle. Un boleto todavía dentro de su validez no se puede cancelar en Stripe y se puede pagar hasta que venza: meta.charges_still_payable dice cuántos.
Parámetros
Nombre
Tipo
Descripción
enrollmenten la ruta · obligatorio
integer
Idempotency-Keyen el encabezado · opcional
string
Código único de esta solicitud (hasta 255 caracteres visibles; sirve un UUID). Repetir con la misma clave en 24 h devuelve la primera respuesta.
includeen la query · opcional
string
Datos relacionados, separados por coma: student (exige students:read), installments (exige billing:read), contract.
200Matrícula cancelada.application/json400Idempotency-Key ausente donde se exige (idempotency_key_required) o fuera del 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
409La matrícula ya está cancelada o concluida (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, con el detalle por campo en errors) o Idempotency-Key ya usada con otros datos (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."
]
}
}
429Límite de llamadas alcanzado.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"
}
Cobros
Cuotas, datos para pagar (billing:read) y segunda copia (billing:write).
GET/api/v1/installments
Listar cuotas
Clave conbilling:read
Parámetros
Nombre
Tipo
Descripción
limiten la query · opcional
integer
Elementos por página (1 a 200).
cursoren la query · opcional
string
El meta.next_cursor de la página anterior.
updated_sinceen la query · opcional
string
Solo registros modificados desde esta fecha y hora (ISO 8601).
200Página de cuotas.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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 (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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}
Una cuota
Clave conbilling:read
Incluye la imagen del código QR PIX (payment.pix_qr_code_base64), que la lista no trae.
200La cuota.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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"
}
Genera la segunda copia con un nuevo vencimiento, como el panel: la cuota actual se cancela junto con el cobro en Stripe y se crea otra (replaces_installment_id apunta a la anterior), con un boleto o PIX nuevo y un e-mail al alumno. El valor no cambia por la API.
Parámetros
Nombre
Tipo
Descripción
installmenten la ruta · obligatorio
integer
Idempotency-Keyen el encabezado · opcional
string
Código único de esta solicitud (hasta 255 caracteres visibles; sirve un UUID). Repetir con la misma clave en 24 h devuelve la primera respuesta.
Campos del cuerpo (JSON)
Nombre
Tipo
Descripción
due_dateopcional
string | null
Nuevo vencimiento (AAAA-MM-DD, de hoy en adelante en la zona horaria de la escuela). Sin él, vence en 3 días.
201La cuota nueva, con los datos para pagar.application/json400Idempotency-Key ausente donde se exige (idempotency_key_required) o fuera del 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
409Cuota pagada, cancelada o dispensada (installment_not_payable), boleto actual todavía válido (boleto_still_valid) o escuela sin cuenta de 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, con el detalle por campo en errors) o Idempotency-Key ya usada con otros datos (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."
]
}
}
429Límite de llamadas alcanzado.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"
}
502Stripe rechazó o no respondió (gateway_error). Con installment_id, la segunda copia se creó y su cobro sale de nuevo automáticamente.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
Direcciones que reciben los avisos de la escuela (webhooks:manage). El formato del aviso está en webhooks → evento.
200Direcciones de la escuela (sin el secreto).application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
429Límite de llamadas alcanzado.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
Registrar dirección de aviso
Clave conwebhooks:manage
La respuesta trae el secreto (secret) una sola vez: guárdelo para verificar la firma de los avisos. Hasta 10 direcciones por escuela.
Campos del cuerpo (JSON)
Nombre
Tipo
Descripción
urlopcional
string
Tiene que ser https y apuntar a una dirección pública.
descriptionopcional
string | null
eventsopcional
array
Eventos suscritos (WebhookEventType) o ["*"] para todos.
201Dirección registrada, con el secreto.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
409Límite de direcciones alcanzado.application/problem+json422Parámetro inválido (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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"
}
200La dirección.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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}
Modificar dirección de aviso
Clave conwebhooks:manage
Envíe solo lo que cambia. enabled: false pausa; enabled: true reactiva y pone en cero el conteo de fallas.
200La dirección modificada.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
422Parámetro inválido (detalle por campo en 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."
]
}
}
429Límite de llamadas alcanzado.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"
}
204Eliminada.401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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
Historial de entregas de la dirección
Clave conwebhooks:manage
Últimos 30 días, del más antiguo al más reciente.
Parámetros
Nombre
Tipo
Descripción
webhooken la ruta · obligatorio
integer
limiten la query · opcional
integer
Elementos por página (1 a 200).
cursoren la query · opcional
string
El meta.next_cursor de la página anterior.
updated_sinceen la query · opcional
string
Solo registros modificados desde esta fecha y hora (ISO 8601).
200Página de entregas.application/json400Cursor inválido: reinicie la lista sin 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"
}
401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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 prueba
Clave conwebhooks:manage
Envía un aviso webhook.test a la dirección, en un solo intento. Funciona aunque la API de la escuela esté desactivada.
Parámetros
Nombre
Tipo
Descripción
webhooken la ruta · obligatorio
integer
Ejemplo
curl -X POST https://edupay.estudiosite.com/api/v1/webhooks/123/test \
-H "Authorization: Bearer $EDUPAY_KEY"
Respuestas
202Aviso de prueba en cola.application/json401Clave ausente, inválida, vencida o revocada.application/problem+json
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Chave de acesso ausente, inválida, vencida ou revogada.",
"code": "unauthenticated"
}
403API desactivada en la escuela (code api_disabled) o clave sin el permiso necesario (code insufficient_scope, con la lista en 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"
]
}
404El registro no existe en esta escuela.application/problem+json
429Límite de llamadas alcanzado.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"
}
Habla con nosotros
Nuestro equipo está disponible para resolver dudas sobre proyectos, consultoría y tecnología educativa.