Meta & Instagram API integracija
Referenca za izradu Instagram aplikacije na SMSBAT ChatHub platformi: autentifikacija, Instagram Direct razgovori, komentari na postove i kolute, odgovori na priče, webdojavljivanja i anketiranje.
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. Gdje se njih dvoje ne slažu,
razlika se poziva unutar teksta 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 za povratni poziv) | https://restapi.smsbat.com |
| REST API Swagger | https://restapi.smsbat.com/swagger/v1/swagger.json |
| Web panel operatera | https://chat.smsbat.com |
2. Autentifikacija
Shema autentifikacije ovisi o grupi krajnjih točaka. Njihovo miješanje je najčešći uzrok 401.
| Grupa | Zaglavlje |
|---|---|
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 · Osnovna autorizacija |
Organizacijski token za X-Authorization-Key izdaje se na ploči pod Profil.
JWT tvrtke i operatera dolaze iz /api/company/get-token i /api/operator/get-token.
Odstupanje
chatapi OpenAPI dokument deklarira jednu sigurnosnu shemu — Bearer — i primjenjuje je
globalno. X-Authorization-Key tamo uopće nije deklariran, iako interni Meta
Komentari API specifikacija naziva ga za /api/meta/*. Najvjerojatnije se njime bavi
middleware koji se ne odražava u Swaggeru. Potvrdite empirijski prije slanja.
2.1 Token tvrtke
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/sinkroniziranje 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 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 vraća JWT kao niz.
2.6 Provjera valjanosti tokena 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
}
Ako nije valjano: { "isValid": false, "error": "Invalid token" }.
2.7 Ugradite panel za chat 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. Dubinske veze na panel za chat
Vanjski sustav (CRM, ERP, web stranica) može otvoriti određeni razgovor u
https://chat.smsbat.com/. Operator je autoriziran JWT-om proslijeđenim 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 | ID chata |
phone | Telefonski broj u međunarodnom formatu |
from | Identifikator robne marke/poslovnog računa (bm_id) |
source | Izvor chata — 7 za Instagram, pogledajte §8.1 |
token | Važeći operater JWT bez isteka s pristupom chatovima |
Nevažeći JWT dovodi posjetitelja na zaslon za prijavu na ploči operatera.
4. Izravni razgovori na Instagramu
4.1 Popis 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 glasovanje
krajnja točka je perPage (camelCase). Ovo nije tipfeler - API koristi oboje.
Parametri upita, svi izborni:
| Parametar | Upišite | Opis |
|---|---|---|
source | ChatSource | 7 ograničava rezultate na Instagram |
entityId | int | ID poslovnog računa. Primjenjuje se samo zajedno s 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 vrijednosti 1 / 20 |
status | ChatStatus[] | Status chata, ponovljiv |
search | string | Pretraživanje slobodnog teksta (ime, telefon, …) |
organizationId | int | ID organizacije |
operatorId | int[] | Filtriraj prema dodijeljenim operatorima |
date | string[] | Dvije granice: ?date=…&date=… |
isChain | bool | Vrati chatove kao lance, noseći poruke iz prethodnih chatova |
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 važna za Instagram aplikaciju:
| Polje | Značenje |
|---|---|
instaAccount | Instagram poslovni račun (trgovina). id je vrijednost filtra entityId; name je naziv računa iz Meta |
instagramUser | Kupac. name je Instagram oznaka, id je instagram_user_id vrijednost filtera |
metaUserId | ID kupca s opsegom na Metinoj strani (niz) |
messSource | 7 za Instagram |
phone | Obično null za Instagram — nemojte ga koristiti kao ključ |
ChatDTO također 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 Poruke chata
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 popunjava se kada se poruka odnosi na objavu na Instagramu ili Story — proslijedite je
ravno natrag 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 | Upišite | Opis |
|---|---|---|
textMessage | string? | Tekst poruke. Može biti prazno ako je prisutan media |
author | AuthorMessage? | 0 operater, 1 klijent |
isInternal | bool? | true označava internu bilješku koja nije isporučena 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 također se može proslijediti na putu:
POST /api/chat/{chatId}/{referralGuid}/message (isto tako …/message/v1, …/message/v2).
4.4 Pošaljite datoteku ili video (višedijelni, v2)
POST https://chatapi.smsbat.com/api/chat/1867/message/v2
Authorization: Bearer <token>
Content-Type: multipart/form-data
Nazivi polja obrazaca su PascalCase s notacijom s točkama
textMessage i media.file tiho se ignoriraju. Koristite točna imena ispod.
| Polje obrasca | Upišite | Opis |
|---|---|---|
TextMessage | string | Tekst poruke |
Author | int | 0 operater, 1 klijent |
IsInternal | bool | Interna bilješka |
ReplyToMessageId | int | Poruka na koju se odgovara |
AppGuid | uuid | GUID preporuke |
Media.File | binary | Sama datoteka |
Media.Name | string | Naziv datoteke |
Media.Format | string | Vrsta MIME (video/mp4, image/png, application/pdf) |
Media.Type | MediaType | Vidi §8.5 |
Media.DataBase64 | string | Alternativa za Media.File |
Media.Thumbnail | string | Okvir za pregled videozapisa Base64 |
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 objekt.
4.6 Ažuriraj statuse poruka
PUT https://chatapi.smsbat.com/api/chat/messages/status
Authorization: Bearer <token>
Content-Type: application/json
{ "status": 3, "messageIds": [9928, 9929] }
4.7 Brisanje razgovora
DELETE https://chatapi.smsbat.com/api/chat/chats/1867
Authorization: Bearer <token>
5. Postovi, koluti i priče
Osnovni put: https://chatapi.smsbat.com/api/meta
Autor: X-Authorization-Key: <organization token>
5.1 Popis 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 | Upišite | Obavezno | Opis |
|---|---|---|---|
page | int | ne | Stranica, zadano 1 |
perPage | int | ne | Stavke po stranici, zadano 20 |
id | int | ne | Filtriraj prema ID interne objave |
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
Swaggerova shema MetaCommentPostListItemDtoPaginationDTO definira total. The
interni specifikacijski dokumenti totalCount. Swagger se generira iz koda, dakle
total vjerojatnija je istina. Raščlanite total ?? totalCount dok se ovo ne riješi.
| Polje | Opis |
|---|---|
id | ID internog posta |
metaId | Vanjska objava / kolut / ID priče u Meta |
text | Naslov objave |
imageUrl | URL proxy medija s ključem koji nije sekvencijalan MetaPost.Guid ili null |
platform | facebook ili instagram |
mediaType | post, reel ili story |
createdAt | Datum kreiranja (datum platforme ili datum baze podataka) |
story | Prisutno samo za mediaType: "story" |
story.id | Interni ID priče; jednako post.id |
story.metaId | Vanjski ID priče u Meta |
story.url | Stabilni proxy URL pohranjenog Story medija; null ako se medij ne može spremiti |
Post mediji opslužuju se na dva načina: GET /api/meta/post/media/{id:int} za natrag
kompatibilnost i GET /api/meta/post/media/{guid:guid}. Novi API odgovori i povratni pozivi
uvijek generirajte GUID obrazac.
5.2 Popis komentara
GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
| Parametar | Upišite | Obavezno | Opis |
|---|---|---|---|
page | int | ne | Stranica, zadano 1 |
perPage | int | ne | Stavke po stranici, zadano 20 |
postId | int | ne | Filtriraj po ID-u objave |
parentCommentId | int | ne | Dječji komentari (odgovori) danog komentara |
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 | ID internog komentara |
metaId | Vanjski ID u Meta. null za naš odgovor na čekanju do slanja |
text | Tekst komentara |
createdAt | Datum kreiranja |
platform | facebook ili instagram |
replyStatus | null za ulazni 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 | Post, 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šoj razini |
Odstupanje — vrsta `author.type`
Interna specifikacija dokumentira nizove "meta_user" / "owner". Razmetljivi tipovi
MetaCommentAuthorType kao cijeli broj s enumom [0, 1]. A JsonStringEnumConverter
objasnio bi jaz, ali to nije potvrđeno stvarnim odgovorom. Napiši a
parser koji prihvaća oboje.
5.3 Odgovorite na komentar
Stavite odgovor u red 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 — s
replyStatus: "pending" i metaId: null. Ishod isporuke stiže kasnije kao a
source: 13 povratni poziv (§6.4).
Odstupanje — kod odgovora
Swagger izjavljuje 200 bez tijela; interna specifikacija izjavljuje 202 Accepted
s komentarom kao tijelom. Upravljaču najvjerojatnije nedostaje ProducesResponseType
atribut ostavljajući Swagger zadanim. Prihvati bilo koji 2xx i ne ovisi o tijelu.
6. Web hookovi
SMSBAT šalje POST zahtjeva s application/json na vaš URL i očekuje HTTP 200 natrag.
Nulta polja su potpuno izostavljena
Polje čija je vrijednost null uopće nije serijalizirano u tijelo povratnog poziva. Za a
poruka koja nije došla s 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 | Upišite | Opis |
|---|---|---|
url | string | Vaša krajnja točka |
source | SendingSourceCallback | Vrsta događaja, vidi §8.2 |
headerName / headerValue | string | Proizvoljno zaglavlje autentifikacije koje prilažemo zahtjevu (nije obavezno) |
channelType | ChatSource | Kanal. 7 za Instagram. Izborno |
channelEntityId | int | Konkretni poslovni račun. Zahtijeva channelType |
Bez channelType URL prima događaje sa svakog kanala.
Tip
Za punu pokrivenost komentarima potrebne su dvije registracije: source: 12 za nove komentare i
source: 13 za statuse odgovora. Za odgovore Direct i Story dodajte source: 3
(i 11 ako želite svaku chat poruku).
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,
s dodatnim blokom Story najviše razine:
{
"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 | Identifikatori razgovora i poruka |
Author | 0 korisnik, 1 operater |
Username | Instagram/Facebook prikazno ime ili oznaka |
UserId | Interni numerički ID korisnika u SMSBAT |
MetaUserId | Opseg ID sugovornika u Meta. Na odlaznoj poruci operatera ovo i dalje identificira Meta korisnika chata, a ne operatera |
ShopId | Interni ID Instagram/Facebook poslovnog računa |
ShopName | Naziv poslovnog računa primljen od Mete 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 | Prisutno samo na dolazni odgovor na priču |
Story.Id | ID interne priče (MetaPost) — može se koristiti izravno kao id / postId u Meta API-ju |
Story.MetaId | Vanjski ID priče u Meta |
Story.Url | Stabilni proxy URL pohranjenog Story medija. Odsutan kada se medij nije mogao spremiti — blok Story i poruka se i dalje isporučuju |
`Author` je obrnut u odnosu na Chat API
U ChatMessageDTO.author, 0 znači operater, a 1 znači klijent. U ovom povratnom pozivu jest
obrnuto: 0 je korisnik, 1 je operater. Nemojte dijeliti mapiranje.
6.3 Novi komentar (source: 12)
Pali se kada Meta korisnik komentira objavu na Facebooku ili Instagram objavu / Reel.
Note
Instagram Story odgovori ne dostavljaju se putem source: 12. Stižu kao obični
dolazne poruke na source: 3 i/ili 11 s blokom Story — vidi §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 isporučiti odgovor, bez obzira uspjeli ili ne uspjeli.
{
"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 Dijeljena polja za povratni komentar
Oba povratna poziva za komentare dijele isti oblik tijela i razlikuju se samo za type.
| Polje | Opis |
|---|---|
type | "new_comment" ili "comment_status" |
platform | "facebook" ili "instagram" |
comment.id | ID internog komentara |
comment.metaId | Vanjski ID u Meta; null za odgovor na čekanju prije slanja |
comment.parentCommentId | ID nadređenog komentara. Odsutan za komentar najviše razine |
comment.parentMetaId | ID vanjskog nadređenog komentara. Odsutan na najvišoj razini |
comment.parentCommentText | Tekst komentara roditelja. Odsutan na najvišoj razini |
comment.text | Tekst komentara |
comment.createdAt | Datum kreiranja |
comment.updatedAt | Zadnje ažuriranje. Odsutan ako komentar nikad nije uređivan |
comment.replyStatus | "pending" / "sent" / "failure". Odsutan za ulazni korisnički komentar |
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 kad nema |
post.id | ID internog posta |
post.metaId | Vanjska objava / kolut / ID priče u Meta |
post.text | Objavi tekst |
post.imageUrl | Objavite URL slike ili null |
post.createdAt | Datum kreiranja objave |
post.mediaType | U povratnim pozivima za komentare 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 tipkanja (source: 8)
{ "chat_id": 1867, "event": "start_typing", "operator_name": "Iryna" }
{ "chat_id": 1867, "event": "end_typing" }
7. Anketiranje 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 | Neobavezno. Preuzeto iz tokena kada je izostavljen |
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
niz 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 ubrajaju u deleted. Naručivanje i ponovni pokušaji su vaši
odgovornost strane.
7.3 Preporučena petlja
- Anketa
GET /api/chat/callback-eventsna rasporedu. - Obradite događaje u svojoj usluzi.
- Pošaljite obrađenu listu
event_guidna/callback-events/processed. - Ponovite.
8. Enum referenca
8.1 ChatSource — kanal (0–9)
| Kod | Kanal |
|---|---|
| 0 | Viber |
| 1 | ViberBot |
| 2 | TelegramBot |
| 3 | |
| 4 | Widget |
| 5 | Rozetka |
| 6 | |
| 7 | |
| 8 | Maturalna |
| 9 | Olx |
8.2 SendingSourceCallback — vrsta događaja povratnog poziva (0–13)
| Kod | Događaj |
|---|---|
| 3 | Chat — nova chat poruka, uključujući odgovore na priču |
| 5 | Status chata promijenjen |
| 6 | Status poruke promijenjen |
| 7 | Stvoren novi chat |
| 8 | Indikator tipkanja |
| 9 | Poruka ažurirana ili obrisana |
| 11 | AnyChatMessage — bilo koja poruka chata |
| 12 | MetaNewComment — novi Instagram / Facebook komentar |
| 13 | MetaCommentStatus — status isporuke našeg odgovora na komentar |
Enum obuhvaća 0–13; preostale vrijednosti nisu potrebne za Instagram integracije.
8,3 ChatStatus (0–4)
0 Novo, 1 Otvoreno, 2 Čekanje, 3 Na pauzi, 4 Zatvoreno
8,4 MessageStatus (0–11)
| Kod | Ime |
|---|---|
| 0 | NOVO |
| 1 | USPJEH |
| 2 | ODBIJENO |
| 3 | PROČITAJ |
| 4 | NEPOZNATO |
| 5 | OBRADA |
| 6 | ISPORUČENO |
| 7 | BLOCKED_BY_USER |
| 8 | KORISNIK_NIJE_PRONAĐEN |
Enum obuhvaća 0–11. Vrijednosti 9, 10 i 11 postoje u API-ju, ali još nisu dokumentirane —
tretirajte ih kao UNKNOWN.
8,5 MediaType (1–10)
1 Fotografija, 2 Datoteka, 3 Audio, 4 Video, 5 Naljepnica, 6 Naljepnica Animirana,
7 StickerVideo, 8 Animacija, 9 Glas, 10 VideoNote
8.6 AuthorMessage — autor u Chat API-ju (0–4)
0 Operater, 1 Klijent, 2 Bot, 3 Viber Račun
Enum obuhvaća 0–4; vrijednost 4 nije dokumentirana. Povratni pozivi “nova poruka” koriste
suprotno preslikavanje — vidi §6.2.
8,7 ChatMessageType (0–2)
0 Tekst, 1 Fotografija, 2 Datoteka
8.8 Komentar replyStatus
null dolazni korisnički komentar, "pending" naš odgovor je u redu čekanja, "sent" isporučen,
"failure" dostava nije uspjela.
Otvorena pitanja
Tri točke u kojima se interna specifikacija i kodom generirani Swagger ne slažu. jedan zahtjev s pravim tokenom podmiruje ih sve; do tada, pišite klijentu obrambeno.
| # | Pitanje | Specifikacija | razmetanje | Kako provjeriti |
|---|---|---|---|---|
| 1 | Zaglavlje autentifikacije za /api/meta/* | X-Authorization-Key | samo Bearer deklarirano | 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 s 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— prihvaća i niz i cijeli broj (0↔meta_user,1↔owner, preslikavanje za potvrdu);reply— tretirajte bilo koji2xxkao uspjeh, ne zahtijeva tijelo, preuzmite konačni status iz povratnog pozivasource: 13.
Bilješke o implementaciji
- Auth se razlikuje po grupi krajnjih točaka —
/api/meta/*koristiX-Authorization-Key, chatove i operatori koristeBearer,restapiprihvaća bilo koji. - Paginacija se piše na dva načina —
per_pagena/api/chat/chats,perPagena/api/meta/*i/api/chat/callback-events. - Polja
multipart/form-datasu PascalCase s notacijom s točkama (Media.File,Media.Type). - Nulta polja su izostavljena iz povratnih poziva — odsutan ključ znači
null. phoneje običnonullna Instagramu. Identificirajte kupca pomoćuinstagramUser.id/metaUserIdi trgovina premainstaAccount.id(vrijednost filtraentityId).Story.Idiz povratnog poziva može se izravno vratiti kaoid/postIdu Meta API.- Provjerite operaterov JWT
expiresAtprije upotrebe u dubokoj vezi ili widgetu.