AFTERLOG

Afterlog para desarrolladores

Lleva los recorridos de Afterlog a tus apps y servicios.

Widgets embebibles

Coloca un slider Before↔Current o una tarjeta de recorrido en cualquier sitio. Solo recorridos públicos — sin API key.

Vista previa en vivo

Etiqueta de script

Añade el script del SDK y un div marcador; el widget se monta y se ajusta solo.

<script async src="https://afterlog.me/sdk/afterlog.js"></script>
<div data-afterlog-journey="JOURNEY_ID" data-afterlog-theme="light"></div>

iframe directo

Embebe sin JavaScript. Usa theme=light|dark y variant=slider|card.

<iframe
  src="https://afterlog.me/embed/journey/JOURNEY_ID?theme=light&variant=slider"
  width="480" height="520" style="border:0;max-width:100%"
  scrolling="no" loading="lazy" title="Afterlog journey"></iframe>

oEmbed

Pega una URL de recorrido en Slack, WordPress y otras herramientas con oEmbed.

GET https://afterlog.me/api/oembed?url=https://afterlog.me/journey/JOURNEY_ID&format=json

API para partners

Una API REST de solo lectura para socios aprobados. Lleva a tu producto trayectos públicos, tendencias, búsqueda y perfiles.

Autenticación

Envía tu clave en el encabezado x-api-key. Emite claves desde la consola de desarrollador de abajo.

curl https://api.afterlog.me/v1/partner/trending \
  -H "x-api-key: ak_live_..."

Acceso anticipado

La API de socios es por invitación por ahora. Registra una app y la revisamos antes de activar tus claves.

  • 403La app aún no está aprobada, o la clave fue revocada.
  • 401Falta x-api-key o no es válida.
  • 429Límite de solicitudes superado: espera según el encabezado Retry-After y reintenta.

Endpoints

Todas las rutas son relativas a https://api.afterlog.me/v1 y de solo lectura. Tendencias y búsqueda paginan con cursor y nextCursor.

GET /partner/trending?category=&sort=trending|helpful&cursor=&limit=
GET /partner/search?q=&cursor=&limit=
GET /partner/journeys/:id
GET /partner/profiles/:username
GET /partner/profiles/:username/journeys?sort=recent|pinned

Forma de la respuesta

Un trayecto se devuelve como su vista pública: portada, etiquetas, estadísticas y autor. Sin campos privados ni específicos del espectador.

{
  "items": [
    {
      "id": "cmr576hhy000n5s6a1b2c3d4",
      "userId": "cmr4qx8p0000ab12cd34",
      "title": "코 성형 회복 여정",
      "category": "BEAUTY",
      "categoryCustom": null,
      "startDate": "2026-01-15",
      "privacy": "PUBLIC",
      "status": "PUBLISHED",
      "description": "붓기와 회복 과정을 매주 기록합니다.",
      "tags": ["recovery", "beauty"],
      "coverMediaId": "cmr58a4k0001...",
      "coverUrl": "https://disk.afterlog.me/media/.../320.webp",
      "captureSlots": [{ "key": "front", "label": "Front" }, { "key": "side", "label": "Side" }],
      "heroSlot": "front",
      "createdAt": "2026-01-15T09:12:00.000Z",
      "updatedAt": "2026-07-14T02:31:00.000Z",
      "stats": {
        "daysCount": 180, "updatesCount": 12, "viewsCount": 3400,
        "savesCount": 210, "followersCount": 95, "helpfulCount": 88,
        "completedReadsCount": 40, "forksCount": 3, "helpfulnessScore": 0.82
      },
      "owner": {
        "userId": "cmr4qx8p0000ab12cd34", "username": "riah_kim",
        "displayName": "Riah", "avatarMediaId": null,
        "avatarUrl": "https://disk.afterlog.me/media/.../320.webp"
      },
      "trendingScore": 128.4
    }
  ],
  "nextCursor": "eyJjIjoiMjAyNi0wNy0xNCJ9"
}

¿Listo para construir? Registra una app y emite tu primera clave.

Abrir consola de desarrollador

OAuth para datos de usuario

