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_id | Identifiant public de ton app (ex. swlv_a1b2c3…). |
| client_secret | Secret, affiché une seule fois. À garder côté serveur, jamais dans le navigateur. |
L'URL de callback (redirect_uri)
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=xyzTrois 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_urienvoyé 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
- 1L’utilisateur clique « Importer mes activités Sweliv » sur ton app.
- 2Tu le rediriges vers l’écran de consentement Sweliv.
- 3Il se connecte (Google / Apple / email) et autorise.
- 4Sweliv le renvoie sur ton callback avec un code à usage unique.
- 5Ton serveur échange ce code contre un access token.
- 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=S256Aprè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/activities | Liste paginée des activités de l’utilisateur. |
| GET /api/v1/activities/:id | Détail d’une activité (même forme). |
L'objet Activity
| id | Identifiant unique. |
| sport | RUN, CYCLING, GYM, TENNIS, PADEL, SWIMMING, TRIATHLON. |
| status | Toujours COMPLETED (activités en cours non exposées). |
| startedAt | Début (ISO 8601, UTC). |
| endedAt | Fin (ISO 8601) ou null. |
| distanceMeters | Distance en mètres (entier). |
| durationSeconds | Durée en secondes (entier). |
| title | Titre donné par l’utilisateur, ou null. |
| description | Description libre, ou null. |
| group | { id, name } du groupe associé, ou null. |
Scopes
| activities:read | Lire la liste et le détail des activités. (Seul scope disponible aujourd’hui.) |
Erreurs & limites
| 429 | Rate limit : 120 req / min / token. Réessaie après le délai indiqué. |
| 401 | Token manquant, expiré ou révoqué — rafraîchis-le. |
| 403 | Scope insuffisant pour l’endpoint. |
| 404 | Activité inexistante ou d’un autre utilisateur (non distingué, par confidentialité). |
| 400 | Requê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