Help Center Integracija API-ja Meta & Instagram

Integracija API-ja Meta & Instagram

Referenca za izdelavo aplikacije Instagram na platformi SMSBAT ChatHub: preverjanje pristnosti, Pogovori Instagram Direct, komentarji na objave in kolute, odgovori na zgodbe, spletne trnke in glasovanje.

Viri

Ta stran združuje notranjo specifikacijo API-ja Meta Comments z aktivnim OpenAPI-jem definicije na https://chatapi.smsbat.com/swagger/v1/swagger.json in https://restapi.smsbat.com/swagger/v1/swagger.json. Kjer se ne strinjata, je razlika je prikazana v vrstici in navedena pod Odprta vprašanja.


1. Osnovni URL-ji

NamenURL
API za klepet + API za metahttps://chatapi.smsbat.com
Uporabniški vmesnik Swagger / OpenAPIhttps://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json
REST API (organizacije, URL-ji za povratni klic)https://restapi.smsbat.com
REST API Swaggerhttps://restapi.smsbat.com/swagger/v1/swagger.json
Spletna plošča operaterjahttps://chat.smsbat.com

2. Preverjanje pristnosti

Shema avtorizacije je odvisna od skupine končnih točk. Njihovo mešanje je najpogostejši vzrok za 401.