Permite que los usuarios conecten su cuenta de Afterlog para que tu app lea sus trayectos —incluidos los privados— en su nombre. Authorization Code + PKCE (S256).

Flujo

  1. 1. Envía al usuario a la URL de autorización con tu PKCE challenge y los scopes solicitados.
  2. 2. El usuario revisa y aprueba en Afterlog; lo redirigimos de vuelta a tu redirect_uri con un code de un solo uso y tu state.
  3. 3. Intercambia el code por tokens en el endpoint de token, enviando tu code_verifier original.
  4. 4. Llama a la API de socios con Authorization: Bearer <access_token>. Los tokens de acceso duran 1 hora; usa refresh para rotarlos.

Scopes

journeys.readLeer los trayectos y registros del usuario conectado, incluidos los privados.
profile.readLeer el perfil público del usuario conectado.

URL de autorización

Redirige el navegador aquí. El redirect_uri debe coincidir exactamente con uno registrado en tu app, y se requiere PKCE con method=S256.

https://afterlog.me/oauth/authorize?response_type=code
  &client_id=YOUR_APP_ID
  &redirect_uri=https://your.app/callback
  &scope=journeys.read%20profile.read
  &state=RANDOM_CSRF
  &code_challenge=BASE64URL_SHA256_OF_VERIFIER
  &code_challenge_method=S256

Intercambio de token

Intercambia el code por un token de acceso + refresh. Los clientes confidenciales también envían client_secret.

curl -X POST https://api.afterlog.me/v1/oauth/token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "authorization_code",
    "client_id": "YOUR_APP_ID",
    "code": "<code from redirect>",
    "redirect_uri": "https://your.app/callback",
    "code_verifier": "<original PKCE verifier>"
  }'

Uso del token

Envía el token de acceso como cabecera Bearer en las lecturas de la API de socios. Con journeys.read se incluyen los trayectos privados del usuario conectado.

curl https://api.afterlog.me/v1/partner/journeys/JOURNEY_ID \
  -H "Authorization: Bearer <access_token>"

Webhooks

Recibe avisos cuando un usuario conectado añade un registro o publica un trayecto. Los payloads son señales ligeras: obtén los detalles desde la API de socios.

Gestionar endpoints

Registra, lista y elimina endpoints por app en la consola de desarrollador. El secret de firma se muestra una vez al crearlo. Las URLs deben ser https y no apuntar a hosts privados.

Eventos

journey.update.createdUn usuario conectado añadió un registro (Update) a un trayecto.
journey.publishedUn usuario conectado publicó un trayecto.

Payload

Cada entrega tiene un id único (úsalo para idempotencia), un evento, una marca de tiempo y un objeto data ligero.

{
  "id": "whd_5f3a1c...",                     // 배달 고유 id (수신측 idempotency 키)
  "event": "journey.update.created",
  "createdAt": "2026-07-19T09:00:00.000Z",
  "data": {
    "journeyId": "jr_...", "updateId": "up_...",
    "username": "riah", "title": "코 성형 회복 여정"
  }
}

Verificar la firma

Cada petición lleva X-Afterlog-Signature: t=<unix>,v1=<hex>, donde v1 = HMAC-SHA256 de "<t>.<cuerpo crudo>". Recalcula sobre el cuerpo crudo y compara en tiempo constante.

// header: X-Afterlog-Signature: t=<unix>,v1=<hex>
const [t, v1] = header.split(',').map((s) => s.split('=')[1]);
const expected = crypto
  .createHmac('sha256', secret)                // secret = whsec_...
  .update(`${t}.${rawBody}`)                   // 받은 원문 바디 그대로 사용
  .digest('hex');
const ok = crypto.timingSafeEqual(
  Buffer.from(expected), Buffer.from(v1),
);
// t 가 최근(±5분)인지도 확인해 재전송(replay)을 막는다.

Reintentos y desactivación automática

Un 2xx es éxito. Los fallos y timeouts (10 s) se reintentan hasta 3 veces. Tras 10 fallos acumulados el endpoint se desactiva automáticamente; vuelve a crearlo para reactivarlo.

Afterlog para desarrolladores | Afterlog