Développeurs
API publique de publication
Importez des contenus, créez des publications et publiez sur Facebook, Instagram, TikTok, LinkedIn, Threads et Pinterest, le tout limité à un produit via une clé API d'espace de travail. La façon recommandée de s'intégrer est l<connectLink>API Connect</connectLink>, une surface plate sur<code>/api/connect/v1</code> que la plupart des outils de programmation peuvent utiliser telle quelle.
Besoin d'un contrôle total, publication explicite, consultation des exécutions, webhooks signés, traitement par lots, paramètres par canal ? L'API avancée /api/public/v1, plus bas, expose tout cela. Les deux partagent la même authentification, les mêmes produits et le même pipeline de publication ; utilisez uniquement ces routes publiques versionnées (les routes internes de l'application nécessitent une authentification utilisateur Firebase et ne font pas partie du contrat public).
Facebook, Instagram et TikTok sont en publication manuelle par défaut via l'API. Ces canaux utilisent par défaut manual_reminder : Markaestro n'appelle pas l'API de la plateforme et place la publication dans la file « À publier ». Envoyez deliveryMode: "direct_publish" pour utiliser l'API officielle. Sur TikTok, la boîte de réception est utilisée par défaut, sauf si settings.postMode vaut direct_post. LinkedIn, Threads et Pinterest publient de façon programmatique par défaut.
Les espaces de travail peuvent avoir plusieurs produits. Chaque clé API est limitée à un produit à sa création, donc les appels ciblent automatiquement ce produit et les demandes pour tout autre produit sont rejetées.
Vous créez un agent IA ?
Commencez plutôt par le guide pour agents IA. Il contient des schémas d'outils prêts à copier-coller, un résumé pour le system prompt, les règles de nouvelle tentative et de gestion des erreurs dont un agent a besoin, et un démarrage rapide en quatre commandes. Votre agent peut aussi lire directement /llms.txt.
Spécification lisible par machine
Chaque endpoint, chaque format de requête et de réponse et chaque code d'erreur, au format OpenAPI 3.1. Générée à partir des schémas que l'API valide, elle ne peut donc pas décrire une API que nous ne servons pas.
/api/connect/v1 que la plupart des outils de programmation peuvent utiliser telle quelle. Elle adapte la convention courante create-upload-url → PUT → post au même espace de travail, à la même authentification, aux mêmes produits et au même pipeline de publication que l'API complète ci-dessous. Configurez l'URL de base du client sur /api/connect et authentifiez-vous avec une clé API d'espace de travail limitée à un produit (permissions posts.read, posts.write, media.write)./api/connect/v1/social-accountsListe les destinations Facebook, Instagram, TikTok et LinkedIn connectées sous forme de comptes à plat, chacun étiqueté avec son produit pour que les clients puissent regrouper et distinguer. Chaque canal a son propre chemin, sans diffusion inter-canaux.
/api/connect/v1/productsListe les marques (nom dans l'API : products) avec leurs comptes connectés imbriqués, un sélecteur centré sur la marque.
/api/connect/v1/media/create-upload-urlRenvoie une URL d'import signée, à usage unique et de courte durée, plus un id de contenu.
<upload_url>Envoie les octets bruts de l'image vers l'URL signée. Aucune clé API nécessaire, la signature autorise la requête.
/api/connect/v1/postsCrée un brouillon par compte sélectionné. Définissez is_draft=false avec scheduled_at pour programmer la livraison ; TikTok utilise la transmission vers la boîte de réception du créateur.
/api/connect/v1/postsListe les publications de l'espace de travail avec statut, texte et URLs de contenu au format plat.
# 1. List connected accounts
curl "$MARKAESTRO_URL/api/connect/v1/social-accounts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
# 2. Request a signed upload url, then PUT the bytes
curl -X POST "$MARKAESTRO_URL/api/connect/v1/media/create-upload-url" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "mime_type": "image/png", "size_bytes": 184320, "name": "slide-1.png" }'
curl -X PUT "<upload_url>" -H "Content-Type: image/png" --data-binary @slide-1.png
# 3. Create a draft post for one or more accounts
curl -X POST "$MARKAESTRO_URL/api/connect/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"caption": "New drop",
"media": ["ast_111", "ast_222"],
"social_accounts": ["prod_123#instagram:instagram:ig_123"]
}'Chaque compte de /social-accounts est étiqueté avec son product, le nom au format API d'une marque (le même compte peut apparaître dans plusieurs marques), et son id encode productId#destinationId, renvoyez-le tel quel dans social_accounts, et la requête se répartit en une publication par compte. Chaque clé est limitée à une marque, donc elle ne voit et ne publie que sur cette marque. Les publications Facebook, Instagram et TikTok sont en publication manuelle, créées comme brouillons et publiées de façon native par le propriétaire de l'espace de travail depuis la file « À publier » de Markaestro, jamais via l'API de la plateforme. LinkedIn, Threads et Pinterest publient de façon programmatique après une action de publication explicite. Le statut d'une publication est l'un de draft, processing, posted ou failed. Facebook, Instagram, LinkedIn, TikTok et Threads sont chacun une destination dédiée propre, publier sur l'un ne se diffuse jamais vers un autre. Suivez l'état de publication via GET /api/connect/v1/posts.
Avancé : API publique complète
La surface complète de /api/public/v1, publication explicite, exécutions asynchrones, webhooks signés, création par lots et paramètres par canal. Utilisez-la lorsque l'API Connect ne suffit pas.
/api/public/v1/productsListe les marques de la clé ainsi que les canaux actuellement disponibles pour chacune.
/api/public/v1/products/:id/destinationsListe les destinations de publication de cette marque, y compris Instagram Login indépendant, page Facebook, Threads, profil ou page LinkedIn, et destinations TikTok connectées.
/api/public/v1/media/upload-sessionsCrée une session d'envoi direct de 15 minutes avec le nom, le type et la taille exacte.
<uploadSession.uploadUrl>Envoie les octets directement au stockage avec le Content-Type renvoyé, sans clé API.
/api/public/v1/media/upload-sessions/:id/finalizeVérifie le type et la taille et renvoie l'actif média ; les sessions terminées peuvent être réessayées.
/api/public/v1/mediaImport multipart de compatibilité. Renvoie un id d'actif et une URL hébergée.
/api/public/v1/postsCrée un brouillon dans l'espace de travail. Facebook, Instagram et TikTok utilisent par défaut la publication manuelle (deliveryMode manual_reminder) ; envoyez deliveryMode direct_publish pour que la publication utilise l'API.
/api/public/v1/postsListe les publications, des plus récentes aux plus anciennes. Filtrez avec ?status=scheduled pour voir ce qui est programmé, et ?productId= pour limiter à une marque. Une clé limitée à une marque est toujours restreinte à sa propre marque et peut omettre productId.
/api/public/v1/posts/:idRenvoie le statut actuel de la publication, le mode de livraison et les résultats de publication.
/api/public/v1/posts/:id/publishMet en file une exécution de publication asynchrone. Les publications manuelles rejoignent la file « À publier » de l'espace de travail pour publication native ; LinkedIn, Threads et Pinterest publient directement ; les publications Meta ayant activé l'option se publient via l'API officielle, et celles de TikTok utilisent la transmission vers la boîte de réception.
/api/public/v1/posts/:idSupprime la publication de Markaestro. Utilise la permission existante posts.write. Renvoie 400 VALIDATION_POST_IS_PUBLISHING pendant qu'une exécution de publication est en cours. Supprimer une publication déjà publiée ne retire pas la copie active sur la plateforme.
/api/public/v1/job-runs/:idRenvoie queued, running, succeeded ou failed.
/api/public/v1/webhook-endpointsEnregistre une destination de webhook, avec un maximum de 25 endpoints actifs par espace.
/api/public/v1/webhook-endpointsListe les destinations de webhook enregistrées pour la portée de cette clé API.
/api/public/v1/webhook-endpoints/:idDésactive une destination de webhook.
curl "$MARKAESTRO_URL/api/public/v1/products" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"destinationId renvoyé lorsqu'un produit a plusieurs destinations, comme un profil LinkedIn plus des pages.curl "$MARKAESTRO_URL/api/public/v1/products/prod_123/destinations" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"# 1. Create a 15-minute upload session
UPLOAD=$(curl -s -X POST "$MARKAESTRO_URL/api/public/v1/media/upload-sessions" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"launch-1.jpg","contentType":"image/jpeg","sizeBytes":184320}')
# 2. PUT bytes directly to uploadSession.uploadUrl with its returned headers
curl -X PUT "<upload_url>" -H "Content-Type: image/jpeg" --data-binary @launch-1.jpg
# 3. Finalize; the response contains asset.id for mediaAssetIds
curl -X POST "$MARKAESTRO_URL/api/public/v1/media/upload-sessions/<session_id>/finalize" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY""deliveryMode": "direct_publish" pour que cette publication utilise l'API officielle.curl -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-001" \
-d '{
"channel": "instagram",
"caption": "Launch day carousel",
"mediaAssetIds": ["ast_123", "ast_124"],
"productId": "prod_123",
"destinationId": "instagram:instagram:ig_123"
}'deliveryMode: "platform_inbox" (ou direct_publish), une publication explicite envoie le brouillon dans la boîte de réception du créateur sur TikTok.curl -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-tt-001" \
-d '{
"channel": "tiktok",
"caption": "Spring drop teaser",
"mediaAssetIds": ["ast_vid_123"],
"productId": "prod_123",
"destinationId": "tiktok:tiktok:tt_open_123"
}'post.action_required ; LinkedIn, Threads, Pinterest et les publications Meta ayant activé l'option se publient directement ; celles de TikTok mettent en file la transmission vers la boîte de réception.curl -X POST "$MARKAESTRO_URL/api/public/v1/posts/pst_123/publish" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Idempotency-Key: publish-001"posts.read et posts.write.# The key is already bound to one brand
curl "$MARKAESTRO_URL/api/public/v1/posts?status=scheduled&limit=100" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
# Cancel one
curl -X DELETE "$MARKAESTRO_URL/api/public/v1/posts/pst_123" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"{
"id": "evt_123",
"type": "post.action_required",
"createdAt": "2026-04-08T18:06:10.000Z",
"workspaceId": "ws_123",
"data": {
"postId": "pst_123",
"channel": "instagram",
"status": "platform_action_required",
"nextAction": "post_manually_from_reminder"
}
}Publications texte seul, image ou vidéo. Jusqu'à 10 images ou 1 vidéo par publication. Publication manuelle par défaut ; publication directe en cas d'activation.
Au moins une image ou vidéo, jusqu'à 10 éléments. Une seule vidéo se publie comme Reel. Publication manuelle par défaut ; publication directe en cas d'activation.
TikTok
Au moins une image ou une vidéo. Jusqu'à 35 images ou 1 vidéo. Publication manuelle par défaut ; les publications activées vont dans la boîte de réception TikTok du créateur, ou directement sur le profil avec postMode direct_post de TikTok.
Texte, image simple, vidéo simple, ou publications multi-images organiques jusqu'à 20 images. Ciblez le profil connecté ou une page gérée.
X
Texte, jusqu'à quatre images, un GIF ou une vidéo. Les contrôles de réponse s'appliquent par publication, et la publication est bloquée lorsque le budget de coûts X de l'espace de travail est épuisé.