Help Center Meta & Instagram API integracija

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

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 za povratni poziv)https://restapi.smsbat.com
REST API Swaggerhttps://restapi.smsbat.com/swagger/v1/swagger.json
Web panel operaterahttps://chat.smsbat.com

2. Autentifikacija

Shema autentifikacije ovisi o grupi krajnjih točaka. Njihovo miješanje je najčešći uzrok 401.

GrupaZaglavlje
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>
ParametarOpis
chat_raw_idID chata
phoneTelefonski broj u međunarodnom formatu
fromIdentifikator robne marke/poslovnog računa (bm_id)
sourceIzvor chata — 7 za Instagram, pogledajte §8.1
tokenVaž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:

ParametarUpišiteOpis
sourceChatSource7 ograničava rezultate na Instagram
entityIdintID poslovnog računa. Primjenjuje se samo zajedno s source
instagram_user_idintInstagram korisnički ID u ChatHubu
facebook_user_idintFacebook korisnički ID u ChatHubu
page / per_pageintPaginacija, zadane vrijednosti 1 / 20
statusChatStatus[]Status chata, ponovljiv
searchstringPretraživanje slobodnog teksta (ime, telefon, …)
organizationIdintID organizacije
operatorIdint[]Filtriraj prema dodijeljenim operatorima
datestring[]Dvije granice: ?date=…&date=…
isChainboolVrati chatove kao lance, noseći poruke iz prethodnih chatova
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 važna za Instagram aplikaciju:

PoljeZnačenje
instaAccountInstagram poslovni račun (trgovina). id je vrijednost filtra entityId; name je naziv računa iz Meta
instagramUserKupac. name je Instagram oznaka, id je instagram_user_id vrijednost filtera
metaUserIdID kupca s opsegom na Metinoj strani (niz)
messSource7 za Instagram
phoneObič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
  }
}
PoljeUpišiteOpis
textMessagestring?Tekst poruke. Može biti prazno ako je prisutan media
authorAuthorMessage?0 operater, 1 klijent
isInternalbool?true označava internu bilješku koja nije isporučena 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 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 obrascaUpišiteOpis
TextMessagestringTekst poruke
Authorint0 operater, 1 klijent
IsInternalboolInterna bilješka
ReplyToMessageIdintPoruka na koju se odgovara
AppGuiduuidGUID preporuke
Media.FilebinarySama datoteka
Media.NamestringNaziv datoteke
Media.FormatstringVrsta MIME (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeVidi §8.5
Media.DataBase64stringAlternativa za Media.File
Media.ThumbnailstringOkvir za pregled videozapisa Base64
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 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>
ParametarUpišiteObaveznoOpis
pageintneStranica, zadano 1
perPageintneStavke po stranici, zadano 20
idintneFiltriraj prema ID interne objave
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

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.

PoljeOpis
idID internog posta
metaIdVanjska objava / kolut / ID priče u Meta
textNaslov objave
imageUrlURL proxy medija s ključem koji nije sekvencijalan MetaPost.Guid ili null
platformfacebook ili instagram
mediaTypepost, reel ili story
createdAtDatum kreiranja (datum platforme ili datum baze podataka)
storyPrisutno samo za mediaType: "story"
story.idInterni ID priče; jednako post.id
story.metaIdVanjski ID priče u Meta
story.urlStabilni 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>
ParametarUpišiteObaveznoOpis
pageintneStranica, zadano 1
perPageintneStavke po stranici, zadano 20
postIdintneFiltriraj po ID-u objave
parentCommentIdintneDječji komentari (odgovori) danog komentara
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
idID internog komentara
metaIdVanjski ID u Meta. null za naš odgovor na čekanju do slanja
textTekst komentara
createdAtDatum kreiranja
platformfacebook ili instagram
replyStatusnull za ulazni 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"
postPost, 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š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
  }'
