Referencia
API HTTP
La web y el CLI usan la misma API, y puedes usarla desde tus propios scripts. Todo vive bajo /api, responde JSON y exige una cuenta.
Autenticación
Hay dos formas de identificarse, y el resultado es el mismo: la petición actúa como esa cuenta.
| Modo | Cómo | Para qué |
|---|---|---|
| Sesión | Cookie byox_session, que devuelve POST /api/auth/login |
La web |
| Token personal | Authorization: Bearer byox_… |
Scripts, el CLI y el MCP |
Los tokens se crean en Cuenta → Tokens de acceso, o con POST /api/auth/tokens desde una sesión.
# Con un token
curl -s https://byox.ejemplo.com/api/courses \
-H "Authorization: Bearer $BYOX_TOKEN"
# Con una sesión
curl -s -c cookies.txt -X POST https://byox.ejemplo.com/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"ana","password":"…"}'
curl -s -b cookies.txt https://byox.ejemplo.com/api/courses
Errores
Los errores devuelven un cuerpo { "error": "mensaje" } y el código HTTP correspondiente.
| Código | Cuándo |
|---|---|
400 |
La petición es inválida (datos que faltan o no cumplen las reglas). |
401 |
Falta la sesión o el token, o ya no valen. El cuerpo incluye "login": true. |
403 |
La cuenta no tiene permiso para esa acción, o la petición con cookie no viene del mismo origen. |
404 |
No existe el recurso. |
409 |
Conflicto, por ejemplo un usuario que ya existe. |
413 |
El cuerpo es demasiado grande. |
429 |
Demasiados intentos; espera unos minutos. |
Cuenta
| Método y ruta | Descripción | Acceso |
|---|---|---|
GET /api/auth/state |
Modo de registro y largo mínimo de contraseña. | Público |
POST /api/auth/login |
{ username, password }. Abre una sesión. |
Público |
POST /api/auth/signup |
{ username, email, password, invite? }. Crea una cuenta y abre sesión. |
Según BYOX_SIGNUP |
POST /api/auth/logout |
Cierra la sesión. | Público |
GET /api/auth/me |
La cuenta actual: user, admin, email. |
Sesión o token |
POST /api/auth/password |
{ current, next }. Cambia la contraseña y cierra las demás sesiones. |
Solo sesión |
GET /api/auth/tokens |
Tus tokens, sin el valor secreto. | Sesión o token |
POST /api/auth/tokens |
{ name }. Crea un token y devuelve su valor, una única vez. |
Solo sesión |
DELETE /api/auth/tokens/:id |
Revoca un token. | Sesión o token |
POST /api/auth/invites |
{ note?, ttlHours?, max? }. Crea un código y lo devuelve completo ({ code, id }), una sola vez. ttlHours: de 1 a 8760 horas; sin valor, no vence. max: de 1 a 1000 cuentas; sin valor, una; null, sin límite. |
Administrador |
GET /api/auth/invites |
Todos los códigos, los más nuevos primero: { id, note, by, created, expires, max, used, state, uses: [{ user, at }] }. state es active, used, expired o revoked. |
Administrador |
DELETE /api/auth/invites/<id> |
Revoca un código. Si ya creó cuentas queda en la lista como revoked; si no, se borra. |
Administrador |
Cursos y progreso
| Método y ruta | Descripción |
|---|---|
GET /api/courses |
El catálogo, con tu progreso en cada curso y los tests que fallan. |
GET /api/courses/:slug |
Un curso: tramos, etapas con su estado y resultado, y URL de clonado. |
GET /api/courses/:slug/status |
El último push: commit, estado del CI y resultado por etapa. |
GET /api/courses/:slug/readme |
La portada del curso, ya renderizada a HTML. |
GET /api/courses/:slug/issues/:n |
Una etapa: consigna, pistas pedidas, actividad y último resultado con el log. |
POST /api/courses/:slug/issues/:n/hint |
Pide la siguiente pista. |
POST /api/courses/:slug/start |
Empieza el curso (crea tu repositorio). Exige un commit verificado. |
POST /api/courses/:slug/upgrade |
Trae lo nuevo del curso a tu repositorio, sin perder progreso. |
GET /api/profile |
Tu racha, tu récord, los días activos y tus cursos. |
GET /api/activity |
Los últimos pushes y etapas cerradas. |
GET /api/health |
Estado de Forgejo, del runner y de tu asistente conectado. |
Autoría
Las rutas POST de esta sección requieren una cuenta que pueda crear cursos (administrador, o BYOX_AUTHORS=all).
| Método y ruta | Descripción |
|---|---|
GET /api/author |
Los cursos fuente y su estado de verificación. |
GET /api/author/templates |
Las plantillas disponibles (python, rust, go, node). |
GET /api/author/guide |
La guía de formato de un curso, en markdown. |
POST /api/author/new |
{ slug, lang, title? }. Crea un curso desde una plantilla. |
GET /api/author/:slug |
El estado de un curso: errores de formato y verificación por etapa. |
POST /api/author/:slug/verify |
Inicia la verificación. Responde 202; consulta el estado con la ruta anterior. |
GET /api/courses/:slug/export |
El código byox1-… del curso, con metadatos. |
GET /api/courses/:slug/export.byox |
El mismo código como archivo descargable. |
POST /api/import/preview |
{ code }. Muestra qué trae un código, sin importar nada. |
POST /api/import |
{ code, slug? }. Importa un curso y lo verifica. |
Rutas que no son de la API
| Ruta | Descripción |
|---|---|
GET /health |
Responde ok si el servicio vive. Sin autenticación; sirve para monitoreo. |
POST /mcp |
El servidor MCP. Exige Authorization: Bearer byox_…. |
POST /hooks/results, /hooks/progress |
Avisos internos del CI. Se validan con un secreto por repositorio; no son para uso externo. |
POST /hooks/source |
Webhook de Forgejo al publicar en un curso fuente. Viaja firmado. |