Meta & Instagram API integracija
Referenca za pravljenje Instagram aplikacije na SMSBAT ChatHub platformi: autentifikacija, Instagram Direktni razgovori, komentari na objave i Reels, odgovori na Story, web-hookovi i ankete.
Izvori
Ova stranica spaja internu Meta Comments API specifikaciju sa živim OpenAPI-jem
definicije na https://chatapi.smsbat.com/swagger/v1/swagger.json i
https://restapi.smsbat.com/swagger/v1/swagger.json. Tamo gdje se njih dvoje ne slažu,
razlika se poziva na liniju i navodi pod Otvorena pitanja.
1. Osnovni URL-ovi
| Svrha | URL |
|---|---|
| Chat API + Meta API | https://chatapi.smsbat.com |
| Swagger UI / OpenAPI | https://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json |
| REST API (organizacije, URL-ovi povratnog poziva) | https://restapi.smsbat.com |
| REST API Swagger | https://restapi.smsbat.com/swagger/v1/swagger.json |
| Operator web panel | https://chat.smsbat.com |
2. Autentifikacija
Šema autentifikacije zavisi od grupe krajnjih tačaka. Njihovo miješanje je najčešći uzrok 401.
| Grupa | Header |
|---|---|
chatapi.smsbat.com/api/meta/* (objave, komentari) | 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 · Basic Auth |
Token organizacije za X-Authorization-Key se izdaje u panelu pod Profil.
JWT kompanije i operatera dolaze iz /api/company/get-token i /api/operator/get-token.
Nepodudarnost
chatapi OpenAPI dokument deklarira jednu sigurnosnu šemu — Bearer — i primjenjuje je
globalno. X-Authorization-Key tamo uopšte nije deklarisan, iako interni Meta
Komentari API specifikacija imenuje ga za /api/meta/*. Najvjerovatnije se njime bavi
srednji softver koji se ne odražava u Swaggeru. Potvrdite empirijski prije slanja.
2.1 Token kompanije
POST https://chatapi.smsbat.com/api/company/get-token
Content-Type: application/json
{ "login": "company_login", "password": "company_password" }
200 OK vraća goli niz tokena.
2.2 Organizacije
GET https://chatapi.smsbat.com/api/company/organization
Authorization: Bearer <company_token>
[ { "id": 24, "name": "My Instagram Store" } ]
2.3 Operateri u organizaciji
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" }
}
]
Statusi operatera: 0 Aktivan, 1 Neaktivan, 2 Izbrisan.
2.4 Dodavanje/sinhronizacija operatora
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 Operater 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 vraća JWT kao string.
2.6 Potvrdite token operatora
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
}
Kada je nevažeći: { "isValid": false, "error": "Invalid token" }.
2.7 Ugradite panel za ćaskanje operatera
<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. Duboke veze u panel za ćaskanje
Eksterni sistem (CRM, ERP, web stranica) može otvoriti određeni razgovor
https://chat.smsbat.com/. Operator je ovlašten od strane JWT-a koji je proslijeđen kao parametar upita.
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>
| Parametar | Opis |
|---|---|
chat_raw_id | Chat ID |
phone | Broj telefona u međunarodnom formatu |
from | Identifikator brenda / poslovnog računa (bm_id) |
source | Izvor ćaskanja — 7 za Instagram, pogledajte §8.1 |
token | Važeći operater JWT bez isteka sa pristupom chatovima |
Nevažeći JWT dovodi posjetitelja na ekran za prijavu na panelu operatera.
4. Instagram Direktni razgovori
4.1 Lista razgovora
GET https://chatapi.smsbat.com/api/chat/chats?source=7&page=1&per_page=20
Authorization: Bearer <token>
Note
Paginacija ovdje je per_page (snake_case). Pod /api/meta/* i glasanje
krajnja tačka je perPage (camelCase). Ovo nije greška u kucanju – API koristi oboje.
Parametri upita, svi opcioni:
| Parametar | Vrsta | Opis |
|---|---|---|
source | ChatSource | 7 ograničava rezultate na Instagram |
entityId | int | ID poslovnog računa. Primjenjuje se samo zajedno sa source |
instagram_user_id | int | Instagram korisnički ID u ChatHubu |
facebook_user_id | int | Facebook korisnički ID u ChatHubu |
page / per_page | int | Paginacija, zadane postavke 1 / 20 |
status | ChatStatus[] | Status ćaskanja, ponovljivo |
search | string | Pretraživanje slobodnog teksta (ime, telefon,…) |
organizationId | int | ID organizacije |
operatorId | int[] | Filtriraj po dodijeljenim operatorima |
date | string[] | Dvije granice: ?date=…&date=… |
isChain | bool | Vratite chatove kao lance, noseći poruke iz prethodnih razgovora |
isUnread, starMark, isOperator, isAIAgent | bool | Dodatni filteri |
phone, email, contactId, clientId, tagIds, rate, sortedBy | — | Ostali filteri |
200 OK vraća 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": []
}
]
}
Polja koja su bitna za Instagram aplikaciju:
| Polje | Značenje |
|---|---|
instaAccount | Instagram poslovni račun (trgovina). id je vrijednost filtera entityId; name je naziv računa iz Meta |
instagramUser | Kupac. name je Instagram ručka, id je vrijednost filtera instagram_user_id |
metaUserId | ID korisnika u opsegu na Meta strani (string) |
messSource | 7 za Instagram |
phone | Obično null za Instagram — nemojte ga koristiti kao ključ |
ChatDTO takođe nosi 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 i taggedMessages.
4.2 Chat poruke
GET https://chatapi.smsbat.com/api/chat/chats/1867/messages?isChain=false
Authorization: Bearer <token>
200 OK vraća niz od 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 se popunjava kada se poruka odnosi na objavu na Instagramu ili Story - proslijedite je
pravo nazad kao id / postId na Meta API. media je ChatMediaDTO:
{ name, format, type, uri, raw, length, isUploaded }.
4.3 Pošaljite poruku (JSON)
POST https://chatapi.smsbat.com/api/chat/1867/message
Authorization: Bearer <token>
Content-Type: application/json
Tijelo — 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
}
}
| Polje | Vrsta | Opis |
|---|---|---|
textMessage | string? | Tekst poruke. Može biti prazan kada je prisutno media |
author | AuthorMessage? | 0 operater, 1 klijent |
isInternal | bool? | true označava internu napomenu koja nije dostavljena kupcu |
replyToMessageId | int? | ID poruke na koju se odgovara |
appGuid | uuid? | GUID preporuke |
media | MediaDTO? | { name, format, dataBase64, thumbnail, duration, type } |
200 OK → { "id": 9930, "messageStatus": 0 }
GUID preporuke se također može proslijediti putem:
POST /api/chat/{chatId}/{referralGuid}/message (isto …/message/v1, …/message/v2).
4.4 Pošaljite fajl ili video (višedelni, v2)
POST https://chatapi.smsbat.com/api/chat/1867/message/v2
Authorization: Bearer <token>
Content-Type: multipart/form-data
Nazivi polja obrasca su PascalCase sa tačkom
textMessage i media.file se tiho zanemaruju. Koristite tačne nazive ispod.
| Polje obrasca | Vrsta | Opis |
|---|---|---|
TextMessage | string | Tekst poruke |
Author | int | 0 operater, 1 klijent |
IsInternal | bool | Interna napomena |
ReplyToMessageId | int | Poruka na koju se odgovara |
AppGuid | uuid | GUID preporuke |
Media.File | binary | Sam fajl |
Media.Name | string | Naziv datoteke |
Media.Format | string | MIME tip (video/mp4, image/png, application/pdf) |
Media.Type | MediaType | Vidi §8.5 |
Media.DataBase64 | string | Alternativa Media.File |
Media.Thumbnail | string | Base64 video okvir za pregled |
Media.Duration | double | Trajanje videa u sekundama |
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 Promjena statusa chata
PUT https://chatapi.smsbat.com/api/chat/status
Authorization: Bearer <token>
Content-Type: application/json
{ "id": 1867, "status": 4 }
200 OK ponavlja ažurirani objekat.
4.6 Ažuriranje statusa poruka
PUT https://chatapi.smsbat.com/api/chat/messages/status
Authorization: Bearer <token>
Content-Type: application/json
{ "status": 3, "messageIds": [9928, 9929] }
4.7 Izbrišite razgovor
DELETE https://chatapi.smsbat.com/api/chat/chats/1867
Authorization: Bearer <token>
5. Postovi, koluti i priče
Osnovna putanja: https://chatapi.smsbat.com/api/meta
Auth: X-Authorization-Key: <organization token>
5.1 Lista postova, kolutova i priča
GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
| Parametar | Vrsta | Obavezno | Opis |
|---|---|---|---|
page | int | ne | Stranica, podrazumevano 1 |
perPage | int | ne | Stavke po stranici, podrazumevano 20 |
id | int | ne | Filtriraj po internom ID-u posta |
platform | string | ne | instagram ili facebook |
mediaType | string | ne | post, reel ili story. Sve vrste kada su izostavljene |
# 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"
}
}
]
}
Nepodudarnost — naziv polja brojača
Swagger šema MetaCommentPostListItemDtoPaginationDTO definira total. The
dokumenti interne specifikacije totalCount. Swagger se generira iz koda, dakle
total je vjerovatnija istina. Parsirajte total ?? totalCount dok se ovo ne riješi.
| Polje | Opis |
|---|---|
id | Interni broj posta |
metaId | Vanjska objava / Reel / ID priče u Meta |
text | Naslov posta |
imageUrl | URL proxy medija označen nesekvencijskim MetaPost.Guid ili null |
platform | facebook ili instagram |
mediaType | post, reel ili story |
createdAt | Datum kreiranja (datum platforme ili datum baze podataka) |
story | Poklanjamo samo za mediaType: "story" |
story.id | Interni ID priče; jednako post.id |
story.metaId | ID eksterne priče u Meta |
story.url | Stabilni proxy URL pohranjenog Story medija; null ako medij nije mogao biti sačuvan |
Post mediji se opslužuju na dva puta: GET /api/meta/post/media/{id:int} za nazad
kompatibilnost i GET /api/meta/post/media/{guid:guid}. Novi API odgovori i povratni pozivi
uvijek generirajte GUID obrazac.
5.2 Lista komentara
GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
| Parametar | Vrsta | Obavezno | Opis |
|---|---|---|---|
page | int | ne | Stranica, podrazumevano 1 |
perPage | int | ne | Stavke po stranici, podrazumevano 20 |
postId | int | ne | Filtriraj po ID-u pošte |
parentCommentId | int | ne | Komentari djece (odgovori) na dati komentar |
platform | string | ne | facebook ili 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..."
}
}
]
}
| Polje | Opis |
|---|---|
id | Interni ID komentara |
metaId | Vanjski ID u Meta. null za naš odgovor na čekanju dok se ne pošalje |
text | Tekst komentara |
createdAt | Datum kreiranja |
platform | facebook ili instagram |
replyStatus | null za dolazni komentar korisnika; "pending" / "sent" / "failure" za naš odgovor |
author.type | "meta_user" vanjski korisnik, "owner" vlasnik stranice |
author.name | Ime autora |
author.metaUserId | ID korisnika s opsegom u Meta; null za "owner" |
post | Objava, kolut ili priča kojoj komentar pripada |
post.mediaType | post, reel ili story |
post.story | Referenca priče { id, metaId, url }, Samo priče |
mediaUrl | Mediji u prilogu komentara, ili null |
replyTo | Komentar roditelja { id, metaId, text }; null na najvišem nivou |
Nepodudarnost — vrsta `author.type`
Interna specifikacija dokumentuje nizove "meta_user" / "owner". Swagger tipovi
MetaCommentAuthorType kao cijeli broj sa enumom [0, 1]. A JsonStringEnumConverter
bi objasnio jaz, ali to nije potvrđeno u odnosu na stvarni odgovor. Napišite a
parser koji prihvata oboje.
5.3 Odgovor na komentar
U redu čeka odgovor za isporuku.
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"
Tijelo zahtjeva: { "text": "Reply text" }
202 Accepted vraća objekt komentara — istog oblika kao GET /api/meta/comments — sa
replyStatus: "pending" i metaId: null. Ishod isporuke stiže kasnije kao a
source: 13 povratni poziv (§6.4).
Nepodudarnost — kod odgovora
Swagger izjavljuje 200 bez tijela; interna specifikacija deklarira 202 Accepted
sa komentarom kao tijelom. Kontroloru najvjerovatnije nedostaje ProducesResponseType
atributa, ostavljajući Swagger na zadanom. Prihvatite bilo koji 2xx i ne ovisite o tijelu.
6. Webhooks
SMSBAT šalje POST zahtjeva sa application/json na vaš URL i očekuje HTTP 200 natrag.
Nulta polja su u potpunosti izostavljena
Polje čija je vrijednost null uopće nije serijalizirano u tijelo povratnog poziva. Za a
poruka koja nije stigla sa Facebooka ili Instagrama jednostavno ne postoji ključ MetaUserId.
Tretirajte “odsutan” i null kao istu stvar.
6.1 Registrirajte URL povratnog poziva
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
}'
| Polje | Vrsta | Opis |
|---|---|---|
url | string | Vaša krajnja tačka |
source | SendingSourceCallback | Tip događaja, pogledajte §8.2 |
headerName / headerValue | string | Proizvoljno auth zaglavlje koje prilažemo zahtjevu (opcionalno) |
channelType | ChatSource | Kanal. 7 za Instagram. Opciono |
channelEntityId | int | Određen poslovni račun. Zahtijeva channelType |
Bez channelType URL prima događaje sa svakog kanala.
Tip
Za potpunu pokrivenost komentara potrebne su dvije registracije: source: 12 za nove komentare i
source: 13 za statuse odgovora. Za direktne i Story odgovore dodajte source: 3
(i 11 ako želite svaku poruku ćaskanja).
Preostale operacije:
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 vraća:
[
{
"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 Nova poruka i odgovor na Instagram Story (source: 3, 11)
Odgovor korisnika na Instagram Story stiže kao obična poruka u ovim povratnim pozivima,
sa dodatnim blokom najvišeg nivoa Story:
{
"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"
}
}
| Polje | Opis |
|---|---|
ChatId / MessageId | Chat i identifikatori poruka |
Author | 0 korisnik, 1 operater |
Username | Instagram/Facebook ime za prikaz ili ručica |
UserId | Interni brojčani ID korisnika u SMSBAT |
MetaUserId | Opseg ID sagovornika u Meta. U odlaznoj poruci operatera ovo i dalje identifikuje Meta korisnika chata, a ne operatera |
ShopId | Interni ID Instagram/Facebook poslovnog naloga |
ShopName | Ime poslovnog računa kako je primljeno od Meta u vrijeme povezivanja |
MessageText | Tekst poruke |
MessageMedia | URL medija kada je poruka medijska |
type_messenger | Izvor, 7 za Instagram |
operator_name | Ime operatera kada je Author = 1 |
Story | Prisutni samo na dolaznom odgovoru na priču |
Story.Id | Interna priča (MetaPost) ID — može se koristiti direktno kao id / postId u Meta API-ju |
Story.MetaId | ID eksterne priče u Meta |
Story.Url | Stabilni proxy URL pohranjenog medija priča. Odsutan kada medij nije mogao biti sačuvan — blok Story i poruka se i dalje isporučuju |
`Author` je obrnuto u odnosu na Chat API
U ChatMessageDTO.author, 0 znači operater, a 1 znači klijent. U ovom povratnom pozivu jeste
obrnuto: 0 je korisnik, 1 je operater. Ne dijelite mapiranje.
6.3 Novi komentar (source: 12)
Pokreće se kada korisnik Meta komentariše objavu na Facebooku ili Instagram objavu / Reel.
Note
Instagram Odgovori na priču se ne isporučuju preko source: 12. Stižu kao obični
dolazne poruke na source: 3 i/ili 11 sa blokom Story — videti §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 Status odgovora na komentar (source: 13)
Pali se nakon što pokušamo da dostavimo odgovor, bez obzira da li je uspješan ili neuspješan.
{
"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 Zajednička polja povratnog poziva komentara
Oba povratna poziva komentara dijele jedan oblik tijela i razlikuju se samo za type.
| Polje | Opis |
|---|---|
type | "new_comment" ili "comment_status" |
platform | "facebook" ili "instagram" |
comment.id | Interni ID komentara |
comment.metaId | Eksterni ID u Meta; null za odgovor na čekanju prije slanja |
comment.parentCommentId | ID nadređenog komentara. Odsutan za komentar najvišeg nivoa |
comment.parentMetaId | ID vanjskog nadređenog komentara. Odsutan na najvišem nivou |
comment.parentCommentText | Tekst komentara roditelja. Odsutan na najvišem nivou |
comment.text | Tekst komentara |
comment.createdAt | Datum kreiranja |
comment.updatedAt | Posljednje ažuriranje. Odsutan ako komentar nikada nije uređivan |
comment.replyStatus | "pending" / "sent" / "failure". Odsutan za dolazni komentar korisnika |
comment.author.type | "meta_user" ili "owner" |
comment.author.name | Ime autora |
comment.author.metaUserId | ID autora s opsegom u Meta. Odsutan za "owner" |
comment.mediaUrl | Komentirajte medije. Odsutan kada ga nema |
post.id | Interni broj posta |
post.metaId | Vanjska objava / Reel / ID priče u Meta |
post.text | Tekst posta |
post.imageUrl | URL objave slike ili null |
post.createdAt | Datum kreiranja objave |
post.mediaType | U povratnim pozivima komentara, samo post ili reel |
6.6 Novi chat (source: 7)
{ "ChatId": 12345, "Phone": "+380501234567", "chat.Source": 7 }
6.7 Promjene statusa poruka i chata (source: 6 / 5)
{ "name": "changed_message_status", "id": 9928, "status": 6 }
{ "name": "changed_chat_status", "id": 1867, "status": 4 }
6.8 Poruka uređena ili obrisana (source: 9)
{ "messageId": 9930, "text": "Updated message text" }
{ "messageId": 9931, "delete": true }
6.9 Indikator kucanja (source: 8)
{ "chat_id": 1867, "event": "start_typing", "operator_name": "Iryna" }
{ "chat_id": 1867, "event": "end_typing" }
7. Ispitivanje događaja
Za okruženja koja ne mogu prihvatiti ulazni HTTP.
7.1 Dohvaćanje događaja
GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
| Parametar | Opis |
|---|---|
organizationId | Opciono. Preuzeto iz tokena kada se izostavi |
page / perPage | Paginacija, zadane postavke 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"
}
]
}
Svaki događaj nosi event_guid, timestamp, organization_id i callback_type — a
string koji odgovara vrijednostima source u §8.2. Preostala polja odgovaraju odgovarajućim
webhook u §6.
7.2 Potvrdite obrađene događaje
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 }
Događaji koji su već uklonjeni jednostavno se ne računaju u deleted. Naručivanje i ponovni pokušaji su vaši
odgovornost strane.
7.3 Preporučena petlja
- Anketa
GET /api/chat/callback-eventspo rasporedu. - Obradite događaje u vašoj službi.
- Pošaljite obrađenu listu
event_guidna/callback-events/processed. - Ponovite.
8. Enum reference
8.1 ChatSource — kanal (0–9)
| Šifra | Kanal |
|---|---|
| 0 | Viber |
| 1 | ViberBot |
| 2 | TelegramBot |
| 3 | |
| 4 | Widget |
| 5 | Rozetka |
| 6 | |
| 7 | |
| 8 | Prom |
| 9 | Olx |
8.2 SendingSourceCallback — tip događaja povratnog poziva (0–13)
| Šifra | Događaj |
|---|---|
| 3 | Chat — nova poruka za ćaskanje, uključujući odgovore na Story |
| 5 | Status chata je promijenjen |
| 6 | Status poruke je promijenjen |
| 7 | Novi chat kreiran |
| 8 | Indikator kucanja |
| 9 | Poruka ažurirana ili obrisana |
| 11 | AnyChatMessage — bilo koja poruka za ćaskanje |
| 12 | MetaNewComment — novi Instagram / Facebook komentar |
| 13 | MetaCommentStatus — status isporuke našeg odgovora na komentar |
Enum se prostire na 0–13; preostale vrijednosti nisu potrebne za Instagram integracije.
8.3 ChatStatus (0–4)
0 Novo, 1 Otvoreno, 2 Čekanje, 3 U pauzi, 4 Zatvoreno
8.4 MessageStatus (0–11)
| Šifra | Ime |
|---|---|
| 0 | NOVO |
| 1 | USPJEH |
| 2 | ODBIJENO |
| 3 | PROČITAJTE |
| 4 | NEPOZNATO |
| 5 | OBRADA |
| 6 | ISPORUČENO |
| 7 | BLOCKED_BY_USER |
| 8 | USER_NOT_FOUND |
Enum se prostire na 0–11. Vrijednosti 9, 10 i 11 postoje u API-ju, ali još nisu dokumentirane —
tretirati ih kao UNKNOWN.
8.5 MediaType (1–10)
1 Fotografija, 2 Fajl, 3 Audio, 4 Video, 5 Naljepnica, 6 StickerAnimated,
7 StickerVideo, 8 Animacija, 9 Glas, 10 VideoNote
8.6 AuthorMessage — autor u Chat API-ju (0–4)
0 Operator, 1 Klijent, 2 Bot, 3 Viber nalog
Enum se prostire na 0–4; vrijednost 4 je nedokumentovana. Povratni pozivi “nove poruke” koriste
suprotno preslikavanje — vidi §6.2.
8.7 ChatMessageType (0–2)
0 Tekst, 1 Fotografija, 2 Fajl
8.8 Komentar replyStatus
null dolazni komentar korisnika, "pending" naš odgovor je na čekanju, "sent" dostavljen,
"failure" isporuka nije uspjela.
Otvorena pitanja
Tri tačke u kojima se interna specifikacija i kod generisani Swagger ne slažu. Jedan zahtjev sa pravim tokenom sve ih rješava; do tada pišite klijentu defanzivno.
| # | Pitanje | Specifikacija | Swagger | Kako provjeriti |
|---|---|---|---|---|
| 1 | Auth header za /api/meta/* | X-Authorization-Key | samo Bearer deklarisano | curl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — očekujte 200, a ne 401 |
| 2 | Polje brojača u Meta odgovorima | totalCount | total | Isti zahtjev — pročitajte korijenski JSON ključ |
| 3 | author.type tip i reply statusni kod | "meta_user" / "owner", 202 sa tijelom | int [0,1], 200 bez tijela | curl -i .../api/meta/comments?perPage=1 plus testni odgovor |
Privremene smjernice:
- brojač — čitaj
total ?? totalCount; author.type— prihvatite i niz i cijeli broj (0↔meta_user,1↔owner, mapiranje treba potvrditi);reply— tretirajte bilo koji2xxkao uspjeh, ne zahtijevajte tijelo, uzmite konačni status iz povratnog pozivasource: 13.
Bilješke o implementaciji
- Auth se razlikuje po grupi krajnjih tačaka —
/api/meta/*koristiX-Authorization-Key, chatove i operateri koristeBearer,restapiprihvata bilo koje. - Paginacija se piše na dva načina —
per_pagena/api/chat/chats,perPagena/api/meta/*i/api/chat/callback-events. multipart/form-datapolja su PascalCase sa tačkom (Media.File,Media.Type).- Nulta polja su izostavljena iz povratnih poziva — odsutan ključ znači
null. phoneje običnonullna Instagramu. Identifikujte kupca pomoćuinstagramUser.id/metaUserIdi shop zainstaAccount.id(vrijednost filteraentityId).Story.Idiz povratnog poziva može se proslediti direktno nazad kaoid/postIdMeta API-ju.- Provjerite
expiresAtoperatera JWT prije nego ga koristite u dubokoj vezi ili u widgetu.