Help Center Мета & Инстаграм АПИ интеграција

Мета & Инстаграм АПИ интеграција

Референца за прављење Инстаграм апликације на СМСБАТ ЦхатХуб платформи: аутентификација, Инстаграм Директни разговори, коментари на објаве и колутове, одговори на приче, веб-хукови и анкете.

Извори

Ова страница спаја интерну Мета Цомментс АПИ спецификацију са активним ОпенАПИ-јем дефиниције на https://chatapi.smsbat.com/swagger/v1/swagger.json и https://restapi.smsbat.com/swagger/v1/swagger.json. Тамо где се њих двоје не слажу, разлика се позива на линију и наводи под Отворена питања.


1. Основни УРЛ-ови

СврхаУРЛ
Цхат АПИ + Мета АПИhttps://chatapi.smsbat.com
Сваггер УИ / ОпенАПИhttps://chatapi.smsbat.com/index.html · …/swagger/v1/swagger.json
РЕСТ АПИ (организације, УРЛ адресе за повратни позив)https://restapi.smsbat.com
РЕСТ АПИ Сваггерhttps://restapi.smsbat.com/swagger/v1/swagger.json
Веб панел оператераhttps://chat.smsbat.com

2. Аутентификација

Шема аутентификације зависи од групе крајњих тачака. Њихово мешање је најчешћи узрок 401.

