Meta & Instagram API-integration
Reference til opbygning af en Instagram-app på SMSBAT ChatHub-platformen: autentificering, Instagram Direkte samtaler, kommentarer til opslag og ruller, historiesvar, webhooks og afstemninger.
Kilder
Denne side fusionerer den interne Meta Comments API-specifikation med den levende OpenAPI
definitioner ved https://chatapi.smsbat.com/swagger/v1/swagger.json og
https://restapi.smsbat.com/swagger/v1/swagger.json. Hvor de to er uenige, er det
forskel kaldes inline og opført under Åbne spørgsmål.
1. Basis-URL’er
| Formål | URL |
|---|---|
| Chat API + Meta API | https://chatapi.smsbat.com |
| Swagger UI / OpenAPI | https://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json |
| REST API (organisationer, tilbagekalds-URL’er) | https://restapi.smsbat.com |
| REST API Swagger | https://restapi.smsbat.com/swagger/v1/swagger.json |
| Operatør webpanel | https://chat.smsbat.com |
2. Godkendelse
Godkendelsesordningen afhænger af endepunktsgruppen. At blande dem er den mest almindelige årsag til 401.
| Gruppe | Overskrift |
|---|---|
chatapi.smsbat.com/api/meta/* (indlæg, kommentarer) | 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 · Grundlæggende godkendelse |
Organisationstokenet for X-Authorization-Key udstedes i panelet under Profil.
Firma- og operatør-JWT’er kommer fra /api/company/get-token og /api/operator/get-token.
Uoverensstemmelse
chatapi OpenAPI-dokumentet erklærer et enkelt sikkerhedsskema — Bearer — og anvender det
globalt. X-Authorization-Key er slet ikke deklareret der, selvom den interne Meta
Kommentarer API-specifikationen navngiver den til /api/meta/*. Det håndteres højst sandsynligt af
middleware, der ikke afspejles i Swagger. Bekræft empirisk, før du sender.
2.1 Virksomhedstoken
POST https://chatapi.smsbat.com/api/company/get-token
Content-Type: application/json
{ "login": "company_login", "password": "company_password" }
200 OK returnerer en bar token-streng.
2.2 Organisationer
GET https://chatapi.smsbat.com/api/company/organization
Authorization: Bearer <company_token>
[ { "id": 24, "name": "My Instagram Store" } ]
2.3 Operatører i en organisation
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" }
}
]
Operatørstatusser: 0 Aktiv, 1 Inaktiv, 2 Slettet.
2.4 Tilføj/synkroniser operatorer
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 Operatør 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 returnerer JWT som en streng.
2.6 Valider et operatørtoken
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
}
Når ugyldig: { "isValid": false, "error": "Invalid token" }.
2.7 Integrer operatørchatpanelet
<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 til chatpanelet
Et eksternt system (CRM, ERP, hjemmeside) kan åbne en specifik samtale i
https://chat.smsbat.com/. Operatøren er autoriseret af en JWT, der sendes som en forespørgselsparameter.
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 | Beskrivelse |
|---|---|
chat_raw_id | Chat ID |
phone | Telefonnummer i internationalt format |
from | Brand-/virksomhedskonto-id (bm_id) |
source | Chatkilde — 7 for Instagram, se §8.1 |
token | Gyldig, uudløbet operatør JWT med adgang til chats |
En ugyldig JWT lander den besøgende på operatørpanelets login-skærm.
4. Instagram Direkte samtaler
4.1 Liste over chats
GET https://chatapi.smsbat.com/api/chat/chats?source=7&page=1&per_page=20
Authorization: Bearer <token>
Note
Sideinddeling her er per_page (slangekasse). Under /api/meta/* og afstemningen
endepunktet er perPage (camelCase). Dette er ikke en tastefejl - API’en bruger begge dele.
Forespørgselsparametre, alle valgfrie:
| Parameter | Skriv | Beskrivelse |
|---|---|---|
source | ChatSource | 7 begrænser resultater til Instagram |
entityId | int | Virksomhedskonto-id. Kun anvendt sammen med source |
instagram_user_id | int | Instagram bruger-id i ChatHub |
facebook_user_id | int | Facebook-bruger-id i ChatHub |
page / per_page | int | Sideinddeling, standardindstillinger 1 / 20 |
status | ChatStatus[] | Chatstatus, gentagelig |
search | string | Fritekstsøgning (navn, telefon, …) |
organizationId | int | Organisations-id |
operatorId | int[] | Filtrer efter tildelte operatorer |
date | string[] | To grænser: ?date=…&date=… |
isChain | bool | Returner chats som kæder, med meddelelser fra tidligere chats |
isUnread, starMark, isOperator, isAIAgent | bool | Yderligere filtre |
phone, email, contactId, clientId, tagIds, rate, sortedBy | — | Andre filtre |
200 OK returnerer 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 felter, der betyder noget for en Instagram-app:
| Felt | Betydning |
|---|---|
instaAccount | Instagram-virksomhedskontoen (butikken). id er entityId filterværdien; name er kontonavnet fra Meta |
instagramUser | kunden. name er Instagram-håndtaget, id er instagram_user_id-filterværdien |
metaUserId | Kundens scoped ID på Metas side (streng) |
messSource | 7 til Instagram |
phone | Normalt null til Instagram — brug det ikke som en nøgle |
ChatDTO bærer også 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 og taggedMessages.
4.2 Chatbeskeder
GET https://chatapi.smsbat.com/api/chat/chats/1867/messages?isChain=false
Authorization: Bearer <token>
200 OK returnerer en matrix på 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 er udfyldt, når beskeden vedrører et Instagram-opslag eller en historie – send det
lige tilbage som id / postId til Meta API. media er en ChatMediaDTO:
{ name, format, type, uri, raw, length, isUploaded }.
4.3 Send en besked (JSON)
POST https://chatapi.smsbat.com/api/chat/1867/message
Authorization: Bearer <token>
Content-Type: application/json
Krop — 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
}
}
| Felt | Skriv | Beskrivelse |
|---|---|---|
textMessage | string? | Beskedtekst. Kan være tom, når media er til stede |
author | AuthorMessage? | 0 operatør, 1 klient |
isInternal | bool? | true markerer en intern note, der ikke er leveret til kunden |
replyToMessageId | int? | ID for den besked, der besvares |
appGuid | uuid? | Henvisnings GUID |
media | MediaDTO? | { name, format, dataBase64, thumbnail, duration, type } |
200 OK → { "id": 9930, "messageStatus": 0 }
En henvisnings-GUID kan også sendes i stien:
POST /api/chat/{chatId}/{referralGuid}/message (ligeså …/message/v1, …/message/v2).
4.4 Send en fil eller video (multipart, v2)
POST https://chatapi.smsbat.com/api/chat/1867/message/v2
Authorization: Bearer <token>
Content-Type: multipart/form-data
Formularfeltnavne er PascalCase med priknotation
textMessage og media.file ignoreres stille. Brug de nøjagtige navne nedenfor.
| Formularfelt | Skriv | Beskrivelse |
|---|---|---|
TextMessage | string | Meddelelsestekst |
Author | int | 0 operatør, 1 klient |
IsInternal | bool | Intern note |
ReplyToMessageId | int | Besked bliver besvaret |
AppGuid | uuid | Henvisnings GUID |
Media.File | binary | Selve filen |
Media.Name | string | Filnavn |
Media.Format | string | MIME-type (video/mp4, image/png, application/pdf) |
Media.Type | MediaType | Se §8.5 |
Media.DataBase64 | string | Alternativ til Media.File |
Media.Thumbnail | string | Base64 video forhåndsvisningsramme |
Media.Duration | double | Videovarighed i sekunder |
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 Skift chatstatus
PUT https://chatapi.smsbat.com/api/chat/status
Authorization: Bearer <token>
Content-Type: application/json
{ "id": 1867, "status": 4 }
200 OK ekkoer det opdaterede objekt.
4.6 Opdater meddelelsesstatusser
PUT https://chatapi.smsbat.com/api/chat/messages/status
Authorization: Bearer <token>
Content-Type: application/json
{ "status": 3, "messageIds": [9928, 9929] }
4.7 Slet en chat
DELETE https://chatapi.smsbat.com/api/chat/chats/1867
Authorization: Bearer <token>
5. Indlæg, ruller og historier
Basissti: https://chatapi.smsbat.com/api/meta
Auth: X-Authorization-Key: <organization token>
5.1 Liste indlæg, ruller og historier
GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
| Parameter | Skriv | Påkrævet | Beskrivelse |
|---|---|---|---|
page | int | nej | Side, standard 1 |
perPage | int | nej | Elementer pr. side, standard 20 |
id | int | nej | Filtrer efter internt post-id |
platform | string | nej | instagram eller facebook |
mediaType | string | nej | post, reel eller story. Alle typer, når de er udeladt |
# 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"
}
}
]
}
Afvigelse — tællerfeltnavn
Swagger-skemaet MetaCommentPostListItemDtoPaginationDTO definerer total. Den
interne specifikationsdokumenter totalCount. Swagger genereres fra koden, så
total er den mere sandsynlige sandhed. Parse total ?? totalCount indtil dette er afgjort.
| Felt | Beskrivelse |
|---|---|
id | Internt post-id |
metaId | Ekstern post / Reel / Story ID i Meta |
text | Indlægstekst |
imageUrl | Proxymedie-URL indtastet af den ikke-sekventielle MetaPost.Guid eller null |
platform | facebook eller instagram |
mediaType | post, reel eller story |
createdAt | Oprettelsesdato (platformsdato eller databasedato) |
story | Til stede kun for mediaType: "story" |
story.id | Internt historie-id; lig med post.id |
story.metaId | Ekstern historie-id i Meta |
story.url | Stabil proxy-URL for det lagrede Story-medie; null hvis mediet ikke kunne gemmes |
Postmedier betjenes af to ruter: GET /api/meta/post/media/{id:int} for baglæns
kompatibilitet og GET /api/meta/post/media/{guid:guid}. Nye API-svar og tilbagekald
generer altid GUID-formularen.
5.2 Liste kommentarer
GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
| Parameter | Skriv | Påkrævet | Beskrivelse |
|---|---|---|---|
page | int | nej | Side, standard 1 |
perPage | int | nej | Elementer pr. side, standard 20 |
postId | int | nej | Filtrer efter post ID |
parentCommentId | int | nej | Underordnede kommentarer (svar) til en given kommentar |
platform | string | nej | facebook eller 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..."
}
}
]
}
| Felt | Beskrivelse |
|---|---|
id | Internt kommentar-id |
metaId | Eksternt ID i Meta. null for et afventende svar fra vores, indtil det sendes |
text | Kommentartekst |
createdAt | Oprettelsesdato |
platform | facebook eller instagram |
replyStatus | null for en indgående brugerkommentar; "pending" / "sent" / "failure" til vores svar |
author.type | "meta_user" ekstern bruger, "owner" sideejer |
author.name | Forfatternavn |
author.metaUserId | Scoped bruger-ID i Meta; null for "owner" |
post | Indlægget, rullen eller historien kommentaren tilhører |
post.mediaType | post, reel eller story |
post.story | Historiereference { id, metaId, url }, kun historier |
mediaUrl | Medier vedhæftet kommentaren, eller null |
replyTo | Forældrekommentar { id, metaId, text }; null på øverste niveau |
Afvigelse — type `author.type`
Den interne specifikation dokumenterer strengene "meta_user" / "owner". Swagger typer
MetaCommentAuthorType som et heltal med enum [0, 1]. A JsonStringEnumConverter
ville forklare kløften, men det er ikke blevet bekræftet mod et reelt svar. Skriv en
parser, der accepterer begge dele.
5.3 Svar på en kommentar
Sætter et svar i kø for levering.
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"
Anmodningstekst: { "text": "Reply text" }
202 Accepted returnerer kommentarobjektet — samme form som GET /api/meta/comments — med
replyStatus: "pending" og metaId: null. Leveringsresultatet kommer senere som en
source: 13 tilbagekald (§6.4).
Uoverensstemmelse — svarkode
Swagger erklærer 200 uden krop; den interne specifikation erklærer 202 Accepted
med kommentaren som krop. Controlleren mangler sandsynligvis en ProducesResponseType
attribut, hvilket efterlader Swagger på sin standard. Accepter enhver 2xx og vær ikke afhængig af en krop.
6. Webhooks
SMSBAT sender POST anmodninger med application/json til din URL og forventer HTTP 200 tilbage.
Nul felter er udeladt helt
Et felt, hvis værdi er null, serialiseres slet ikke i tilbagekaldsteksten. For en
besked, der ikke kom fra Facebook eller Instagram, er der simpelthen ingen MetaUserId nøgle.
Behandl “fraværende” og null som det samme.
6.1 Registrer en tilbagekalds-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
}'
| Felt | Skriv | Beskrivelse |
|---|---|---|
url | string | Dit slutpunkt |
source | SendingSourceCallback | Begivenhedstype, se §8.2 |
headerName / headerValue | string | Vilkårlig godkendelseshoved, vi vedhæfter anmodningen (valgfrit) |
channelType | ChatSource | Kanal. 7 til Instagram. Valgfrit |
channelEntityId | int | En specifik virksomhedskonto. Kræver channelType |
Uden channelType modtager URL’en begivenheder fra hver kanal.
Tip
Fuld kommentardækning kræver to registreringer: source: 12 for nye kommentarer og
source: 13 for svarstatusser. For direkte svar og historiesvar tilføj source: 3
(og 11 hvis du vil have hver chatbesked).
Resterende operationer:
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 returnerer:
[
{
"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 Ny besked og Instagram Story-svar (source: 3, 11)
En brugers svar på en Instagram Story ankommer som en almindelig besked i disse tilbagekald,
med en ekstra Story blok på øverste 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"
}
}
| Felt | Beskrivelse |
|---|---|
ChatId / MessageId | Chat- og besked-id’er |
Author | 0 bruger, 1 operatør |
Username | Instagram / Facebook visningsnavn eller håndtag |
UserId | Internt numerisk bruger-id i SMSBAT |
MetaUserId | Scoped ID for samtalepartneren i Meta. På en udgående operatørmeddelelse identificerer dette stadig metabrugeren af chatten, ikke operatøren |
ShopId | Internt ID for Instagram / Facebook-virksomhedskontoen |
ShopName | Virksomhedskontonavn som modtaget fra Meta på tilslutningstidspunktet |
MessageText | Meddelelsestekst |
MessageMedia | Medie-URL, når meddelelsen er media |
type_messenger | Kilde, 7 til Instagram |
operator_name | Operatørnavn når Author = 1 |
Story | Viser kun på et indgående historiesvar |
Story.Id | Internt historie (MetaPost) ID — kan bruges direkte som id / postId i Meta API |
Story.MetaId | Ekstern historie-id i Meta |
Story.Url | Stabil proxy-URL for det gemte Story-medie. Fraværende, når mediet ikke kunne gemmes — Story-blokken og beskeden leveres stadig |
`Author` er inverteret i forhold til Chat API'en
I ChatMessageDTO.author betyder 0 operatør og 1 betyder klient. I dette tilbagekald er det
omvendt: 0 er brugeren, 1 er operatøren. Del ikke kortlægningen.
6.3 Ny kommentar (source: 12)
Udløses, når en Meta-bruger kommenterer et Facebook-opslag eller et Instagram-opslag/Reel.
Note
Instagram Storysvar leveres ikke gennem source: 12. De ankommer som almindelige
indgående beskeder på source: 3 og/eller 11 med en Story blok — se §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 Kommentar svarstatus (source: 13)
Udløses, efter at vi forsøger at levere et svar, uanset om det lykkes eller mislykkes.
{
"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 Delte kommentartilbagekaldsfelter
Begge tilbagekald af kommentarer deler én kropsform og adskiller sig kun med type.
| Felt | Beskrivelse |
|---|---|
type | "new_comment" eller "comment_status" |
platform | "facebook" eller "instagram" |
comment.id | Internt kommentar-id |
comment.metaId | Eksternt ID i Meta; null for et afventende svar, før det sendes |
comment.parentCommentId | Forældres kommentar-id. Fraværende for en kommentar på øverste niveau |
comment.parentMetaId | Ekstern forældrekommentar-id. Fraværende på topniveau |
comment.parentCommentText | Forældrekommentartekst. Fraværende på topniveau |
comment.text | Kommentartekst |
comment.createdAt | Oprettelsesdato |
comment.updatedAt | Sidste opdatering. Fraværende, hvis kommentaren aldrig blev redigeret |
comment.replyStatus | "pending" / "sent" / "failure". Fraværende for en indgående brugerkommentar |
comment.author.type | "meta_user" eller "owner" |
comment.author.name | Forfatternavn |
comment.author.metaUserId | Scoped forfatter-id i Meta. Fraværende i "owner" |
comment.mediaUrl | Kommentarmedie. Fraværende, når der ikke er nogen |
post.id | Internt post-id |
post.metaId | Ekstern post / Reel / Story ID i Meta |
post.text | Indlægstekst |
post.imageUrl | Send billed-URL eller null |
post.createdAt | Post oprettelsesdato |
post.mediaType | I kommentartilbagekald, kun post eller reel |
6.6 Ny chat (source: 7)
{ "ChatId": 12345, "Phone": "+380501234567", "chat.Source": 7 }
6.7 Besked- og chatstatusændringer (source: 6 / 5)
{ "name": "changed_message_status", "id": 9928, "status": 6 }
{ "name": "changed_chat_status", "id": 1867, "status": 4 }
6.8 Besked redigeret eller slettet (source: 9)
{ "messageId": 9930, "text": "Updated message text" }
{ "messageId": 9931, "delete": true }
6.9 Indtastningsindikator (source: 8)
{ "chat_id": 1867, "event": "start_typing", "operator_name": "Iryna" }
{ "chat_id": 1867, "event": "end_typing" }
7. Begivenhedsafstemning
Til miljøer, der ikke kan acceptere indgående HTTP.
7.1 Hent begivenheder
GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
| Parameter | Beskrivelse |
|---|---|
organizationId | Valgfri. Taget fra token, når udeladt |
page / perPage | Sideinddeling, standardindstillinger 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"
}
]
}
Hver begivenhed har event_guid, timestamp, organization_id og callback_type — en
streng, der matcher source-værdierne i §8.2. De resterende felter matcher de tilsvarende
webhook i §6.
7.2 Anerkend behandlede hændelser
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 }
Begivenheder, der allerede er fjernet, tæller simpelthen ikke med i deleted. Bestilling og genforsøg er din
sides ansvar.
7.3 Anbefalet sløjfe
- Afstemning
GET /api/chat/callback-eventspå en tidsplan. - Behandle begivenhederne i din tjeneste.
- Send den behandlede
event_guid-liste til/callback-events/processed. - Gentag.
8. Enum reference
8.1 ChatSource — kanal (0–9)
| Kode | Kanal |
|---|---|
| 0 | Viber |
| 1 | ViberBot |
| 2 | TelegramBot |
| 3 | |
| 4 | Widget |
| 5 | Rozetka |
| 6 | |
| 7 | |
| 8 | Bal |
| 9 | Olx |
8.2 SendingSourceCallback — tilbagekaldshændelsestype (0–13)
| Kode | Begivenhed |
|---|---|
| 3 | Chat — ny chatbesked, inklusive historiesvar |
| 5 | Chatstatus ændret |
| 6 | Meddelelsesstatus ændret |
| 7 | Ny chat oprettet |
| 8 | Indtastningsindikator |
| 9 | Besked opdateret eller slettet |
| 11 | AnyChatMessage — enhver chatbesked |
| 12 | MetaNewComment — ny Instagram/Facebook-kommentar |
| 13 | MetaCommentStatus — leveringsstatus for vores kommentarsvar |
Enumet spænder over 0–13; de resterende værdier er ikke nødvendige for Instagram-integrationer.
8.3 ChatStatus (0-4)
0 Ny, 1 Åben, 2 Venter, 3 OnPause, 4 Lukket
8,4 MessageStatus (0–11)
| Kode | Navn |
|---|---|
| 0 | NYHED |
| 1 | SUCCES |
| 2 | AFVISET |
| 3 | LÆS |
| 4 | UKENDT |
| 5 | BEHANDLING |
| 6 | LEVERET |
| 7 | BLOCKED_BY_USER |
| 8 | USER_NOT_FOUND |
Enummet spænder over 0–11. Værdierne 9, 10 og 11 findes i API’et, men er endnu ikke dokumenteret —
behandle dem som UNKNOWN.
8,5 MediaType (1-10)
1 Foto, 2 Fil, 3 Lyd, 4 Video, 5 Sticker, 6 StickerAnimated,
7 StickerVideo, 8 Animation, 9 Stemme, 10 VideoNote
8.6 AuthorMessage — forfatter i Chat API (0–4)
0 Operatør, 1 Client, 2 Bot, 3 ViberAccount
Enumet spænder over 0–4; værdien 4 er udokumenteret. De “nye besked”-tilbagekald bruger
modsat kortlægning — se §6.2.
8.7 ChatMessageType (0–2)
0 Tekst, 1 Foto, 2 Fil
8.8 Kommentar replyStatus
null indgående brugerkommentar, "pending" vores svar er i kø, "sent" leveret,
"failure" levering mislykkedes.
Åbne spørgsmål
Tre punkter, hvor den interne specifikation og den kodegenererede Swagger er uenige. En anmodning med en rigtig token afgør dem alle; indtil da, skriv klienten defensivt.
| # | Spørgsmål | Specifikation | Swagger | Sådan tjekker du |
|---|---|---|---|---|
| 1 | Auth header for /api/meta/* | X-Authorization-Key | kun Bearer erklæret | curl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — forvent 200, ikke 401 |
| 2 | Tællerfelt i Meta-svar | totalCount | total | Samme anmodning — læs root-JSON-nøglen |
| 3 | author.type type og reply statuskode | "meta_user" / "owner", 202 med krop | int [0,1], 200 uden krop | curl -i .../api/meta/comments?perPage=1 plus et testsvar |
Midlertidig vejledning:
- tæller — læs
total ?? totalCount; author.type— accepter både en streng og et heltal (0↔meta_user,1↔owner, kortlægning skal bekræftes);reply— behandle enhver2xxsom succes, kræver ingen krop, tag den endelige status frasource: 13tilbagekaldet.
Implementeringsnoter
- Godkendelse er forskellig fra endepunktsgruppe —
/api/meta/*brugerX-Authorization-Key, chats og operatører brugerBearer,restapiaccepterer enten. - Søgning staves på to måder —
per_pagepå/api/chat/chats,perPagepå/api/meta/*og/api/chat/callback-events. multipart/form-datafelter er PascalCase med priknotation (Media.File,Media.Type).- Nul-felter er udeladt fra tilbagekald — en fraværende tast betyder
null. phoneer normaltnullpå Instagram. Identificer kunden vedinstagramUser.id/metaUserIdog butikken vedinstaAccount.id(filterværdienentityId).Story.Idfra et tilbagekald kan sendes direkte tilbage somid/postIdtil Meta API.- Tjek operatørens JWT’s
expiresAt, før du bruger den i et dyblink eller widget.