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": "[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"
}
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": "[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"
    }
}
GET /api/auth/me Authentification requise

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.

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, 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
    }
}
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
    }
}

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"
    }
}
GET /api/pinterest/accounts/{pageId}/boards Authentification requise

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

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