Cómo empezar
- En la web, ve a Mi plan → 🔑 Acceso por API y crea un token. Cópialo: solo se muestra una vez.
- Envía el token en cada petición con la cabecera
Authorization: Bearer <token>. - Todas las respuestas y los cuerpos son JSON. Las fechas van en formato
AAAA-MM-DD.
URL base: https://146-103-48-13.sslip.io
El token da acceso solo a los datos de tu cuenta. Si se filtra, revócalo desde la web.
Rutas
| Método | Ruta | Qué hace |
|---|---|---|
| GET | /api/state | Todo: plan, metas y registros |
| PUT | /api/state | Reemplaza todo (mismo formato que GET). ⚠️ Borra lo que no envíes |
| GET | /api/plan | Plan semanal |
| PUT | /api/plan | Guarda el plan semanal |
| GET | /api/goals | Lista de metas y sub-metas |
| GET | /api/goals/:id | Una meta |
| POST | /api/goals | Crea una meta (o sub-meta con parentId) |
| PATCH | /api/goals/:id | Cambia name, date, notes y/o achieved |
| DELETE | /api/goals/:id | Elimina la meta y sus sub-metas |
| GET | /api/records?from=&to= | Registros de entrenamientos (filtro de fechas opcional) |
| GET | /api/records/:fecha | Registro de un día |
| PUT | /api/records/:fecha | Marca cumplido / no cumplido, notas o un entrenamiento extra |
| DELETE | /api/records/:fecha | Borra el registro del día (vuelve a lo planificado) |
Formato de los datos
Plan — days: 0 = domingo … 6 = sábado
{
"startDate": "2026-10-26",
"days": {
"1": { "title": "Rodaje suave", "detail": "40 min a ritmo cómodo" },
"3": { "title": "Series + fuerza", "detail": "6×800 m + core" },
"0": { "title": "Fondo largo", "detail": "Sumar 1–2 km cada semana" }
}
}
Meta
{
"id": "1",
"name": "Maratón de Santiago",
"date": "2027-04-11",
"parentId": null, // id de la meta principal si es sub-meta
"notes": "Bajar de 4 horas",
"achieved": null // null = en curso, "yes" = lograda, "no" = no lograda
}
Registro de un día
{
"status": "done", // "pending" | "done" | "missed"
"note": "17 km, me dolió el gemelo",
"title": "Fondo largo", // opcional: cambia el nombre del entrenamiento ese día
"detail": "18 km suaves", // opcional
"extra": false // true = entrenamiento fuera del plan
}
Ejemplos
PowerShell
$base = "https://146-103-48-13.sslip.io"
$token = "nraf_..." # tu token
$h = @{ Authorization = "Bearer $token" }
# Ver las metas
Invoke-RestMethod "$base/api/goals" -Headers $h
# Marcar el entrenamiento del 3 de noviembre como cumplido
Invoke-RestMethod "$base/api/records/2026-11-03" -Method PUT -Headers $h `
-ContentType "application/json" -Body '{"status":"done","note":"8 km"}'
# Cambiar la fecha de una meta
Invoke-RestMethod "$base/api/goals/1" -Method PATCH -Headers $h `
-ContentType "application/json" -Body '{"date":"2027-04-18"}'
curl
curl -H "Authorization: Bearer nraf_..." https://146-103-48-13.sslip.io/api/state
curl -X POST https://146-103-48-13.sslip.io/api/goals \
-H "Authorization: Bearer nraf_..." -H "Content-Type: application/json" \
-d '{"name":"10K de prueba","date":"2026-12-13","parentId":"1"}'
JavaScript
const res = await fetch('https://146-103-48-13.sslip.io/api/records/2026-11-05', {
method: 'PUT',
headers: { Authorization: 'Bearer nraf_...', 'Content-Type': 'application/json' },
body: JSON.stringify({ status: 'missed', note: 'Trabajo hasta tarde' }),
});
Errores
Si algo falla, la respuesta trae un código HTTP y {"error": "mensaje"}:
400datos no válidos (ej: fecha mal escrita)401falta el token o fue revocado404la meta o el registro no existe500error del servidor