Help Center Meta & Instagram API integracija

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

SvrhaURL
Chat API + Meta APIhttps://chatapi.smsbat.com
Swagger UI / OpenAPIhttps://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json
REST API (organizacije, URL-ovi povratnog poziva)https://restapi.smsbat.com
REST API Swaggerhttps://restapi.smsbat.com/swagger/v1/swagger.json
Operator web panelhttps://chat.smsbat.com

2. Autentifikacija

Šema autentifikacije zavisi od grupe krajnjih tačaka. Njihovo miješanje je najčešći uzrok 401.

GrupaHeader
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>
ParametarOpis
chat_raw_idChat ID
phoneBroj telefona u međunarodnom formatu
fromIdentifikator brenda / poslovnog računa (bm_id)
sourceIzvor ćaskanja — 7 za Instagram, pogledajte §8.1
tokenVaž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:

ParametarVrstaOpis
sourceChatSource7 ograničava rezultate na Instagram
entityIdintID poslovnog računa. Primjenjuje se samo zajedno sa source
instagram_user_idintInstagram korisnički ID u ChatHubu
facebook_user_idintFacebook korisnički ID u ChatHubu
page / per_pageintPaginacija, zadane postavke 1 / 20
statusChatStatus[]Status ćaskanja, ponovljivo
searchstringPretraživanje slobodnog teksta (ime, telefon,…)
organizationIdintID organizacije
operatorIdint[]Filtriraj po dodijeljenim operatorima
datestring[]Dvije granice: ?date=…&date=…
isChainboolVratite chatove kao lance, noseći poruke iz prethodnih razgovora
isUnread, starMark, isOperator, isAIAgentboolDodatni 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:

PoljeZnačenje
instaAccountInstagram poslovni račun (trgovina). id je vrijednost filtera entityId; name je naziv računa iz Meta
instagramUserKupac. name je Instagram ručka, id je vrijednost filtera instagram_user_id
metaUserIdID korisnika u opsegu na Meta strani (string)
messSource7 za Instagram
phoneObič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
  }
}
PoljeVrstaOpis
textMessagestring?Tekst poruke. Može biti prazan kada je prisutno media
authorAuthorMessage?0 operater, 1 klijent
isInternalbool?true označava internu napomenu koja nije dostavljena kupcu
replyToMessageIdint?ID poruke na koju se odgovara
appGuiduuid?GUID preporuke
mediaMediaDTO?{ 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 obrascaVrstaOpis
TextMessagestringTekst poruke
Authorint0 operater, 1 klijent
IsInternalboolInterna napomena
ReplyToMessageIdintPoruka na koju se odgovara
AppGuiduuidGUID preporuke
Media.FilebinarySam fajl
Media.NamestringNaziv datoteke
Media.FormatstringMIME tip (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeVidi §8.5
Media.DataBase64stringAlternativa Media.File
Media.ThumbnailstringBase64 video okvir za pregled
Media.DurationdoubleTrajanje 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>
ParametarVrstaObaveznoOpis
pageintneStranica, podrazumevano 1
perPageintneStavke po stranici, podrazumevano 20
idintneFiltriraj po internom ID-u posta
platformstringneinstagram ili facebook
mediaTypestringnepost, 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.

PoljeOpis
idInterni broj posta
metaIdVanjska objava / Reel / ID priče u Meta
textNaslov posta
imageUrlURL proxy medija označen nesekvencijskim MetaPost.Guid ili null
platformfacebook ili instagram
mediaTypepost, reel ili story
createdAtDatum kreiranja (datum platforme ili datum baze podataka)
storyPoklanjamo samo za mediaType: "story"
story.idInterni ID priče; jednako post.id
story.metaIdID eksterne priče u Meta
story.urlStabilni 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>
ParametarVrstaObaveznoOpis
pageintneStranica, podrazumevano 1
perPageintneStavke po stranici, podrazumevano 20
postIdintneFiltriraj po ID-u pošte
parentCommentIdintneKomentari djece (odgovori) na dati komentar
platformstringnefacebook 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..."
      }
    }
  ]
}
PoljeOpis
idInterni ID komentara
metaIdVanjski ID u Meta. null za naš odgovor na čekanju dok se ne pošalje
textTekst komentara
createdAtDatum kreiranja
platformfacebook ili instagram
replyStatusnull za dolazni komentar korisnika; "pending" / "sent" / "failure" za naš odgovor
author.type"meta_user" vanjski korisnik, "owner" vlasnik stranice
author.nameIme autora
author.metaUserIdID korisnika s opsegom u Meta; null za "owner"
postObjava, kolut ili priča kojoj komentar pripada
post.mediaTypepost, reel ili story
post.storyReferenca priče { id, metaId, url }, Samo priče
mediaUrlMediji u prilogu komentara, ili null
replyToKomentar 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
  }'
