Help Center Meta- en Instagram API-integratie

Meta- en Instagram API-integratie

Referentie voor het bouwen van een Instagram-app op het SMSBAT ChatHub Platform: authenticatie, Instagram Directe gesprekken, reacties op berichten en reels, verhaalantwoorden, webhooks en polls.

Bronnen

Deze pagina voegt de interne Meta Comments API-specificatie samen met de live OpenAPI definities op https://chatapi.smsbat.com/swagger/v1/swagger.json en https://restapi.smsbat.com/swagger/v1/swagger.json. Waar de twee het niet eens zijn, wordt de Het verschil wordt inline weergegeven en vermeld onder Open vragen.


1. Basis-URL’s

DoelURL
Chat-API + Meta-APIhttps://chatapi.smsbat.com
Swagger-UI / OpenAPIhttps://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json
REST API (organisaties, callback-URL’s)https://restapi.smsbat.com
REST API Swaggerhttps://restapi.smsbat.com/swagger/v1/swagger.json
Webpaneel voor operatorhttps://chat.smsbat.com

2. Authenticatie

Het verificatieschema hangt af van de eindpuntgroep. Het door elkaar halen is de meest voorkomende oorzaak van 401.

GroepKop
chatapi.smsbat.com/api/meta/* (berichten, opmerkingen)X-Authorization-Key: <organization token>
chatapi.smsbat.com/api/chat/*, /api/company/*, /api/operator/*Authorization: Bearer <JWT>
restapi.smsbat.com/*X-Authorization-Key · Authorization: Bearer · Basisverificatie

Het organisatietoken voor X-Authorization-Key wordt uitgegeven in het paneel onder Profiel. Bedrijfs- en operator-JWT’s komen uit /api/company/get-token en /api/operator/get-token.

Discrepantie

Het chatapi OpenAPI-document declareert één enkel beveiligingsschema — Bearer — en past dit toe wereldwijd. X-Authorization-Key wordt daar helemaal niet gedeclareerd, hoewel de interne Meta Opmerkingen De API-specificatie noemt dit /api/meta/*. Het wordt waarschijnlijk afgehandeld door middleware die niet wordt weerspiegeld in Swagger. Bevestig empirisch voordat u verzendt.

2.1 Bedrijfstoken

POST https://chatapi.smsbat.com/api/company/get-token
Content-Type: application/json

{ "login": "company_login", "password": "company_password" }

200 OK retourneert een kale tokenreeks.

2.2 Organisaties

GET https://chatapi.smsbat.com/api/company/organization
Authorization: Bearer <company_token>
[ { "id": 24, "name": "My Instagram Store" } ]

2.3 Operatoren in een organisatie

GET https://chatapi.smsbat.com/api/operator?organizationId=24
Authorization: Bearer <company_token>
[
  {
    "id": 21,
    "name": "Jane Doe",
    "status": 0,
    "organization": { "id": 24, "name": "My Instagram Store" }
  }
]

Operatorstatussen: 0 Actief, 1 Inactief, 2 Verwijderd.

2.4 Operators toevoegen/synchroniseren

POST https://chatapi.smsbat.com/api/operator/synchronize
Authorization: Bearer <company_token>
Content-Type: application/json

[ { "organizationId": 24, "name": "John Operator" } ]

200 OK → [ { "id": 21, "status": 0, "name": "John Operator" } ]

2.5 Operator JWT

POST https://chatapi.smsbat.com/api/operator/get-token
Authorization: Bearer <company_token>
Content-Type: application/json

{ "id": 21, "expiresAt": "2026-12-31T23:59:59.000Z" }

200 OK retourneert de JWT als een tekenreeks.

2.6 Valideer een operatortoken

POST https://chatapi.smsbat.com/api/operator/validate-token
Authorization: Bearer <company_token>
Content-Type: application/json

"eyJhbGciOi..."
{
  "isValid": true,
  "operatorId": 21,
  "clientId": 0,
  "expiresAt": "2026-12-31T23:59:59.000Z",
  "error": null
}

Indien ongeldig: { "isValid": false, "error": "Invalid token" }.

2.7 Sluit het operatorchatpaneel in

<script type="module" id="operator-chat-panel-script"
  src="https://widget.smsbat.com/operator-chat-panel/widget-script.js"
  token="YOUR_OPERATOR_JWT_TOKEN"></script>

Een extern systeem (CRM, ERP, website) kan een specifiek gesprek openen https://chat.smsbat.com/. De operator wordt geautoriseerd door een JWT die als queryparameter wordt doorgegeven.

https://chat.smsbat.com/?chat_raw_id=<chat_id>&token=<jwt>
https://chat.smsbat.com/?phone=<phone>&token=<jwt>
https://chat.smsbat.com/?from=<bm_id>&phone=<phone>&token=<jwt>
https://chat.smsbat.com/?source=7&from=<bm_id>&phone=<phone>&token=<jwt>
ParameterBeschrijving
chat_raw_idChat-ID
phoneTelefoonnummer in internationaal formaat
fromMerk-/bedrijfsaccount-ID (bm_id)
sourceChatbron — 7 voor Instagram, zie §8.1
tokenGeldige, niet-verlopen operator JWT met toegang tot chats

Een ongeldige JWT brengt de bezoeker naar het inlogscherm van het bedieningspaneel.


4. Instagram Directe gesprekken

4.1 Lijst met chats

GET https://chatapi.smsbat.com/api/chat/chats?source=7&page=1&per_page=20
Authorization: Bearer <token>

Note

De paginering is hier per_page (snake_case). Onder /api/meta/* en de polling eindpunt is perPage (camelCase). Dit is geen typefout: de API gebruikt beide.

Queryparameters, allemaal optioneel:

ParameterTypBeschrijving
sourceChatSource7 beperkt de resultaten tot Instagram
entityIdintZakelijk account-ID. Alleen toegepast samen met source
instagram_user_idintInstagram-gebruikers-ID in ChatHub
facebook_user_idintFacebook-gebruikers-ID in ChatHub
page / per_pageintPaginering, standaardwaarden 1 / 20
statusChatStatus[]Chatstatus, herhaalbaar
searchstringZoeken in vrije tekst (naam, telefoon, …)
organizationIdintOrganisatie-ID
operatorIdint[]Filteren op toegewezen operators
datestring[]Twee grenzen: ?date=…&date=…
isChainboolChats retourneren als kettingen, met berichten van eerdere chats
isUnread, starMark, isOperator, isAIAgentboolExtra filters
phone, email, contactId, clientId, tagIds, rate, sortedBy—Andere filters

200 OK retourneert GetChatsResponse:

{
  "total": 1,
  "newMessagesCount": 2,
  "items": [
    {
      "id": 1867,
      "theme": null,
      "messSource": 7,
      "chatStatus": 1,
      "countUnread": 2,
      "metaUserId": "1585775752382460",
      "instaAccount": { "id": 12, "name": "my_instagram_shop", "photo": "https://..." },
      "instagramUser": { "id": 123, "name": "marianna_cat", "photo": "https://..." },
      "operator": { "id": 21, "name": "Jane", "photo": "https://..." },
      "client": { "id": 55, "name": "Marianna", "photo": null },
      "textLastMess": "Hello! Is this product available?",
      "timeLastMess": "2026-08-13T10:15:00Z",
      "authorLastMessage": 1,
      "messageStatus": 6,
      "isMedia": false,
      "phone": null,
      "organizationId": 1,
      "createdAt": "2026-08-13T10:14:00Z",
      "isStarred": false,
      "isBlocked": false,
      "tags": []
    }
  ]
}

De velden die er toe doen voor een Instagram-app:

VeldBetekenis
instaAccountHet Instagram zakelijke account (de winkel). id is de filterwaarde entityId; name is de accountnaam van Meta
instagramUserDe klant. name is de Instagram-handle, id is de instagram_user_id filterwaarde
metaUserIdDe bereik-ID van de klant aan de kant van Meta (tekenreeks)
messSource7 voor Instagram
phoneMeestal null voor Instagram – gebruik het niet als sleutel

ChatDTO bevat ook olxUser, promUser, waba, rozetkaUser, facebookAccount, facebookUser, viberAccount, tgBot, tgUser, viberBot, viberBotUser, widget, media, isConnectedAI, isPromo, rate, rateComment, closedBy, draft, lang, starMark, contactId, contactName, block, isInStopList, stopList, isSmsFallbackEnabled en taggedMessages.

4.2 Chatberichten

GET https://chatapi.smsbat.com/api/chat/chats/1867/messages?isChain=false
Authorization: Bearer <token>

200 OK retourneert een array van ChatMessageDTO:

[
  {
    "id": 9928,
    "chatId": 1867,
    "message": "Hi! Do you have size M in stock?",
    "messageTranslation": null,
    "phone": null,
    "author": 1,
    "source": 7,
    "media": null,
    "replyTo": null,
    "status": 6,
    "date": "2026-08-13T10:14:00Z",
    "operator": null,
    "client": { "id": 123, "name": "marianna_cat", "photo": "https://..." },
    "messageType": 0,
    "isInternal": false,
    "isBroadcast": false,
    "starMark": false,
    "referralGuid": null,
    "postId": null,
    "isConnectedAI": false,
    "organizationId": 1,
    "countUnreadMessages": 0
  }
]

postId wordt ingevuld als het bericht betrekking heeft op een Instagram-bericht of -verhaal: geef het door meteen terug als id / postId naar de Meta API. media is een ChatMediaDTO: { name, format, type, uri, raw, length, isUploaded }.

4.3 Een bericht verzenden (JSON)

POST https://chatapi.smsbat.com/api/chat/1867/message
Authorization: Bearer <token>
Content-Type: application/json

Lichaam — SendChatMessageDTO:

{
  "textMessage": "Hello! Yes, size M is available.",
  "author": 0,
  "isInternal": false,
  "replyToMessageId": 9928,
  "appGuid": "550e8400-e29b-41d4-a716-446655440000",
  "media": {
    "name": "item.jpg",
    "format": "image/jpeg",
    "dataBase64": "/9j/4AAQSkZJRg...",
    "type": 1
  }
}
VeldTypBeschrijving
textMessagestring?Berichttekst. Mag leeg zijn als media aanwezig is
authorAuthorMessage?0 operator, 1 klant
isInternalbool?true markeert een interne notitie die niet bij de klant is afgeleverd
replyToMessageIdint?ID van het bericht waarop wordt gereageerd
appGuiduuid?Verwijzings-GUID
mediaMediaDTO?{ name, format, dataBase64, thumbnail, duration, type }

200 OK → { "id": 9930, "messageStatus": 0 }

Er kan ook een verwijzings-GUID worden doorgegeven in het pad: POST /api/chat/{chatId}/{referralGuid}/message (eveneens …/message/v1, …/message/v2).

4.4 Een bestand of video verzenden (multipart, v2)

POST https://chatapi.smsbat.com/api/chat/1867/message/v2
Authorization: Bearer <token>
Content-Type: multipart/form-data

Formulierveldnamen zijn PascalCase met puntnotatie

textMessage en media.file worden stilzwijgend genegeerd. Gebruik de exacte namen hieronder.

FormulierveldTypBeschrijving
TextMessagestringBerichttekst
Authorint0 operator, 1 klant
IsInternalboolInterne opmerking
ReplyToMessageIdintBericht wordt beantwoord
AppGuiduuidVerwijzings-GUID
Media.FilebinaryHet bestand zelf
Media.NamestringBestandsnaam
Media.FormatstringMIME-type (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeZie §8.5
Media.DataBase64stringAlternatief voor Media.File
Media.ThumbnailstringBase64 videovoorbeeldframe
Media.DurationdoubleVideoduur in seconden
curl -X POST "https://chatapi.smsbat.com/api/chat/1867/message/v2" \
  -H "Authorization: Bearer <token>" \
  -F "TextMessage=Here is the price list" \
  -F "Author=0" \
  -F "Media.Type=2" \
  -F "Media.File=@./price.pdf"

200 OK → { "id": 9931, "messageStatus": 0 }

4.5 Chatstatus wijzigen

PUT https://chatapi.smsbat.com/api/chat/status
Authorization: Bearer <token>
Content-Type: application/json

{ "id": 1867, "status": 4 }

200 OK echoot het bijgewerkte object.

4.6 Berichtstatussen bijwerken

PUT https://chatapi.smsbat.com/api/chat/messages/status
Authorization: Bearer <token>
Content-Type: application/json

{ "status": 3, "messageIds": [9928, 9929] }

4.7 Een chat verwijderen

DELETE https://chatapi.smsbat.com/api/chat/chats/1867
Authorization: Bearer <token>

5. Berichten, rollen en verhalen

Basispad: https://chatapi.smsbat.com/api/meta Authenticatie: X-Authorization-Key: <organization token>

5.1 Lijstposts, rollen en verhalen

GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
ParameterTypVereistBeschrijving
pageintneePagina, standaard 1
perPageintneeItems per pagina, standaard 20
idintneeFilter op interne bericht-ID
platformstringneeinstagram of facebook
mediaTypestringneepost, reel of story. Alle typen indien weggelaten
# Every post
curl -H "X-Authorization-Key: <token>" \
  "https://chatapi.smsbat.com/api/meta/posts?page=1&perPage=10"

# Instagram only
curl -H "X-Authorization-Key: <token>" \
  "https://chatapi.smsbat.com/api/meta/posts?platform=instagram"

# A single post by ID
curl -H "X-Authorization-Key: <token>" \
  "https://chatapi.smsbat.com/api/meta/posts?id=42"

# Instagram Stories only
curl -H "X-Authorization-Key: <token>" \
  "https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story"

200 OK:

{
  "total": 42,
  "items": [
    {
      "id": 42,
      "metaId": "18113450675314072",
      "text": "Check out our new collection!",
      "imageUrl": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-1711-4aa8-b21d-f6dbf8f347ef",
      "platform": "instagram",
      "mediaType": "story",
      "createdAt": "2026-07-22T09:35:30Z",
      "story": {
        "id": 42,
        "metaId": "18113450675314072",
        "url": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-1711-4aa8-b21d-f6dbf8f347ef"
      }
    }
  ]
}

Discrepantie — tellerveldnaam

Het Swagger-schema MetaCommentPostListItemDtoPaginationDTO definieert total. De interne specificatiedocumenten totalCount. Swagger wordt gegenereerd op basis van de code, dus total is de meest waarschijnlijke waarheid. Parseer total ?? totalCount totdat dit is geregeld.

VeldBeschrijving
idInterne post-ID
metaIdExterne post / haspel / verhaal-ID in Meta
textOnderschrift
imageUrlProxymedia-URL gecodeerd met de niet-sequentiële MetaPost.Guid, of null
platformfacebook of instagram
mediaTypepost, reel of story
createdAtAanmaakdatum (platformdatum of databasedatum)
storyPresenteer alleen voor mediaType: "story"
story.idInterne verhaal-ID; gelijk aan post.id
story.metaIdExterne verhaal-ID in Meta
story.urlStabiele proxy-URL van de opgeslagen Story-media; null als de media niet konden worden opgeslagen

Postmedia worden bediend via twee routes: GET /api/meta/post/media/{id:int} voor achteruit compatibiliteit en GET /api/meta/post/media/{guid:guid}. Nieuwe API-reacties en callbacks genereer altijd het GUID-formulier.

5.2 Lijst met opmerkingen

GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
ParameterTypVereistBeschrijving
pageintneePagina, standaard 1
perPageintneeItems per pagina, standaard 20
postIdintneeFilter op bericht-ID
parentCommentIdintneeOnderliggende opmerkingen (antwoorden) van een bepaalde opmerking
platformstringneefacebook of instagram

200 OK:

{
  "total": 100,
  "items": [
    {
      "id": 5,
      "metaId": "179000000000005",
      "text": "What is the price?",
      "createdAt": "2026-04-15T10:30:00Z",
      "platform": "instagram",
      "replyStatus": null,
      "author": {
        "type": "meta_user",
        "name": "John Doe",
        "metaUserId": "1585775752382460"
      },
      "post": {
        "id": 1,
        "metaId": "18113450675314072",
        "text": null,
        "imageUrl": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-…",
        "createdAt": "2026-07-22T09:35:30Z",
        "mediaType": "story",
        "story": {
          "id": 1,
          "metaId": "18113450675314072",
          "url": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-…"
        }
      },
      "mediaUrl": "https://chatapi.smsbat.com/api/meta/comment/media/5",
      "replyTo": {
        "id": 3,
        "metaId": "179000000000003",
        "text": "Parent comment..."
      }
    }
  ]
}
VeldBeschrijving
idInterne opmerking-ID
metaIdExterne ID in Meta. null voor een wachtend antwoord van ons totdat het wordt verzonden
textCommentaartekst
createdAtAanmaakdatum
platformfacebook of instagram
replyStatusnull voor een inkomend gebruikerscommentaar; "pending" / "sent" / "failure" voor ons antwoord
author.type"meta_user" externe gebruiker, "owner" pagina-eigenaar
author.nameNaam auteur
author.metaUserIdScoped gebruikers-ID in Meta; null voor "owner"
postHet bericht, de haspel of het verhaal waartoe de reactie behoort
post.mediaTypepost, reel of story
post.storyVerhaalreferentie { id, metaId, url }, alleen verhalen
mediaUrlMedia die aan de opmerking zijn gekoppeld, of null
replyToOudercommentaar { id, metaId, text }; null op topniveau

Discrepantie — type `author.type`

De interne specificatie documenteert de strings "meta_user" / "owner". Swagger-types MetaCommentAuthorType als een geheel getal met enum [0, 1]. Een JsonStringEnumConverter zou de kloof kunnen verklaren, maar dat is niet bevestigd door een echte reactie. Schrijf een parser die beide accepteert.

5.3 Reageren op een opmerking

Zet een antwoord in de wachtrij voor bezorging.

curl -X POST \
  -H "X-Authorization-Key: <token>" \
  -H "Content-Type: application/json" \
  -d '{"text": "Thanks for the feedback!"}' \
  "https://chatapi.smsbat.com/api/meta/comments/5/reply"

Verzoektekst: { "text": "Reply text" }

202 Accepted retourneert het commentaarobject — dezelfde vorm als GET /api/meta/comments — met replyStatus: "pending" en metaId: null. Het bezorgingsresultaat arriveert later als een source: 13 terugbellen (§6.4).

Discrepantie — responscode

Swagger verklaart 200 zonder lichaam; de interne specificatie verklaart 202 Accepted met de opmerking als hoofdtekst. De controller mist hoogstwaarschijnlijk een ProducesResponseType attribuut, waardoor Swagger op de standaardwaarde blijft staan. Accepteer elke 2xx en ben niet afhankelijk van een lichaam.


6. Webhooks

SMSBAT stuurt POST verzoeken met application/json naar uw URL en verwacht HTTP 200 terug.

Null-velden worden volledig weggelaten

Een veld waarvan de waarde null is, wordt helemaal niet geserialiseerd in de callback-tekst. Voor een bericht dat niet van Facebook of Instagram kwam, er is simpelweg geen MetaUserId sleutel. Behandel “afwezig” en null als hetzelfde.

6.1 Registreer een terugbel-URL

curl -X POST 'https://restapi.smsbat.com/organizations/callback_urls' \
  -H 'X-Authorization-Key: <token>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://your-server.com/webhook",
    "source": 12,
    "headerName": "X-Webhook-Secret",
    "headerValue": "your-secret",
    "channelType": 7,
    "channelEntityId": 12
  }'
VeldTypBeschrijving
urlstringUw eindpunt
sourceSendingSourceCallbackGebeurtenistype, zie §8.2
headerName / headerValuestringWillekeurige auth-header die we aan het verzoek toevoegen (optioneel)
channelTypeChatSourceKanaal. 7 voor Instagram. Optioneel
channelEntityIdintEen specifiek zakelijk account. Vereist channelType

Zonder channelType ontvangt de URL gebeurtenissen van elk kanaal.

Tip

Voor volledige commentaardekking zijn twee registraties nodig: source: 12 voor nieuwe commentaren en source: 13 voor antwoordstatussen. Voeg voor directe en verhaalantwoorden source: 3 toe (en 11 als je elk chatbericht wilt).

Resterende operaties:

GET    https://restapi.smsbat.com/organizations/callback_urls?source=12
GET    https://restapi.smsbat.com/organizations/callback_urls/{id}
PUT    https://restapi.smsbat.com/organizations/callback_urls/{id}
DELETE https://restapi.smsbat.com/organizations/callback_urls/{id}

GET retourneert:

[
  {
    "id": 101,
    "url": "https://your-server.com/webhook",
    "source": 12,
    "headerName": "X-Webhook-Secret",
    "headerValue": "your-secret",
    "createdAt": "2026-08-13T09:00:00Z",
    "channelType": 7,
    "channelEntityId": 12
  }
]

6.2 Nieuw bericht en antwoord op Instagram-verhaal (source: 3, 11)

Het antwoord van een gebruiker op een Instagram Story komt binnen als een gewoon bericht in deze terugbelverzoeken, met een extra Story-blok op het hoogste niveau:

{
  "ChatId": 123,
  "MessageId": 456,
  "MessageText": "😍",
  "Username": "Jane Smith",
  "UserId": 789,
  "MetaUserId": "1585775752382460",
  "ShopId": 12,
  "ShopName": "instagram shop name",
  "Author": 0,
  "type_messenger": 7,
  "Story": {
    "Id": 42,
    "MetaId": "18113450675314072",
    "Url": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-1711-4aa8-b21d-f6dbf8f347ef"
  }
}
VeldBeschrijving
ChatId / MessageIdChat- en bericht-ID’s
Author0 gebruiker, 1 operator
UsernameInstagram / Facebook-weergavenaam of -handle
UserIdIntern numeriek gebruikers-ID in SMSBAT
MetaUserIdScoped ID van de gesprekspartner in Meta. Bij een uitgaand operatorbericht identificeert dit nog steeds de Meta-gebruiker van de chat, niet de operator
ShopIdInterne ID van het Instagram-/Facebook-bedrijfsaccount
ShopNameZakelijke accountnaam zoals ontvangen van Meta tijdens het verbindingstijdstip
MessageTextBerichttekst
MessageMediaMedia-URL als het bericht media
type_messengerBron, 7 voor Instagram
operator_nameOperatornaam wanneer Author = 1
StoryPresenteer alleen bij een inkomend verhaalantwoord
Story.IdIntern verhaal (MetaPost) ID — direct bruikbaar als id / postId in de Meta API
Story.MetaIdExterne verhaal-ID in Meta
Story.UrlStabiele proxy-URL van de opgeslagen Story-media. Afwezig wanneer de media niet kon worden opgeslagen — het blok Story en het bericht worden nog steeds afgeleverd

`Author` is omgekeerd ten opzichte van de Chat API

In ChatMessageDTO.author betekent 0 operator en 1 client. In deze callback wel andersom: 0 is de gebruiker, 1 is de operator. Deel de mapping niet.

6.3 Nieuwe opmerking (source: 12)

Wordt geactiveerd wanneer een Meta-gebruiker commentaar geeft op een Facebook-bericht of een Instagram-bericht/Reel.

Note

Instagram Verhaalantwoorden worden niet afgeleverd via source: 12. Ze komen als gewoon aan inkomende berichten op source: 3 en/of 11 met een Story blok — zie §6.2.

{
  "type": "new_comment",
  "platform": "instagram",
  "comment": {
    "id": 10,
    "metaId": "179000000000010",
    "parentCommentId": 5,
    "parentMetaId": "179000000000005",
    "parentCommentText": "The user's previous comment",
    "text": "Great product!",
    "createdAt": "2026-04-16T12:00:00Z",
    "author": {
      "type": "meta_user",
      "name": "Jane Smith",
      "metaUserId": "1585775752382460"
    }
  },
  "post": {
    "id": 1,
    "metaId": "123456789012345",
    "text": "Post description...",
    "imageUrl": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-…",
    "createdAt": "2026-04-10T12:00:00Z",
    "mediaType": "post"
  }
}

6.4 Reactiestatus (source: 13)

Wordt geactiveerd nadat we hebben geprobeerd een antwoord te geven, ongeacht of dit lukt of mislukt.

{
  "type": "comment_status",
  "platform": "instagram",
  "comment": {
    "id": 15,
    "metaId": "179000000000015",
    "parentCommentId": 10,
    "parentMetaId": "179000000000010",
    "parentCommentText": "Great product!",
    "text": "Thanks for the feedback!",
    "createdAt": "2026-04-16T12:05:00Z",
    "updatedAt": "2026-04-16T12:05:03Z",
    "replyStatus": "sent",
    "author": {
      "type": "owner",
      "name": "Support Agent"
    }
  },
  "post": {
    "id": 1,
    "metaId": "179999999999999",
    "text": "Reel description...",
    "imageUrl": "https://dashboard.smsbat.com/api/meta/post/media/7d124c36-…",
    "createdAt": "2026-07-22T09:35:30Z",
    "mediaType": "reel"
  }
}

6.5 Gedeelde terugbelvelden voor opmerkingen

Beide reactie-callbacks delen één lichaamsvorm en verschillen slechts met type.

VeldBeschrijving
type"new_comment" of "comment_status"
platform"facebook" of "instagram"
comment.idInterne opmerking-ID
comment.metaIdExterne ID in Meta; null voor een wachtend antwoord voordat het wordt verzonden
comment.parentCommentIdID van ouderreactie. Afwezig voor een reactie op het hoogste niveau
comment.parentMetaIdExterne bovenliggende commentaar-ID. Afwezig op topniveau
comment.parentCommentTextTekst van oudercommentaar. Afwezig op topniveau
comment.textCommentaartekst
comment.createdAtAanmaakdatum
comment.updatedAtLaatste update. Afwezig als de opmerking nooit is bewerkt
comment.replyStatus"pending" / "sent" / "failure". Afwezig voor een inkomende gebruikersreactie
comment.author.type"meta_user" of "owner"
comment.author.nameNaam auteur
comment.author.metaUserIdScoped auteur-ID in Meta. Afwezig voor "owner"
comment.mediaUrlCommentaarmedia. Afwezig terwijl er geen is
post.idInterne post-ID
post.metaIdExterne post / haspel / verhaal-ID in Meta
post.textBerichttekst
post.imageUrlAfbeeldings-URL plaatsen, of null
post.createdAtDatum van postaanmaak
post.mediaTypeIn commentaar-callbacks alleen post of reel

6.6 Nieuwe chat (source: 7)

{ "ChatId": 12345, "Phone": "+380501234567", "chat.Source": 7 }

6.7 Bericht- en chatstatuswijzigingen (source: 6 / 5)

{ "name": "changed_message_status", "id": 9928, "status": 6 }
{ "name": "changed_chat_status",    "id": 1867, "status": 4 }

6.8 Bericht bewerkt of verwijderd (source: 9)

{ "messageId": 9930, "text": "Updated message text" }
{ "messageId": 9931, "delete": true }

6.9 Type-indicator (source: 8)

{ "chat_id": 1867, "event": "start_typing", "operator_name": "Iryna" }
{ "chat_id": 1867, "event": "end_typing" }

7. Polling van evenementen

Voor omgevingen die geen inkomende HTTP kunnen accepteren.

7.1 Gebeurtenissen ophalen

GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
ParameterBeschrijving
organizationIdOptioneel. Overgenomen van het token wanneer weggelaten
page / perPagePaginering, standaardwaarden 1 / 20
{
  "page": 1,
  "perPage": 20,
  "total": 947,
  "items": [
    {
      "ChatId": 1867,
      "MessageId": 9928,
      "MessageText": "Hello there!",
      "MessageMedia": null,
      "Phone": null,
      "Username": "marianna_cat",
      "UserId": 123,
      "ShopId": 12,
      "ShopName": "instagram shop name",
      "Author": 1,
      "type_messenger": 7,
      "message_date": "2026-08-13T12:27:39.724Z",
      "timestamp": "2026-08-13T12:27:39.736Z",
      "event_guid": "ff60129e-c6e4-4876-9d90-badb430c0606",
      "organization_id": 1,
      "callback_type": "3"
    }
  ]
}

Elke gebeurtenis heeft event_guid, timestamp, organization_id en callback_type — een tekenreeks die overeenkomt met de source-waarden in §8.2. De overige velden komen overeen met de overeenkomstige velden webhook in §6.

7.2 Verwerkte gebeurtenissen bevestigen

POST https://chatapi.smsbat.com/api/chat/callback-events/processed
Authorization: Bearer <token>
Content-Type: application/json

[ "ff60129e-c6e4-4876-9d90-badb430c0606" ]

200 OK → { "deleted": 1 }

Reeds verwijderde evenementen tellen eenvoudigweg niet mee voor deleted. Bestellen en nieuwe pogingen zijn uw eigen verantwoordelijkheid verantwoordelijkheid van de kant.

7.3 Aanbevolen lus

  1. Poll GET /api/chat/callback-events volgens een schema.
  2. Verwerk de gebeurtenissen in jouw dienst.
  3. Stuur de verwerkte lijst event_guid naar /callback-events/processed.
  4. Herhaal.

8. Enum-referentie

8.1 ChatSource — kanaal (0–9)

CodeKanaal
0Viber
1ViberBot
2TelegramBot
3WhatsApp
4Widget
5Rozetka
6Facebook
7Instagram
8Bal
9Olx

8.2 SendingSourceCallback — type terugbelgebeurtenis (0–13)

CodeEvenement
3Chat — nieuw chatbericht, inclusief verhaalantwoorden
5Chatstatus gewijzigd
6Berichtstatus gewijzigd
7Nieuwe chat aangemaakt
8Type-indicator
9Bericht bijgewerkt of verwijderd
11AnyChatMessage — elk chatbericht
12MetaNewComment — nieuwe Instagram-/Facebook-reactie
13MetaCommentStatus — leveringsstatus van ons commentaarantwoord

De opsomming omvat 0–13; de overige waarden zijn niet nodig voor Instagram-integraties.

8,3 ChatStatus (0–4)

0 Nieuw, 1 Open, 2 Wachten, 3 AanPauze, 4 Gesloten

8,4 MessageStatus (0–11)

CodeNaam
0NIEUW
1SUCCES
2AFGEWEZEN
3LEES
4ONBEKEND
5VERWERKING
6BEZORGD
7GEBLOKKEERD_BY_USER
8USER_NOT_FOUND

De opsomming omvat 0–11. Waarden 9, 10 en 11 bestaan in de API, maar zijn nog niet gedocumenteerd — behandel ze als UNKNOWN.

8,5 MediaType (1–10)

1 Foto, 2 Bestand, 3 Audio, 4 Video, 5 Sticker, 6 Stickeranimatie, 7 StickerVideo, 8 Animatie, 9 Stem, 10 VideoOpmerking

8.6 AuthorMessage — auteur in de Chat API (0–4)

0 Operator, 1 Klant, 2 Bot, 3 ViberAccount

De opsomming omvat 0–4; waarde 4 is niet gedocumenteerd. De terugbelverzoeken voor “nieuw bericht” gebruiken de tegenovergestelde mapping — zie §6.2.

8,7 ChatMessageType (0–2)

0 Tekst, 1 Foto, 2 Bestand

8.8 Commentaar replyStatus

null inkomende gebruikerscommentaar, "pending" ons antwoord staat in de wachtrij, "sent" afgeleverd, "failure" levering mislukt.


Open vragen

Drie punten waarop de interne specificatie en de door code gegenereerde Swagger het niet eens zijn. Eén verzoek met een echt token regelt ze allemaal; schrijf de cliënt tot die tijd defensief.

#VraagSpecificatieZwagerHoe te controleren
1Auth-header voor /api/meta/*X-Authorization-Keyalleen Bearer verklaardcurl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — verwacht 200, niet 401
2Tellerveld in metareactiestotalCounttotalHetzelfde verzoek: lees de root-JSON-sleutel
3author.type type en reply statuscode"meta_user" / "owner", 202 met lichaamint [0,1], 200 zonder lichaamcurl -i .../api/meta/comments?perPage=1 plus een testantwoord

Tussentijdse begeleiding:

  • teller — lees total ?? totalCount;
  • author.type — accepteer zowel een string als een geheel getal (0 ↔ meta_user, 1 ↔ owner, toewijzing moet nog worden bevestigd);
  • reply — behandel elke 2xx als succes, vereist geen body, neem de uiteindelijke status over van de source: 13 callback.

Implementatieopmerkingen

  • Auth verschilt per eindpuntgroep — /api/meta/* gebruikt X-Authorization-Key, chats en operators gebruiken Bearer, restapi accepteert beide.
  • Paginatie wordt op twee manieren gespeld — per_page op /api/chat/chats, perPage op /api/meta/* en /api/chat/callback-events.
  • multipart/form-data velden zijn PascalCase met puntnotatie (Media.File, Media.Type).
  • Null-velden worden weggelaten bij callbacks — een afwezige sleutel betekent null.
  • phone is meestal null op Instagram. Identificeer de klant met instagramUser.id / metaUserId en de winkel op instaAccount.id (de filterwaarde entityId).
  • Story.Id van een callback kan direct worden teruggestuurd als id / postId naar de Meta API.
  • Controleer de expiresAt van operator JWT voordat u deze in een deeplink of de widget gebruikt.