AFTERLOG

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=json

API 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.

  • 403App pas encore approuvée, ou clé révoquée.
  • 401x-api-key manquante ou invalide.
  • 429Limite 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|pinned

Forme 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éveloppeur

OAuth 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. 1. Envoyez l'utilisateur vers l'URL d'autorisation avec votre PKCE challenge et les scopes demandés.
  2. 2. L'utilisateur examine et approuve sur Afterlog ; nous le redirigeons vers votre redirect_uri avec un code à usage unique et votre state.
  3. 3. Échangez le code contre des jetons au point de terminaison token, en envoyant votre code_verifier d'origine.
  4. 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.readLire les parcours et journaux de l'utilisateur connecté, y compris privés.
profile.readLire 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.createdUn utilisateur connecté a ajouté un journal (Update) à un parcours.
journey.publishedUn 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.

Afterlog pour les développeurs | Afterlog