SkupinaGlava
chatapi.smsbat.com/api/meta/* (objave, komentarji)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 avtorizacija

Organizacijski žeton za X-Authorization-Key se izda v plošči pod Profil. JWT podjetja in operaterja prihajajo iz /api/company/get-token in /api/operator/get-token.

Neskladje

Dokument chatapi OpenAPI deklarira eno samo varnostno shemo — Bearer — in jo uporabi globalno. X-Authorization-Key tam sploh ni deklariran, čeprav notranja Meta Komentarji Specifikacija API-ja ga imenuje za /api/meta/*. Najverjetneje ga obravnava vmesna programska oprema, ki se ne odraža v Swaggerju. Potrdite empirično, preden pošljete.

2.1 Žeton podjetja

POST https://chatapi.smsbat.com/api/company/get-token
Content-Type: application/json

{ "login": "company_login", "password": "company_password" }

200 OK vrne goli niz žetona.

2.2 Organizacije

GET https://chatapi.smsbat.com/api/company/organization
Authorization: Bearer <company_token>
[ { "id": 24, "name": "My Instagram Store" } ]

2.3 Operaterji v 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 operaterja: 0 Aktiven, 1 Neaktiven, 2 Izbrisan.

2.4 Dodajanje / sinhroniziranje operaterjev

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 vrne JWT kot niz.

2.6 Preverjanje žetona operaterja

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
}

Ko je neveljavno: { "isValid": false, "error": "Invalid token" }.

2.7 Vdelajte ploščo za klepet operaterja

<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. Globinske povezave v ploščo za klepet

Zunanji sistem (CRM, ERP, spletna stran) lahko odpre določen pogovor v https://chat.smsbat.com/. Operaterja pooblasti JWT, posredovan kot poizvedbeni parameter.

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>
ParameterOpis
chat_raw_idID klepeta
phoneTelefonska številka v mednarodni obliki
fromIdentifikator blagovne znamke/poslovnega računa (bm_id)
sourceVir klepeta — 7 za Instagram, glejte §8.1
tokenVeljaven, nepotekel operater JWT z dostopom do klepetov

Neveljaven JWT pripelje obiskovalca na prijavni zaslon nadzorne plošče.


4. Instagram Direct pogovori

4.1 Seznam klepetov

GET https://chatapi.smsbat.com/api/chat/chats?source=7&page=1&per_page=20
Authorization: Bearer <token>

Note

Paginacija tukaj je per_page (snake_case). Pod /api/meta/* in glasovanje končna točka je perPage (camelCase). To ni tipkarska napaka - API uporablja oboje.

Parametri poizvedbe, vsi neobvezni:

ParameterVrstaOpis
sourceChatSource7 omejuje rezultate na Instagram
entityIdintID poslovnega računa. Uporablja se samo skupaj z source
instagram_user_idintID uporabnika Instagrama v ChatHubu
facebook_user_idintID uporabnika Facebooka v ChatHubu
page / per_pageintPaginacija, privzeto 1 / 20
statusChatStatus[]Stanje klepeta, ponovljivo
searchstringIskanje po prostem besedilu (ime, telefon, …)
organizationIdintID organizacije
operatorIdint[]Filtriraj po dodeljenih operaterjih
datestring[]Dve meji: ?date=…&date=…
isChainboolVrni klepete kot verige, ki prenašajo sporočila iz prejšnjih klepetov
isUnread, starMark, isOperator, isAIAgentboolDodatni filtri
phone, email, contactId, clientId, tagIds, rate, sortedBy—Drugi filtri

200 OK vrne 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, ki so pomembna za aplikacijo Instagram:

PoljePomen
instaAccountInstagram poslovni račun (trgovina). id je vrednost filtra entityId; name je ime računa iz Meta
instagramUserStranka. name je Instagram ročaj, id je instagram_user_id vrednost filtra
metaUserIdID stranke v obsegu na strani Mete (niz)
messSource7 za Instagram
phoneObičajno null za Instagram — ne uporabljajte ga kot ključ

ChatDTO nosi tudi 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 in taggedMessages.

4.2 Sporočila klepeta

GET https://chatapi.smsbat.com/api/chat/chats/1867/messages?isChain=false
Authorization: Bearer <token>

200 OK vrne niz 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 je zapolnjeno, ko se sporočilo nanaša na objavo ali zgodbo na Instagramu – posredujte naravnost nazaj kot id / postId v Meta API. media je ChatMediaDTO: { name, format, type, uri, raw, length, isUploaded }.

4.3 Pošljite sporočilo (JSON)

POST https://chatapi.smsbat.com/api/chat/1867/message
Authorization: Bearer <token>
Content-Type: application/json

Telo — 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?Besedilo sporočila. Lahko je prazno, če je prisoten media
authorAuthorMessage?0 operater, 1 odjemalec
isInternalbool?true označuje interno opombo, ki ni dostavljena stranki
replyToMessageIdint?ID sporočila, na katerega se odgovarja
appGuiduuid?Napotitveni GUID
mediaMediaDTO?{ name, format, dataBase64, thumbnail, duration, type }

200 OK → { "id": 9930, "messageStatus": 0 }

Napotitveni GUID je lahko posredovan tudi na poti: POST /api/chat/{chatId}/{referralGuid}/message (prav tako …/message/v1, …/message/v2).

4.4 Pošiljanje datoteke ali videa (večdelno, v2)

POST https://chatapi.smsbat.com/api/chat/1867/message/v2
Authorization: Bearer <token>
Content-Type: multipart/form-data

Imena polj obrazcev so v PascalCase z zapisom s pikami

textMessage in media.file sta tiho prezrta. Uporabite točna imena spodaj.

Polje obrazcaVrstaOpis
TextMessagestringBesedilo sporočila
Authorint0 operater, 1 odjemalec
IsInternalboolInterna opomba
ReplyToMessageIdintSporočilo, na katerega se odgovarja
AppGuiduuidNapotitveni GUID
Media.FilebinarySama datoteka
Media.NamestringIme datoteke
Media.FormatstringVrsta MIME (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeGlej §8.5
Media.DataBase64stringAlternativa Media.File
Media.ThumbnailstringOkvir za predogled videa Base64
Media.DurationdoubleTrajanje videa v sekundah
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 Spremenite status klepeta

PUT https://chatapi.smsbat.com/api/chat/status
Authorization: Bearer <token>
Content-Type: application/json

{ "id": 1867, "status": 4 }

200 OK odmeva posodobljen predmet.

4.6 Posodobite statuse sporočil

PUT https://chatapi.smsbat.com/api/chat/messages/status
Authorization: Bearer <token>
Content-Type: application/json

{ "status": 3, "messageIds": [9928, 9929] }

4.7 Izbriši klepet

DELETE https://chatapi.smsbat.com/api/chat/chats/1867
Authorization: Bearer <token>

5. Objave, koluti in zgodbe

Osnovna pot: https://chatapi.smsbat.com/api/meta Avtor: X-Authorization-Key: <organization token>

5.1 Seznam objav, kolutov in zgodb

GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
ParameterVrstaZahtevanoOpis
pageintneStran, privzeto 1
perPageintneElementi na stran, privzeto 20
idintneFiltriraj po ID interne objave
platformstringneinstagram ali facebook
mediaTypestringnepost, reel ali story. Vse vrste, če so izpuščene
# 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"
      }
    }
  ]
}

Neskladje — ime polja števca

Swaggerjeva shema MetaCommentPostListItemDtoPaginationDTO definira total. The notranji specifikacijski dokumenti totalCount. Swagger se ustvari iz kode, torej total je bolj verjetna resnica. Razčlenite total ?? totalCount, dokler to ni urejeno.

PoljeOpis
idID interne objave
metaIdZunanja objava / kolut / ID zgodbe v meta
textNapis objave
imageUrlURL posredniškega medija z nezaporednim ključem MetaPost.Guid ali null
platformfacebook ali instagram
mediaTypepost, reel ali story
createdAtDatum ustvarjanja (datum platforme ali datum baze podatkov)
storyPrisotno samo za mediaType: "story"
story.idNotranji ID zgodbe; enako post.id
story.metaIdZunanji ID zgodbe v meta
story.urlStabilen proxy URL shranjenega medija Story; null, če medija ni bilo mogoče shraniti

Poštni mediji so na voljo po dveh poteh: GET /api/meta/post/media/{id:int} za nazaj združljivost in GET /api/meta/post/media/{guid:guid}. Novi odgovori API in povratni klici vedno ustvari obrazec GUID.

5.2 Seznam komentarjev

GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
ParameterVrstaZahtevanoOpis
pageintneStran, privzeto 1
perPageintneElementi na stran, privzeto 20
postIdintneFiltriraj po ID objave
parentCommentIdintneOtroški komentarji (odgovori) danega komentarja
platformstringnefacebook ali 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 notranjega komentarja
metaIdZunanji ID v Meta. null za naš čakajoči odgovor, dokler ni poslan
textBesedilo komentarja
createdAtDatum nastanka
platformfacebook ali instagram
replyStatusnull za vhodni komentar uporabnika; "pending" / "sent" / "failure" za naš odgovor
author.type"meta_user" zunanji uporabnik, "owner" lastnik strani
author.nameIme avtorja
author.metaUserIdID uporabnika v meti; null za "owner"
postObjava, kolut ali zgodba, kateri pripada komentar
post.mediaTypepost, reel ali story
post.storyReferenca zgodbe { id, metaId, url }, samo zgodbe
mediaUrlMediji priloženi komentarju ali null
replyToKomentar staršev { id, metaId, text }; null na najvišji ravni

Neskladje — vrsta `author.type`

Notranja specifikacija dokumentira nize "meta_user" / "owner". Razvajeni tipi MetaCommentAuthorType kot celo število z enumom [0, 1]. A JsonStringEnumConverter bi pojasnil vrzel, vendar to ni bilo potrjeno z resničnim odzivom. Napišite a razčlenjevalnik, ki sprejme oboje.

5.3 Odgovorite na komentar

Odgovor postavi v čakalno vrsto za dostavo.

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"

Telo zahteve: { "text": "Reply text" }

202 Accepted vrne objekt komentarja — enake oblike kot GET /api/meta/comments — z replyStatus: "pending" in metaId: null. Izid dostave pride kasneje kot a source: 13 povratni klic (§6.4).

Neskladje — odzivna koda

Swagger izjavlja 200 brez telesa; notranja specifikacija navaja 202 Accepted s komentarjem kot telesom. Krmilnik verjetno nima ProducesResponseType atribut, pri čemer Swagger ostane privzet. Sprejmite katerikoli 2xx in ne bodite odvisni od telesa.


6. Webhooks

SMSBAT pošlje POST zahtevkov s application/json na vaš URL in pričakuje HTTP 200 nazaj.

Ničelna polja so v celoti izpuščena

Polje, katerega vrednost je null, sploh ni serializirano v telo povratnega klica. Za a sporočilo, ki ni prišlo s Facebooka ali Instagrama, ključa MetaUserId preprosto ni. Obravnavajte “odsoten” in null kot isto stvar.

6.1 Registrirajte URL povratnega klica

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 končna točka
sourceSendingSourceCallbackVrsta dogodka, glejte §8.2
headerName / headerValuestringPoljubna avtorska glava, ki jo priložimo zahtevi (neobvezno)
channelTypeChatSourceKanal. 7 za Instagram. Neobvezno
channelEntityIdintPoseben poslovni račun. Zahteva channelType

Brez channelType URL prejema dogodke iz vsakega kanala.

Tip

Popolna pokritost s komentarji zahteva dve registraciji: source: 12 za nove komentarje in source: 13 za statuse odgovorov. Za odgovore Direct in Story dodajte source: 3 (in 11, če želite vsako sporočilo klepeta).

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 vrne:

[
  {
    "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 Novo sporočilo in odgovor Instagram Story (source: 3, 11)

Uporabnikov odgovor na Instagram Story prispe kot običajno sporočilo v teh povratnih klicih, z dodatnim blokom Story najvišje ravni:

{
  "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 / MessageIdIdentifikatorji klepetov in sporočil
Author0 uporabnik, 1 operater
UsernameInstagram/Facebook prikazno ime ali ročaj
UserIdNotranji številčni ID uporabnika v SMSBAT
MetaUserIdObsežen ID sogovornika v Meti. Pri odhodnem sporočilu operaterja to še vedno identificira Meta uporabnika klepeta in ne operaterja
ShopIdInterni ID poslovnega računa Instagram/Facebook
ShopNameIme poslovnega računa, kot je bilo prejeto od Mete ob času povezave
MessageTextBesedilo sporočila
MessageMediaURL medija, ko je sporočilo medij
type_messengerVir, 7 za Instagram
operator_nameIme operaterja, ko je Author = 1
StoryPrisoten samo pri dohodnem odgovoru Story
Story.IdID notranje zgodbe (MetaPost) — uporabno neposredno kot id / postId v Meta API
Story.MetaIdZunanji ID zgodbe v meta
Story.UrlStabilen proxy URL shranjenega medija Story. Odsoten, ko medija ni bilo mogoče shraniti — blok Story in sporočilo sta še vedno dostavljena

`Author` je obrnjeno glede na API za klepet

V ChatMessageDTO.author 0 pomeni operater in 1 pomeni odjemalca. V tem povratnem klicu je obratno: 0 je uporabnik, 1 je operater. Ne delite preslikave.

6.3 Nov komentar (source: 12)

Sproži se, ko uporabnik Meta komentira objavo na Facebooku ali Instagram objavo / Reel.

Note

Instagram Odgovori na zgodbe niso dostavljeni prek source: 12. Prispejo kot navadni dohodna sporočila na source: 3 in/ali 11 z blokom Story — glejte §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 Stanje odgovora na komentar (source: 13)

Sproži, ko poskušamo dostaviti odgovor, ne glede na to, ali uspe ali ne.

{
  "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 Polja za povratni klic v skupni rabi komentarjev

Oba povratna klica komentarjev imata eno obliko telesa in se razlikujeta le za type.

PoljeOpis
type"new_comment" ali "comment_status"
platform"facebook" ali "instagram"
comment.idID notranjega komentarja
comment.metaIdZunanji ID v Meta; null za čakajoči odgovor, preden je poslan
comment.parentCommentIdID nadrejenega komentarja. Odsoten za komentar na najvišji ravni
comment.parentMetaIdID zunanjega nadrejenega komentarja. Odsoten na najvišji ravni
comment.parentCommentTextBesedilo komentarja staršev. Odsoten na najvišji ravni
comment.textBesedilo komentarja
comment.createdAtDatum nastanka
comment.updatedAtZadnja posodobitev. Odsoten, če komentar ni bil nikoli urejen
comment.replyStatus"pending" / "sent" / "failure". Odsoten za komentar vhodnega uporabnika
comment.author.type"meta_user" ali "owner"
comment.author.nameIme avtorja
comment.author.metaUserIdID avtorja v meti. Odsoten za "owner"
comment.mediaUrlKomentirajte medije. Odsoten, ko ga ni
post.idID interne objave
post.metaIdZunanja objava / kolut / ID zgodbe v meta
post.textObjavi besedilo
post.imageUrlObjavite URL slike ali null
post.createdAtDatum ustvarjanja objave
post.mediaTypePri povratnih klicih komentarjev samo post ali reel

6.6 Nov klepet (source: 7)

{ "ChatId": 12345, "Phone": "+380501234567", "chat.Source": 7 }

6.7 Spremembe stanja sporočil in klepeta (source: 6 / 5)

{ "name": "changed_message_status", "id": 9928, "status": 6 }
{ "name": "changed_chat_status",    "id": 1867, "status": 4 }

6.8 Sporočilo urejeno ali izbrisano (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 dogodkov

Za okolja, ki ne morejo sprejeti vhodnega HTTP-ja.

7.1 Pridobivanje dogodkov

GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
ParameterOpis
organizationIdNeobvezno. Vzeto iz žetona, če je izpuščeno
page / perPagePaginacija, privzeto 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"
    }
  ]
}

Vsak dogodek nosi event_guid, timestamp, organization_id in callback_type — a niz, ki se ujema z vrednostmi source v §8.2. Preostala polja se ujemajo z ustreznimi webhook v §6.

7.2 Potrditev obdelanih dogodkov

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 }

Že odstranjeni dogodki preprosto ne štejejo k deleted. Naročanje in ponovni poskusi so vaši odgovornost strani.

7.3 Priporočena zanka

  1. Anketa GET /api/chat/callback-events po urniku.
  2. Obdelajte dogodke v vaši storitvi.
  3. Pošljite obdelan seznam event_guid na /callback-events/processed.
  4. Ponovite.

8. Enum referenca

8.1 ChatSource — kanal (0–9)

KodaKanal
0Viber
1ViberBot
2TelegramBot
3WhatsApp
4Pripomoček
5Rozetka
6Facebook
7Instagram
8Maturantski ples
9Olx

8.2 SendingSourceCallback — vrsta dogodka povratnega klica (0–13)

KodaDogodek
3Chat — novo sporočilo klepeta, vključno z odgovori Story
5Stanje klepeta spremenjeno
6Stanje sporočila spremenjeno
7Nov klepet ustvarjen
8Indikator tipkanja
9Sporočilo posodobljeno ali izbrisano
11AnyChatMessage — poljubno sporočilo klepeta
12MetaNewComment — nov komentar na Instagramu / Facebooku
13MetaCommentStatus — stanje dostave našega odgovora na komentar

Enum obsega 0–13; preostale vrednosti niso potrebne za integracije Instagrama.

8,3 ChatStatus (0–4)

0 Novo, 1 Odprto, 2 Čakanje, 3 Vklopljeno, 4 Zaprto

8,4 MessageStatus (0–11)

KodaIme
0NOVO
1USPEH
2ZAVRNJENO
3PREBERITE
4NEZNANO
5PREDELAVA
6DOSTAVLJENO
7BLOCKED_BY_USER
8USER_NOT_FOUND

Enum obsega 0–11. Vrednosti 9, 10 in 11 obstajajo v API-ju, vendar še niso dokumentirane — obravnavajte jih kot UNKNOWN.

8,5 MediaType (1–10)

1 Fotografija, 2 Datoteka, 3 Avdio, 4 Video, 5 Nalepka, 6 Animirana nalepka, 7 StickerVideo, 8 Animacija, 9 Glas, 10 VideoNote

8.6 AuthorMessage — avtor v API-ju za klepet (0–4)

0 Operater, 1 Client, 2 Bot, 3 ViberAccount

Enum obsega 0–4; vrednost 4 ni dokumentirana. Povratni klic »novo sporočilo« uporablja nasprotno preslikavo — glej §6.2.

8,7 ChatMessageType (0–2)

0 besedilo, 1 fotografija, 2 datoteka

8.8 Komentar replyStatus

null vhodni komentar uporabnika, "pending" naš odgovor je v čakalni vrsti, "sent" dostavljen, "failure" dostava ni uspela.


Odprta vprašanja

Tri točke, kjer se notranja specifikacija in s kodo ustvarjena Swagger ne strinjata. ena zahteva s pravim žetonom poravna vse; do takrat pa pišite stranki obrambno.

#VprašanjeSpecifikacijaBahanjeKako preveriti
1Glava overitve za /api/meta/*X-Authorization-Keyprijavljenih samo Bearercurl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — pričakujte 200, ne 401
2Polje števca v meta odgovorihtotalCounttotalIsta zahteva — preberite korenski ključ JSON
3author.type vrsta in reply statusna koda"meta_user" / "owner", 202 z ohišjemint [0,1], 200 brez telesacurl -i .../api/meta/comments?perPage=1 plus preizkusni odgovor

Začasna navodila:

  • števec — preberite total ?? totalCount;
  • author.type — sprejme tako niz kot celo število (0 ↔ meta_user, 1 ↔ owner, preslikavo je treba potrditi);
  • reply — vsak 2xx obravnavajte kot uspeh, ne zahtevajte telesa, prevzamete končni status iz povratnega klica source: 13.

Opombe o izvajanju

  • Auth se razlikuje glede na skupino končnih točk — /api/meta/* uporablja X-Authorization-Key, klepete in operaterji uporabljajo Bearer, restapi sprejema bodisi.
  • Paginacija se črkuje na dva načina — per_page na /api/chat/chats, perPage na /api/meta/* in /api/chat/callback-events.
  • Polja multipart/form-data so v PascalCase z zapisom s pikami (Media.File, Media.Type).
  • Ničelna polja so izpuščena iz povratnih klicev — odsoten ključ pomeni null.
  • phone je običajno null na Instagramu. Prepoznajte stranko po instagramUser.id / metaUserId in nakupujte pri instaAccount.id (vrednost filtra entityId).
  • Story.Id iz povratnega klica je mogoče neposredno posredovati nazaj kot id / postId v Meta API.
  • Preverite expiresAt operaterja JWT, preden ga uporabite v globoki povezavi ali pripomočku.