PoljeUpišiteOpis
urlstringVaša krajnja točka
sourceSendingSourceCallbackVrsta događaja, vidi §8.2
headerName / headerValuestringProizvoljno zaglavlje autentifikacije koje prilažemo zahtjevu (nije obavezno)
channelTypeChatSourceKanal. 7 za Instagram. Izborno
channelEntityIdintKonkretni 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"
  }
}
PoljeOpis
ChatId / MessageIdIdentifikatori razgovora i poruka
Author0 korisnik, 1 operater
UsernameInstagram/Facebook prikazno ime ili oznaka
UserIdInterni numerički ID korisnika u SMSBAT
MetaUserIdOpseg ID sugovornika u Meta. Na odlaznoj poruci operatera ovo i dalje identificira Meta korisnika chata, a ne operatera
ShopIdInterni ID Instagram/Facebook poslovnog računa
ShopNameNaziv poslovnog računa primljen od Mete u vrijeme povezivanja
MessageTextTekst poruke
MessageMediaURL medija kada je poruka medijska
type_messengerIzvor, 7 za Instagram
operator_nameIme operatera kada je Author = 1
StoryPrisutno samo na dolazni odgovor na priču
Story.IdID interne priče (MetaPost) — može se koristiti izravno kao id / postId u Meta API-ju
Story.MetaIdVanjski ID priče u Meta
Story.UrlStabilni 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.

PoljeOpis
type"new_comment" ili "comment_status"
platform"facebook" ili "instagram"
comment.idID internog komentara
comment.metaIdVanjski ID u Meta; null za odgovor na čekanju prije slanja
comment.parentCommentIdID nadređenog komentara. Odsutan za komentar najviše razine
comment.parentMetaIdID vanjskog nadređenog komentara. Odsutan na najvišoj razini
comment.parentCommentTextTekst komentara roditelja. Odsutan na najvišoj razini
comment.textTekst komentara
comment.createdAtDatum kreiranja
comment.updatedAtZadnje 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.nameIme autora
comment.author.metaUserIdID autora s opsegom u meta. Odsutan za "owner"
comment.mediaUrlKomentirajte medije. Odsutan kad nema
post.idID internog posta
post.metaIdVanjska objava / kolut / ID priče u Meta
post.textObjavi tekst
post.imageUrlObjavite URL slike ili null
post.createdAtDatum kreiranja objave
post.mediaTypeU 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>
ParametarOpis
organizationIdNeobavezno. Preuzeto iz tokena kada je izostavljen
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 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

  1. Anketa GET /api/chat/callback-events na rasporedu.
  2. Obradite događaje u svojoj usluzi.
  3. Pošaljite obrađenu listu event_guid na /callback-events/processed.
  4. Ponovite.

8. Enum referenca

8.1 ChatSource — kanal (0–9)

KodKanal
0Viber
1ViberBot
2TelegramBot
3Whatsapp
4Widget
5Rozetka
6Facebook
7Instagram
8Maturalna
9Olx

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

KodDogađaj
3Chat — nova chat poruka, uključujući odgovore na priču
5Status chata promijenjen
6Status poruke promijenjen
7Stvoren novi chat
8Indikator tipkanja
9Poruka ažurirana ili obrisana
11AnyChatMessage — bilo koja poruka chata
12MetaNewComment — novi Instagram / Facebook komentar
13MetaCommentStatus — 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)

KodIme
0NOVO
1USPJEH
2ODBIJENO
3PROČITAJ
4NEPOZNATO
5OBRADA
6ISPORUČENO
7BLOCKED_BY_USER
8KORISNIK_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.

#PitanjeSpecifikacijarazmetanjeKako provjeriti
1Zaglavlje autentifikacije za /api/meta/*X-Authorization-Keysamo Bearer deklariranocurl -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 s tijelomint [0,1], 200 bez tijelacurl -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 koji 2xx kao uspjeh, ne zahtijeva tijelo, preuzmite konačni status iz povratnog poziva source: 13.

Bilješke o implementaciji

  • Auth se razlikuje po grupi krajnjih točaka — /api/meta/* koristi X-Authorization-Key, chatove i operatori koriste Bearer, restapi prihvaća bilo koji.
  • Paginacija se piše na dva načina — per_page na /api/chat/chats, perPage na /api/meta/* i /api/chat/callback-events.
  • Polja multipart/form-data su PascalCase s notacijom s točkama (Media.File, Media.Type).
  • Nulta polja su izostavljena iz povratnih poziva — odsutan ključ znači null.
  • phone je obično null na Instagramu. Identificirajte kupca pomoću instagramUser.id / metaUserId i trgovina prema instaAccount.id (vrijednost filtra entityId).
  • Story.Id iz povratnog poziva može se izravno vratiti kao id / postId u Meta API.
  • Provjerite operaterov JWT expiresAt prije upotrebe u dubokoj vezi ili widgetu.