Documentation

API développeurs Sweliv

Authentifie tes utilisateurs avec « Se connecter avec Sweliv » et récupère leurs activités sportives. API en lecture seule, protégée par OAuth 2.0 (Authorization Code + PKCE).

Introduction

L'API Sweliv permet à ton application d'importer les activités d'un utilisateur, avec son consentement explicite. Le mécanisme est un OAuth 2.0 standard, identique à « Se connecter avec Strava / Google ».

  • Flux : Authorization Code + PKCE (méthode S256, obligatoire).
  • Scope : activities:read (lecture seule).
  • Tokens : access token (1 h) + refresh token (60 jours, rotatif).
  • Base URL API : https://api.sweliv.com

Avant de commencer

Demande tes identifiants à l'équipe Sweliv (support@sweliv.com) en fournissant le nom de ton app et ta/tes URL(s) de callback. Tu recevras :

client_idIdentifiant public de ton app (ex. swlv_a1b2c3…).
client_secretSecret, affiché une seule fois. À garder côté serveur, jamais dans le navigateur.

L'URL de callback (redirect_uri)

C'est la page de TON application où Sweliv renvoie l'utilisateur une fois qu'il a cliqué « Autoriser ».

Tu choisis librement son chemin — par exemple https://ton-app.com/auth/sweliv/callback. C'est une route que tu codes dans ton app pour récupérer le code renvoyé par Sweliv :

https://ton-app.com/auth/sweliv/callback?code=ABC123&state=xyz

Trois choses à retenir :

  • C'est toi qui la définis, puis tu nous la communiques pour qu'on l'enregistre. On ne l'invente pas pour toi.
  • Match exact obligatoire : le redirect_uri envoyé dans chaque requête doit être byte-for-byte celui enregistré (sécurité anti-interception).
  • Tu peux en enregistrer plusieurs (ex. une de prod, une de test http://localhost:3000/callback).

Aperçu du flux

  1. 1L’utilisateur clique « Importer mes activités Sweliv » sur ton app.
  2. 2Tu le rediriges vers l’écran de consentement Sweliv.
  3. 3Il se connecte (Google / Apple / email) et autorise.
  4. 4Sweliv le renvoie sur ton callback avec un code à usage unique.
  5. 5Ton serveur échange ce code contre un access token.
  6. 6Tu appelles l’API avec ce token et tu importes ses activités.

1 · Autorisation (PKCE + redirection)

Génère un code_verifier aléatoire, calcule son code_challenge = base64url(sha256(verifier)), garde le verifier en session, puis redirige l'utilisateur :

// Node.js
import crypto from 'node:crypto';

const verifier  = crypto.randomBytes(32).toString('base64url');
const challenge = crypto.createHash('sha256')
                        .update(verifier).digest('base64url');
// → stocke `verifier` en session (requis à l'étape 2)

GEThttps://sweliv.com/oauth/authorize

https://sweliv.com/oauth/authorize
  ?response_type=code
  &client_id=swlv_xxx
  &redirect_uri=https://ton-app.com/auth/sweliv/callback
  &scope=activities:read
  &state=<aléatoire-anti-CSRF>
  &code_challenge=<base64url(sha256(verifier))>
  &code_challenge_method=S256

Après autorisation, Sweliv redirige vers ton callback avec ?code=…&state=…. Vérifie que le state correspond à celui envoyé.

2 · Échange du code contre un token

Dans le handler de ton callback, côté serveur :

POSThttps://api.sweliv.com/oauth/token

POST /oauth/token   (Content-Type: application/json)
{
  "grant_type":    "authorization_code",
  "client_id":     "swlv_xxx",
  "client_secret": "<si app confidentielle>",
  "code":          "ABC123",
  "redirect_uri":  "https://ton-app.com/auth/sweliv/callback",
  "code_verifier": "<le verifier de l'étape 1>"
}

Réponse :

{
  "access_token":  "...",
  "refresh_token": "...",
  "token_type":    "Bearer",
  "expires_in":    3600,
  "scope":         "activities:read"
}

3 · Appeler l'API

Passe l'access token dans l'en-tête Authorization: Bearer <token>. Les données sont automatiquement limitées à l'utilisateur qui a autorisé.

GEThttps://api.sweliv.com/api/v1/activities

GET /api/v1/activities?limit=30&cursor=<id>
Authorization: Bearer <access_token>

{
  "data": [
    {
      "id": "ckxy...",
      "sport": "RUN",
      "status": "COMPLETED",
      "startedAt": "2026-05-30T07:12:00.000Z",
      "endedAt": "2026-05-30T07:58:21.000Z",
      "distanceMeters": 10240,
      "durationSeconds": 2781,
      "title": "Tempo run",
      "description": null,
      "group": { "id": "ckg...", "name": "Run Club Paris" }
    }
  ],
  "nextCursor": "ckxw..."
}

Pagination par curseur : repasse nextCursor dans ?cursor=. null = fin de liste. limit de 1 à 100 (défaut 30).

4 · Rafraîchir le token

Quand l'access token expire (401), échange le refresh token. Il est rotatif : chaque rafraîchissement en renvoie un nouveau et invalide l'ancien — stocke toujours le dernier reçu.

POST /oauth/token   (Content-Type: application/json)
{
  "grant_type":    "refresh_token",
  "client_id":     "swlv_xxx",
  "client_secret": "<si app confidentielle>",
  "refresh_token": "<le refresh token>"
}

Référence des endpoints

GET /oauth/authorizeÉcran de consentement (sur sweliv.com).
POST /oauth/tokenÉchange de code + rafraîchissement (api.sweliv.com).
GET /api/v1/activitiesListe paginée des activités de l’utilisateur.
GET /api/v1/activities/:idDétail d’une activité (même forme).

L'objet Activity

idIdentifiant unique.
sportRUN, CYCLING, GYM, TENNIS, PADEL, SWIMMING, TRIATHLON.
statusToujours COMPLETED (activités en cours non exposées).
startedAtDébut (ISO 8601, UTC).
endedAtFin (ISO 8601) ou null.
distanceMetersDistance en mètres (entier).
durationSecondsDurée en secondes (entier).
titleTitre donné par l’utilisateur, ou null.
descriptionDescription libre, ou null.
group{ id, name } du groupe associé, ou null.

Scopes

activities:readLire la liste et le détail des activités. (Seul scope disponible aujourd’hui.)

Erreurs & limites

429Rate limit : 120 req / min / token. Réessaie après le délai indiqué.
401Token manquant, expiré ou révoqué — rafraîchis-le.
403Scope insuffisant pour l’endpoint.
404Activité inexistante ou d’un autre utilisateur (non distingué, par confidentialité).
400Requête invalide (PKCE, code expiré/réutilisé, redirect_uri non correspondant…).

FAQ

C'est quoi l'URL de callback ?

La page de ton app où Sweliv renvoie l'utilisateur après autorisation, avec le code dans l'URL. Tu en choisis le chemin, et tu nous la communiques pour qu'on l'enregistre. Voir la section « L'URL de callback ».

Mes utilisateurs Google / Apple peuvent-ils se connecter ?

Oui. L'écran de consentement gère Google, Apple et email/mot de passe — toutes les méthodes d'inscription Sweliv.

Le client_secret est-il obligatoire ?

Pour une app avec backend (confidentielle), oui. Pour une SPA / app mobile (publique), non : PKCE seul suffit. Précise-le à l'enregistrement.

Puis-je écrire / créer des activités via l'API ?

Non, l'API est en lecture seule pour l'instant (scope activities:read uniquement).


Une question ? support@sweliv.com