Saltar al contenido
Studeia Docs
AI-assisted translation — last updated 2026-05-31. For original (pt-BR or en-US), use the language switcher.

API pública Studeia: overview

API pública Studeia: 166 métodos REST (33 grupos), 35 scopes granulares, dual auth (session o Bearer key) en la mayoría de las rutas, rate limiting Redis 3 tiers, CORS. Docs en /docs/api

2026-05-31 5 min
Resposta curta

La API pública de Studeia ofrece 166 métodos REST documentados en 33 grupos (courses, users, enrollments, classes, media, gradebook, question-banks, live-classes, LTI, RAG, gamification, automations, ai-analytics y más). La mayoría de las rutas de recurso acepta dual auth — session o Bearer API key con 35 scopes granulares; las rutas que gestionan credenciales, OAuth, billing, SSO, video/avatar y dominio son session-only por seguridad. Rate limiting Redis en 3 tiers. CORS habilitado.

Patrón de endpoint

https://[tenant].studeia.com/api/institution/[resource]

Para tenants con dominio personalizado:

https://api.escuela.com/api/institution/[resource]

Autenticación — dual auth

La mayoría de las rutas /api/institution/* acepta 2 modos de autenticación. Las rutas que gestionan credenciales, OAuth, billing, SSO, proveedores de video/avatar y verificación de dominio son session-only por seguridad (no aceptan API key).

Bearer API key

GET /api/institution/courses
Authorization: Bearer mia_abc123...

API key resuelta mediante caché Redis (60s TTL) + lookup por prefijo.

Session cookie

GET /api/institution/courses
Cookie: sb-access-token=...; sb-refresh-token=...

Para llamadas del propio frontend de Studeia.

Scopes (granulares)

Cada ruta de recurso declara requiredScopes; la API key debe tener los scopes correspondientes. El backend reconoce 35 scopes en total.

RutaScopes
coursescourses:read
usersusers:read
enrollmentsenrollments:read
classesclasses:read
mediamedia:read
gradebookgrades:read
rubricsrubrics:read
question-banksquestion-banks:read
live-classeslive-classes:read
tagstags:read
invitesinvites:read
lti-toolslti:read
drivedrive:read
settings, themes, api-keys, profile-configsettings:read
automationsautomations:read
prompts, ai-limitsai:read
ai-analyticsreports:read
reportsreports:read
video-providersettings:read

API key con scope vacío ([]) = acceso total (claves admin).

Rate limiting

TierReq/horaBurst/min
standard1.000100
high5.000300
customconfigurablecustom/60

Headers de respuesta:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 947
X-RateLimit-Reset: 1716480000

Rate exceeded:

HTTP/1.1 429 Too Many Requests
Retry-After: 120

{ "error": "rate_limit_exceeded", "retryAfter": 120 }

Patrón de respuesta

Éxito

{
  "data": [...],
  "pagination": {
    "page": 1,
    "perPage": 50,
    "total": 247,
    "totalPages": 5
  }
}

Error

{
  "error": "validation_failed",
  "details": [
    { "field": "email", "message": "Invalid email format" }
  ]
}

Status codes:

  • 200 OK
  • 201 Created
  • 204 No Content (DELETE)
  • 400 Bad Request (validation)
  • 401 Unauthorized (auth inválida)
  • 403 Forbidden (sin scope o role)
  • 404 Not Found
  • 409 Conflict (inconsistencia de estado)
  • 422 Unprocessable Entity (regla de negocio)
  • 429 Rate limit
  • 500 Server error

Paginación

Por defecto: cursor-based.

GET /api/institution/courses?page=1&perPage=50&search=matematica

perPage máx. 100 (cap server-side).

CORS

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization, Accept-Language
Access-Control-Max-Age: 86400

Preflight (OPTIONS) responde 204.

i18n

Los errores se localizan mediante el header Accept-Language: es-ES (o en-US, pt-BR, fr-FR). Fallback pt-BR si el idioma no está soportado.

Quickstart

# 1. Genera la API key en /institution/settings > API Keys

# 2. Lista cursos
curl https://[tenant].studeia.com/api/institution/courses \
  -H "Authorization: Bearer mia_abc123..." \
  -H "Accept-Language: es-ES"

# 3. Crea un alumno
curl -X POST https://[tenant].studeia.com/api/institution/users \
  -H "Authorization: Bearer mia_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Maria Silva",
    "email": "maria@example.com",
    "role": "student",
    "sendInvite": true
  }'

Grupos de endpoints (33 grupos)

Documentación detallada por grupo en /docs/api/[group]:

  • Institución, Cursos, Módulos, Lecciones, Usuarios, Matrículas, Grupos
  • Medios, Calificaciones, Rúbricas, Banco de Preguntas, Clases en Vivo, Video Providers
  • Webhooks, Invitaciones, Tags, LTI, Configuraciones, Automatizaciones
  • RAG, Reportes, Análisis IA, Gamificación, Email, Drive, Calendario

Ver también

FAQ

¿Cómo creo una API key?

Como institution_admin: /institution/settings > API Keys > Create. Configura nombre, scopes (granulares: courses:read, users:write, etc), rate limit tier (standard 1000/h, high 5000/h, custom). La clave completa (formato mia_ + 40 hex) se muestra UNA ÚNICA VEZ tras la creación. Solo el hash SHA-256 queda en la base de datos.

¿El rate limit es por usuario o por clave?

Por API key. Cada clave tiene su propio rate limit tier. Headers de respuesta: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Rate exceeded: HTTP 429 con header Retry-After.

¿Puedo crear un usuario vía API?

Sí. POST /api/institution/users con scope users:write. Body: { name, email, role, classGroupIds?, sendInvite? }. Respeta el límite de alumnos del plan (checkTenantResourceLimit fail-closed).

¿Hay webhooks para recibir eventos?

Sí, mediante Automatizaciones. Crea una automatización con trigger event (lesson_completed, quiz_submitted, etc) + action send_webhook hacia tu URL. Template interpolation soportado ({{user.name}}, {{event.score}}). Prevención SSRF (IPs privadas bloqueadas).

Veja tambem

API pública Studeia: overview