Afterlog pour les développeurs
Intégrez les parcours Afterlog dans vos apps et services.

Widgets intégrables
Placez un curseur Before↔Current ou une carte de parcours sur n’importe quel site. Parcours publics uniquement — sans clé API.
Aperçu en direct
Balise script
Ajoutez le script du SDK et un div d’emplacement ; le widget se monte et se redimensionne tout seul.
<script async src="https://afterlog.me/sdk/afterlog.js"></script>
<div data-afterlog-journey="JOURNEY_ID" data-afterlog-theme="light"></div>iframe direct
Intégrez sans JavaScript. Utilisez theme=light|dark et 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
Collez une URL de parcours dans Slack, WordPress et autres outils compatibles oEmbed.
GET https://afterlog.me/api/oembed?url=https://afterlog.me/journey/JOURNEY_ID&format=jsonAPI partenaires
Une API REST en lecture seule pour les partenaires approuvés. Intégrez les parcours publics, les tendances, la recherche et les profils à votre produit.
Authentification
Envoyez votre clé dans l’en-tête x-api-key. Générez des clés depuis la console développeur ci-dessous.
curl https://api.afterlog.me/v1/partner/trending \
-H "x-api-key: ak_live_..."Accès anticipé
L’API partenaire est sur invitation pour l’instant. Enregistrez une app, puis nous l’examinons avant d’activer vos clés.
403— App pas encore approuvée, ou clé révoquée.401— x-api-key manquante ou invalide.429— Limite de requêtes dépassée — attendez selon l’en-tête Retry-After, puis réessayez.
Points de terminaison
Tous les chemins sont relatifs à https://api.afterlog.me/v1 et en lecture seule. Les tendances et la recherche paginent via cursor et 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|pinnedForme de la réponse
Un parcours est renvoyé sous sa vue publique — couverture, tags, statistiques et auteur. Aucun champ privé ni propre au lecteur.
{
"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"
}Prêt à créer ? Enregistrez une app et générez votre première clé.
Ouvrir la console développeurOAuth pour les données utilisateur
Laissez les utilisateurs connecter leur compte Afterlog pour que votre app lise leurs parcours — y compris privés — en leur nom. Authorization Code + PKCE (S256).
Déroulé
- 1. Envoyez l'utilisateur vers l'URL d'autorisation avec votre PKCE challenge et les scopes demandés.
- 2. L'utilisateur examine et approuve sur Afterlog ; nous le redirigeons vers votre redirect_uri avec un code à usage unique et votre state.
- 3. Échangez le code contre des jetons au point de terminaison token, en envoyant votre code_verifier d'origine.
- 4. Appelez l'API partenaire avec Authorization: Bearer <access_token>. Les jetons d'accès durent 1 heure ; utilisez refresh pour les faire tourner.
Scopes
journeys.read | Lire les parcours et journaux de l'utilisateur connecté, y compris privés. |
profile.read | Lire le profil public de l'utilisateur connecté. |
URL d'autorisation
Redirigez le navigateur ici. Le redirect_uri doit correspondre exactement à un URI enregistré sur votre app, et PKCE avec method=S256 est requis.
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Échange de jeton
Échangez le code contre un jeton d'accès + refresh. Les clients confidentiels envoient aussi 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>"
}'Utiliser le jeton
Envoyez le jeton d'accès en en-tête Bearer sur les lectures de l'API partenaire. Avec journeys.read, les parcours privés de l'utilisateur connecté sont inclus.
curl https://api.afterlog.me/v1/partner/journeys/JOURNEY_ID \
-H "Authorization: Bearer <access_token>"Webhooks
Soyez notifié quand un utilisateur connecté ajoute un journal ou publie un parcours. Les charges utiles sont des signaux légers — récupérez les détails via l'API partenaire.
Gérer les points de terminaison
Enregistrez, listez et supprimez les points de terminaison par app dans la console développeur. Le secret de signature est affiché une seule fois à la création. Les URL doivent être en https et ne pas pointer vers un hôte privé.
Événements
journey.update.created | Un utilisateur connecté a ajouté un journal (Update) à un parcours. |
journey.published | Un utilisateur connecté a publié un parcours. |
Charge utile
Chaque livraison a un id unique (à utiliser pour l'idempotence), un événement, un horodatage et un objet data léger.
{
"id": "whd_5f3a1c...", // 배달 고유 id (수신측 idempotency 키)
"event": "journey.update.created",
"createdAt": "2026-07-19T09:00:00.000Z",
"data": {
"journeyId": "jr_...", "updateId": "up_...",
"username": "riah", "title": "코 성형 회복 여정"
}
}Vérifier la signature
Chaque requête porte X-Afterlog-Signature: t=<unix>,v1=<hex>, où v1 = HMAC-SHA256 de "<t>.<corps brut>". Recalculez sur le corps brut et comparez en temps constant.
// 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)을 막는다.Nouvelles tentatives et désactivation automatique
Un 2xx est un succès. Les échecs et délais (10 s) sont réessayés jusqu'à 3 fois. Après 10 échecs cumulés, le point de terminaison est désactivé automatiquement ; recréez-le pour le réactiver.