PoljeVrstaOpis
urlstringVaša krajnja tačka
sourceSendingSourceCallbackTip događaja, pogledajte §8.2
headerName / headerValuestringProizvoljno auth zaglavlje koje prilažemo zahtjevu (opcionalno)
channelTypeChatSourceKanal. 7 za Instagram. Opciono
channelEntityIdintOdređ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"
  }
}
PoljeOpis
ChatId / MessageIdChat i identifikatori poruka
Author0 korisnik, 1 operater
UsernameInstagram/Facebook ime za prikaz ili ručica
UserIdInterni brojčani ID korisnika u SMSBAT
MetaUserIdOpseg ID sagovornika u Meta. U odlaznoj poruci operatera ovo i dalje identifikuje Meta korisnika chata, a ne operatera
ShopIdInterni ID Instagram/Facebook poslovnog naloga
ShopNameIme poslovnog računa kako je primljeno od Meta u vrijeme povezivanja
MessageTextTekst poruke
MessageMediaURL medija kada je poruka medijska
type_messengerIzvor, 7 za Instagram
operator_nameIme operatera kada je Author = 1
StoryPrisutni samo na dolaznom odgovoru na priču
Story.IdInterna priča (MetaPost) ID — može se koristiti direktno kao id / postId u Meta API-ju
Story.MetaIdID eksterne priče u Meta
Story.UrlStabilni 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.

PoljeOpis
type"new_comment" ili "comment_status"
platform"facebook" ili "instagram"
comment.idInterni ID komentara
comment.metaIdEksterni ID u Meta; null za odgovor na čekanju prije slanja
comment.parentCommentIdID nadređenog komentara. Odsutan za komentar najvišeg nivoa
comment.parentMetaIdID vanjskog nadređenog komentara. Odsutan na najvišem nivou
comment.parentCommentTextTekst komentara roditelja. Odsutan na najvišem nivou
comment.textTekst komentara
comment.createdAtDatum kreiranja
comment.updatedAtPosljednje 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.nameIme autora
comment.author.metaUserIdID autora s opsegom u Meta. Odsutan za "owner"
comment.mediaUrlKomentirajte medije. Odsutan kada ga nema
post.idInterni broj posta
post.metaIdVanjska objava / Reel / ID priče u Meta
post.textTekst posta
post.imageUrlURL objave slike ili null
post.createdAtDatum kreiranja objave
post.mediaTypeU 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>
ParametarOpis
organizationIdOpciono. Preuzeto iz tokena kada se izostavi
page / perPagePaginacija, 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

  1. Anketa GET /api/chat/callback-events po rasporedu.
  2. Obradite događaje u vašoj službi.
  3. Pošaljite obrađenu listu event_guid na /callback-events/processed.
  4. Ponovite.

8. Enum reference

8.1 ChatSource — kanal (0–9)

ŠifraKanal
0Viber
1ViberBot
2TelegramBot
3Whatsapp
4Widget
5Rozetka
6Facebook
7Instagram
8Prom
9Olx

8.2 SendingSourceCallback — tip događaja povratnog poziva (0–13)

ŠifraDogađaj
3Chat — nova poruka za ćaskanje, uključujući odgovore na Story
5Status chata je promijenjen
6Status poruke je promijenjen
7Novi chat kreiran
8Indikator kucanja
9Poruka ažurirana ili obrisana
11AnyChatMessage — bilo koja poruka za ćaskanje
12MetaNewComment — novi Instagram / Facebook komentar
13MetaCommentStatus — 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)

ŠifraIme
0NOVO
1USPJEH
2ODBIJENO
3PROČITAJTE
4NEPOZNATO
5OBRADA
6ISPORUČENO
7BLOCKED_BY_USER
8USER_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.

#PitanjeSpecifikacijaSwaggerKako provjeriti
1Auth header za /api/meta/*X-Authorization-Keysamo Bearer deklarisanocurl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — očekujte 200, a ne 401
2Polje brojača u Meta odgovorimatotalCounttotalIsti zahtjev — pročitajte korijenski JSON ključ
3author.type tip i reply statusni kod"meta_user" / "owner", 202 sa tijelomint [0,1], 200 bez tijelacurl -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 koji 2xx kao uspjeh, ne zahtijevajte tijelo, uzmite konačni status iz povratnog poziva source: 13.

Bilješke o implementaciji

  • Auth se razlikuje po grupi krajnjih tačaka — /api/meta/* koristi X-Authorization-Key, chatove i operateri koriste Bearer, restapi prihvata bilo koje.
  • Paginacija se piše na dva načina — per_page na /api/chat/chats, perPage na /api/meta/* i /api/chat/callback-events.
  • multipart/form-data polja su PascalCase sa tačkom (Media.File, Media.Type).
  • Nulta polja su izostavljena iz povratnih poziva — odsutan ključ znači null.
  • phone je obično null na Instagramu. Identifikujte kupca pomoću instagramUser.id / metaUserId i shop za instaAccount.id (vrijednost filtera entityId).
  • Story.Id iz povratnog poziva može se proslediti direktno nazad kao id / postId Meta API-ju.
  • Provjerite expiresAt operatera JWT prije nego ga koristite u dubokoj vezi ili u widgetu.