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
| Doel | URL |
|---|---|
| Chat-API + Meta-API | https://chatapi.smsbat.com |
| Swagger-UI / OpenAPI | https://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json |
| REST API (organisaties, callback-URL’s) | https://restapi.smsbat.com |
| REST API Swagger | https://restapi.smsbat.com/swagger/v1/swagger.json |
| Webpaneel voor operator | https://chat.smsbat.com |
2. Authenticatie
Het verificatieschema hangt af van de eindpuntgroep. Het door elkaar halen is de meest voorkomende oorzaak van 401.
| Groep | Kop |
|---|---|
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>
3. Deeplinks naar het chatpaneel
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>
| Parameter | Beschrijving |
|---|---|
chat_raw_id | Chat-ID |
phone | Telefoonnummer in internationaal formaat |
from | Merk-/bedrijfsaccount-ID (bm_id) |
source | Chatbron — 7 voor Instagram, zie §8.1 |
token | Geldige, 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:
| Parameter | Typ | Beschrijving |
|---|---|---|
source | ChatSource | 7 beperkt de resultaten tot Instagram |
entityId | int | Zakelijk account-ID. Alleen toegepast samen met source |
instagram_user_id | int | Instagram-gebruikers-ID in ChatHub |
facebook_user_id | int | Facebook-gebruikers-ID in ChatHub |
page / per_page | int | Paginering, standaardwaarden 1 / 20 |
status | ChatStatus[] | Chatstatus, herhaalbaar |
search | string | Zoeken in vrije tekst (naam, telefoon, …) |
organizationId | int | Organisatie-ID |
operatorId | int[] | Filteren op toegewezen operators |
date | string[] | Twee grenzen: ?date=…&date=… |
isChain | bool | Chats retourneren als kettingen, met berichten van eerdere chats |
isUnread, starMark, isOperator, isAIAgent | bool | Extra 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:
| Veld | Betekenis |
|---|---|
instaAccount | Het Instagram zakelijke account (de winkel). id is de filterwaarde entityId; name is de accountnaam van Meta |
instagramUser | De klant. name is de Instagram-handle, id is de instagram_user_id filterwaarde |
metaUserId | De bereik-ID van de klant aan de kant van Meta (tekenreeks) |
messSource | 7 voor Instagram |
phone | Meestal 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
}
}
| Veld | Typ | Beschrijving |
|---|---|---|
textMessage | string? | Berichttekst. Mag leeg zijn als media aanwezig is |
author | AuthorMessage? | 0 operator, 1 klant |
isInternal | bool? | true markeert een interne notitie die niet bij de klant is afgeleverd |
replyToMessageId | int? | ID van het bericht waarop wordt gereageerd |
appGuid | uuid? | Verwijzings-GUID |
media | MediaDTO? | { 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.
| Formulierveld | Typ | Beschrijving |
|---|---|---|
TextMessage | string | Berichttekst |
Author | int | 0 operator, 1 klant |
IsInternal | bool | Interne opmerking |
ReplyToMessageId | int | Bericht wordt beantwoord |
AppGuid | uuid | Verwijzings-GUID |
Media.File | binary | Het bestand zelf |
Media.Name | string | Bestandsnaam |
Media.Format | string | MIME-type (video/mp4, image/png, application/pdf) |
Media.Type | MediaType | Zie §8.5 |
Media.DataBase64 | string | Alternatief voor Media.File |
Media.Thumbnail | string | Base64 videovoorbeeldframe |
Media.Duration | double | Videoduur 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>
| Parameter | Typ | Vereist | Beschrijving |
|---|---|---|---|
page | int | nee | Pagina, standaard 1 |
perPage | int | nee | Items per pagina, standaard 20 |
id | int | nee | Filter op interne bericht-ID |
platform | string | nee | instagram of facebook |
mediaType | string | nee | post, 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.
| Veld | Beschrijving |
|---|---|
id | Interne post-ID |
metaId | Externe post / haspel / verhaal-ID in Meta |
text | Onderschrift |
imageUrl | Proxymedia-URL gecodeerd met de niet-sequentiële MetaPost.Guid, of null |
platform | facebook of instagram |
mediaType | post, reel of story |
createdAt | Aanmaakdatum (platformdatum of databasedatum) |
story | Presenteer alleen voor mediaType: "story" |
story.id | Interne verhaal-ID; gelijk aan post.id |
story.metaId | Externe verhaal-ID in Meta |
story.url | Stabiele 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>
| Parameter | Typ | Vereist | Beschrijving |
|---|---|---|---|
page | int | nee | Pagina, standaard 1 |
perPage | int | nee | Items per pagina, standaard 20 |
postId | int | nee | Filter op bericht-ID |
parentCommentId | int | nee | Onderliggende opmerkingen (antwoorden) van een bepaalde opmerking |
platform | string | nee | facebook 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..."
}
}
]
}
| Veld | Beschrijving |
|---|---|
id | Interne opmerking-ID |
metaId | Externe ID in Meta. null voor een wachtend antwoord van ons totdat het wordt verzonden |
text | Commentaartekst |
createdAt | Aanmaakdatum |
platform | facebook of instagram |
replyStatus | null voor een inkomend gebruikerscommentaar; "pending" / "sent" / "failure" voor ons antwoord |
author.type | "meta_user" externe gebruiker, "owner" pagina-eigenaar |
author.name | Naam auteur |
author.metaUserId | Scoped gebruikers-ID in Meta; null voor "owner" |
post | Het bericht, de haspel of het verhaal waartoe de reactie behoort |
post.mediaType | post, reel of story |
post.story | Verhaalreferentie { id, metaId, url }, alleen verhalen |
mediaUrl | Media die aan de opmerking zijn gekoppeld, of null |
replyTo | Oudercommentaar { 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
}'
| Veld | Typ | Beschrijving |
|---|---|---|
url | string | Uw eindpunt |
source | SendingSourceCallback | Gebeurtenistype, zie §8.2 |
headerName / headerValue | string | Willekeurige auth-header die we aan het verzoek toevoegen (optioneel) |
channelType | ChatSource | Kanaal. 7 voor Instagram. Optioneel |
channelEntityId | int | Een 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"
}
}
| Veld | Beschrijving |
|---|---|
ChatId / MessageId | Chat- en bericht-ID’s |
Author | 0 gebruiker, 1 operator |
Username | Instagram / Facebook-weergavenaam of -handle |
UserId | Intern numeriek gebruikers-ID in SMSBAT |
MetaUserId | Scoped ID van de gesprekspartner in Meta. Bij een uitgaand operatorbericht identificeert dit nog steeds de Meta-gebruiker van de chat, niet de operator |
ShopId | Interne ID van het Instagram-/Facebook-bedrijfsaccount |
ShopName | Zakelijke accountnaam zoals ontvangen van Meta tijdens het verbindingstijdstip |
MessageText | Berichttekst |
MessageMedia | Media-URL als het bericht media |
type_messenger | Bron, 7 voor Instagram |
operator_name | Operatornaam wanneer Author = 1 |
Story | Presenteer alleen bij een inkomend verhaalantwoord |
Story.Id | Intern verhaal (MetaPost) ID — direct bruikbaar als id / postId in de Meta API |
Story.MetaId | Externe verhaal-ID in Meta |
Story.Url | Stabiele 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.
| Veld | Beschrijving |
|---|---|
type | "new_comment" of "comment_status" |
platform | "facebook" of "instagram" |
comment.id | Interne opmerking-ID |
comment.metaId | Externe ID in Meta; null voor een wachtend antwoord voordat het wordt verzonden |
comment.parentCommentId | ID van ouderreactie. Afwezig voor een reactie op het hoogste niveau |
comment.parentMetaId | Externe bovenliggende commentaar-ID. Afwezig op topniveau |
comment.parentCommentText | Tekst van oudercommentaar. Afwezig op topniveau |
comment.text | Commentaartekst |
comment.createdAt | Aanmaakdatum |
comment.updatedAt | Laatste 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.name | Naam auteur |
comment.author.metaUserId | Scoped auteur-ID in Meta. Afwezig voor "owner" |
comment.mediaUrl | Commentaarmedia. Afwezig terwijl er geen is |
post.id | Interne post-ID |
post.metaId | Externe post / haspel / verhaal-ID in Meta |
post.text | Berichttekst |
post.imageUrl | Afbeeldings-URL plaatsen, of null |
post.createdAt | Datum van postaanmaak |
post.mediaType | In 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>
| Parameter | Beschrijving |
|---|---|
organizationId | Optioneel. Overgenomen van het token wanneer weggelaten |
page / perPage | Paginering, 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
- Poll
GET /api/chat/callback-eventsvolgens een schema. - Verwerk de gebeurtenissen in jouw dienst.
- Stuur de verwerkte lijst
event_guidnaar/callback-events/processed. - Herhaal.
8. Enum-referentie
8.1 ChatSource — kanaal (0–9)
| Code | Kanaal |
|---|---|
| 0 | Viber |
| 1 | ViberBot |
| 2 | TelegramBot |
| 3 | |
| 4 | Widget |
| 5 | Rozetka |
| 6 | |
| 7 | |
| 8 | Bal |
| 9 | Olx |
8.2 SendingSourceCallback — type terugbelgebeurtenis (0–13)
| Code | Evenement |
|---|---|
| 3 | Chat — nieuw chatbericht, inclusief verhaalantwoorden |
| 5 | Chatstatus gewijzigd |
| 6 | Berichtstatus gewijzigd |
| 7 | Nieuwe chat aangemaakt |
| 8 | Type-indicator |
| 9 | Bericht bijgewerkt of verwijderd |
| 11 | AnyChatMessage — elk chatbericht |
| 12 | MetaNewComment — nieuwe Instagram-/Facebook-reactie |
| 13 | MetaCommentStatus — 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)
| Code | Naam |
|---|---|
| 0 | NIEUW |
| 1 | SUCCES |
| 2 | AFGEWEZEN |
| 3 | LEES |
| 4 | ONBEKEND |
| 5 | VERWERKING |
| 6 | BEZORGD |
| 7 | GEBLOKKEERD_BY_USER |
| 8 | USER_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.
| # | Vraag | Specificatie | Zwager | Hoe te controleren |
|---|---|---|---|---|
| 1 | Auth-header voor /api/meta/* | X-Authorization-Key | alleen Bearer verklaard | curl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — verwacht 200, niet 401 |
| 2 | Tellerveld in metareacties | totalCount | total | Hetzelfde verzoek: lees de root-JSON-sleutel |
| 3 | author.type type en reply statuscode | "meta_user" / "owner", 202 met lichaam | int [0,1], 200 zonder lichaam | curl -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 elke2xxals succes, vereist geen body, neem de uiteindelijke status over van desource: 13callback.
Implementatieopmerkingen
- Auth verschilt per eindpuntgroep —
/api/meta/*gebruiktX-Authorization-Key, chats en operators gebruikenBearer,restapiaccepteert beide. - Paginatie wordt op twee manieren gespeld —
per_pageop/api/chat/chats,perPageop/api/meta/*en/api/chat/callback-events. multipart/form-datavelden zijn PascalCase met puntnotatie (Media.File,Media.Type).- Null-velden worden weggelaten bij callbacks — een afwezige sleutel betekent
null. phoneis meestalnullop Instagram. Identificeer de klant metinstagramUser.id/metaUserIden de winkel opinstaAccount.id(de filterwaardeentityId).Story.Idvan een callback kan direct worden teruggestuurd alsid/postIdnaar de Meta API.- Controleer de
expiresAtvan operator JWT voordat u deze in een deeplink of de widget gebruikt.