Objetivo

Suscríbete o cancela la suscripción a los anuncios de release del changelog con una sola llamada al API. El botón Subscribe en /<locale>/changelog (Astro) usa estos endpoints internamente; el mismo flujo está disponible para cualquier cliente autenticado por cookie.

Ambos endpoints requieren autenticación por cookie (app_token). No aceptan API key (es una preferencia por usuario, no una superficie M2M).

Prerrequisitos

  • Sesión de usuario activa (cookie app_token válida) — primero inicia sesión vía /login.
  • La cookie app_csrf se establece en el mismo login y se lee del lado cliente para el header X-CSRF-Token.

Pasos

1. Consulta tu estado de suscripción actual

curl -s -X GET 'https://api.example.com/v1/users/me/changelog/subscribe-status' \
  -H 'Cookie: app_token=<tu-token>'

Respuesta (200):

{
  "data": {
    "type": "changelog_subscription_status",
    "id": "<user_id>",
    "attributes": {
      "subscribed": true,
      "channels": {
        "in_app": true,
        "email": true
      }
    }
  }
}

subscribed es true solo cuando ambos canales están activos. El acoplamiento de los dos canales es intencional — el botón Subscribe es un control agregado todo-o-nada. Si necesitás control canal-por-canal (e.g. solo in-app, sin email), usá la API granular de preferencias de notificación.

2. Activá o desactivá la suscripción

curl -s -X POST 'https://api.example.com/v1/users/me/changelog/subscribe' \
  -H 'Cookie: app_token=<tu-token>; app_csrf=<tu-csrf>' \
  -H 'X-CSRF-Token: <tu-csrf>' \
  -H 'Content-Type: application/json' \
  -d '{"enabled": true}'
  • enabled: true activa AMBAS preferencias changelog.release_published.in_app Y changelog.digest_monthly.email.
  • enabled: false desactiva ambas.
  • La respuesta tiene la misma forma que el endpoint subscribe-status, con subscribed reflejando el nuevo estado.

El toggle es idempotente — llamarlo con el mismo valor que el estado actual es no-op (no se emite evento de auditoría cuando nada cambia).

Errores

StatusCódigoCausa
401unauthorizedCookie faltante o inválida.
401csrf_missing / csrf_mismatchPOST sin header X-CSRF-Token válido.
422invalid_enabledBody sin enabled, o valor no booleano.