ГрупаХеадер
chatapi.smsbat.com/api/meta/* (објаве, коментари)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 · Басиц Аутх

Токен организације за X-Authorization-Key се издаје у табли под Профил. ЈВТ компаније и оператера долазе из /api/company/get-token и /api/operator/get-token.

Неподударност

chatapi ОпенАПИ документ декларише једну безбедносну шему — Bearer — и примењује је глобално. X-Authorization-Key тамо уопште није декларисан, иако интерни Мета Коментари АПИ спецификација га именује за /api/meta/*. Највероватније се њиме баве средњи софтвер који се не одражава у Сваггер-у. Потврдите емпиријски пре него што пошаљете.

2.1 Токен компаније

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

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

200 OK враћа голи низ токена.

2.2 Организације

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

2.3 Оператери у организацији

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" }
  }
]

Статуси оператера: 0 Активан, 1 Неактиван, 2 Избрисан.

2.4 Додавање/синхронизација оператора

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 Оператор ЈВТ

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 враћа ЈВТ као стринг.

2.6 Потврдите токен оператора

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
}

Када је неважећи: { "isValid": false, "error": "Invalid token" }.

2.7 Уградите панел за ћаскање оператера

<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. Дубоке везе у панел за ћаскање

Екстерни систем (ЦРМ, ЕРП, веб локација) може да отвори одређени разговор https://chat.smsbat.com/. Оператор је овлашћен од стране ЈВТ-а који је прослеђен као параметар упита.

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>
ПараметарОпис
chat_raw_idИД ћаскања
phoneБрој телефона у међународном формату
fromИдентификатор бренда / пословног налога (bm_id)
sourceИзвор ћаскања — 7 за Инстаграм, погледајте §8.1
tokenВажећи оператер ЈВТ без истека са приступом четовима

Неважећи ЈВТ доводи посетиоца на екран за пријаву на панелу оператера.


4. Инстаграм Директни разговори

4.1 Листа ћаскања

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

Note

Пагинација овде је per_page (смаке_цасе). Под /api/meta/* и гласање крајња тачка је perPage (цамелЦасе). Ово није штампарска грешка - АПИ користи обоје.

Параметри упита, сви опционални:

ПараметарТипОпис
sourceChatSource7 ограничава резултате на Инстаграм
entityIdintИД пословног налога. Примењује се само заједно са source
instagram_user_idintИД корисника Инстаграма у ЦхатХуб-у
facebook_user_idintИД корисника Фејсбука у ЦхатХуб-у
page / per_pageintПагинација, подразумеване вредности 1 / 20
statusChatStatus[]Статус ћаскања, поновљиво
searchstringПретрага слободног текста (име, телефон, …)
organizationIdintИД организације
operatorIdint[]Филтрирај по додељеним операторима
datestring[]Две границе: ?date=…&date=…
isChainboolВрати ћаскања као ланце, носећи поруке из претходних ћаскања
isUnread, starMark, isOperator, isAIAgentboolДодатни филтери
phone, email, contactId, clientId, tagIds, rate, sortedBy—Остали филтери

200 OK враћа 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": []
    }
  ]
}

Поља која су важна за Инстаграм апликацију:

ПољеЗначење
instaAccountИнстаграм пословни налог (продавница). id је вредност филтера entityId; name је име налога из Мета
instagramUserмуштерија. name је Инстаграм дршка, id је вредност филтера instagram_user_id
metaUserIdИД клијента у опсегу на Мета страни (стринг)
messSource7 за Инстаграм
phoneОбично null за Инстаграм — немојте га користити као кључ

ChatDTO такође носи 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 и taggedMessages.

4.2 Поруке ћаскања

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

200 OK враћа низ од 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 се попуњава када се порука односи на Инстаграм пост или причу — проследите је право назад као id / postId у Мета АПИ. media је ChatMediaDTO: { name, format, type, uri, raw, length, isUploaded }.

4.3 Пошаљите поруку (ЈСОН)

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

Тело — 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
  }
}
ПољеТипОпис
textMessagestring?Текст поруке. Може бити празан када је присутно media
authorAuthorMessage?0 оператер, 1 клијент
isInternalbool?true означава интерну напомену која се не испоручује купцу
replyToMessageIdint?ИД поруке на коју се одговара
appGuiduuid?Реферрал ГУИД
mediaMediaDTO?{ name, format, dataBase64, thumbnail, duration, type }

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

ГУИД препоруке се такође може пренети на путањи: POST /api/chat/{chatId}/{referralGuid}/message (исто …/message/v1, …/message/v2).

4.4 Пошаљите датотеку или видео (вишеделни, в2)

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

Имена поља обрасца су ПасцалЦасе са тачком

textMessage и media.file се тихо игноришу. Користите тачна имена испод.

Поље обрасцаТипОпис
TextMessagestringТекст поруке
Authorint0 оператер, 1 клијент
IsInternalboolИнтерна напомена
ReplyToMessageIdintПорука на коју се одговара
AppGuiduuidРеферрал ГУИД
Media.FilebinaryСама датотека
Media.NamestringИме датотеке
Media.FormatstringМИМЕ тип (video/mp4, image/png, application/pdf)
Media.TypeMediaTypeВидети §8.5
Media.DataBase64stringАлтернатива Media.File
Media.ThumbnailstringБасе64 оквир за преглед видео записа
Media.DurationdoubleТрајање видеа у секундама
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 Промена статуса ћаскања

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

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

200 OK понавља ажурирани објекат.

4.6 Ажурирање статуса порука

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

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

4.7 Избришите ћаскање

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

5. Постови, колути и приче

Основна путања: https://chatapi.smsbat.com/api/meta Аутх: X-Authorization-Key: <organization token>

5.1 Листа постова, колутова и прича

GET https://chatapi.smsbat.com/api/meta/posts?platform=instagram&mediaType=story&page=1&perPage=20
X-Authorization-Key: <token>
ПараметарТипОбавезноОпис
pageintноСтраница, подразумевано 1
perPageintноСтавке по страници, подразумевано 20
idintноФилтрирај према интерном ИД-у поста
platformstringноinstagram или facebook
mediaTypestringноpost, reel или story. Сви типови када су изостављени
# 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"
      }
    }
  ]
}

Неслагање — назив поља бројача

Свагерова шема MetaCommentPostListItemDtoPaginationDTO дефинише total. Тхе документи интерне спецификације totalCount. Сваггер се генерише из кода, дакле total је вероватнија истина. Парсирајте total ?? totalCount док се ово не реши.

ПољеОпис
idИнтерни ИД поста
metaIdСпољна објава / Реел / ИД приче у Мета
textНаслов поста
imageUrlУРЛ прокси медија са кључем несеквентног MetaPost.Guid или null
platformfacebook или instagram
mediaTypepost, reel или story
createdAtДатум креирања (датум платформе или датум базе података)
storyПоклоните само за mediaType: "story"
story.idИнтерни ИД приче; једнако post.id
story.metaIdИД спољне приче у Мета
story.urlСтабилни проки УРЛ сачуваног медија прича; null ако се медиј не може сачувати

Пост медији се опслужују на два пута: GET /api/meta/post/media/{id:int} за назад компатибилност и GET /api/meta/post/media/{guid:guid}. Нови АПИ одговори и повратни позиви увек генерише ГУИД образац.

5.2 Листа коментара

GET https://chatapi.smsbat.com/api/meta/comments?platform=instagram&postId=42&page=1&perPage=20
X-Authorization-Key: <token>
ПараметарТипОбавезноОпис
pageintноСтраница, подразумевано 1
perPageintноСтавке по страници, подразумевано 20
postIdintноФилтрирај по ИД-у поште
parentCommentIdintноПодређени коментари (одговори) датог коментара
platformstringноfacebook или 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..."
      }
    }
  ]
}
ПољеОпис
idИнтерни ИД коментара
metaIdЕкстерни ИД у Мета. null за наш одговор на чекању док се не пошаље
textТекст коментара
createdAtДатум креирања
platformfacebook или instagram
replyStatusnull за долазни коментар корисника; "pending" / "sent" / "failure" за наш одговор
author.type"meta_user" спољни корисник, "owner" власник странице
author.nameИме аутора
author.metaUserIdИД корисника са опсегом у Мета; null за "owner"
postОбјава, колут или прича којој коментар припада
post.mediaTypepost, reel или story
post.storyРеференца приче { id, metaId, url }, само приче
mediaUrlМедији приложени уз коментар, или null
replyToКоментар родитеља { id, metaId, text }; null на највишем нивоу

Неподударност — тип `author.type`

Интерна спецификација документује низове "meta_user" / "owner". Сваггер типови MetaCommentAuthorType као цео број са енумом [0, 1]. А JsonStringEnumConverter би објаснио јаз, али то није потврђено у односу на прави одговор. Напишите а парсер који прихвата и једно и друго.

5.3 Одговори на коментар

У реду чека одговор за испоруку.

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"

Тело захтева: { "text": "Reply text" }

202 Accepted враћа објекат коментара — истог облика као GET /api/meta/comments — са replyStatus: "pending" и metaId: null. Исход испоруке стиже касније као а source: 13 повратни позив (§6.4).

Неподударност — код одговора

Сваггер изјављује 200 без тела; интерна спецификација наводи 202 Accepted са коментаром као телом. Контролору највероватније недостаје ProducesResponseType атрибута, остављајући Сваггер на подразумеваном. Прихватите било који 2xx и не зависите од тела.


6. Вебхоокс

СМСБАТ шаље POST захтева са application/json на ваш УРЛ и очекује HTTP 200 назад.

Нулта поља су у потпуности изостављена

Поље чија је вредност null уопште није серијализовано у тело повратног позива. За а порука која није стигла са Фејсбука или Инстаграма једноставно не постоји кључ MetaUserId. Третирајте „одсутан“ и null као исту ствар.

6.1 Региструјте УРЛ за повратни позив

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
  }'
ПољеТипОпис
urlstringВаша крајња тачка
sourceSendingSourceCallbackТип догађаја, видети §8.2
headerName / headerValuestringПроизвољно аутх заглавље које прилажемо захтеву (опционо)
channelTypeChatSourceКанал. 7 за Инстаграм. Опционо
channelEntityIdintКонкретан пословни рачун. Захтева channelType

Без channelType УРЛ прима догађаје са сваког канала.

Tip

За потпуну покривеност коментара потребне су две регистрације: source: 12 за нове коментаре и source: 13 за статусе одговора. За директне одговоре и одговоре на причу додајте source: 3 (и 11 ако желите сваку поруку ћаскања).

Преостале операције:

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 враћа:

[
  {
    "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 Нова порука и одговор на Инстаграм прича (source: 3, 11)

Одговор корисника на Инстаграм причу стиже као обична порука у овим повратним позивима, са додатним блоком 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"
  }
}
ПољеОпис
ChatId / MessageIdИдентификатори ћаскања и порука
Author0 корисник, 1 оператер
UsernameИнстаграм/Фацебоок име или ручица за приказ
UserIdИнтерни бројчани ИД корисника у СМСБАТ-у
MetaUserIdИД саговорника са опсегом у Мета-у. У одлазној поруци оператера ово и даље идентификује Мета корисника ћаскања, а не оператера
ShopIdИнтерни ИД Инстаграм/Фацебоок пословног налога
ShopNameИме пословног налога како је примљено од Мета у време повезивања
MessageTextТекст поруке
MessageMediaУРЛ медија када је порука медијска
type_messengerИзвор, 7 за Инстаграм
operator_nameИме оператера када је Author = 1
StoryПрисутни само на долазном одговору на причу
Story.IdИД интерне приче (MetaPost) — употребљив директно као id / postId у Мета АПИ-ју
Story.MetaIdИД спољне приче у Мета
Story.UrlСтабилни прокси УРЛ сачуваног медија прича. Одсутан када медиј није могао да се сачува — блок Story и порука се и даље испоручују

`Author` је обрнуто у односу на АПИ за ћаскање

У ChatMessageDTO.author, 0 значи оператер, а 1 значи клијент. У овом повратном позиву јесте обрнуто: 0 је корисник, 1 је оператер. Не делите мапирање.

6.3 Нови коментар (source: 12)

Покреће се када корисник Мета коментарише објаву на Фејсбуку или Инстаграм објаву / Реел.

Note

Инстаграм Одговори на причу се не испоручују преко source: 12. Стижу као обични долазне поруке на source: 3 и/или 11 са блоком Story — видети §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 Статус одговора на коментар (source: 13)

Пали се након што покушамо да доставимо одговор, било да успе или не.

{
  "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 Дељена поља повратног позива за коментаре

Оба повратна позива коментара деле један облик тела и разликују се само за type.

ПољеОпис
type"new_comment" или "comment_status"
platform"facebook" или "instagram"
comment.idИнтерни ИД коментара
comment.metaIdЕкстерни ИД у Мета; null за одговор на чекању пре него што се пошаље
comment.parentCommentIdИД надређеног коментара. Одсутан за коментар највишег нивоа
comment.parentMetaIdИД спољног надређеног коментара. Одсутан на највишем нивоу
comment.parentCommentTextТекст коментара родитеља. Одсутан на највишем нивоу
comment.textТекст коментара
comment.createdAtДатум креирања
comment.updatedAtПоследње ажурирање. Одсутан ако коментар никада није уређиван
comment.replyStatus"pending" / "sent" / "failure". Одсутан за долазни коментар корисника
comment.author.type"meta_user" или "owner"
comment.author.nameИме аутора
comment.author.metaUserIdИД аутора у опсегу у Мета-у. Одсутан за "owner"
comment.mediaUrlКоментирајте медије. Одсутан када га нема
post.idИнтерни ИД поста
post.metaIdСпољна објава / Реел / ИД приче у Мета
post.textТекст поста
post.imageUrlУРЛ слике поста, или null
post.createdAtДатум креирања објаве
post.mediaTypeУ повратним позивима коментара, само post или reel

6.6 Ново ћаскање (source: 7)

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

6.7 Промене статуса порука и ћаскања (source: 6 / 5)

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

6.8 Порука измењена или обрисана (source: 9)

{ "messageId": 9930, "text": "Updated message text" }
{ "messageId": 9931, "delete": true }

6.9 Индикатор куцања (source: 8)

{ "chat_id": 1867, "event": "start_typing", "operator_name": "Iryna" }
{ "chat_id": 1867, "event": "end_typing" }

7. Испитивање догађаја

За окружења која не могу да прихвате улазни ХТТП.

7.1 Преузимање догађаја

GET https://chatapi.smsbat.com/api/chat/callback-events?page=1&perPage=20
Authorization: Bearer <token>
ПараметарОпис
organizationIdОпционо. Преузето из токена када се изостави
page / perPageПагинација, подразумеване вредности 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"
    }
  ]
}

Сваки догађај носи event_guid, timestamp, organization_id и callback_type — а стринг који одговара вредностима source у §8.2. Преостала поља одговарају одговарајућим вебхоок у §6.

7.2 Потврдите обрађене догађаје

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 }

Догађаји који су већ уклоњени једноставно се не рачунају у deleted. Наручивање и поновни покушаји су ваши одговорност стране.

7.3 Препоручена петља

  1. Анкета GET /api/chat/callback-events по распореду.
  2. Обрадите догађаје у вашој служби.
  3. Пошаљите обрађену листу event_guid на /callback-events/processed.
  4. Поновите.

8. Енум референце

8.1 ChatSource — канал (0–9)

КодКанал
0Вибер
1ВиберБот
2ТелеграмБот
3Вхатсапп
4Видгет
5Розетка
6Фацебоок
7Инстаграм
8Пром
9Олк

8.2 SendingSourceCallback — тип догађаја повратног позива (0–13)

КодДогађај
3Chat — нова порука за ћаскање, укључујући одговоре на причу
5Статус ћаскања је промењен
6Статус поруке је промењен
7Ново ћаскање је направљено
8Индикатор куцања
9Порука ажурирана или обрисана
11AnyChatMessage — било која порука за ћаскање
12MetaNewComment — нови Инстаграм / Фацебоок коментар
13MetaCommentStatus — статус испоруке нашег одговора на коментар

Енум обухвата 0–13; преостале вредности нису потребне за Инстаграм интеграције.

8.3 ChatStatus (0–4)

0 Ново, 1 Отворено, 2 Чекање, 3 У паузи, 4 Затворено

8.4 MessageStatus (0–11)

КодИме
0НОВО
1СУЦЦЕСС
2РЕЈЕЦТЕД
3ПРОЧИТАЈТЕ
4УНКНОВН
5ПРОЦЕССИНГ
6ДЕЛИВЕРЕД
7БЛОЦКЕД_БИ_УСЕР
8УСЕР_НОТ_ФОУНД

Наброј се простире на 0–11. Вредности 9, 10 и 11 постоје у АПИ-ју, али још увек нису документоване — третирати их као UNKNOWN.

8.5 MediaType (1–10)

1 Фотографија, 2 Фајл, 3 Аудио, 4 Видео, 5 Стикер, 6 СтицкерАниматед, 7 СтицкерВидео, 8 Анимација, 9 Глас, 10 ВидеоБелешка

8.6 AuthorMessage — аутор у АПИ-ју за ћаскање (0–4)

0 Оператор, 1 Клијент, 2 Бот, 3 Вибер налог

Енум се простире на 0–4; вредност 4 је недокументована. Повратни позиви „нове поруке“ користе супротно пресликавање — видети §6.2.

8.7 ChatMessageType (0–2)

0 Текст, 1 Слика, 2 Фајл

8.8 Коментар replyStatus

null долазни коментар корисника, "pending" наш одговор је на чекању, "sent" испоручен, "failure" испорука није успела.


Отворена питања

Три тачке у којима се интерна спецификација и Сваггер генерисани код не слажу. Један захтев са правим токеном све их решава; до тада напишите клијента дефанзивно.

#ПитањеСпецификацијаСваггерКако проверити
1Аутх хеадер за /api/meta/*X-Authorization-Keyсамо Bearer декларисаноcurl -i -H "X-Authorization-Key: <token>" ".../api/meta/posts?perPage=1" — очекујте 200, а не 401
2Поље бројача у Мета одговоримаtotalCounttotalИсти захтев — прочитајте основни ЈСОН кључ
3author.type тип и reply статусни код"meta_user" / "owner", 202 са теломint [0,1], 200 без телаcurl -i .../api/meta/comments?perPage=1 плус тест одговор

Привремене смернице:

  • бројач — читај total ?? totalCount;
  • author.type — прихватите и стринг и цео број (0 ↔ meta_user, 1 ↔ owner, мапирање треба да буде потврђено);
  • reply — третирајте било који 2xx као успех, не захтевајте тело, узмите коначни статус из повратног позива source: 13.

Напомене о примени

  • Аутх се разликује по групи крајњих тачака — /api/meta/* користи X-Authorization-Key, ћаскање и оператери користе Bearer, restapi прихвата било које.
  • Пагинација се пише на два начина — per_page на /api/chat/chats, perPage на /api/meta/* и /api/chat/callback-events.
  • multipart/form-data поља су ПасцалЦасе са нотацијом тачака (Media.File, Media.Type).
  • Нулта поља су изостављена из повратних позива — одсутан кључ значи null.
  • phone је обично null на Инстаграму. Идентификујте купца помоћу instagramUser.id / metaUserId и продавницу за instaAccount.id (вредност филтера entityId).
  • Story.Id из повратног позива може се проследити директно назад као id / postId Мета АПИ-ју.
  • Проверите expiresAt оператера ЈВТ пре него што га употребите у дубокој вези или у виџету.