API Documentation
Version 1.2 - Avril 2026
Authentification
L'API utilise une authentification par clef API. Incluez votre clef API dans l'en-tete X-Api-Key de chaque requete.
curl -X GET "https://plus-tard.com/api/auth/validate" \ -H "X-Api-Key: votre_clef_api"
Valide une clef API et retourne ses informations.
Headers
| Nom | Type | Description |
|---|---|---|
X-Api-Key requis |
string | Votre clef API |
Reponse
200 OK { "valid": true, "api_key": { "created_at": "2026-01-01T12:00:00+00:00", "expires_at": "2027-01-01T12:00:00+00:00", "last_used_at": "2026-01-28T10:30:00+00:00" } }
Gestion des utilisateurs
Cree un nouvel utilisateur et retourne une URL pour connecter ses comptes sociaux.
Corps de la requete
| Parametre | Type | Description |
|---|---|---|
email optionnel |
string | Adresse email de l'utilisateur |
language optionnel |
string | Langue preferee (fr, en). Defaut: fr |
Exemple de requete
curl -X POST "https://plus-tard.com/api/auth/register" \
-H "X-Api-Key: votre_clef_api" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"language": "fr"
}'
Reponse
201 Created { "success": true, "user": { "id": 123, "email": "[email protected]", "language": "fr", "is_subscribed": true }, "oauth_url": "https://plus-tard.com/api/auth/connect/eyJ..." }
Erreurs possibles
400 Bad Request - Email invalide { "success": false, "error": "invalid_email", "error_description": "The provided email address is not valid" } 409 Conflict - Email deja utilise { "success": false, "error": "email_exists", "error_description": "A user with this email already exists" }
Recupere les informations d'un utilisateur par son ID, incluant ses comptes sociaux connectes.
Parametres de l'URL
| Parametre | Type | Description |
|---|---|---|
id requis |
integer | ID de l'utilisateur |
Reponse
200 OK { "success": true, "user": { "id": 123, "email": "[email protected]", "language": "fr", "is_subscribed": true, "providers": [ { "id": 1, "provider": "facebook", "providerId": "10225678901234567", "username": "John Doe", "accounts": [ { "id": "123456789", "name": "Ma Page Facebook", "type": "page" } ] }, { "id": 2, "provider": "linkedin", "providerId": "urn:li:person:AbCdEf123", "username": "John Doe", "accounts": [] } ], "created_at": "2026-01-01T12:00:00+00:00", "updated_at": "2026-01-28T10:30:00+00:00" } }
Recupere l'utilisateur proprietaire de la cle API, avec ses comptes sociaux connectes. La reponse a le meme format que /api/auth/user/{id}, sans avoir besoin de connaitre son ID.
Genere une nouvelle URL OAuth pour permettre a un utilisateur existant de connecter des comptes sociaux supplementaires.
Parametres de l'URL
| Parametre | Type | Description |
|---|---|---|
id requis |
integer | ID de l'utilisateur |
Reponse
200 OK { "success": true, "user_id": 123, "oauth_url": "https://plus-tard.com/api/auth/connect/eyJ..." }
OAuth - Connexion des comptes sociaux
Les endpoints OAuth permettent aux utilisateurs de connecter leurs comptes de reseaux sociaux. Le flux typique est le suivant:
- Creez un utilisateur via
POST /api/auth/registerpour obtenir uneoauth_url - Redirigez l'utilisateur vers cette URL
- L'utilisateur choisit le reseau social a connecter et s'authentifie
- Apres authentification reussie, le compte est lie et l'utilisateur voit une page de confirmation
- Facebook - Pages et profils
- Instagram - Comptes professionnels (connectes via Facebook)
- LinkedIn - Profils personnels et pages entreprise
- Twitter/X - Comptes utilisateur
- TikTok - Comptes createur
- Threads - Comptes utilisateur
- Bluesky - Comptes utilisateur (via mot de passe d'application)
POST /api/post (provider google), mais la connexion du compte Google n'est pas encore exposee via l'API publique. Elle se fait pour l'instant depuis l'interface web, dans les parametres du compte utilisateur.
Page de connexion OAuth. Affiche les boutons pour connecter les differents reseaux sociaux.
Parametres de l'URL
| Parametre | Type | Description |
|---|---|---|
token requis |
string | Token signe identifiant l'utilisateur (valide 24h) |
Callbacks OAuth
Ces endpoints sont appeles automatiquement par les plateformes sociales apres l'authentification. Ils ne doivent pas etre appeles directement.
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/auth/facebook/callback |
Callback Facebook OAuth |
| GET | /api/auth/linkedin/callback |
Callback LinkedIn (profil personnel) |
| GET | /api/auth/linkedin-pro/callback |
Callback LinkedIn (page entreprise) |
| GET | /api/auth/twitter/callback |
Callback Twitter/X OAuth |
| GET | /api/auth/tiktok/callback |
Callback TikTok OAuth |
| GET | /api/auth/threads/callback |
Callback Threads OAuth |
| POST | /api/auth/bluesky/connect |
Connexion Bluesky (via mot de passe d'application) |
Gestion des posts
Cree un nouveau post programme pour publication sur un reseau social.
Corps de la requete
| Parametre | Type | Description |
|---|---|---|
provider requis |
string | Plateforme cible: facebook, instagram, linkedin, twitter, tiktok, threads, bluesky, google, pinterest |
plannedAt requis |
string | Date/heure de publication (format ISO 8601). Le décalage est respecté : 2026-02-01T14:00:00Z (UTC) part à 15h00 heure de Paris. Sans décalage, l'heure est lue comme heure de Paris. |
pageId requis |
string | ID du compte cible sur le reseau social. Pour les providers avec sous-comptes (Facebook, Instagram), utilisez le champ id du sous-compte dans accounts. Pour les autres providers (Twitter, LinkedIn, Threads, TikTok, Bluesky, Google, Pinterest), utilisez le champ providerId retourne par GET /api/auth/user/{id}. |
text optionnel |
string | Texte du post |
imagePosts optionnel |
array | Liste d'URLs d'images ou videos. Chaque element peut etre une chaine (URL) ou un objet {"path": "URL", "isStory": false}. Le champ isStory permet de publier en story (Instagram). |
tiktokParams optionnel |
object | Parametres specifiques TikTok |
twitterParams optionnel |
object | Parametres specifiques Twitter |
instagramParams optionnel |
object | Parametres specifiques Instagram : {"shareToFeed": true}. Voir ci-dessous. |
pinterestParams requis pour Pinterest |
object | Options du Pin : {"boardId": "…", "title": "…", "link": "…", "altText": "…"}. Voir ci-dessous. |
Exemple de requete
curl -X POST "https://plus-tard.com/api/post" \
-H "X-Api-Key: votre_clef_api" \
-H "Content-Type: application/json" \
-d '{
"provider": "facebook",
"plannedAt": "2026-02-01T14:00:00Z",
"pageId": "123456789",
"text": "Mon nouveau post programme via l API!",
"imagePosts": [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg"
]
}'
Reponse
201 Created { "success": true, "post_id": 456, "plannedAt": "2026-02-01T15:00:00+01:00", "message": "Post created successfully" }
Erreurs possibles
400 Bad Request - Champs manquants { "error": "Missing required fields", "missing_fields": ["provider", "plannedAt"] } 400 Bad Request - Format de date invalide { "error": "Invalid date format for plannedAt. Expected ISO 8601 format (e.g., 2024-01-01T12:00:00Z)" }
Parametres Twitter/X
Pour les posts Twitter/X, vous pouvez specifier des parametres supplementaires pour creer des threads:
| Parametre | Type | Description |
|---|---|---|
is_thread |
boolean | Active le mode thread. Le texte sera automatiquement decoupe en plusieurs tweets. Defaut: false |
max_chars_per_tweet |
integer | Nombre maximum de caracteres par tweet dans un thread. Defaut: 280 |
{
"twitterParams": {
"is_thread": true,
"max_chars_per_tweet": 280
}
}
is_thread est active, le texte du post sera automatiquement divise en plusieurs tweets en respectant la limite de caracteres. Les medias (images/videos) seront attaches au premier tweet du thread.
Parametres TikTok
Pour les posts TikTok, vous pouvez specifier des parametres supplementaires:
| Parametre | Type | Description |
|---|---|---|
privacy_level |
string | Niveau de confidentialite: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY |
disable_comment |
boolean | Desactive les commentaires. Defaut: false |
disable_duet |
boolean | Desactive les duos. Defaut: false |
disable_stitch |
boolean | Desactive le stitch. Defaut: false |
brand_organic_toggle |
boolean | Indique un contenu promotionnel organique. Defaut: false |
brand_content_toggle |
boolean | Indique un partenariat de marque. Defaut: false |
{
"tiktokParams": {
"privacy_level": "PUBLIC_TO_EVERYONE",
"disable_comment": false,
"disable_duet": false,
"disable_stitch": false,
"brand_organic_toggle": false,
"brand_content_toggle": false
}
}
Parametres Instagram (instagramParams)
| Parametre | Type | Description |
|---|---|---|
shareToFeed |
boolean | Reels uniquement (un seul media video, hors story). true : le Reel apparait dans l'onglet Reels et dans le fil du profil. false : uniquement dans l'onglet Reels. Ignore pour les images, carrousels et stories. Defaut: true |
{
"instagramParams": {
"shareToFeed": false
}
}
Parametres Pinterest (pinterestParams)
Le champ text du post devient la description du Pin (800 caracteres maximum).
| Parametre | Type | Description |
|---|---|---|
boardId requis |
string | Tableau ou publier le Pin, a choisir parmi ceux renvoyes par GET /api/pinterest/accounts/{pageId}/boards |
title |
string | Titre du Pin (100 caracteres maximum) |
link |
string | Lien de destination du Pin (URL http(s)) |
altText |
string | Texte alternatif de l'image (500 caracteres maximum) |
{
"provider": "pinterest",
"pageId": "1234567890",
"plannedAt": "2026-11-05T10:00:00Z",
"text": "Notre nouvelle collection d'automne",
"imagePosts": ["https://example.com/pin.jpg"],
"pinterestParams": {
"boardId": "987654321",
"title": "Collection automne",
"link": "https://example.com/automne"
}
}
Liste les tableaux du compte Pinterest {pageId} (son providerId), lus en direct chez Pinterest. Reponse : {"success": true, "boards": [{"id": "…", "name": "…", "privacy": "PUBLIC"}]}. Erreurs : 404 si le compte n'est pas connecte a la clef API, 409 s'il doit etre reconnecte, 502 si Pinterest ne repond pas.
Contraintes par plateforme
imagePosts. Un post sans media sera rejete avec une erreur 400.
pinterestParams.boardId et 1 image (ou un carrousel de 2 a 5 images) en URL https publique. Les videos ne sont pas encore prises en charge. Un Pin invalide est rejete avec une erreur 400 dont details liste les problemes.
.mp4 uniquement. Les autres formats video (mov, avi, mkv, etc.) seront rejetes avec une erreur 400.
Formats de medias supportes
| Type | Extensions |
|---|---|
| Images | jpg, jpeg, png, gif, webp |
| Videos | mp4, mov, avi, mkv, webm, flv, wmv |
Codes d'erreur
| Code HTTP | Description |
|---|---|
| 200 | Requete reussie |
| 201 | Ressource creee avec succes |
| 400 | Requete invalide (parametres manquants ou incorrects) |
| 401 | Authentification requise ou clef API invalide |
| 403 | Acces refuse (l'utilisateur demande n'appartient pas a votre compte) |
| 404 | Ressource non trouvee |
| 409 | Conflit (ex: email deja utilise) |
| 500 | Erreur serveur interne |
Format des erreurs
Toutes les erreurs suivent un format standardise:
{
"success": false,
"error": "error_code",
"error_description": "Description lisible de l'erreur"
}
Codes d'erreur specifiques
| Code | Description |
|---|---|
missing_api_key |
L'en-tete X-Api-Key est manquant |
invalid_api_key |
La clef API est invalide ou expiree |
invalid_email |
L'adresse email fournie n'est pas valide |
email_exists |
Un utilisateur avec cet email existe deja |
user_not_found |
L'utilisateur demande n'existe pas |
access_denied |
Vous n'avez pas la permission d'acceder aux informations de cet utilisateur |
invalid_token |
Le token OAuth est invalide ou expire |
account_already_linked |
Le compte social est deja lie a un autre utilisateur |