Aller au contenu principal

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"
GET /api/auth/validate Authentification requise

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

POST /api/auth/register Authentification requise

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": "utilisateur@example.com",
    "language": "fr"
  }'

Reponse

201 Created
{
    "success": true,
    "user": {
        "id": 123,
        "email": "utilisateur@example.com",
        "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"
}
GET /api/auth/user/{id} Authentification requise

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": "utilisateur@example.com",
        "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"
    }
}
GET /api/auth/user/{id}/oauth-url Authentification requise

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..."
}
Note: L'URL OAuth est valide pendant 24 heures. Apres expiration, generez-en une nouvelle avec cet endpoint.

OAuth - Connexion des comptes sociaux

Les endpoints OAuth permettent aux utilisateurs de connecter leurs comptes de reseaux sociaux. Le flux typique est le suivant:

  1. Creez un utilisateur via POST /api/auth/register pour obtenir une oauth_url
  2. Redirigez l'utilisateur vers cette URL
  3. L'utilisateur choisit le reseau social a connecter et s'authentifie
  4. Apres authentification reussie, le compte est lie et l'utilisateur voit une page de confirmation
Reseaux sociaux supportes via l'API OAuth:
  • 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)
Google My Business : la publication vers Google My Business est supportee par 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.
GET /api/auth/connect/{token}

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)
Important: Ce endpoint retourne une page HTML, pas du JSON. Redirigez l'utilisateur vers cette URL dans son navigateur.

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

POST /api/post Authentification requise

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
plannedAt requis string Date/heure de publication (format ISO 8601)
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), 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

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,
    "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
    }
}
Note: Lorsque 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
    }
}

Contraintes par plateforme

Instagram: Les posts Instagram necessitent obligatoirement au moins une image ou video dans imagePosts. Un post sans media sera rejete avec une erreur 400.
LinkedIn: Les videos LinkedIn doivent etre au format .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