Documentación de la API

Cómo empezar

  1. En la web, ve a Mi plan → 🔑 Acceso por API y crea un token. Cópialo: solo se muestra una vez.
  2. Envía el token en cada petición con la cabecera Authorization: Bearer <token>.
  3. 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étodoRutaQué hace
GET/api/stateTodo: plan, metas y registros
PUT/api/stateReemplaza todo (mismo formato que GET). ⚠️ Borra lo que no envíes
GET/api/planPlan semanal
PUT/api/planGuarda el plan semanal
GET/api/goalsLista de metas y sub-metas
GET/api/goals/:idUna meta
POST/api/goalsCrea una meta (o sub-meta con parentId)
PATCH/api/goals/:idCambia name, date, notes y/o achieved
DELETE/api/goals/:idElimina la meta y sus sub-metas
GET/api/records?from=&to=Registros de entrenamientos (filtro de fechas opcional)
GET/api/records/:fechaRegistro de un día
PUT/api/records/:fechaMarca cumplido / no cumplido, notas o un entrenamiento extra
DELETE/api/records/:fechaBorra 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"}: