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=jsonAPI 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.
403— La app aún no está aprobada, o la clave fue revocada.401— Falta x-api-key o no es válida.429— Lí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|pinnedForma 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 desarrolladorOAuth 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. Envía al usuario a la URL de autorización con tu PKCE challenge y los scopes solicitados.
- 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. Intercambia el code por tokens en el endpoint de token, enviando tu code_verifier original.
- 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.read | Leer los trayectos y registros del usuario conectado, incluidos los privados. |
profile.read | Leer 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=S256Intercambio 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.created | Un usuario conectado añadió un registro (Update) a un trayecto. |
journey.published | Un 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.