REST APIGET

Messages de la boîte de réception

Lisez les conversations de messages privés sur Facebook, Instagram, Bluesky et Mastodon, envoyez des réponses selon les règles de chaque plateforme et marquez les conversations comme traitées.

GEThttps://post.adaptlypost.com/post/api/v1/inbox/conversations

Renvoie les conversations de messages privés, celle qui a le dernier message en premier. Répond { conversations, total, hasMore, nextCursor }.

Clé API (jeton Bearer)
Permission:inbox.readRôles et permissions

Tous les rôles détiennent inbox.read, donc toute clé valide peut lire la boîte de réception.

Paramètres de requête

ParamètreTaperDescription
accountIdsstring[]Uniquement ces comptes, par l'id de GET /social-accounts. Répétez la clé ou séparez les valeurs par des virgules. Jusqu'à 50
platformsPlatformType[]Uniquement ces plateformes. Répétez la clé ou séparez les valeurs par des virgules
statusesInboxStatus[]Uniquement les éléments dans ces états : UNREAD, READ ou DONE. Répétez la clé ou séparez les valeurs par des virgules
sincestring (ISO 8601)Uniquement les éléments créés sur la plateforme à partir de cette date et heure
searchstringTexte à rechercher
limitnumberÉléments par page, de 1 à 100. 25 par défaut
cursorstringLe nextCursor de la page précédente. nextCursor vaut null sur la dernière page

Environ 10 minutes, pas en temps réel

AdaptlyPost lit chaque compte connecté toutes les 10 minutes et garde ce qu'il trouve. Les listes répondent à partir de cette copie, donc un nouveau commentaire, une mention, un message ou un avis apparaît en environ 10 minutes. POST /api/v1/inbox/refresh demande une lecture immédiate. Les événements de webhook viennent des mêmes lectures.

Canaux qui demandent une reconnexion

Tous les canaux sont ouverts à l'API. Quand une connexion n'a pas la permission de la plateforme pour un canal ou une action, y compris les permissions que la plateforme examine encore pour AdaptlyPost, GET /api/v1/inbox/summary affiche le canal en RECONNECT_REQUIRED et chaque écriture sur ce canal répond 403 inbox_reconnect_required. Un jeton expiré répond de la même façon. Demandez à l'utilisateur de reconnecter le compte dans AdaptlyPost ; réessayer ne sert à rien.

Champs d'une conversation

ChampDescription
idId de la conversation. Utilisez-le avec les endpoints ci-dessous
accountIdLe compte auquel appartient l'élément : son id de GET /social-accounts
platformLa plateforme, en PlatformType
accountNameNom affiché de ce compte
participantL'autre personne : id, name, username et avatarUrl
lastMessageTextTexte du dernier message
lastMessageAtDate d'envoi du dernier message
lastMessageIsOwntrue quand votre compte a envoyé le dernier message
statusUNREAD, READ ou DONE. Une conversation passe en UNREAD quand l'autre personne écrit et que personne n'a répondu depuis, donc une réponse envoyée depuis l'application de la plateforme la laisse lue
repliedAtDate de la dernière réponse de votre compte, ou null
replyWindowEndsAtFacebook et Instagram : date de fermeture de la fenêtre de réponse de 24 heures, comptée à partir du dernier message lu par AdaptlyPost. null sur les autres plateformes
maxMessageLengthLe message le plus long que la plateforme accepte dans cette conversation
capabilitiescanReply : false une fois la fenêtre de réponse fermée, ou quand la plateforme ne permet pas au compte d'envoyer

Lire une conversation

GEThttps://post.adaptlypost.com/post/api/v1/inbox/conversations/:id

Renvoie { conversation, messages } : la conversation et les messages qu'AdaptlyPost en a lus. Un id inconnu répond 404 inbox_item_not_found. Chaque message a ces champs :

Clé API (jeton Bearer)
Permission:inbox.readRôles et permissions
ChampDescription
idId du message
isOwntrue quand votre compte l'a envoyé
textLe texte du message
hasAttachmentstrue quand le message contient des images ou des fichiers. L'API renvoie uniquement le texte
createdAtDate d'envoi

Envoyer un message

POSThttps://post.adaptlypost.com/post/api/v1/inbox/conversations/:id/messages

Envoie un message du compte dans la conversation et répond 201 { conversation, message }.

Clé API (jeton Bearer)
Permission:inbox.replyRôles et permissions

Les écritures exigent inbox.reply (Administrateur et Éditeur) et un abonnement AdaptlyPost actif. Sans abonnement, elles répondent 403 subscription_required.

Paramètres du corps

ParamètreTaperDescription
textREQUISstringLe message, jusqu'à maxMessageLength de la conversation

La fenêtre de 24 heures sur Facebook et Instagram

Facebook et Instagram ne laissent une entreprise répondre que dans les 24 heures suivant le dernier message de la personne. L'envoi part quand même vers la plateforme après replyWindowEndsAt, car la personne a peut-être écrit depuis la dernière lecture ; quand la plateforme le refuse, l'appel répond 400 inbox_messaging_window_closed. Les messages Bluesky exigent un mot de passe d'application avec accès aux messages privés.

Marquer comme lu ou traité

POSThttps://post.adaptlypost.com/post/api/v1/inbox/conversations/status

Définit le statut de 100 conversations au plus et répond { conversations, unreadCount }.

Clé API (jeton Bearer)
Permission:inbox.replyRôles et permissions

Paramètres du corps

ParamètreTaperDescription
idsREQUISstring[]De 1 à 100 ids issus de la liste
statusREQUISInboxStatusUNREAD, READ ou DONE

Refus

Un appel refusé répond { statusCode, error, code, message }. Basez-vous sur code. message explique le refus en clair.

CodeStatutQuand, et que faire
inbox_item_not_found404L'id n'existe pas ou appartient à un autre espace de travail. Arrêtez
inbox_action_unsupported400La plateforme, ou cet élément, ne permet pas ce masquage, cette suppression ou ce j'aime. capabilities indique ce qui s'applique. Arrêtez
inbox_reconnect_required403La connexion n'a pas la permission pour ce canal ou cette action, y compris une permission encore en examen par la plateforme, ou son jeton a expiré. Demandez à l'utilisateur de reconnecter le compte dans AdaptlyPost. Ne réessayez pas
inbox_reply_invalid400Le texte est vide ou dépasse la limite. Le message indique la limite. Corrigez le texte
inbox_messaging_window_closed400Facebook ou Instagram : la fenêtre de réponse de 24 heures est passée. Arrêtez
inbox_rate_limited429La plateforme a limité le débit d'AdaptlyPost. Réessayez plus tard
inbox_platform_error503La plateforme a échoué. Réessayez plus tard
permission_denied403Le rôle de la clé n'a pas inbox.read ou inbox.reply. Ne réessayez pas
subscription_required403Une écriture sans abonnement AdaptlyPost actif. Ne réessayez pas
Lister les conversations non lues
curl --request GET \
  --url 'https://post.adaptlypost.com/post/api/v1/inbox/conversations?statuses=UNREAD' \
  --header 'Authorization: Bearer <api-key>'
Lire une conversation
curl --request GET \
  --url https://post.adaptlypost.com/post/api/v1/inbox/conversations/cnv_5d0e7a19 \
  --header 'Authorization: Bearer <api-key>'

200
{
  "conversation": { "id": "cnv_5d0e7a19", "...": "..." },
  "messages": [
    {
      "id": "msg_a1f20c33",
      "isOwn": false,
      "text": "Hi, do you ship to Portugal?",
      "hasAttachments": false,
      "createdAt": "2026-11-08T08:55:02.000Z"
    }
  ]
}
Envoyer un message
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/inbox/conversations/cnv_5d0e7a19/messages \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{ "text": "Yes, delivery to Portugal takes 3 to 5 days." }'
Marquer une conversation comme traitée
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/inbox/conversations/status \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{ "ids": ["cnv_5d0e7a19"], "status": "DONE" }'
200
{
  "conversations": [
    {
      "id": "cnv_5d0e7a19",
      "accountId": "conn_fb_page_001",
      "platform": "FACEBOOK",
      "accountName": "AdaptlyPost",
      "participant": {
        "id": "7230011122233344",
        "name": "João Silva",
        "username": null,
        "avatarUrl": null
      },
      "lastMessageText": "Hi, do you ship to Portugal?",
      "lastMessageAt": "2026-11-08T08:55:02.000Z",
      "lastMessageIsOwn": false,
      "status": "UNREAD",
      "repliedAt": null,
      "replyWindowEndsAt": "2026-11-09T08:55:02.000Z",
      "maxMessageLength": 2000,
      "capabilities": { "canReply": true }
    }
  ],
  "total": 2,
  "hasMore": false,
  "nextCursor": null
}